所謂fine tune就是用別人訓練好的模型,加上我們自己的數據,來訓練新的模型。fine tune相當於使用別人的模型的前幾層,來提取淺層特征,然后在最后再落入我們自己的分類中。
fine tune的好處在於不用完全重新訓練模型,從而提高效率,因為一般新訓練模型准確率都會從很低的值開始慢慢上升,但是fine tune能夠讓我們在比較少的迭代次數之后得到一個比較好的效果。在數據量不是很大的情況下,fine tune會是一個比較好的選擇。但是如果你希望定義自己的網絡結構的話,就需要從頭開始了。(其實finetune和增量學習非常相近,方法類似)
這里我用使用爬蟲抓取的6類圖片對imagenet官網上發布的預訓模型(bvlc_reference_caffenet.caffemodel)進行finetune:
過程與訓練.caffemodel時差不多,只有幾處差異需要注意一下:
(1)solver.prototxt中的一些參數可能要適當進行一些修改;
(2)在train_val.prototxt和deploy.prototxt中的網絡結構中,因為我們全連接層之前的層的初始權重依然使用預訓模型的初始權重,但最后的全連接層需要重新訓練,其中num_output由1000改為6,最后一層的名字也要重新命名,比如:fc8_flicker;
(3)train.sh修改如下:
./build/tools/caffe train -solver=examples/money_test/fine_tune/solver.prototxt -weights=models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel
這里還要注意一點: 在進行finetune時再次添加的樣本的label值必須從0開始且連續(假如我第4類識別不太好,我試過在finetune的時候如果僅僅添加第四類,label等於4,則訓練時loss一直在異常跳動)
所以這里有一個問題:
有沒有一種方法使我能在finetune或者增量學習時只訓練某一類(label不等於0)樣本。(假如我的預訓模型對那一類的識別效果不行)???請知道的人提供建議,不勝感激!
