caffe finetune微調

  • 什麼是fine-tuning:

       在別人基於caffe訓練好的模型(如caffenet,googlenet等)的基礎上,利用別人訓練好的模型的權重參數值,通過訓練自己的圖片集修改最後一層的(也就是softmax)的參數和輸出類別,說白了就是網絡層的前面層不變作爲一個特徵提取器,只改變最後一層作爲一個分類器,最後的訓練就相當於訓練了一個適合自己需求的分類器。

       finetune需要下面幾個文件:

      train_val.prototxt 

      deploy.prototxt(測試時用到)

      solver.prototxt

     caffemodel(別人訓練過的)

步驟:

1.修改輸入輸出均值文件,若有網絡名字也要修改。輸入中的數據的數據格式大小也要記得修改。輸出時如果最後一層不是全連接(比如:squeezenet),在最後的num_output上修改。

2.修改最後一層的名稱,與修改網絡名字的原理一樣。因爲已訓練好的模型中沒有與新的層進行匹配的結果,因此就會以新的隨機值初始化最新創建的層。不匹配就會重新開始訓練這一層,而前面的層也不會改變。

3.學習速率,由於finetune是在局部進行微調,因此學習速率base_lr不能太大,選擇0.01,0.001...並且我們希望學習速率能隨着迭代的次數不斷降低,而且學習速率降低的幅度更快一些。這樣以來,在使用step的策略時,stepsize可以更小一些。也就是運行更少的次數,降低一次lr。

4.因爲最後一層是重新學習,因此需要有更快的學習速率相比較其他層,因此我們將,weight和bias的學習速率加快10倍。

5.train與test中的batch_size過大不修改,會出現許多Restarting data prefetching from start。跑的速度感覺也很慢,是因爲自己的數據集比模型訓練的數據集小得多,而我的批處理大小是相同的。因此,很明顯,爲了測試網絡,網絡必須從一開始就預先獲取大量數據。但這樣的話,GPU的佔有率也比較高。

6.deploy.prototxt與train_val.prototxt要修改得一致。

dim: 1   num,對待識別樣本進行數據增廣的數量,可自行定義。一般會進行5次crop,之後分別flip。如果該值爲10則表示一個樣本會變成10個,之後輸入到網絡進行識別。如果不進行數據增廣,可以設置成1 
dim: 3  通道數,表示RGB三個通道 
dim: 128  圖像的長和寬 

參考:https://blog.csdn.net/u010402786/article/details/70141261

https://blog.csdn.net/qq_18644873/article/details/84634580

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章