目的
ゼロからKerasとTensorFlow(TF)を自由自在に動かせるようになる。
そのための、End to Endの作業ログ(備忘録)を残す。
※環境はMacだが、他のOSでの汎用性を保つように意識。
※アジャイルで執筆しており、精度を逐次高めていく予定。
目次
- Keras(Tensorflow)の環境構築
- KerasでMINSTの学習と予測
- KerasでTensorBoardの利用
- Kerasで重みファイルの保存/読み込み
- Kerasで自前データの学習と予測
- Kerasで転移学習 <---いまココ
概要
このページを読んでできるようになること
- VGG16のFine-tuningによる17種類の花の分類 で紹介されている fine tuning のサンプルプログラムを動かす。
- 上記の学習はCPUだと2日間近くかかるため、事前に用意してある学習済みのパラメータを読み込み、学習結果を確認する。
転移学習(Fine-tuning)とは
※ Chainerでファインチューニングするときの個人的ベストプラクティス より抜粋
ニューラルネットを学習するために、別の問題、別のデータセットで学習済みのモデルのパラメータをコピーして、それを新しいニューラルネットのパラメータの初期値として使うことをファインチューニングといいます。
典型的なケースとして、一般物体認識のデータセットであるImageNetで学習したネットワークを物体検出やSemantic Segmentationといった別の問題に使用するといった例があります。
一般的にDeep Learningでは大量の学習データが必要とされていますが、あらかじめ(大量のデータで)学習したモデルを初期値として使いファインチューニングすることで、実際に解きたい問題に関するデータの量が不十分でも十分な性能を達成できる場合があります。また、学習にかかる時間を短縮する効果もあります。
ソースコード
動作確認環境
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
データセット
-
17 Category Flower Dataset ページの Downloads から Dataset images をクリックして
17flowers.tgz
をダウンロードする -
17flowers.tgz
を解凍して出てきたjpg/
ディレクトリをdataset/
下に配置する
前処理
- 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
です
コード解説
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.h5
を keras-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
をロードして上書きしている。
# VGG16とFCを接続
model = Model(input=vgg16.input, output=fc(vgg16.output))
# 学習済みの重みをロード
model.load_weights(os.path.join(result_dir, 'finetuning-sample.h5'))
参考資料
目次
参考サイト
- Kerasオリジナル
- (Kerasチュートリアル要約) 少ないデータでパワフルな画像分類を実現するために
- VGG16のFine-tuningによる17種類の花の分類
- 転移学習(Transfer Learning)を用いた、効率的なモデル作成
その他
VGG16とは
- Visual Geometry Group の16層ニューラルネットワーク(ソース:http://aidiary.hatenablog.com/entry/20170104/1483535144#f-2eb00bea)
- KerasでVGG16を使う
- VGG16のFine-tuningによる犬猫認識 (1)
- VGG16のFine-tuningによる犬猫認識 (2)
- VGG16のFine-tuningによる17種類の花の分類