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とをチェック。Flickrのfine-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と向上しているのがわかる。