1. 程式人生 > >深度學習之模型fine-tuning(微調網路)

深度學習之模型fine-tuning(微調網路)

目前呢,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初次體驗,希望能幫到大家!