Caffe fine-tuning 微調網絡


轉載請注明出處,樓燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/

目前呢,caffe,theano,torch是當下比較流行的Deep Learning的深度學習框架,樓主最近也在做一些與此相關的事情。在這里,我主要介紹一下如何在Caffe上微調網絡,適應我們自己特定的新任務。一般來說我們自己需要做的方向,比如在一些特定的領域的識別分類中,我們很難拿到大量的數據。因為像在ImageNet上畢竟是一個千萬級的圖像數據庫,通常我們可能只能拿到幾千張或者幾萬張某一特定領域的圖像,比如識別衣服啊、標志啊、生物種類等等。在這種情況下重新訓練一個新的網絡是比較復雜的,而且參數不好調整,數據量也不夠,因此fine-tuning微調就是一個比較理想的選擇。

微調網絡,通常我們有一個初始化的模型參數文件,這里是不同於training from scratch,scrachtch指的是我們訓練一個新的網絡,在訓練過程中,這些參數都被隨機初始化,而fine-tuning,是我們可以在ImageNet上1000類分類訓練好的參數的基礎上,根據我們的分類識別任務進行特定的微調。

這里我以一個車型的識別為例,假設我們有431種車型需要識別,我的任務對象是車,現在有ImageNet的模型參數文件,在這里使用的網絡模型是CaffeNet,是一個小型的網絡,其實別的網絡如GoogleNet也是一樣的原理。那么這個任務的變化可以表示為:

 任務:分類
 類別數目:1000(ImageNet上1000類的分類任務)------> 431(自己的特定數據集的分類任務431車型)

那么在網絡的微調中,我們的整個流程分為以下幾步:

  1. 依然是准備好我們的訓練數據和測試數據
  2. 計算數據集的均值文件,因為集中特定領域的圖像均值文件會跟ImageNet上比較General的數據的均值不太一樣
  3. 修改網絡最后一層的輸出類別,並且需要加快最后一層的參數學習速率
  4. 調整Solver的配置參數,通常學習速率和步長,迭代次數都要適當減少
  5. 啟動訓練,並且需要加載pretrained模型的參數

簡單的用流程圖示意一下:

1.准備數據集

這一點就不用說了,准備兩個txt文件,放成list的形式,可以參考caffe下的example,圖像路徑之后一個空格之后跟着類別的ID,如下,這里記住ID必須從0開始,要連續,否則會出錯,loss不下降,按照要求寫就OK。
這個是訓練的圖像label,測試的也同理

2.計算數據集的均值文件

使用caffe下的convert_imageset工具

具體命令是

/home/chenjie/louyihang/caffe/build/tools/convert_imageset /home/chenjie/DataSet/CompCars/data/cropped_image/ ../train_test_split/classification/train_model431_label_start0.txt ../intermediate_data/train_model431_lmdb -resize_width=227 -resize_height=227 -check_size -shuffle true

其中第一個參數是基地址路徑用來拼接的,第二個是label的文件,第三個是生成的數據庫文件支持leveldb或者lmdb,接着是resize的大小,最后是否隨機圖片順序

3.調整網絡層參數

參照Caffe上的例程,我用的是CaffeNet,首先在輸入層data層,修改我們的source 和 meanfile, 根據之前生成的lmdb 和mean.binaryproto修改即可
最后輸出層是fc8,
1.首先修改名字,這樣預訓練模型賦值的時候這里就會因為名字不匹配從而重新訓練,也就達成了我們適應新任務的目的。
1.調整學習速率,因為最后一層是重新學習,因此需要有更快的學習速率相比較其他層,因此我們將,weight和bias的學習速率加快10倍。
原來是fc8,記得把跟fc8連接的名字都要修改掉,修改后如下

4.修改Solver參數

原來的參數是用來training from scratch,從原始數據進行訓練的,因此一般來說學習速率、步長、迭代次數都比較大,在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
訓練的命令如下:

OK,最后達到的性能還不錯accuray 是0.9,loss降的很低,這是我的caffe初次體驗,希望能幫到大家!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM