覚え書きブログ

Deep Learning覚え書き(Caffenetのfine-tuning)

Caffenetの学習済みモデル(bvlc_reference_caffenet.caffemodel)を、Flickrの画像を使ってfine-tuningしてみた。基本的には、caffeのチュートリアルを参考にした。

まずは、Flickrから画像をダウンロード。

> python examples/finetune_flickr_style/assemble_data.py --workers=1 --images=2000 --seed 831486
Downloading 2000 images with 1 workers...
Writing train/val for 2000 successfully downloaded images.

「workers=-1」だとエラーが出たので、「workers=1」に設定して実行した。

次に、models/models/finetune_flickr_style/のsolver.prototxtとtrain_val.prototxtとをチェック。Flickrfine-tuning用とImageNet2012のpre-training用では、主に次の点で異なる。

  • ImageNet2012では1000クラスあるのに対し、Flickrでは20クラスしかないため、fully connected層の出力数(train_val.prototxtのfc8_flickrのnum_output)は20に設定
  • ImageNet2012で学習済みのCaffenetをFlickrで再学習するので、全体の学習率を0.001と低く設定(solver.prototxtのbase_lr)。ただし、fully connected層は、Flickrの20クラス用に新規に学習する必要があるため、重みパラメータとバイアスパラメータのblobs_lrをそれぞれ10と20と高い値に設定
layers {
  name: "fc8_flickr"
  type: INNER_PRODUCT
  bottom: "fc7"
  top: "fc8_flickr"
  # blobs_lr is set to higher than for other layers, because this layer is starting from random while the others are already trained
  blobs_lr: 10
  blobs_lr: 20
  weight_decay: 1
  weight_decay: 0
  inner_product_param {
    num_output: 20
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}

最後に、bvlc_reference_caffenet.caffemodelをパラメータの初期値として、Flickrのデータを用いてCaffenetを更新する。

> ./build/tools/caffe train -solver models/finetune_flickr_style/solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel

I0221 07:19:16.347483 11711 solver.cpp:160] Solving FlickrStyleCaffeNet
I0221 07:19:16.347637 11711 solver.cpp:161] Learning Rate Policy: step
I0221 07:19:16.347710 11711 solver.cpp:264] Iteration 0, Testing net (#0)
I0221 07:44:24.154173 11711 solver.cpp:315]     Test net output #0: accuracy = 0.0468
I0221 07:45:07.876698 11711 solver.cpp:209] Iteration 0, loss = 4.03495
I0221 07:45:07.877579 11711 solver.cpp:445] Iteration 0, lr = 0.001
I0221 07:59:22.261471 11711 solver.cpp:209] Iteration 20, loss = 3.13825
I0221 07:59:22.265858 11711 solver.cpp:445] Iteration 20, lr = 0.001
I0221 08:13:32.546468 11711 solver.cpp:209] Iteration 40, loss = 2.62929

...

I0221 19:49:16.804013 11711 solver.cpp:209] Iteration 980, loss = 0.025264
I0221 19:49:16.804239 11711 solver.cpp:445] Iteration 980, lr = 0.001
I0221 20:03:18.673755 11711 solver.cpp:334] Snapshotting to models/finetune_flickr_style/finetune_flickr_style_iter_1000.caffemodel
I0221 20:03:25.134783 11711 solver.cpp:342] Snapshotting solver state to models/finetune_flickr_style/finetune_flickr_style_iter_1000.solverstate
I0221 20:03:27.052242 11711 solver.cpp:264] Iteration 1000, Testing net (#0)
I0221 20:32:01.976197 11711 solver.cpp:315]     Test net output #0: accuracy = 0.2512
I0221 20:32:48.852264 11711 solver.cpp:209] Iteration 1000, loss = 0.198099
I0221 20:32:48.853659 11711 solver.cpp:445] Iteration 1000, lr = 0.001

最初は、loss=4.03495、accuracy=0.0468しかなかったが、1000回の更新後には、loss=0.198099、accuracy=0.2512と向上しているのがわかる。