寫代碼復現(xiàn)論文的幾點建議!

不知道大家有時候會不會有一個很好的idea,但是就是寫不出來具體的代碼,或者寫的代碼不夠高效。
其實這種情況所有人都會遇到:
場景1:比賽期間有一個新特征的方法,但是用pandas實現(xiàn)太慢,時間復雜度太高。場景2:科研或工作遇到一個新問題,進入一個新領域,不知道如何開始。場景3:復現(xiàn)別人的深度學習論文,但就是沒法成功。
場景1:代碼太慢
現(xiàn)在不管是比賽還是常見的數(shù)據(jù)處理,都會遇到大規(guī)模的文件。此時如果你代碼寫的不夠高效,代碼肯定會運行的很慢很慢,基本上沒法滿足要求。
步驟1:寫出基礎代碼
使用少量數(shù)據(jù)集來實踐你的思路,代碼可以不用很優(yōu)化,優(yōu)先寫出來即可。寫完后建議封裝為函數(shù),方便調用。
步驟2:優(yōu)化代碼邏輯
在不斷增加數(shù)據(jù)量的過程中,你會發(fā)現(xiàn)代碼越來越慢,逐漸達到你的預期上限。此時你應該嘗試去優(yōu)化你的代碼了。
優(yōu)化代碼有一些基礎的邏輯:
代碼本身足夠高效嗎? 代碼是否利用了所有的CPU/GPU?
例如在使用Pandas時,如果不了解具體的語法,很容易將代碼寫成for循環(huán),可以參考以下優(yōu)化過程。
下標循環(huán)
df1 = df
for i in range(len(df)):
if df.iloc[i]['test'] != 1:
df1.iloc[i]['test'] = 0
Iterrows循環(huán)
i = 0
for ind, row in df.iterrows():
if row['test'] != 1:
df1.iloc[i]['test'] = 0
i += 1
Apply循環(huán)
df1['test'] = df['test'].apply(lambda x: x if x == 1 else 0)
內置函數(shù)
res = df.sum()
Numpy函數(shù)
df_values = df.values
res = np.sum(df_values)
步驟3:提高資源利用率
當你逐步對Pandas和Numpy的熟悉過程中,你會發(fā)現(xiàn)自己的代碼也運行的越來越快。如果最終代碼都是用內置函數(shù)實現(xiàn),基本上已經很好了。
但也可以進一步優(yōu)化,因為Pandas很多操作都是串行單線程執(zhí)行,所以可以手動開多線程進一步加速數(shù)據(jù)的計算過程,把所有CPU用上,或使用cuDF利用GPU加速。
場景2:新領域無從下手
閱讀已有新工作的必經之路,所以努力要站在巨人的肩膀上。
閱讀目標領域內近3-5年頂會論文,特別是綜述論文。 收集公開賽事或榜單上學習Top名次的解決方案,包含思路和代碼。
無他唯孰能爾,多收集多整理,理解領域思路和套路。
場景3:復現(xiàn)別人的論文
科研并不是從0到1,一定要多去了解已有的工作,以及已有的論文代碼。在閱讀完論文代碼后,可以按照如下步驟逐步復現(xiàn):
步驟1:找到有開源代碼的論文
在Github上找到歷史的有代碼的論文,這些論文項目雖然比較舊,但參考價值很大。
步驟2:整理好數(shù)據(jù)集的加載
搞清楚數(shù)據(jù)集怎么制作怎么加載怎么輸入怎么計算怎么輸出,數(shù)據(jù)集如何處理,如何編碼。
步驟3:搭建論文模型
基于論文思路整理好模型結構,有多少層,每層的細節(jié),每層的維度,一步一步搭建。保證模型可以正常訓練和預測。
步驟4:確定訓練細節(jié)
根據(jù)論文實驗部分的細節(jié),確定具體的batch、epoch、學習率和優(yōu)化器,確定訓練的流程沒有問題。
整理不易,點贊三連↓
