深度學習 Fine-tune 技巧總結


深度學習中需要大量的數據和計算資源(乞丐版都需要12G顯存的GPU - -)且需花費大量時間來訓練模型,但在實際中難以滿足這些需求,而使用遷移學習則能有效

降低數據量、計算量和計算時間,並能定制在新場景的業務需求,可謂一大利器。

遷移學習不是一種算法而是一種機器學習思想,應用到深度學習就是微調(Fine-tune)。通過修改預訓練網絡模型結構(如修改樣本類別輸出個數),選擇性載入預訓練網絡模型權重(通常是載入除最后的全連接層的之前所有層 ,也叫瓶頸層)

再用自己的數據集重新訓練模型就是微調的基本步驟。 微調能夠快速訓練好一個模型,用相對較小的數據量,還能達到不錯的結果。

 

微調的具體方法和技巧有很多種,這里總結了在不同場景下的微調技巧:

 

1)新數據集比較小且和原數據集相似。因為新數據集比較小(比如<5000),如果fine-tune可能會過擬合;又因為新舊數據集類似,我們期望他們高層特征類似,可以使用預訓練網絡當做特征提取器,用提取的特征訓練線性分類器。

2)新數據集大且和原數據集相似。因為新數據集足夠大(比如>10000),可以fine-tune整個網絡。

3)新數據集小且和原數據集不相似。新數據集小,最好不要fine-tune,和原數據集不類似,最好也不使用高層特征。這時可是使用前面層的特征來訓練SVM分類器。

4)新數據集大且和原數據集不相似。因為新數據集足夠大,可以重新訓練。但是實踐中fine-tune預訓練模型還是有益的。新數據集足夠大,可以fine-tine整個網絡。

 

 

fine-tune實踐建議:

1)預訓練模型的限制。使用預訓練模型,受限於其網絡架構。例如,不能隨意從預訓練模型取出卷積層。但是因為參數共享,可以輸入任意大小的圖像;卷積層和池化層對輸入數據大小沒有要求;全連接層對輸入大小沒有要求,輸出大小固定。

2)學習率。與重新訓練相比,fine-tune要使用更小的學習率。因為訓練好的網絡模型權重已經平滑,我們不希望太快扭曲(distort)它們(尤其是當隨機初始化線性分類器來分類預訓練模型提取的特征時)。

2

深度學習可以說是一門數據驅動的學科,各種有名的CNN模型,無一不是在大型的數據庫上進行的訓練。像ImageNet這種規模的數據庫,動輒上百萬張圖片。對於普通的機器學習工作者、學習者來說,面對的任務各不相同,很難拿到如此大規模的數據集。同時也沒有谷歌,Facebook那種大公司驚人的算力支持,想從0訓練一個深度CNN網絡,基本是不可能的。但是好在已經訓練好的模型的參數,往往經過簡單的調整和訓練,就可以很好的遷移到其他不同的數據集上,同時也無需大量的算力支撐,便能在短時間內訓練得出滿意的效果。這便是遷移學習。究其根本,就是雖然圖像的數據集不同,但是底層的特征卻是有大部分通用的。

遷移學習主要分為兩種

  • 第一種即所謂的transfer learning,遷移訓練時,移掉最頂層,比如ImageNet訓練任務的頂層就是一個1000輸出的全連接層,換上新的頂層,比如輸出為10的全連接層,然后訓練的時候,只訓練最后兩層,即原網絡的倒數第二層和新換的全連接輸出層。可以說transfer learning將底層的網絡當做了一個特征提取器來使用。
  • 第二種叫做fine tune,和transfer learning一樣,換一個新的頂層,但是這一次在訓練的過程中,所有的(或大部分)其它層都會經過訓練。也就是底層的權重也會隨着訓練進行調整。

一個典型的遷移學習過程是這樣的。首先通過transfer learning對新的數據集進行訓練,訓練過一定epoch之后,改用fine tune方法繼續訓練,同時降低學習率。這樣做是因為如果一開始就采用fine tune方法的話,網絡還沒有適應新的數據,那么在進行參數更新的時候,比較大的梯度可能會導致原本訓練的比較好的參數被污染,反而導致效果下降。

參考:https://blog.csdn.net/tsyccnh/article/details/78889838

https://www.cnblogs.com/andre-ma/p/8676186.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM