ヘルプKaggleにTensorFlowグレートバリアリーフを保護チャレンジに参加

TensorFlowLiteモデルメーカーによるテキスト分類

TensorFlow.orgで表示 GoogleColabで実行 GitHubでソースを表示 ノートブックをダウンロード

TensorFlowライトモデルメーカーライブラリが適応とオンデバイスMLのアプリケーションのためにこのモデルを展開するときに、特定の入力データにTensorFlowモデルを変換するプロセスを単純化します。

このノートブックは、モデルメーカーライブラリを利用して、モバイルデバイスで映画レビューを分類するために一般的に使用されるテキスト分類モデルの適応と変換を説明するエンドツーエンドの例を示しています。テキスト分類モデルは、テキストを事前定義されたカテゴリに分類します。入力は前処理されたテキストである必要があり、出力はカテゴリの確率です。このチュートリアルで使用されるデータセットは、ポジティブおよびネガティブな映画レビューです。

前提条件

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

この例を実行するには、より型式メーカパッケージを含め、必要なパッケージをインストールGitHubのレポ

pip install -q tflite-model-maker

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

import numpy as np
import os

from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.config import ExportFormat
from tflite_model_maker.text_classifier import AverageWordVecSpec
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/pkg_resources/__init__.py:119: PkgResourcesDeprecationWarning: 0.18ubuntu0.18.04.1 is an invalid version and will not be supported in a future release
  PkgResourcesDeprecationWarning,
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/numba/core/errors.py:168: UserWarning: Insufficiently recent colorama version found. Numba requires colorama >= 0.3.9
  warnings.warn(msg)

サンプルトレーニングデータをダウンロードします。

このチュートリアルでは、使用するSST-2 (スタンフォード感情ツリーバンク)での課題の一つであるGLUEのベンチマークを。トレーニング用の67,349本の映画レビューとテスト用の872本の映画レビューが含まれています。データセットには、ポジティブとネガティブの映画レビューの2つのクラスがあります。

data_dir = tf.keras.utils.get_file(
      fname='SST-2.zip',
      origin='https://dl.fbaipublicfiles.com/glue/data/SST-2.zip',
      extract=True)
data_dir = os.path.join(os.path.dirname(data_dir), 'SST-2')
Downloading data from https://dl.fbaipublicfiles.com/glue/data/SST-2.zip
7446528/7439277 [==============================] - 0s 0us/step
7454720/7439277 [==============================] - 0s 0us/step

SST-2データセットはTSV形式で保存されます。 TSVとCSVの唯一の違いは、TSV、タブ使用していることです\tコンマの代わりにその区切り文字として文字を, CSV形式で。

これがトレーニングデータセットの最初の5行です。 label = 0は負を意味し、label = 1は正を意味します。

ラベル
親ユニットから新しい分泌物を隠す0
ウィットは含まれていません。 0
そのキャラクターを愛し、人間の本性についてかなり美しい何かを伝えます1
ずっと同じままでいるために完全に満足している0
最悪のオタクの復讐の決まり文句で、映画製作者は浚渫する可能性があります0

次に、我々は、パンダのデータフレームにデータセットをロードし、現在のラベル名(変更されます01 、より人間が読めるもの(に) negativepositive )とモデルのトレーニングのためにそれらを使用します。

import pandas as pd

def replace_label(original_file, new_file):
  # Load the original file to pandas. We need to specify the separator as
  # '\t' as the training data is stored in TSV format
  df = pd.read_csv(original_file, sep='\t')

  # Define how we want to change the label name
  label_map = {0: 'negative', 1: 'positive'}

  # Excute the label change
  df.replace({'label': label_map}, inplace=True)

  # Write the updated dataset to a new file
  df.to_csv(new_file)

# Replace the label name for both the training and test dataset. Then write the
# updated CSV dataset to the current folder.
replace_label(os.path.join(os.path.join(data_dir, 'train.tsv')), 'train.csv')
replace_label(os.path.join(os.path.join(data_dir, 'dev.tsv')), 'dev.csv')

クイックスタート

テキスト分類モデルをトレーニングするには、次の5つの手順があります。

手順1.テキスト分類モデルアーキテクチャを選択します。

ここでは、平均的な単語埋め込みモデルアーキテクチャを使用します。これにより、小さくて高速なモデルが適切な精度で生成されます。

