機械学習

【TensorFlow2入門】ディープラーニング(CNN)で仮面ライダー俳優を見分けるAIを作る(後編)

ディープラーニング(CNN)で仮面ライダー俳優を見分けるAIを作る(前編)の続きになります。

前回までに、TensorFlowで学習するためのデータが集まったので、TensorFlowでモデルを構築していきたいと思います!

Tensor Flowを始める前に

ディープラーニングが少しもわからない、という方は今後やっていることが少し難しいかもしれません。おすすめのサイトや書籍をご紹介しておきます。

どれも私が独学する際に役立ったものです。

【書籍編】

【サイト編】

TensorFlowチュートリアル(日本語版)

Convolutional Neural Networkとは何なのか

Tensor Flow2を使って顔を識別するAIをつくる

Tensor Flowの流れ

Tensor Flowでの流れをざっくり説明すると以下のようになります。

  1. ディープラーニングのモデル構築
  2. モデルをコンパイル
  3. 訓練する
  4. 正答率を評価する
  5. 予測する(ここで顔を識別します)

0.パッケージのインポート、画像の前処理

必要なパッケージをインポートします

モデルを構築する前に、画像の前処理というものを行わないといけません。

まだまだ詳しくないので、チュートリアルと同じ方法で画像の読み込み等を行っていきます。

オリジナルのデータセットを読み込むための準備などを参考にすれば、もっとスマートにできるのかもしれませんが... まあいずれ笑

tf.keras.preprocessing.image.ImageDataGenerator というものを使って、画像をロードしていきます。

ジェネレータはメモリが限られているときなどに有効な手法のようです。

画像の前処理の流れは以下のようになります。

  1. ディスクから画像を読み取る
  2. これらの画像のコンテンツをデコードし、RGB値にしたがって適切なグリッド形式に変換
  3. それらを浮動小数点テンソルに変換
  4. テンソルを0〜255の値から0〜1の値にリスケーリング(ニューラルネットワークは小さな入力値を扱う方が適しているため)

実際にいくつかの画像を表示してみます。

ラベルを見てみると、ディレクトリの順番通りに振り分けられていることが確認できました。

データの数が足りないかもな、とこの辺で思う。とりあえず進めます。

1.ディープラーニングのモデル構築

学習用のモデルを構築します。ここはかなりシンプルです。レイヤーはチュートリアル通りです。

2.モデルをコンパイル

モデルをコンパイルします。最適化の手法や損失関数をどうするか設定します。

モデルの表示をします。

3.訓練する、4.正答率を評価する

モデルの学習をして、その結果を可視化してみます!

エポック数は5です。

微妙です。データ数が少ないからでしょうか。全体の正答率も低いですね。

エポック数を10にしてみます。

明らかにテストデータの正確性が6エポックぐらいで頭打ちしてますのでいわゆる過学習というやつでしょう…

とりあえず予測することが目的なので精度については妥協します...

学習データ、モデルの保存方法

学習させたデータを一度保存しておきます。保存方法は簡単です。

saved_modelというディレクトリを作成してください。

model.saveを呼ぶことで、モデルのアーキテクチャや重み、訓練の設定を単一のファイル/フォルダに保存できます。

assets,saved_model.pb,variablesが保存されます。

データをロードして、アーキテクチャを確認すると、保存できていることがわかります。

テスト用モデルを評価すると、先ほどと同じ値になっていることも確認できます。

85%だと実際少し低いですね(笑)

一度、ここまでのソースコードをまとめておきます。

5.予測する

では、俳優を識別するためのプログラムを作っていきます。

ほんとはweb上に作りたかったですけど今回は諦めてターミナルで実行するだけのものとしました。

実際にやってみましょう!

適当にネットから拾ってきて、名前を付けておきます。

実際の結果は以下の通りです。

割としっかり認識してくれました。3枚目の写真は顔が小さくて、OpenCv側が取得できなかったようです。

クラス分類なので違う人は一番似ている人になってしまうんですね。

悩んだ点

実際、ここまでたどり着くのに1週間ほどかかりました。

オリジナルデータを読み込ませる際、普通はnumpyの配列にして渡すそうなのですが違うやり方でやろうと思い、ジェネレータを採用しました。ジェネレータを使用してやっている方はあまりおらず、使い方に苦戦しました。

Kerasで大規模な画像分類 - vgg16 転移学習 という記事にめっちゃ助けられました。感謝です。

そして、取り組んでいる最中に

  • テストデータ
  • 検証用
  • 訓練データ

の違いがよくわからないなと思いました。

色々調べた結果、様々な方法・過程があるようですが、訓練→検証→テストと進むのが一般的。

そもそも、テストデータの用意を忘れてしまったことにギリギリになって気づきました。

なので今回はスルーしましたが、実装する場合は前回のmakeデータを1度実行した後、validationに対してもう一度実行することでテストデータの作成を行えます。

モデルも大事ですが、データの準備がいかに大事かということを実感しました。

今後もTensorflowの学習を続けていこうと思います

最後までありがとうございました!

参考サイト

CNNを使って衛星データに雲が映っているか否か画像分類してみた

Kerasの時系列予測でgeneratorを使って大容量データを扱う 後編

Kerasで大規模な画像分類 - vgg16 転移学習

TensorFlow2でのモデルファイルの保存と読み込み

TensorFlow + Kerasでフレンズ識別する - その2: 簡単なCNNを使った学習編

教師あり学習における訓練、検証、テストデータについて(図解なし)

TensorFlowのSavedModelの便利さを紹介する

-機械学習

© 2020 まきろぐ Powered by AFFINGER5