1. 程式人生 > >Caffe windows 下進行(微調)fine-tune 模型

Caffe windows 下進行(微調)fine-tune 模型

小菜最近一直在學習caffe。今天小菜主要介紹一下如何在Caffe上微調網路(ps:小菜中間也出現了許多問題,不過很感謝網上的一些前輩的無私奉獻),一般比較經典的深度學習模型是別人訓練好的模型,例如分類模型主要是針對Imagenet的資料集進行分類的。為了適應我們自己特定的新任務(小菜的任務是分類),一般來說我們自己需要做的方向,比如在一些特定的領域的識別分類中,我們很難拿到大量的資料。因為像在ImageNet上畢竟是一個千萬級的影象資料庫,通常我們可能只能拿到幾千張或者幾萬張某一特定領域的影象,比如識別衣服啊、標誌啊、生物種類等等。在這種情況下重新訓練一個新的網路是比較複雜的,而且引數不好調整,資料量也不夠,因此fine-tuning微調就是一個比較理想的選擇。

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

微調網路,通常我們有一個初始化的模型引數檔案,這裡是不同於training from scratch,scrachtch指的是我們訓練一個新的網路,在訓練過程中,這些引數都被隨機初始化,而fine-tuning,是我們可以在ImageNet上1000類分類訓練好的引數的基礎上,根據我們的分類識別任務進行特定的微調。由於ImageNet的輸出的分類數是1000,小菜用了6類的影象進行分類,所以最後的輸出需要由1000改為6。

另外還需要將fc8層進行改名改為自己的名字(小菜改為fc8-test),這樣因為已訓練好的模型中沒有與新的層進行匹配的結果,因此就會以新的隨機值初始化最新建立的層。小菜使用的網路模型是CaffeNet,是一個小型的網路,其實別的網路如GoogleNet也是一樣的原理。那麼這個任務的變化可以表示為:

 任務:分類

 類別數目:1000(ImageNet上1000類的分類任務)----->6(自己的特定資料集的分類任務)那麼在網路的微調中,我們的整個流程分為以下幾步:

Ø  準備好我們的訓練資料和測試資料,分為訓練集和測試集;

Ø  計算資料集的均值檔案;

Ø  修改網路;

Ø  調整Solver的配置引數,通常學習速率和步長,迭代次數都要適當減少,可以參考前面的solver的詳解進行調整;

Ø  啟動訓練;

1.準備資料集

這一點就不用說了,準備兩個txt檔案,放成list的形式,可以參考caffe學習系列中資料集的生成。影象路徑之後一個空格之後跟著類別的ID,如下,這裡記住ID必須從0開始,要連續,否則會出錯,loss不下降,按照要求寫就OK。小菜找了6類一共是600張圖片,480張為train,120張為test,放在caffe-master/data/re/train和caffe-master/data/re/test。生成影象對應的train.txt和test.txt,接著生成對應的lmdb資料,小菜把這些檔案都放在caffe-master/examples/myfile路徑下。這個是訓練的影象label,測試的也同理。

2.計算資料集的均值檔案

因為集中特定領域的影象均值檔案會跟ImageNet上比較General的資料的均值不太一樣,生成的過程可以參考之前caffe生成均值檔案的步驟。小菜最後生成的mean.binaryproto檔案放在caffe-master/examples/myfile路徑下。

3.調整網路層引數

參照Caffe上的例程,我用的是CaffeNet,首先在輸入層data層,修改我們的source 和 meanfile, 根據之前生成的lmdb 和mean.binaryproto修改即可,最後一層的輸出類別,也就是將deploy.prototxt檔案中的最後的輸出類別1000改為自己的輸出類別(小菜是改為6了)並且需要加快最後一層的引數學習速率。首先修改名字,這樣預訓練模型賦值的時候這裡就會因為名字不匹配從而重新訓練,也就達成了我們適應新任務的目的。

調整學習速率,因為最後一層是重新學習,因此需要有更快的學習速率相比較其他層,因此我們將,weight和bias的學習速率加快10倍。原來是fc8,記得把跟fc8連線的名字都要修改掉

4.修改Solver引數

可以參考前面的caffe學習系列中的solver的詳解進行調整引數,原來的引數是用來training fromscratch,從原始資料進行訓練的,因此一般來說學習速率、步長、迭代次數都比較大,在fine-tuning微調呢,也正如它的名字,只需要微微調整, 主要的調整有:test_iter從1000改為了100,因為資料量減少了,base_lr從0.01變成了0.001,這個很重要,微調時的基本學習速率不能太大,學習策略沒有改變,步長從原來的100000變成了20000,最大的迭代次數也從450000變成了50000,動量和權重衰減項都沒有修改,依然是GPU模型,網路模型檔案和快照的路徑根據自己修改

5.開始訓練

首先你要從caffe zoo裡面下載一下CaffeNet網路用語ImageNet1000類分類訓練好的模型檔案,名字是bvlc_reference_caffenet.caffemodel,這個模型可以去網上下載:http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel,訓練的命令如下:

Build/x64/Realse/caffe.exe  train --solver=examples/myfile/solver.prototxt --weights  examples/myfile/bvlc_refference_caffenet.caffemodel  --gpu 0

小菜這裡將它寫成一個指令碼檔案(xxx.sh),在cygwin下直接執行該指令碼檔案就行,小菜也建議大家一開始的時候可以自己多手動敲的執行,這樣可以加強你的熟悉程度,後面可以寫成指令碼,因為寫成指令碼很方便,執行的時候只需要敲一行程式碼就行。最後達到的效能還不錯accuray 是0.9,loss降的很低,這是小菜的caffe微調的初次體驗,希望能幫到大家!finetune時應該用自己的資料集生成的均值檔案。