TensorFlow Lite Model Maker による転移学習の過程で accuracy・loss を可視化（グラフ化）する

# はじめに
この記事は、カスタムデータセットを使用した転移学習で TensorFlow Lite のモデルを得る過程を簡素化してくれる「TensorFlow Lite Model Maker」に関するものです。
　●TensorFlow Lite Model Maker
　　https://www.tensorflow.org/lite/guide/model_maker?hl=ja

その TensorFlow Lite Model Maker による転移学習に関し、画像分類用の機械学習モデルを作る下記のチュートリアルがあるのですが、このチュートリアル中の accuracy・loss を可視化してみた際の話を自分用メモも兼ねて書いていきます。
　●TensorFlow Liteモデルメーカーによる画像分類 | TensorFlow Lite
　　https://www.tensorflow.org/lite/tutorials/model_maker_image_classification

# TensorFlow Lite Model Maker で対応可能なタスク
冒頭で少し触れた転移学習ですが、対象とできるタスクは以下となるようです。
![TensorFlow_Lite_Model_Makerがサポート可能なタスク.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f45a1a15-3269-7b6c-fb1d-587a443a5c3b.jpeg)
この記事で扱っているのは、この中の画像分類です。

# TensorFlow Lite Model Maker の画像分類チュートリアルについて
[公式の画像分類のチュートリアル](https://www.tensorflow.org/lite/tutorials/model_maker_image_classification)は、Webサイトを開くとコードや説明が書かれていますが、ページトップにある「Google Colabで実行」と書かれたボタンを押すことで、ページ内の内容を [Google Colab（以下、Colab と記載）](https://colab.research.google.com) で開いて実行ができる状態にできる、とても便利なものです。
![画像分類のチュートリアル.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/274654b2-62dc-8c5a-4d74-f9d3807ebb30.jpeg)
チュートリアル通りの内容を進めていくだけなら、Colab上で説明を読みながらプログラムが書かれた部分をポチポチ押していくだけで、最後には機械学習モデルができあがります（カスタムデータセットは、サンプルとして用意された 5種類の花の画像を転移学習に用いる形になります）。

そのチュートリアルを進める過程で、以下のように学習が行われる部分があり、途中段階の loss や accuracy の値がテキストで表示されます。この途中経過を、グラフで見たいというのが今回のゴールです。
![学習の経過.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ef029eda-078a-06aa-d5eb-9769a75070c5.jpeg)

# 可視化のためのプログラム
## 前提となること 
ここからの話は、上記のチュートリアルで「 `model = image_classifier.create(・・・)` 」までは終えていることと、手順の中のデータの割り当てでバリデーション用データを分けているという前提の作りになっています。

バリデーション用データを分けているというのは、チュートリアルのデータセットの分割で、以下の処理を行った状態です。

```python
data = ImageClassifierDataLoader.from_folder(image_path)
train_data, rest_data = data.split(0.8)
validation_data, test_data = rest_data.split(0.5)
```

また、その場合の学習の処理は以下のようになっているはずです。

```python
model = image_classifier.create(train_data, validation_data=validation_data)
```

ちなみに、この後にグラフを出している例では、自分は以下の処理にして epochs がデフォルトより多く 10 になるようにしています（※グラフ化の際、この部分は必須ではないです）。

```python
model = image_classifier.create(train_data, validation_data=validation_data, epochs=10)
```
## 学習の過程の情報を保持しているところを探す
グラフ化についてポイントになるのは、上で書いた学習の途中経過のデータがどのようにして取得できるかです。
それについては、 model の後にピリオドをうって、自動補完で出てくる内容を見て探してみました。
![補完の表示.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a704b584-1c50-c0be-15a3-0dc0758deeb8.jpeg)
history というものがあり、これだと思われます。

そしてさらに、もう一段階ありました。
![補完の表示2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5b5c24cb-b25f-7ae9-8f38-06462094e025.jpeg)
この `model.history.history` の中を見てみると、必要とするデータが入っていそうです。
![経過情報の値の確認.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d4910aef-5d6f-7fac-ddcc-28f8b0937114.jpeg)

どうやら Keras のモデルと同じもののようなので、分かってしまえば、あとは以下の Keras の公式ドキュメントにある情報などを使って進められます。
　●可視化 - Keras Documentation
　　https://keras.io/ja/visualization/
![可視化_-_Keras_Documentation.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/eeea622d-b18a-03a1-fe65-bdfa30953346.jpeg)

## グラフ化
上記の Keras の公式ドキュメントの例に少しだけ変更を加えます。具体的には以下の内容です。
　`history.history` ⇒ `model.history.history`
　`acc` ⇒ `accuracy`
　`val_acc` ⇒ `val_accuracy`

書きかえ後の内容は以下のとおりです。

```python
# Plot training & validation accuracy values
plt.plot(model.history.history['accuracy'])
plt.plot(model.history.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

# Plot training & validation loss values
plt.plot(model.history.history['loss'])
plt.plot(model.history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()
```

そして、以下のような出力が得られます。
![グラフ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d6352389-fe67-ad5c-d4f2-c88b41f33c1b.jpeg)

# おわりに
今回の記事では、Google Colab上で TensorFlow Lite Model Maker の画像分類のチュートリアルを進める話に関して、その際に得られる学習過程の accuracy・loss の値をグラフ化してみました。

今回、TensorFlow Lite Model Maker を初めて使ったのですが、いろいろ手を加えられるところがあるので、また引き続き利用していこうと思います。

## 転移学習で作成した機械学習モデルのアプリでの利用
今回の記事で作った機械学習モデルは、公式で提供されている iOS用アプリサンプルに組み込んで、iPhone上で使ってみました。以下の動画は、それを実行してみた時の様子です。

<iframe width="560" height="315" src="https://www.youtube.com/embed/V_jEuTvlC90" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>