遷移學習的使用注意事項


github博客傳送門
csdn博客傳送門

什么是fine-tuning?

在實踐中,由於數據集不夠大,很少有人從頭開始訓練網絡。常見的做法是使用預訓練的網絡(例如在ImageNet上訓練的分類1000類的網絡)來重新fine-tuning(也叫微調),或者當做特征提取器。

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

  1. 卷積網絡當做特征提取器。使用在ImageNet上預訓練的網絡,去掉最后的全連接層,剩余部分當做特征提取器(例如AlexNet在最后分類器前,是4096維的特征向量)。這樣提取的特征叫做CNN codes。得到這樣的特征后,可以使用線性分類器(Liner SVM、Softmax等)來分類圖像。

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

預訓練模型

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

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

  2. 新數據集大且和原數據集相似。因為新數據集足夠大,可以fine-tune整個網絡。

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

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

實踐建議

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

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

print_r('點個贊吧');
var_dump('點個贊吧');
NSLog(@"點個贊吧!")
System.out.println("點個贊吧!");
console.log("點個贊吧!");
print("點個贊吧!");
printf("點個贊吧!\n");
cout << "點個贊吧!" << endl;
Console.WriteLine("點個贊吧!");
fmt.Println("點個贊吧!")
Response.Write("點個贊吧");
alert(’點個贊吧’)


免責聲明!

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



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