fine-tuning

轉自http://www.javashuo.com/article/p-zfjjhdmp-cr.html網絡

 

在實踐中,因爲數據集不夠大,不多有人從頭開始訓練網絡。常見的作法是使用預訓練的網絡(例如在ImageNet上訓練的分類1000類的網絡)來從新fine-tuning(也叫微調),或者當作特徵提取器。架構

 

如下是常見的兩類遷移學習場景:ide

1 卷積網絡當作特徵提取器。使用在ImageNet上預訓練的網絡,去掉最後的全鏈接層,剩餘部分當作特徵提取器(例如AlexNet在最後分類器前,是4096維的特徵向量)。這樣提取的特徵叫作CNN codes。獲得這樣的特徵後,可使用線性分類器(Liner SVM、Softmax等)來分類圖像。學習

2 Fine-tuning卷積網絡。替換掉網絡的輸入層(數據),使用新的數據繼續訓練。Fine-tune時能夠選擇fine-tune所有層或部分層。一般,前面的層提取的是圖像的通用特徵(generic features)(例如邊緣檢測,色彩檢測),這些特徵對許多任務都有用。後面的層提取的是與特定類別有關的特徵,所以fine-tune時經常只須要Fine-tuning後面的層。spa

 

預訓練模型.net

在ImageNet上訓練一個網絡,即便使用多GPU也要花費很長時間。所以人們一般共享他們預訓練好的網絡,這樣有利於其餘人再去使用。例如,Caffe有預訓練好的網絡地址Model Zoo。code

 

什麼時候以及如何Fine-tuneblog

決定如何使用遷移學習的因素有不少,這是最重要的只有兩個:新數據集的大小、以及新數據和原數據集的類似程度。有一點必定記住:網絡前幾層學到的是通用特徵,後面幾層學到的是與類別相關的特徵。這裏有使用的四個場景:get

一、新數據集比較小且和原數據集類似。由於新數據集比較小,若是fine-tune可能會過擬合;又由於新舊數據集相似,咱們指望他們高層特徵相似,可使用預訓練網絡當作特徵提取器,用提取的特徵訓練線性分類器。it

二、新數據集大且和原數據集類似。由於新數據集足夠大,能夠fine-tune整個網絡。

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

四、新數據集大且和原數據集不類似。由於新數據集足夠大,能夠從新訓練。可是實踐中fine-tune預訓練模型仍是有益的。新數據集足夠大,能夠fine-tine整個網絡。

 

實踐建議

預訓練模型的限制。使用預訓練模型,受限於其網絡架構。例如,你不能隨意從預訓練模型取出卷積層。可是由於參數共享,能夠輸入任意大小圖像;卷積層和池化層對輸入數據大小沒有要求(只要步長stride fit),其輸出大小和屬於大小相關;全鏈接層對輸入大小沒有要求,輸出大小固定。(總感受哪邊不對)

學習率。與從新訓練相比,fine-tune要使用更小的學習率。由於訓練好的網絡模型權重已經平滑,咱們不但願太快扭曲(distort)它們(尤爲是當隨機初始化線性分類器來分類預訓練模型提取的特徵時)。

本站公眾號
   歡迎關注本站公眾號,獲取更多信息