Deep learning系列(十三)Transfer learning 和 caffe Fine-tuning__深度學習

來源:互聯網
上載者:User
1. Transfer Learning

在實踐中因為資料庫大小的限制,我們通常不會從頭開始(參數隨機初始化)訓練卷積神經網路。相反,通常會在一個大的資料庫上(比如ImageNet,包含1000類總數為120萬的映像分類資料庫)進行CNN的訓練,得到訓練好的網路(下面簡稱ConvNet),然後ConvNet以下面兩種方式用到我們的項目中: 將ConvNet作為特徵提取器。去掉ConvNet最後一層全串連層,將ConvNet剩下的部分當作特徵提取器用到我們的分類任務中。對於AlexNet來說,這將產生一個4096維的特徵向量,用這得到的特徵向量,訓練一個線性分類器(線性SVM或者softmax分類器),用在我們的分類任務中。 用新資料庫的資料微調ConvNet。對於在ImageNet預訓練的網路ConvNet,我們可以在新的資料庫上使用反向傳播演算法微調它的權重參數。在微調過程中,既可以調整所有層的參數,也可以將前幾層的參數固定,微調後面幾層。這樣做的原因在於預訓練的網路前幾層通常是通用的特徵(比如邊緣提取器),而網路的後幾層則是與資料庫和分類任務相關的,因而可以在給定新的資料庫和分類任務時僅調整後面幾層。 2. 怎樣fine-tune

在fine-tune時,究竟該選擇哪種方式的Transfer Learning。需要考慮的因素有許多,其中最重要的兩條是新資料庫的規模和它與預訓練資料庫的相似程度,根據這兩條因素的不同配置,存在四種情境: 新資料庫小,和預訓練資料庫相似。因為資料庫比較小,fine-tune的話可能會產生過擬合,比較好的做法是用預訓練的網路作為特徵提取器,然後訓練線性分類器用在新的任務上。 新資料庫比較大,和預訓練資料庫相似。這種情況下,不用擔心過擬合,可以放心地微調整個網路。 新資料庫小,和預訓練資料庫不相似。這時,既不能微調,用預訓練網路去掉最後一層作為特徵提取器也不合適,可行的方案是用預訓練網路的前面幾層的啟用值作為特徵,然後訓練線性分類器。 資料庫大,和預訓練資料庫不相似。這時可以從頭開始訓練,也可以在預訓練的基礎上進行微調。 3. 用caffe進行fine-tune

和從頭開始訓練CNN一樣,用caffe進行微調也可以分解為四步: 將資料轉化為caffe能處理的格式; 定義net; 定義solver; 在預訓練的權重基礎上進行訓練。 3.1. 資料格式轉化

最常用的格式是LMDB,假設我們下載的資料庫是圖片的格式,訓練庫放在txt檔案中,每行包含圖片的地址和類別標籤[path/to/image.jpeg] [label]:

/home/dumengnan/caffe-master/data/flickr_style/images/12123529133_c1fb58f6dc.jpg 16/home/dumengnan/caffe-master/data/flickr_style/images/11603781264_0a34b7cc0a.jpg 12...

將其轉化為LMDB使用的函數是convert_imageset,調用.sh檔案內容如下:

EXAMPLE=data/flickr_styleDATA=data/flickr_styleTOOLS=build/toolsTRAIN_DATA_ROOT=/# Set RESIZE=true to resize the images to 256x256. Leave as false if images have# already been resized using another tool.RESIZE=trueif $RESIZE; then  RESIZE_HEIGHT=256  RESIZE_WIDTH=256else  RESIZE_HEIGHT=0  RESIZE_WIDTH=0fiecho "Creating train lmdb..."# GLOG_logtostderr含義是在/tmp目錄下輸出日誌# shuffle含義是對資料庫圖片進行排序GLOG_logtostderr=1 $TOOLS/convert_imageset \    --resize_height=$RESIZE_HEIGHT \    --resize_width=$RESIZE_WIDTH \    --shuffle \    $TRAIN_DATA_ROOT \    $DATA/train.txt \    $EXAMPLE/flickr_train_lmdbecho "Creating test lmdb..."GLOG_logtostderr=1 $TOOLS/convert_imageset \    --resize_height=$RESIZE_HEIGHT \    --resize_width=$RESIZE_WIDTH \    --shuffle \    $TRAIN_DATA_ROOT \    $DATA/test.txt \    $EXAMPLE/flickr_test_lmdbecho "Done."

轉化結束後,在flickr_train_lmdb和flickr_test_lmdb檔案夾中儲存了lmdb檔案。 3.2. 定義net

微調參數時,儲存net的.prototxt檔案可以直接複製預訓練時使用的.prototxt檔案,然後進行以下修改: 修改data層; 修改output層,包括層的名字和輸出類別數; 減小batch的大小(和GPU的大小成比例); 降低前幾層的學習率(可以將學習率置為0,所謂凍結這一層的參數),升高最後一層的學習率。

修改層的名字的原因是使用不同的名字,預訓練網路中該層的參數會重新初始化,如下圖所示:


3.3. 定義solver

儲存solver的.prototxt檔案同樣不需要重新去寫,拷貝預訓練時使用的.prototxt檔案,進行以下修改: 將net從預訓練使用的net換為現在使用的net; 降低學習率(除以100),這樣做的原因是相比隨機初始化的權重參數,預訓練的參數已相對較好了,不需要更新太快; 可以修改最大迭代次數和snapshot。 3.4. 訓練

相比使用參數隨機初始化的訓練,在預訓練的基礎上進行訓練的話調用命令時增加一個-weight參數,並給出預訓練參數的儲存位置,如下所示:

./build/tools/caffe train -solver models/finetune_flickr_style/solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel
4. fine-tune的結果

新的資料庫是flickr資料庫,分類任務是進行20類的分類(預訓練的分類任務是1000類分類),使用圖片的數量為700張左右,機器的顯卡是GTX970,經過6個小時的訓練(迭代次數為80000次),分類準確率收斂到34%左右。

參考資料:
1. http://caffe.berkeleyvision.org/gathered/examples/finetune_flickr_style.html
2. http://cs231n.github.io/transfer-learning/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.