spec = model_spec.get('average_word_vec')

モデルメーカーはまたのような他のモデルのアーキテクチャをサポートBERTを。あなたが他のアーキテクチャについて学ぶに興味を持っている場合は、参照テキスト分類のためのモデルのアーキテクチャを選択し、以下のセクションを。

ステップ2.ロードトレーニングとテストデータは、その後、特定のに応じて、それらを前処理するmodel_spec

モデルメーカーは、CSV形式で入力データを取得できます。以前に作成した人間が読める形式のラベル名を使用して、トレーニングとテストのデータセットを読み込みます。

各モデルアーキテクチャでは、入力データを特定の方法で処理する必要があります。 DataLoaderからの要求読み出しmodel_spec 、自動的に必要な前処理を実行します。

train_data = DataLoader.from_csv(
      filename='train.csv',
      text_column='sentence',
      label_column='label',
      model_spec=spec,
      is_training=True)
test_data = DataLoader.from_csv(
      filename='dev.csv',
      text_column='sentence',
      label_column='label',
      model_spec=spec,
      is_training=False)

ステップ3.トレーニングデータを使用してTensorFlowモデルをトレーニングします。

平均ワード埋め込みモデルの使用batch_size = 32デフォルトで。したがって、トレーニングデータセットの67,349文を通過するには2104ステップかかることがわかります。モデルを10エポックトレーニングします。つまり、トレーニングデータセットを10回実行します。

model = text_classifier.create(train_data, model_spec=spec, epochs=10)
Epoch 1/10
2104/2104 [==============================] - 7s 3ms/step - loss: 0.6777 - accuracy: 0.5657
Epoch 2/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.5666 - accuracy: 0.7200
Epoch 3/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.4484 - accuracy: 0.7955
Epoch 4/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3982 - accuracy: 0.8262
Epoch 5/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3735 - accuracy: 0.8387
Epoch 6/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3595 - accuracy: 0.8476
Epoch 7/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3476 - accuracy: 0.8541
Epoch 8/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3379 - accuracy: 0.8593
Epoch 9/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3329 - accuracy: 0.8628
Epoch 10/10
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3258 - accuracy: 0.8646

ステップ4.テストデータを使用してモデルを評価します。

トレーニングデータセットの文を使用してテキスト分類モデルをトレーニングした後、テストデータセットの残りの872文を使用して、これまでに見たことのない新しいデータに対してモデルがどのように機能するかを評価します。

デフォルトのバッチサイズは32であるため、テストデータセットの872文を処理するには28ステップかかります。

loss, acc = model.evaluate(test_data)
28/28 [==============================] - 0s 2ms/step - loss: 0.5149 - accuracy: 0.8268

ステップ5.TensorFlowLiteモデルとしてエクスポートします。

トレーニングしたテキスト分類をTensorFlowLite形式でエクスポートしてみましょう。モデルをエクスポートするフォルダーを指定します。デフォルトでは、float TFLiteモデルは、平均的な単語埋め込みモデルアーキテクチャ用にエクスポートされます。

model.export(export_dir='average_word_vec')
2021-11-02 12:53:52.418162: W tensorflow/python/util/util.cc:348] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
2021-11-02 12:53:52.887037: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-11-02 12:53:52.887073: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.

Colabの左側のサイドバーを使用して、TensorFlowLiteモデルファイルをダウンロードできます。行くaverage_word_vec我々がで指定されたフォルダexport_dir上、上記のパラメータを右クリックしmodel.tfliteファイルを選択しますDownloadてローカルコンピュータにダウンロードします。

このモデルは、使用してAndroidやiOSアプリに統合することができNLClassifierのAPITensorFlow Liteのタスク・ライブラリーを

参照してくださいTFLiteテキスト分類サンプルアプリモデルが作業のアプリで使用される方法の詳細については、を。

注1:Android Studio Model Bindingはまだテキスト分類をサポートしていないため、TensorFlowLiteタスクライブラリを使用してください。

注2:ありmodel.json TFLiteモデルと同じフォルダ内のファイルが。これは、のJSON表現が含まれたメタデータTensorFlow Liteのモデル内にバンドルされています。モデルメタデータは、TFLiteタスクライブラリがモデルの機能とモデルのデータを前処理/後処理する方法を知るのに役立ちます。あなたがダウンロードする必要はありませんmodel.jsonそれは情報提供の目的のためだけであり、その内容はTFLiteファイル内にすでにあるとしてファイルを。

