1. 程式人生 > >遷移學習的使用注意事項

遷移學習的使用注意事項

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(’點個贊吧’)