Tutorial実装で確認するTensorFlow③(MobileNetによる転移学習)|DeepLearningの実装 #4

f:id:lib-arts:20190530161346p:plain

ライブラリの使い方を中心に取り扱った記事は深い考察になりづらいのであまり書きたくないのですが、DeepLearning系は仕様の変化が早過ぎるので、DeepLearningの実装に関しては諸々のドキュメントのまとめを備忘録も兼ねてシリーズ化していければと考えています。
#1ではKerasのチュートリアルを元にMLP(MultiLayer Perceptron)やCNNの動作確認、#2ではTensorFlowのチュートリアルを元に簡単な動作確認、#3ではMobileNetを用いた画像分類(image classification)の推論を行いました。

#4では#3の続きとして、MobileNetの転移学習(transfer learning)について取り扱います。
以下目次になります。
1. DeepLearningにおける転移学習
2. 転移学習(transfer learning)の実行&実装の確認
3. まとめ


1. DeepLearningにおける転移学習
1節ではDeepLearningにおける転移学習についてまとめていきます。

まずは転移学習についてですが、上記のAutoMLの記事でも言及しましたがしっかりとまとめていなかったので軽く概要についてまとめます。日本語のWikipediaにページが見当たらなかったので、英語版のWikipediaの冒頭を訳します。

===
Transfer learning is a research problem in machine learning that focuses on storing knowledge gained while solving one problem and applying it to a different but related problem. For example, knowledge gained while learning to recognize cars could apply when trying to recognize trucks. This area of research bears some relation to the long history of psychological literature on transfer of learning, although formal ties between the two fields are limited.
===

和訳:『転移学習(Transfer learning)は機械学習における研究課題で、一つの問題を解いた際に得られた知識をストックし異なるが類似のタスクに応用することに焦点を当てる。たとえば、自動車を認識するために得た知識はトラックを認識するのに適用することができる。この研究分野は学習の転移の心理学の文献の長い歴史と形式的には限定された結びつきであるもののなんらかの関連を生み出している。』
上記が簡単な訳になりますが(若干いい加減ではありますが)、最初の二文が機械学習の分脈で考える際は重要です。とにかくあるタスクで学習させた結果を他のタスクに適用するというのが肝になります。
DeepLearningの文脈ではもう少し具体的に大きなデータセット(large dataset)で学習したものを小さなデータセットしかないもので再学習させたり、小さいモデルで学習させた結果を大きいモデルの初期値として用いたりなどを行います。大きなデータセットで学習されたモデルは学習済みモデル(pre-trained model)として公開されているのが近年のトレンドなので、そちらを元に手元のデータセットで学習を行うなども可能です。今回のケースではImageNetで学習されたMobileNetを元に花のデータセットを用いて転移学習を行なっています。
以下コードの実行については2節、実装の確認に関しては3節で行います。


2. 転移学習(transfer learning)の実行&実装の確認
1節ではDeepLearningにおける転移学習の話についてまとめたので、2節では実際にコードを実行していければと思います。

docs/hub_with_keras.ipynb at master · tensorflow/docs · GitHub
#3では上記の前半部分について実行したので、#4では後半部分を実行していきます。
まず、転移学習において用いるデータセットですが、下記では"TensorFlow flowers dataset"を用いるとされています。

f:id:lib-arts:20190602100406p:plain
次に"Run the classifier on a batch of images"のところで転移学習を行わずにImageNetで学習したままのモデルで推論を行なっています。下記のように推論結果が出力されます。
ImageNetは1,000クラス分類問題のため、daisyはいくつかあたっているものの、他の花もdaisyで分類されたり花瓶(vase)だと他のものにフォーカスを当てて分類を行なってしまっています。このように、ImageNetをそのまま用いただけだと細かい品種の問題はできていません。
この問題について解決するために、headless modelをダウンロードし転移学習を行います。この手のタスク特化型の転移学習では入力に近い畳み込み層には画像の認識における根本的な情報が残っており、反対に出力側にはタスク固有の情報が多く残るとされています。

f:id:lib-arts:20190602100431p:plain
上記の流れでダウンロードしたfeature_extractor_layerの次のレイヤーに今回の分類目的の5クラス分のノードを追加しています。それぞれは途中の処理過程でclass_namesを出力することで、『'Daisy', 'Dandelion', 'Roses', 'Sunflowers', 'Tulips'』の5つのクラスを確認することができます。

f:id:lib-arts:20190602104128p:plain
学習データについては一通り把握できたので、次に上記の学習コードを動かします。Kerasの用法としては、model.compileで誤差関数や最適化の設定を行い、model.fitで学習を行います。
学習結果の記述にあたって実装が足されていますが、大まかな流れを掴むにあたってはcompileとfitだけおさえておけば十分です。また実際に学習済みのモデルを元に推論を行なった結果が以下のようになります。

f:id:lib-arts:20190602104151p:plain


3. まとめ
#4ではImageNetで学習させたモデルを元にした転移学習について取り扱いました。
#5ではPix2Pixについて取り扱っていきます。