注3:あなたはMobileBERTまたはBERT-ベースのアーキテクチャを使用して、テキスト分類モデルを訓練する場合は、使用する必要がありますBertNLClassifier APIをモバイルアプリに訓練されたモデルを統合する代わりに。

次のセクションでは、例を段階的に説明して、詳細を示します。

テキスト分類子のモデルアーキテクチャを選択します

model_specオブジェクトは、テキスト分類のための特定のモデルを表しています。 TensorFlow Liteのモデルメーカーは、現在サポートされていMobileBERT 、平均ワード埋め込みとBERT-ベースモデル。

サポートされているモデルmodel_specの名前モデルの説明モデルサイズ
単語埋め込みの平均化'average_word_vec' RELUアクティベーションによるテキスト単語埋め込みの平均化。 <1MB
MobileBERT 'mobilebert_classifier' BERT-Baseより4.3倍小さく、5.5倍高速でありながら、デバイス上のアプリケーションに適した競争力のある結果を達成します。量子化付き25MB
量子化なしで100MB
BERT-Base 'bert_classifier' NLPタスクで広く使用されている標準のBERTモデル。 300MB

クイックスタートでは、平均的な単語埋め込みモデルを使用しました。レッツ・スイッチMobileBERTより精度の高いモデルを訓練します。

mb_spec = model_spec.get('mobilebert_classifier')

トレーニングデータを読み込む

独自のデータセットをアップロードして、このチュートリアルを実行できます。 Colabの左側のサイドバーを使用してデータセットをアップロードします。

ファイルをアップロードする

あなたはクラウドにデータセットをアップロードしたくない場合は、ローカルに従うことによって、ライブラリを実行することができ、ガイドを

簡単にするために、以前にダウンロードしたSST-2データセットを再利用します。さんが使用してみましょうDataLoader.from_csvデータをロードする方法を。

モデルアーキテクチャを変更したため、新しい前処理ロジックを適用するには、トレーニングとテストのデータセットを再読み込みする必要があることに注意してください。

train_data = DataLoader.from_csv(
      filename='train.csv',
      text_column='sentence',
      label_column='label',
      model_spec=mb_spec,
      is_training=True)
test_data = DataLoader.from_csv(
      filename='dev.csv',
      text_column='sentence',
      label_column='label',
      model_spec=mb_spec,
      is_training=False)

モデルメーカーライブラリもサポートしていfrom_folder()ロード・データへの方法を。同じクラスのテキストデータが同じサブディレクトリにあり、サブフォルダ名がクラス名であると想定しています。各テキストファイルには、1つの映画レビューサンプルが含まれています。 class_labelsそのサブフォルダを指定するために使用されるパラメータ。

TensorFlowモデルをトレーニングする

トレーニングデータを使用してテキスト分類モデルをトレーニングします。

model = text_classifier.create(train_data, model_spec=mb_spec, epochs=3)
Epoch 1/3
1403/1403 [==============================] - 322s 193ms/step - loss: 0.3882 - test_accuracy: 0.8464
Epoch 2/3
1403/1403 [==============================] - 257s 183ms/step - loss: 0.1303 - test_accuracy: 0.9534
Epoch 3/3
1403/1403 [==============================] - 257s 183ms/step - loss: 0.0759 - test_accuracy: 0.9753

詳細なモデル構造を調べます。

