用已有模型進行微調 finetune

一、 準備數據集

可以下載我的練習數據:http://pan.baidu.com/s/1MotUe,放在data/re根目錄下。

這些數據共有500張圖片,400張用於訓練,100張用於測試。分爲大巴車、恐龍、大象、鮮花和馬五個類,每個類100張。

在examples/根目錄下新建文件夾 mydata1,在此文件夾內放入訓練集、測試集等相關文件。

1. 訓練集

1)創建訓練集

在examples/mydata1根目錄下,新建imgtrainset文件夾 和 train.txt 文本文件

(注意: txt文件內,類別必須從0開始標註,不能從3開始)


2)利用caffe現成的convert_imageset程序,把訓練集從img格式轉換成lmdb格式(需要歸一到相同尺寸227*227),並且gray爲false(caffenet網絡模型輸入的是三通道圖片),並且需要打亂數據集(不能全0後面跟全1,再跟全2,以此類推),所以一定要加shuffle=true,不然訓練的時候會出錯(loss會很大)

新建convert_image_traindata.bat,內容如下:

SET GLOG_logtostderr=1

E:\study_materials\Caffe\caffe-master\caffe-master\Build\x64\Release\convert_imageset.exe imgtrainset/ train.txt train_modelre_lmdb -resize_width=227 -resize_height=227--backend=lmdb --gray=false--shuffle=true 

pause


則在examples/mydata1根目錄下,就會多一個文件:train_modelre_lmdb


2. 測試集

1)創建測試集

在examples/mydata1根目錄下,新建imgtestset文件夾 和 val.txt 文本文件

(同樣的,txt文件內必須從0開始)



2)利用caffe現成的convert_imageset程序,把測試集從img格式轉換成lmdb格式

新建convert_image_testdata.bat,內容如下:

SET GLOG_logtostderr=1
E:\study_materials\Caffe\caffe-master\caffe-master\Build\x64\Release\convert_imageset.exe imgtestset/ val.txt test_modelre_lmdb -resize_width=227 -resize_height=227 --backend=lmdb --gray=false --shuffle=true

pause


則在examples/mydata1根目錄下,就會多一個文件:test_modelre_lmdb


二、 計算數據集的均值文件(均值文件只有一個(由訓練集生成的))

在examples/mydata1根目錄下新建image_mean_train.bat ,內容如下:

E:\study_materials\Caffe\caffe-master\caffe-master\Build\x64\Release\compute_image_mean.exe E:\study_materials\Caffe\caffe-master\caffe-master\examples\mydata1\train_modelre_lmdb E:\study_materials\Caffe\caffe-master\caffe-master\examples\mydata1\modelre_train_mean.binaryproto --backend=lmdb


則在examples/mydata1根目錄下,就會多一個文件:modelre_train_mean.binaryproto

三、 修改網絡(調整網絡層參數)

我們使用位於models/下的bvlc_reference_caffenet網絡,把solver.prototxt和train_val.prototxt拷貝到examples/mydata1根目錄下,然後再進行修改

修改train_val.prototxt文件內容

1.訓練部分修改 (因爲訓練集不多,所以batch_size可以設置爲1,不過訓練會比較慢)


2.測試部分修改

3.fc8層修改(修改名字之後,這樣預訓練模型賦值的時候這裏就會因爲名字不匹配從而自動的進行重新訓練)

四、 修改Solver參數

修改solver.prototxt文件內容

從原始數據進行訓練的,因此一般來說學習速率、步長、迭代次數都比較大,在fine-tuning微調呢,也正如它的名字,只需要微微調整, 主要的調整有:
  1. test_iter從1000改爲了5(因爲我用的測試集很少,每一類一個,一共5個,而batch_size我設置了1,所以5/1=5),因爲數據量減少了。
  2. base_lr從0.01變成了0.0001(一開始我設置了0.001,一直出現loss=1.#QUAN的情況),這個很重要,微調時的基本學習速率不能太大。
  3. 學習策略lr_policy沒有改變(依舊爲step)。
  4. 步長stepsize從原來的100000變成了200。
  5. 最大的迭代次數max_iter也從450000變成了1000。
  6. test_intervalsnapshot則根據自己的喜好設置,一個是設置多少次輸出accuracy;一個是設置多少次輸出一次caffemodel和solverstate。

參考資料:

http://blog.csdn.net/helloworldding/article/details/76559855

https://www.cnblogs.com/louyihang-loves-baiyan/p/5038758.html


參數設置說明

1.訓練樣本
總共:25個
batch_size:1
將所有樣本處理完一次(稱爲一代,即epoch)需要:25/1=25 次迭代才能完成
所以這裏將test_interval設置爲25,即處理完一次所有的訓練數據後,纔去進行測試。所以這個數要大於等於25.
如果想訓練40代,則最大迭代次數爲1000;
2.測試樣本
同理,有5個測試樣本,batch_size爲1,那麼需要5次才能完整的測試一次。 所以test_iter爲5;這個數要大於等於5.
3.學習率

學習率變化規律我們設置爲隨着迭代次數的增加,慢慢變低。總共迭代1000次,我們將變化5次,所以stepsize設置爲1000/5=200,即每迭代200次,我們就降低一次學習率。

4. Step 學習策略


(注:stepsize不能太小,如果太小會導致學習率再後來越來越小,達不到充分收斂的效果)

五、 啓動訓練,加載預訓練模型微調

在examples/mydata1根目錄下新建文件夾 train_re_finetune.bat,內容如下:
E:\study_materials\Caffe\caffe-master\caffe-master\Build\x64\Release\caffe.exe 
train -solver solver.prototxt -weights bvlc_reference_caffenet.caffemodel 
2>&1 | tee train_re.log
pause


雙擊文件後,運行結果如下圖,信息存在了train_re.log文件中