天天看點

寫代碼複現論文的幾點建議!

寫代碼複現論文的幾點建議!

不知道大家有時候會不會有一個很好的idea,但是就是寫不出來具體的代碼,或者寫的代碼不夠高效。

其實這種情況所有人都會遇到:

  • ​場景1​

    ​:比賽期間有一個新特征的方法,但是用pandas實作太慢,時間複雜度太高。
  • ​場景2​

    ​:科研或工作遇到一個新問題,進入一個新領域,不知道如何開始。
  • ​場景3​

    ​:複現别人的深度學習論文,但就是沒法成功。

場景1:代碼太慢

現在不管是比賽還是常見的資料處理,都會遇到大規模的檔案。此時如果你代碼寫的不夠高效,代碼肯定會運作的很慢很慢,基本上沒法滿足要求。

步驟1:寫出基礎代碼

使用少量資料集來實踐你的思路,代碼可以不用很優化,優先寫出來即可。寫完後建議封裝為函數,友善調用。

步驟2:優化代碼邏輯

在不斷增加資料量的過程中,你會發現代碼越來越慢,逐漸達到你的預期上限。此時你應該嘗試去優化你的代碼了。

優化代碼有一些基礎的邏輯:

  1. 代碼本身足夠高效嗎?
  2. 代碼是否利用了所有的CPU/GPU?

例如在使用Pandas時,如果不了解具體的文法,很容易将代碼寫成​

​for​

​循環,可以參考以下優化過程。

  • 下标循環
df1 = df
for i in range(len(df)):
    if df.iloc[i]['test'] != 1:
        df1.iloc[i]['test'] = 0      
  • Iterrows循環
i = 0
for ind, row in df.iterrows():
    if row['test'] != 1:
        df1.iloc[i]['test'] = 0
    i += 1      
  • Apply循環
df1['test'] = df['test'].apply(lambda x: x if x == 1 else 0)      
  • 内置函數
res = df.sum()      
  • Numpy函數
df_values = df.values
res = np.sum(df_values)      

步驟3:提高資源使用率

當你逐漸對Pandas和Numpy的熟悉過程中,你會發現自己的代碼也運作的越來越快。如果最終代碼都是用内置函數實作,基本上已經很好了。

但也可以進一步優化,因為Pandas很多操作都是串行單線程執行,是以可以手動開多線程進一步加速資料的計算過程,把所有CPU用上,或使用cuDF利用GPU加速。

場景2:新領域無從下手

閱讀已有新工作的必經之路,是以努力要站在巨人的肩膀上。

  1. 閱讀目标領域内近3-5年頂會論文,特别是綜述論文。
  2. 收集公開賽事或榜單上學習Top名次的解決方案,包含思路和代碼。

無他唯孰能爾,多收集多整理,了解領域思路和套路。

場景3:複現别人的論文

科研并不是從0到1,一定要多去了解已有的工作,以及已有的論文代碼。在閱讀完論文代碼後,可以按照如下步驟逐漸複現:

步驟1:找到有開源代碼的論文

在Github上找到曆史的有代碼的論文,這些論文項目雖然比較舊,但參考價值很大。

步驟2:整理好資料集的加載

搞清楚資料集怎麼制作怎麼加載怎麼輸入怎麼計算怎麼輸出,資料集如何處理,如何編碼。

步驟3:搭建論文模型

基于論文思路整理好模型結構,有多少層,每層的細節,每層的次元,一步一步搭建。保證模型可以正常訓練和預測。

步驟4:确定訓練細節