model.summary()
Model: "model"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_word_ids (InputLayer)     [(None, 128)]        0                                            
__________________________________________________________________________________________________
input_mask (InputLayer)         [(None, 128)]        0                                            
__________________________________________________________________________________________________
input_type_ids (InputLayer)     [(None, 128)]        0                                            
__________________________________________________________________________________________________
hub_keras_layer_v1v2 (HubKerasL (None, 512)          24581888    input_word_ids[0][0]             
                                                                 input_mask[0][0]                 
                                                                 input_type_ids[0][0]             
__________________________________________________________________________________________________
dropout_1 (Dropout)             (None, 512)          0           hub_keras_layer_v1v2[0][0]       
__________________________________________________________________________________________________
output (Dense)                  (None, 2)            1026        dropout_1[0][0]                  
==================================================================================================
Total params: 24,582,914
Trainable params: 24,582,914
Non-trainable params: 0
__________________________________________________________________________________________________

モデルを評価する

テストデータを使用してトレーニングしたばかりのモデルを評価し、損失と精度の値を測定します。

loss, acc = model.evaluate(test_data)
28/28 [==============================] - 7s 48ms/step - loss: 0.3859 - test_accuracy: 0.9071

TensorFlowLiteモデルとしてエクスポート

訓練されたモデルが持つTensorFlow Liteのモデル形式に変換するメタデータ後でオンデバイスMLアプリケーションで使用できるようにします。ラベルファイルと語彙ファイルはメタデータに埋め込まれています。デフォルトTFLiteのファイル名ですmodel.tflite

多くのオンデバイスMLアプリケーションでは、モデルサイズが重要な要素です。したがって、モデルを小さくして実行速度を上げる可能性があるように、クオンタイズを適用することをお勧めします。デフォルトのトレーニング後の量子化手法は、BERTおよびMobileBERTモデルのダイナミックレンジ量子化です。

model.export(export_dir='mobilebert/')
2021-11-02 13:09:19.810703: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-11-02 13:09:19.810749: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
2021-11-02 13:09:19.810755: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.

TensorFlow Liteのモデルファイルを使用してモバイルアプリに統合することができBertNLClassifierのAPITensorFlow Liteのタスク・ライブラリーを。これは異なっていることに注意してくださいNLClassifier平均単語ベクトルモデルのアーキテクチャで訓練されたテキスト分類を統合するために使用されるAPIを。

エクスポート形式は、次の1つまたはリストにすることができます。

デフォルトでは、モデルメタデータを含むTensorFlowLiteモデルファイルのみをエクスポートします。モデルに関連する他のファイルをエクスポートして、より適切に調査することもできます。たとえば、次のようにラベルファイルと語彙ファイルのみをエクスポートします。

model.export(export_dir='mobilebert/', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])

あなたはとTFLiteモデルを評価することができますevaluate_tfliteその正確さを測定する方法。トレーニング済みのTensorFlowモデルをTFLite形式に変換し、量子化を適用すると、その精度に影響を与える可能性があるため、デプロイする前にTFLiteモデルの精度を評価することをお勧めします。

accuracy = model.evaluate_tflite('mobilebert/model.tflite', test_data)
print('TFLite model accuracy: ', accuracy)
TFLite model accuracy:  {'accuracy': 0.9002293577981652}

高度な使用法

create機能はモデルメーカーライブラリが使用するモデルを作成することをドライバ関数です。 model_specパラメータは、モデルの仕様を規定しています。 AverageWordVecSpecBertClassifierSpecクラスが現在サポートされています。 create 、次のステップの機能を備えるました:

  1. テキスト分類のためのモデルを作成しますmodel_spec
  2. 分類器モデルをトレーニングします。デフォルトのエポックとデフォルトのバッチサイズはで設定されているdefault_training_epochsdefault_batch_sizeの変数model_specオブジェクト。

このセクションでは、モデルの調整やトレーニングハイパーパラメータなどの高度な使用トピックについて説明します。

MobileBERTモデルのハイパーパラメータをカスタマイズする

調整できるモデルパラメータは次のとおりです。

  • seq_len :モデルへの供給に対する配列の長さ。
  • initializer_range :の標準偏差truncated_normal_initializerすべての重み行列を初期化します。
  • trainable :ブール事前に訓練を受けた層が学習可能であるかどうかを指定しています。

調整できるトレーニングパイプラインパラメータは次のとおりです。

  • model_dir :モデルのチェックポイントファイルの場所。設定されていない場合、一時ディレクトリが使用されます。
  • dropout_rate :脱落率。
  • learning_rate :アダム・オプティマイザの初期学習率。
  • tpu :TPUアドレスに接続します。

たとえば、あなたが設定することができseq_len=256 (デフォルトは128です)。これにより、モデルはより長いテキストを分類できます。

new_model_spec = model_spec.get('mobilebert_classifier')
new_model_spec.seq_len = 256

平均的な単語埋め込みモデルのハイパーパラメータをカスタマイズする

あなたは次のようにモデルのインフラストラクチャを調整することができwordvec_dimseq_lenの変数AverageWordVecSpecクラス。

たとえば、の値を大きくしてモデルを訓練することができwordvec_dim 。新しい構築しなければならないことに注意してくださいmodel_specあなたがモデルを変更した場合。

