[Keras/TensorFlow] 転移学習(Fine-tuning)

  • 13
    いいね
  • 0
    コメント

目的

ゼロからKerasとTensorFlow(TF)を自由自在に動かせるようになる。
そのための、End to Endの作業ログ(備忘録)を残す。
※環境はMacだが、他のOSでの汎用性を保つように意識。
※アジャイルで執筆しており、精度を逐次高めていく予定。

目次

概要

このページを読んでできるようになること

  • VGG16のFine-tuningによる17種類の花の分類 で紹介されている fine tuning のサンプルプログラムを動かす。
  • 上記の学習はCPUだと2日間近くかかるため、事前に用意してある学習済みのパラメータを読み込み、学習結果を確認する。

転移学習(Fine-tuning)とは

Chainerでファインチューニングするときの個人的ベストプラクティス より抜粋

ニューラルネットを学習するために、別の問題、別のデータセットで学習済みのモデルのパラメータをコピーして、それを新しいニューラルネットのパラメータの初期値として使うことをファインチューニングといいます。
典型的なケースとして、一般物体認識のデータセットであるImageNetで学習したネットワークを物体検出やSemantic Segmentationといった別の問題に使用するといった例があります。

一般的にDeep Learningでは大量の学習データが必要とされていますが、あらかじめ(大量のデータで)学習したモデルを初期値として使いファインチューニングすることで、実際に解きたい問題に関するデータの量が不十分でも十分な性能を達成できる場合があります。また、学習にかかる時間を短縮する効果もあります。

ソースコード

https://github.com/deer-dslab/keras-example

動作確認環境

macOS Sierra
Python 3.4
Anaconda3
TensorFlow 1.0.1

Mac で動作確認していますが、Windows でも 事前準備の brew コマンド以外は同様だと思います。

前提条件

事前準備

サイズの大きいバイナリファイルを扱うための Git LFS 導入 しておく

$ brew install git-lfs

ディレクトリ構成

keras-example/
 ├ fine-tuning.py
 └ dataset/
   ├ jpg/
   └ labels.txt/

ダウンロード

ソースコード

リポジトリ keras-example を GitLFS を使用して clone する

$ git lfs clone https://github.com/deer-dslab/keras-example.git

データセット

  1. 17 Category Flower Dataset ページの Downloads から Dataset images をクリックして 17flowers.tgz をダウンロードする
  2. 17flowers.tgz を解凍して出てきた jpg/ ディレクトリを dataset/ 下に配置する

前処理

  1. setup.py を実行して、画像データを学習用とテスト用に分ける
$ cd path-to-project/keras-example/fine-tuning
$ python setup.py

転移学習の実行(fine-tuning)

fine-tuning.py を実行する

$ cd path-to-project/keras-example/fine-tuning
$ python fine-tuning.py

そして (CPU環境では) 2日弱待ちます。。
ちなみに、実行中のキャンセルは例によって ctrl + C です

コード解説

fine-tuning.py
    vgg16 = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor)
    # vgg16.summary()

    # FC層を構築
    # Flattenへの入力指定はバッチ数を除く
    top_model = Sequential()
    top_model.add(Flatten(input_shape=vgg16.output_shape[1:]))
    top_model.add(Dense(256, activation='relu'))
    top_model.add(Dropout(0.5))
    top_model.add(Dense(nb_classes, activation='softmax'))

    # 学習済みのFC層の重みをロード
    # top_model.load_weights(os.path.join(result_dir, 'bottleneck_fc_model.h5'))

    # VGG16とFCを接続
    model = Model(input=vgg16.input, output=top_model(vgg16.output))
  • include_top はVGG16のトップにある1000クラス分類するフル結合層(FC)を含むか含まないかを指定する (※ KerasでVGG16を使う より抜粋)。 今回は VGG16 の 1000 クラス分類ではなく、出力層を 17 クラス分類にするため include_top=False とし、新たに定義した出力層 top_model を使用している。

学習結果を試す

2日待てない場合は、学習後のパラメータファイル finetuning-sample.h5keras-example/fine-tuning/dataset/results/ に置いてあります。

これを読み込んで動作確認してみます。

$ cd path-to-project/keras-example/fine-tuning
$ python predict.py dataset/test_images/Tulip/image_0003.jpg 

('Tulip', 0.99381989)
('Daffodil', 0.0060764253)
('Sunflower', 5.0716473e-05)
('Windflower', 3.6588597e-05)
('Cowslip', 1.2691652e-05)

99% の確率でチューリップという結果がでました。

コード解説

学習時と同様にモデルを定義した後、パラメータ finetuning-sample.h5 をロードして上書きしている。

predict.py
# VGG16とFCを接続
model = Model(input=vgg16.input, output=fc(vgg16.output))

# 学習済みの重みをロード
model.load_weights(os.path.join(result_dir, 'finetuning-sample.h5'))

参考資料

目次

http://qiita.com/agumon/items/91f897b7f260f6aeca95

参考サイト

その他

VGG16とは