1. 始める前に
この Codelab では、TensorFlow と TensorFlow Lite Model Maker で作成されたコードを確認し、コメントスパムに基づいたデータセットを使用してモデルを作成します。元のデータは kaggle で入手できます。これは 1 つの CSV ファイルにまとめられ、壊れたテキスト、マークアップ、繰り返しの単語などが削除されています。これにより、テキストではなくモデルに集中しやすくなります。
ここではレビュー用のコードを提供しますが、Google Colab のコードを使用することを強くおすすめします。
前提条件
- この Codelab は、機械学習に慣れていないデベロッパーを対象にしています。
- この Codelab は、モバイル向けテキスト分類を使ってみるのパスウェイの一部です。前のタスクをまだ完了していない場合は、ここで停止して、前のタスクを完了してください。
学習内容
- Google Colab を使用して TensorFlow Lite Model Maker をインストールする方法
- Cloud サーバーからデバイスにデータをダウンロードする方法
- データローダの使用方法
- モデルを構築する方法
必要なもの
- Google Colab へのアクセス権
2. TensorFlow Lite Model Maker をインストールする
colab を開きます。ノートブックの最初のセルを実行すると、TensorFLow Lite Model Maker がインストールされます。
!pip install -q tflite-model-maker
完了したら、次のセルに進みます。
3. コードをインポートする
次のセルでは、ノートブックのコードで使用する必要があるいくつかのインポートを行います。
import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader
import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')
また、Model Maker の使用条件要件である TensorFlow 2.x が実行されているかどうかも確認します。
4. データをダウンロードする
次に、Cloud サーバーからデバイスにデータをダウンロードし、ローカル ファイルを参照するように data_file を設定します。
data_file = tf.keras.utils.get_file(fname='comment-spam.csv',
origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv',
extract=False)
Model Maker では、このようなシンプルな CSV ファイルからモデルをトレーニングできます。テキストの列とラベルの列を指定するだけでかまいません。その方法については後ほど Codelab で説明します。
5. 事前に学習したエンベディング
通常、Model Maker を使用する場合、モデルはゼロから構築しません。既存のモデルをニーズに合わせてカスタマイズします。
このような言語モデルでは、事前に学習したエンベディングを使用します。 エンベディングの背後には、コーパス全体の各単語に数値を割り当て、単語を数値に変換するという考えがあります。エンベディングは、単語の「方向」を確立して、その単語の感情を判断するために使用されるベクトルです。 たとえば、コメントスパム メッセージで頻繁に使用される単語のベクトルは類似の方向を指し、そうでない単語のベクトルは逆方向を指します。
事前に学習されたエンベディングを使用すると、大量のテキストから感情を学習した単語のコーパス(コレクション)から始めることができるため、ゼロから始めるよりもはるかに迅速に解を得ることができます。
Model Maker には、事前に学習されたエンベディングがいくつか用意されていますが、最も簡単で迅速なエンベディングは average_word_vec オプションです。
以下にコードを示します。
spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7
num_words パラメータ
モデルで使用する単語数も指定します。
「多ければ多いほど良い」と思われるかもしれませんが、通常、各単語の使用頻度に基づいて適切な数があります。コーパスのすべての単語を使用すると、モデルは 1 回しか使用されない単語の方向を学習して確立しようとします。どのテキスト コーパスでも、多くの単語は 1 回か 2 回しか使用されません。全体的な感情にほとんど影響がないため、モデルで使用しても意味はありません。num_words パラメータを使用して、必要な単語数でモデルを調整できます。
この数が少ないと、モデルが小さく高速になる可能性がありますが、認識する単語が少なくなるため、精度が低くなる可能性があります。この数が大きいと、モデルが大きくなり、速度が低下します。最適なバランスを見つけることが重要です。
wordvec_dim パラメータ
wordved_dim パラメータは、各単語のベクトルに使用する次元数です。調査で判明した経験則では、単語数の 4 乗根です。たとえば、2,000 語を使用する場合、適切な開始点は 7 です。使用する単語数を変更する場合は、これも変更できます。
seq_len パラメータ
一般に、入力値に対してモデルは非常に厳格です。言語モデルの場合、言語モデルは特定の静的な長さの文を分類できます。これは、seq_len パラメータまたはシーケンス長によって決まります。
単語を数字(またはトークン)に変換すると、文がこれらのトークンのシーケンスになります。そのため、モデルは(この場合)20 個のトークンを含む文を分類して認識するようにトレーニングされます。文がこれより長い場合は切り捨てられます。短い場合はパディングされます。コーパスには、この目的で使用される専用の <PAD> トークンがあります。
6. データローダを使用する
先ほど CSV ファイルをダウンロードしました。次に、データローダを使用してトレーニング データに変換し、モデルが認識できるようにします。
data = DataLoader.from_csv(
filename=data_file,
text_column='commenttext',
label_column='spam',
model_spec=spec,
delimiter=',',
shuffle=True,
is_training=True)
train_data, test_data = data.split(0.9)
この CSV ファイルをエディタで開くと、各行には 2 つの値のみが表示され、その説明がファイルの先頭行に記述されています。通常、各エントリは列と見なされます。
最初の列の記述子は commenttext になっています。これは、各行の最初のエントリがコメントのテキストであることを示します。同様に、2 列目の記述子は spam であり、各行の 2 つ目のエントリは True または False, です。これは、そのテキストがコメントスパムかどうかを示します。他のプロパティには、先ほど作成した model_spec と区切り文字を指定します。この場合は、ファイルがカンマ区切りなのでカンマになります。このデータをモデルのトレーニングに使用するため、is_Training は True に設定します。
モデルのテストに使用するため、データの一部を残しておきます。データを 90% をトレーニング用、残りの 10% をテスト / 評価用に使用します。ここでは、テストデータをランダムに選択し、データセットの「最後」の 10% はテストに使用しないため、データを読み込むときに shuffle=True を使用してランダム化します。
7. モデルを構築する
次のセルは、単にモデルを構築するためのもので、1 行のコードです。
# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50,
validation_data=test_data)
これにより、Model Maker でテキスト分類モデルが作成されます。使用するトレーニング データ(ステップ 4 で設定)、モデル仕様(ステップ 4 で設定)、エポック数(この場合 50)を指定します。
機械学習の基本原理はパターン マッチングの一種です。最初は、単語の事前トレーニング済みの重みを読み込み、スパムを示している単語とそうでない単語を予測してグループ化を行います。モデルはまだ始まったばかりなので、最初は 50:50 に近い値になる可能性があります。

