Tutorial実装で確認するTensorFlow②(MobileNetによる画像分類とTensorFlow Hub)|DeepLearningの実装 #3

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

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

#3では同様にTensorFlowのチュートリアルから、MobileNetによる画像分類について取り扱います。また、学習済みのモデルを使用するにあたって、TensorFlow Hubというライブラリが用いられているのでこちらについても簡単にまとめます。
以下目次になります。

1. 画像分類(image classification)とMobileNet
2. MobileNetを用いた推論の実行
3. 推論用の実装の確認&TensorFlow Hubについて
4. まとめ

 

1. 画像分類(image classification)とMobileNet
画像分類については下記にサンプルコードがあります。

docs/hub_with_keras.ipynb at master · tensorflow/docs · GitHub
これを実行していくことで、MobileNetを用いた画像分類において推論や転移学習(transfer learning)を行うことができます。

docs/hub_with_keras.ipynb at master · tensorflow/docs · GitHub
また、上記で日本語標記もあるようなので、日本語で読みたい方はこちらを確認すると良いかと思われます(なんとなく読みにくい日本語だったので、今後の解説は基本的にEnglishバージョンをベースで話を進めていきます)。ちなみに#3で転移学習まで一気に取り扱おうと思ったのですが途中で出てくるTensorFlow Hubの把握の方が優先順位が高いと思われたため、#3では画像分類の推論のところを中心に取り扱います。

さて、画像分類(image classification)問題に関してですが、こちらの問題(タスク)についてはILSVRCの画像識別問題が基本的にベンチマークとして用いられてきているため、軽く補足しておきます。ILSVRCは"ImageNet Large Scale Visual Recognition Challenge"の略で、画像における大規模データセットであるImageNetのデータを元に2010年〜2017年まで行われていた世界的な画像認識のコンペティションです。
ILSVRCを考えるにあたって重要になるのが、DeepLearningブームの火付け役となったAlexNet[2012]に始まり、VGGNet[2014]、GoogLeNet[2014]、ResNet[2015]までのネットワーク構造の研究です。これらの取り組みにおいてDeepLearningの認識精度は大きく向上しました。ここまでの発展において、ILSVRCの果たした貢献は大きかったと考えることができます。
ResNetで1,000クラス分類問題のTop5エラー率が5%を切り、人間の精度を上回ったとされています。精度向上についてはここまでが汎用的な結果として見られることが多く、その後は物体検出(Object Detection)や意味分割(Semantic Segmentation)、深層強化学習などの応用タスクへの展開や計算やモデルサイズの軽量化の研究が中心に推移してきています。
その軽量化の文脈で、Googleが2017年に出したのがMobileNetです。MobileNetはDepthwise Separable Convolutionという、空間方向とチャネル方向の畳み込みを分けたネットワークです。

MobileNetについては上記の記事でも記したので詳しくは割愛しますが、AlexNetやVGGNetなどと比較して同様の精度をそれぞれ少ないパラメータ数で実現しています。そのため、チュートリアルのように手軽さが求められるケースでは採用されやすいのだと思われます。
2節では実際にMobileNetの学習済みモデルを用いて推論の実行を行います。


2. MobileNetを用いた推論の実行
2節では下記のコードを実際に動かしていきます。

docs/hub_with_keras.ipynb at master · tensorflow/docs · GitHub

動かすにあたってTensorFlow Hubが入っていなければ先にインストールする必要があります。

f:id:lib-arts:20190531182044p:plain
上記のDecode the predictionのところまで動かすと、下記の推論結果を出力することができます。

f:id:lib-arts:20190531182103p:plain
ちなみに引数としているgrace_hopperはアメリカ海軍の軍人かつ計算機科学者で、プログラミング言語COBOLを開発した方だそうです。

グレース・ホッパー - Wikipedia
一通り推論コードを動かすことができたので、3節では実装の中身を確認していければと思います。

 

3. 推論用の実装の確認&TensorFlow Hubについて
実装を動かすにあたってまず印象深いのは、以前のTensorFlowと比較して大きく仕様が変わっていることです。チュートリアルということもあってか、Kerasライクな実装に大きく変わっています。

classifier = tf.keras.Sequential([
    hub.KerasLayer(classifier_url, input_shape=IMAGE_SHAPE+(3,))
])

一番注目すると良いのが、上記のところでモデルをダウンロードしclassifierに代入しているということです。

result = classifier.predict(grace_hopper[np.newaxis, ...])

上記でモデル(classifier)のpredictメソッドを用いて推論を行なっています。このように、推論にあたっては非常にシンプルなAPIとなっています。

大体の流れについて把握した上でここで気になるのが、モデルのロード(今回の場合はTensorFlow Hubから落としてきているのでDownload)に関してです。ロードを行うにあたって、tf.keras.Sequentialに引数としてhub.KerasLayer(classifier_url, input_shape=IMAGE_SHAPE+(3,))を与えることでロードを行なっています。tf.keras.Sequentialについては通常のKerasの仕様(API)のため、そこまで気にしなくて良いと思いますが、ここで気になるのがhub.KerasLayerです。

import tensorflow_hub as hub

冒頭部で上記のように読み込んでいるので、こちらはTensorFlow Hubのメソッドのようです。

TensorFlow Hub  |  TensorFlow

GitHub - tensorflow/hub: A library for transfer learning by reusing parts of TensorFlow models.
TensorFlow Hubのドキュメントや実装については上記でまとまっています。

f:id:lib-arts:20190531184632p:plain
上記はドキュメントのキャプチャですが、要点だけまとめると「機械学習のモデルの再利用性を高め、転移学習などに用いやすくする」と考えておけば良さそうです。転移学習を行うことにより、「より小さなデータセットで学習し、汎用性を高め、学習のスピードを早くする」ことができるとされています。

hub/keras_layer.py at master · tensorflow/hub · GitHub
今回のhub.KerasLayerの実装は上記にあるようなので、軽くだけ目を通しておきます。

f:id:lib-arts:20190531184658p:plain
上記のように"class KerasLayer(tf.keras.layers.Layer)"が見つかりました。細かく読むのは大変そうなので、一旦ライブラリの構成がなんとなくつかめたことでここまでとします。


4. まとめ
#3では画像分類(image classification)問題に対するMobileNetを用いた推論の実行とコードの確認を行いました。
TensorFlow Hubがなかなか便利そうな印象でした。
#4では、転移学習(transfer learning)について実行し、コードの確認を行いたいと思います。