1. 程式人生 > >用已有模型進行微調 finetune

用已有模型進行微調 finetune

一、準備資料集

這些資料共有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。

參考資料:


引數設定說明

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檔案中