その後、この結果を測定し、最適化コードを実行して予測を微調整してから再試行します。これがエポックです。このため、epochs=50 を指定すると、その「ループ」が 50 回繰り返されます。

モデルは、50 エポックに達するまでに、非常に高い精度を報告します。この場合、99% を示しています。
右側に検証精度の値が表示されます。通常、トレーニングの精度より少し低い値になります。これは、モデルが以前に「見た」ことのないデータを分類する方法を示しているためです。先ほど確保した 10% のテストデータを使用します。

8. モデルをエクスポートする
トレーニングが完了したら、モデルをエクスポートできます。
TensorFlow は独自の形式でモデルをトレーニングします。モバイルアプリで使用するには、この形式を TFLITE 形式に変換する必要があります。Model Maker がこの複雑さを処理します。
ディレクトリを指定してモデルをエクスポートするだけです。
model.export(export_dir='/mm_spam')
そのディレクトリに model.tflite ファイルが表示されます。ダウンロードしたり、次の Codelab で Android アプリに追加する必要があります。
iOS に関する考慮事項
エクスポートした .tflite モデルは、モデルに関するメタデータが埋め込まれており、Android Studio がそのメタデータを読み取ることができるため、Android で適切に動作します。
このメタデータは非常に重要です。モデルが認識する単語を表すトークンの辞書が含まれているためです。単語がトークンになり、これらのトークンに感情のベクトルが与えられることを学習しました。モバイルアプリはこれらのトークンを認識する必要があります。たとえば、「dog」が 42 にトークン化され、ユーザーが文に「dog」と入力した場合、モデルが理解できるように、アプリは「dog」を 42 に変換する必要があります。Android デベロッパーは、これを使用しやすくする「TensorFlow Lite Task Library」を使用できますが、iOS では語彙を処理する必要があるため、語彙を使用可能にする必要があります。Model Maker は、export_format パラメータを指定することで、これをエクスポートできます。モデルのラベルと語彙を取得するには、次のようにします。
model.export(export_dir='/mm_spam/',
export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])
9. 完了
この Codelab では、モデルを構築してエクスポートするための Python コードについて説明しました。最後に .tflite ファイルが作成されます。
次の Codelab では、このモデルを使用するように Android アプリを編集して、スパムコメントの分類を開始する方法について説明します。