views4GCPのストレージサービスについてまとめてみた。Exp:3019MLエンジニアをやっています。直近では、製造業向け画像解析、ECサイトの売上予測などの案件に携わっています。バスケが好きなので、今年はスポーツアナリティクスに挑戦したい思っています。Hub(TF-HUB)を使った花画像の分類を試してみます。プログラムについてはTF-HUBの公式チュートリアルがわかりやすかったのでそれを参考にしています。一連のプロセスの中で独自に画像データを収集し、それを教師データにして学習できるかもやってみます。Hubという機械学習の事前学習済みモデルが集まった書庫のようなリポジトリがあります。これは、機械学習モデルの再利用可能な部分を公開・利用・発見するためのライブラリです。TensorFlowグラフの自己完結型のピースで、転移学習という手法によって、異なるタスク間で重みや資産を再利用する事ができます。転移学習のメリットは次の通りです。Hub(TF-HUB)を試してみましょう。以下のURLからTF-HUBのページにアクセスします。https://tfhub.dev/TF-HUBのトップページが表示されました。現在(2019/3/28)だと227個の事前学習済みモデルが登録されています。内訳は以下の通りです。Preview」バージョンのモジュールが利用可能です。0.3.0がインストールされた環境で実行するようにしてください。モデルの検索さて、実際にモデルを検索してみましょう。検索窓から「tf2」、モジュールタイプが「image-feature-vector」で絞り込むと以下の2つが出てきます。これらのモデルについては後述しますが、ここでは2行目の「tf2-preview/inception_v3/feature_vector」を選択してください。事前学習済みモデル「tf2-preview/inception_v3/feature_vector」の概要ページが表示されました。モデルの特徴や、掲載された論文、元となったデータセットの説明等が載っています。notebooks」からColaboratoryのチュートリアルページへアクセスできます。「ランタイム」→「ランタイムのタイプを変更」から「ノートブックの設定」が開けます。「ランタイムのタイプ」は「Python3」、「ハードウェアアクセラレータ」は「GPU」を選択し、保存してください。Colaboratoryの使い方についてはこちら↓の記事が詳しいので参照してみてください。availableバージョンは最新版の「2.0.0-alpha0」、Eagerモードはオン、GPUが有効化されている事がわかります。次に、TF-HUBのモジュールを選択しましょう。事前学習済みモデルにはいくつかの種類があり、現在TF2.0用で公開されている画像特徴ベクトル(image-feature-vector)の抽出用には「inception_v3」と「mobilenet_v2」の二つがあります。これらはTF-Slimの実装を使っており、こちらの比較表から「inception_v3」の方が精度が高そうなので、今回はこれを使います。モジュールに関しては、Colaboratoryの画面UIからプルダウンで選べます。バッチサイズは「64」として進めます。2048入力に使う画像のサイズは299×299ピクセル、出力次元は2048となっています。次に、学習に使う画像の教師データをダウンロードしましょう。「tf.keras.utils.get_file」関数はデフォルトで「~/.keras」配下に画像をダウンロードしますが、「cache_dir」で任意のディレクトリを指定する事もできます。Colaboratoryはデフォルトで「sample_data」にサンプルデータセットを持っているため、今回はそちらに追加する形にします。#キャッシュ保存用ディレクトリを指定ダウンロードはすぐに完了します。変数「data_dir」にはダウンロード先のパス(「’sample_data/datasets/flower_photos’」)が文字列で格納されています。Colaboratory画面左部のパネル→「ファイル」タブからディレクトリ構成を確認できます。ダウンロードした画像を可視化してみましょう。figsize=(18,18))これをkerasの前処理用モジュール「ImageDataGenerator」で読み込むことにしましょう。先ほど画像のダウンロード先に指定した「data_dir」から、画像ファイルのパスとラベル名を対で読み込む事ができます。トレーニング画像の拡張(水増し)をしたい場合は、「do_data_augmentation」フラグを「True」に設定してください。classes.トレーニング用/検証用に5クラスの画像が準備された事がわかります。次に、モデルの定義をしてみましょう。TF-HUBのモジュールでは、転移学習とファインチューニングのいずれかをフラグによって切り替える事ができます。速度を重視したい場合は転移学習、精度を重視したい場合はファインチューニングを選ぶと良いようです。False)の転移学習で試してみましょう。{type:"boolean"}次は、tf.keras.SequentialのAPIを使って、層を積み重ねていきます。最初にhub.KerasLayerでモジュールを読み込み、ドロップアウト層、全結合層と繋げましょう。ネットワークが組み終わったら、モデルをビルドします。今回のTF2.0のアップデートにおいては、こういった部分の記述の簡略化がポイントになったようです。指定し、コンパイルします。以上で準備は整いました。トレーニングを開始してみます。0.86935エポック回して、val_accuracyは0.8693となりました。学習曲線もプロットしてみましょう。plt.plot(hist["val_accuracy"])今回は学習用データが2939枚、検証用データが731枚という事であまりデータ量は多くないですが、なかなか良い精度が出たのではないでしょうか。オリジナルの教師データを追加し、画像分類してみる今度は、自分で教師データを準備してみましょう。方法はあると思いますが、google_images_downloadというライブラリはさっと試す分には便利です。今回はこちらを使ってWeb上から画像を集めてみましょう。内部的にはseleniumなどを使ってスクレイピングしているようです。画像データの収集pipでライブラリをインストールします。google_images_download次に検索のプログラムを書いていきます。引数「keywords」に収集したい画像の検索キーワードを入力できます。「,」で区切れば、それぞれが別フォルダとして指定のディレクトリにダウンロードされます。今回のチュートリアルで使っている「sample_data/datasets/flower_photos/」を、引数「output_directory」に設定しましょう。tulips)に、3クラス(アジサイ、アサガオ、リンドウ)追加します。後に使うテストデータと混ざらないようにするため、引数「time_range」に'{“time_min”:”01/01/2017′′,”time_max”:”12/31/2017′′}’を指定し、2017年の画像のみを対象とします。imagesダウンロード中のログはこのように出ます。・・・ダウンロード完了後、ファイル一覧から3クラス(アジサイ、アサガオ、リンドウ)が追加された事がわかります。今回は1クラスあたり100枚の画像を収集しましたが、より多くの画像を集めたい場合には検索キーワードを変えたり、オプションとしてseleniumをかますなどしてみてください。再度画像を可視化してみましょう。sample_size)画像はColaboratoryのファイル一覧から一枚ずつ開き確認することもできるので、ノイズになりそうな画像は「ファイルを削除」するなどしてデータセットを整えてください。データの再読み込みデータセットが更新されたので、これを使ってもう一度学習をしてみましょう。classes.ImageDataGeneratorを使って再度画像の読み込みをすると、クラス数が8に増えている事がわかります。先ほどのコードで再度学習を実行してみます。validation_steps=validation_steps).history注)途中、画像の読み込みに失敗する事がありますので、その場合は画像を削除してください。marubarukou300.2.jpg"先程と同じように5エポック実行します。0.8581今度は、val_accuracyは0.8581となりました。追加したクラスに関してはノイズ画像の削除等しておらずそのまま使っているためか、若干下がってますね。学習曲線もプロットしてみましょう。plt.plot(hist["val_accuracy"])テストデータで予測してみるモデルができたので、テストデータを使って分類を試してみましょう。先ほどの学習用データとは違う画像でテストしたいため、引数「time_range」に'{“time_min”:”01/01/2018′′,”time_max”:”12/31/2018′′}’を指定し、2018年の画像のみを対象とします。出力先ディレクトリ「output_directory」はテスト用のものを指定します。images再度ImageDataGeneratorでテスト画像の読み込みを準備します。classes.8クラス、778枚のテストデータが用意できました。それではモデルの予測をしてみます。verbose=1)枚数も多くないのですぐに完了します。それでは予測結果を可視化してみましょう。sample_size)テストデータに対してもまずまずの分類ができてそうです。今回自分で追加した3クラス(アサガオ、アジサイ、リンドウ)も結構良さそうですね。まとめオリジナルの教師データを使う場合でも、tf.kerasのシーケンシャルなAPIによって、画像の読み込みから学習・予測までがシームレスに実行できる事がわかりました。TF-HUBには、昨年話題となった汎用言語表現モデルのBERTなど、画像以外にも様々なモデルがあります。みなさんも試してみてください。