v4の転移学習みなさんこんにちは。技術開発室の岡田です。前回の投稿では、エッジデバイス上での画像認識技術についてご紹介しました。Classification(物体認識)に用いるモデル(分類機)の作成方法についてご紹介します。画像認識の分野では転移学習と呼ばれる方法でモデルを作成することが多いです。転移学習は既存のモデルを利用してモデル作成を行うもので、今回も転移学習を用いてモデルを作成しますが、転移学習については多くの文献が存在しています。v4のモデルを転移学習で作成する方法を説明します。v3/v4の性能比較もしてみたいと思います。モデル作成になります。画像認識のニューラルネットワーク現在、主に画像認識の精度の向上や処理速度の向上、軽量化(容量削減)を目的として、多くの画像認識用のニューラルネットワークが提案されています。CNN)の画像認識精度が高いことが知られており、これを組み込んだ構成のニューラルネットワークが一般的に使われるようになっています。代表的なものは下表のようなものがあります。詳細は、良くまとまっている文献が多くあります*1ので、ここでの説明は割愛させていただきます。畳み込み層とプーリング層から構成されるシンプルなモデル。層の深さが性能にどのような影響を与えるのかを検証することが目的でシンプルな構成としていた。現在でもそのシンプルさから多くの技術者がこれをベースのネットワークが好んで使われることがあるとのこと。モジュールと呼ばれるネットワークを重ねてCNNを作っている。このモジュール内では入力を分岐して(層を横に広げて)異なるサイズのフィルターで畳込みを行い、最後にその結果を結合する構成になっている。residualモジュールと呼ばれるスキップ構造を導入することで層の深いネットワークにおいて効率的な学習を可能にしている。空間方向とチャネル方向に独立に畳み込みを行うことで軽量化を図ったネットワーク。エッジデバイス用にはこのネットワークを用いるのが一般的。おける学習とはネットワークの最適な重みを探索することです。良い精度のモデルを作成するためには、多くの学習データ、時間、計算機リソースを用い、より良い重みを探していく必要があります。多くの場合はこれを行うための十分なデータが集められない、時間や計算機リソースに制約があるなどの問題が発生します。転移学習は、すでに学習済みのモデルを用いることでより効率的にモデルを作成する方法です。似たような問題領域で学習したモデルは、似たような新しい問題領域にも適応できるであろうという仮説のもと、学習済みモデルの一部を変更して新しい問題を解くモデルを作成します。これにより一から学習を行うよりも少ない時間で精度の高いモデルを作ることができるようになります。「将棋の羽生さんはチェスもかなり強い!(参考)それと同じ!」というのと同じようなことです。・・・と、私は説明されたことがありますが、わかったような、わからないような・・・。いえ、転移学習自体は論文等でも多く言及されており、実績もあるものですので、そちらをご確認いただくといいかもしれません*2。ところで、転移学習はその方法で大きく二つにわけることができます(分類の仕方によって三つの場合もある)。一つは、学習済みのモデルを特徴抽出器として用いて、最後の出力層を学習し直すもの。一つは、学習済みモデルの最後の出力層より手前のいくつかの層も学習し直すもの。後者はファインチューニングと呼ばれたりもします。これらの詳細は、使いどころや注意点など含めこのページにわかりやすく記載されていますので一読されると良いかと思います。今回は、前者の学習済みのモデルを特徴抽出器として用いる方で転移学習を行います。転移学習実践ここから、実際に転移学習を行っていきますが、はじめに示したとおり、ここはざっくりとした説明とリファレンスのみです。Poetsを実践することだと思います。v3の転移学習を行うことができます。騙されたと思って、やってみてください。1時間もかからずに新しいモデルを作成することができます。このチュートリアルでは、花を分類する例題になっていますが、ご自身で分類させたい画像データをお持ちでしたら、例題を真似て適当なフォルダ構成で画像ファイルを配置してください。scripts.retrain'の'--image_dir'オプションに画像データのフォルダを指定してあげれば、あなただけの新しいモデルを作成することができます。いかがでしょうか、できましたでしょうか?もしこれが初めて作成したモデルでしたら、結構精度高く分類してくれるので驚くのではないかと思います。V4の転移学習もできるようにしていきましょう。V4の転移学習tensorflow-for-poets2は転移学習のためのチュートリアル用のスクリプトではありますが、大変高機能です。Augmentationをサポートしていたり、転移学習を高速化するためのキャッシュ機構を持っていたりします。v3のみであり、長い間対応モデルの追加はされていません。このため、より新しい精度の高いモデルの転移学習には使うことができません。そこで、ここではコードを少しハックして他のモデルも使えるようにしてみることにします。言うまでもないと思いますが、これはあくまでもチュートリアルのスクリプトを実験的に改変しているものです。プロダクション用途に使用できるかは別途検証が必要になることにご注意ください。今回は2019/7/7時点で最新のtensorflow-for-poets2のソースを対象とします。tensorflow-for-poets2をcloneすると、scriptsというフォルダが作成されます。今回はこの中の次のファイルを改変します。retrain.pyretrain.pyの改変retrain.pyは転移学習を行う処理が記載されたスクリプトです。難しい内容が含まれていますが、今回変更する部分はcreate_model_info関数です。'inception_v3'などの条件分岐が記載されているのが、各転移学習の転移元のモデルを定義する部分になっています。このため、この条件分岐のところに使いたいモデルの情報を追記すれば良さそうです。127.5の後ろに次に内容を追記します。127.5転移学習の開始スクリプトの変更が完了したら、早速転移学習を行ってみたいと思います。スクリプトの実行方法はオリジナルのtensorflow-for-poet2と同じです。必要なパラメータを書き換えてください。v2の例は次のとおりです。完了したら推論を実行してうまく学習できているかを確認します。こちらもスクリプトの実行方法はオリジナルのtensorflow-for-poet2と同じです。必要なパラメータを書き換えてください。v2の例は次のとおりです。--input_height=224どうでしょうか、ご期待の推論がなされているのではないかと思います。v3と性能比較してみます。このデータセットには37カテゴリーのかわいいペットの画像が200枚ずつ格納されています。今回は、トレーニング用に180枚、テスト用に20枚という内訳で分割してトレーニングを行います。各モデルの転移元のモデルは次のものを使っています。https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_1.4_224.tgzトレーニングは2000エポックで統一しています。本当なら学習曲線で確認しながらが良いですが、今回は簡易評価なので手抜きをしています。次の表が各モデルの性能評価の結果です。0.94※各値はmacroの値です。v2がすべての値で成績がよく最も良いモデルになったようです。上記のとおり、チューニング等甘いところがありますのでご参考程度と考えてください。プロジェクトで使う場合は、実際にいくつかのモデルを作成してみて、どれがユースケースに適しているかを確認して使用するようにしてください。Matrixもつけておきます。字が細かくてすみません。v3/v4)の作成方法についてご紹介しました。liteやtensorflowjsのモデルに変換してエッジデバイス上でも使うことができるようになりますので、興味があれば是非チャレンジしてみてください。(まだ計画していませんが、エッジデバイス上で動かすまでについても投稿するかもしれません。)今回は、前回に比べていくらか技術的な内容を盛り込めたかと思います。次回もこんな感じで記載していこうと思います。v4の転移学習Tweet関連記事2020-02-13SalesforceのプラットフォームイベントをPostmanから発行するこんにちは、技術開発室の藤野です。2019の20日目の記事です。