new_model_spec = AverageWordVecSpec(wordvec_dim=32)

前処理されたデータを取得します。

new_train_data = DataLoader.from_csv(
      filename='train.csv',
      text_column='sentence',
      label_column='label',
      model_spec=new_model_spec,
      is_training=True)

新しいモデルをトレーニングします。

model = text_classifier.create(new_train_data, model_spec=new_model_spec)
Epoch 1/3
2104/2104 [==============================] - 8s 4ms/step - loss: 0.6545 - accuracy: 0.6055
Epoch 2/3
2104/2104 [==============================] - 6s 3ms/step - loss: 0.4822 - accuracy: 0.7712
Epoch 3/3
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3993 - accuracy: 0.8217

トレーニングハイパーパラメータを調整する

あなたのようなこともできチューントレーニングハイパーepochsbatch_sizeモデルの精度に影響を与えます。例えば、

  • epochs :より多くのエポックは、より良い精度を達成できましたが、オーバーフィッティングにつながる可能性があります。
  • batch_size :1つのトレーニング段階で使用するサンプルの数。

たとえば、より多くのエポックでトレーニングできます。

model = text_classifier.create(new_train_data, model_spec=new_model_spec, epochs=20)
Epoch 1/20
2104/2104 [==============================] - 7s 3ms/step - loss: 0.6595 - accuracy: 0.5994
Epoch 2/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.4904 - accuracy: 0.7655
Epoch 3/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.4036 - accuracy: 0.8177
Epoch 4/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3690 - accuracy: 0.8392
Epoch 5/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3516 - accuracy: 0.8500
Epoch 6/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3391 - accuracy: 0.8569
Epoch 7/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3301 - accuracy: 0.8608
Epoch 8/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3237 - accuracy: 0.8654
Epoch 9/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3190 - accuracy: 0.8674
Epoch 10/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3151 - accuracy: 0.8703
Epoch 11/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3103 - accuracy: 0.8725
Epoch 12/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3074 - accuracy: 0.8737
Epoch 13/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3036 - accuracy: 0.8757
Epoch 14/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3015 - accuracy: 0.8772
Epoch 15/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.3001 - accuracy: 0.8773
Epoch 16/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.2981 - accuracy: 0.8779
Epoch 17/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.2954 - accuracy: 0.8797
Epoch 18/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.2939 - accuracy: 0.8798
Epoch 19/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.2924 - accuracy: 0.8809
Epoch 20/20
2104/2104 [==============================] - 6s 3ms/step - loss: 0.2903 - accuracy: 0.8822

20のトレーニングエポックで新しく再トレーニングされたモデルを評価します。

new_test_data = DataLoader.from_csv(
      filename='dev.csv',
      text_column='sentence',
      label_column='label',
      model_spec=new_model_spec,
      is_training=False)

loss, accuracy = model.evaluate(new_test_data)
28/28 [==============================] - 0s 2ms/step - loss: 0.5021 - accuracy: 0.8291

モデルアーキテクチャを変更する

あなたは、変更することで、モデルを変更することができmodel_spec 。以下にBERT-Baseモデルへの変更方法を示します。

変更model_specテキスト分類のためのBERT-ベースモデルに。

spec = model_spec.get('bert_classifier')

残りの手順は同じです。

TensorFlowLiteモデルでトレーニング後の量子化をカスタマイズする

訓練後の量子化はまた、CPUとハードウェアアクセラレータ推論速度を向上させながら、モデル精度の劣化の少ない、モデルサイズと推論待ち時間を低減することができる変換技術です。したがって、モデルを最適化するために広く使用されています。

モデルメーカーライブラリは、モデルをエクスポートするときに、デフォルトのトレーニング後の量子化手法を適用します。あなたは訓練後の量子化をカスタマイズしたい場合は、モデルのメーカーが使用して複数の訓練後の量子化オプションをサポートQuantizationConfigをうまくように。たとえば、float16量子化を取り上げましょう。まず、量子化構成を定義します。

config = QuantizationConfig.for_float16()

次に、そのような構成でTensorFlowLiteモデルをエクスポートします。

model.export(export_dir='.', tflite_filename='model_fp16.tflite', quantization_config=config)

続きを読む

あなたは私たちの読むことができるテキスト分類の技術的な詳細を学ぶために例を。詳細については、以下を参照してください。