caffe學習筆記10 -- Fine-tuning a Pretrained Network for Style Recognitio

這是caffe官方文檔Notebook Examples中的第四個例子,鏈接地址:http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/03-fine-tuning.ipynb

這個實例用於在與訓練好的網絡上微調flickr_style數據。用已經訓練好的caffe網絡微調自己的數據。這種方法的好處在於,與訓練網絡從大量的圖片數據集中學習而來,其中間層可以捕獲一般視覺表現的“語義”, 可以將其看做一個包含強大特徵的黑盒子,我們僅需要幾層就能獲得好的數據特徵。

首先,我們需要保存數據,包含如下幾步:

  • 獲取ImageNet ilsvrc與訓練的模型
  • 下載Flickr style數據集的一個子集
  • 將下載的數據編譯爲caffe可以使用的格式

1. 導入程序需要的包:

import os
caffe_root = '/home/sindyz/caffe-master/'
os.chdir(caffe_root)
import sys
sys.path.insert(0,'./python')

import caffe
import numpy as np
from pylab import *

2. 導入數據和模型

# This downloads the ilsvrc auxiliary data (mean file, etc),
# and a subset of 2000 images for the style recognition task.
!data/ilsvrc12/get_ilsvrc_aux.sh
!scripts/download_model_binary.py models/bvlc_reference_caffenet
!python examples/finetune_flickr_style/assemble_data.py \
    --workers=-1 --images=2000 --seed=1701 --label=5

3. 比較一下兩種模型的不同

!diff models/bvlc_reference_caffenet/train_val.prototxt models/finetune_flickr_style/train_val.prototxt  

輸出這裏省略


4. 用python學習,比較微調後的結果與直接訓練的結果

niter = 200
# losses will also be stored in the log
train_loss = np.zeros(niter)
scratch_train_loss = np.zeros(niter)

caffe.set_device(0)
caffe.set_mode_gpu()
# We create a solver that fine-tunes from a previously trained network.
solver = caffe.SGDSolver('models/finetune_flickr_style/solver.prototxt')
solver.net.copy_from('models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')
# For reference, we also create a solver that does no finetuning.
scratch_solver = caffe.SGDSolver('models/finetune_flickr_style/solver.prototxt')

# We run the solver for niter times, and record the training loss.
for it in range(niter):
    solver.step(1)  # SGD by Caffe
    scratch_solver.step(1)
    # store the train loss
    train_loss[it] = solver.net.blobs['loss'].data
    scratch_train_loss[it] = scratch_solver.net.blobs['loss'].data
    if it % 10 == 0:
        print 'iter %d, finetune_loss=%f, scratch_loss=%f' % (it, train_loss[it], scratch_train_loss[it])
print 'done'

輸出省略。。。


5. 查看訓練損失


可見,微調方法產生的損失波動平滑,而且比直接使用模型的損失小。


6. 將較小值部分放大:

plot(np.vstack([train_loss, scratch_train_loss]).clip(0, 4).T)


7. 查看經過200次迭代後,測試準確率,我們看到分類任務中有5個類別,隨機測試的準確率爲20%,與我們預期的一樣,微調的結果要好於直接使用模型的結果。

test_iters = 10
accuracy = 0
scratch_accuracy = 0
for it in arange(test_iters):
    solver.test_nets[0].forward()
    accuracy += solver.test_nets[0].blobs['accuracy'].data
    scratch_solver.test_nets[0].forward()
    scratch_accuracy += scratch_solver.test_nets[0].blobs['accuracy'].data
accuracy /= test_iters
scratch_accuracy /= test_iters
print 'Accuracy for fine-tuning:', accuracy
print 'Accuracy for training from scratch:', scratch_accuracy

Accuracy for fine-tuning: 0.547999998927

Accuracy for training from scratch: 0.218000002205


 

參考資料:

http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/03-fine-tuning.ipynb




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章