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

TensorFlowテキスト演算子をTensorFlowLiteに変換する

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

概要

機械学習モデルは、TensorFlow Liteを使用してモバイル、組み込み、IoTデバイスに頻繁に導入され、データのプライバシーを向上させ、応答時間を短縮します。これらのモデルでは、多くの場合、テキスト処理操作のサポートが必要です。 TensorFlow Textバージョン2.7以降では、パフォーマンスの向上、バイナリサイズの削減、およびこれらの環境での使用に合わせて特別に最適化された操作が提供されます。

テキスト演算子

次のTensorFlowTextクラスは、TensorFlowLiteモデル内から使用できます。

  • FastWordpieceTokenizer
  • WhitespaceTokenizer

モデル例

pip install -q -U tf-nightly
pip install -q -U tensorflow-text-nightly
from absl import app
import numpy as np
import tensorflow as tf
import tensorflow_text as tf_text

from tensorflow.lite.python import interpreter

次のコード例は、単純なテストモデルを使用したPythonでの変換プロセスと解釈を示しています。モデルの出力はできませんのでご注意tf.RaggedTensorあなたがTensorFlowライトを使用しているときに、オブジェクト。しかし、あなたはのコンポーネントを返すことができtf.RaggedTensorオブジェクトを使用してまたはそのそれを変換to_tensor機能を。参照してくださいRaggedTensorガイドの詳細については。

class TokenizerModel(tf.keras.Model):

  def __init__(self, **kwargs):
    super().__init__(**kwargs)
    self.tokenizer = tf_text.WhitespaceTokenizer()

  @tf.function(input_signature=[
      tf.TensorSpec(shape=[None], dtype=tf.string, name='input')
  ])
  def call(self, input_tensor):
    return { 'tokens': self.tokenizer.tokenize(input_tensor).flat_values }
# Test input data.
input_data = np.array(['Some minds are better kept apart'])

# Define a Keras model.
model = TokenizerModel()

# Perform TensorFlow Text inference.
tf_result = model(tf.constant(input_data))
print('TensorFlow result = ', tf_result['tokens'])
TensorFlow result =  tf.Tensor([b'Some' b'minds' b'are' b'better' b'kept' b'apart'], shape=(6,), dtype=string)

TensorFlowモデルをTensorFlowLiteに変換します

TensorFlowライトへTensorFlowテキスト事業者とTensorFlowモデルを変換する場合、あなたはに指示する必要がTFLiteConverter使用して、カスタム演算子があることをallow_custom_ops下の例のように属性を。その後、通常どおりにモデル変換を実行できます。確認TensorFlow Liteのコンバータのモデル変換の基礎に関する詳細なガイドのマニュアルを。

# Convert to TensorFlow Lite.
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS]
converter.allow_custom_ops = True
tflite_model = converter.convert()
2021-11-12 12:21:28.882819: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/tmp6ev3e0l6/assets
2021-11-12 12:21:30.642172: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-11-12 12:21:30.642219: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
WARNING:absl:Buffer deduplication procedure will be skipped when flatbuffer library is not properly loaded
2021-11-12 12:21:30.854523: W tensorflow/compiler/mlir/lite/flatbuffer_export.cc:1903] The following operation(s) need TFLite custom op implementation(s):
Custom ops: TFText>WhitespaceTokenizeWithOffsetsV2
Details:
    tf.TFText>WhitespaceTokenizeWithOffsetsV2(tensor<?x!tf_type.string>, tensor<!tf_type.string>) -> (tensor<?x!tf_type.string>, tensor<?xi64>, tensor<?xi32>, tensor<?xi32>) : {device = ""}
See instructions: https://www.tensorflow.org/lite/guide/ops_custom

推論

TensorFlow LiteインタープリターがTensorFlowテキスト演算子を含むモデルを正しく読み取るには、これらのカスタム演算子を使用するようにモデルを構成し、それらの登録メソッドを提供する必要があります。使用tf_text.tflite_registrar.SELECT_TFTEXT_OPSに支持TensorFlowテキスト事業者の登録機能の完全なスイートを提供してInterpreterWithCustomOps

次の例に示すが、Pythonで推論ながら、手順は、いくつかのマイナーなAPIの翻訳と他の言語で同様であることに注意してください、そして構築する必要tflite_registrarあなたのバイナリに。参照してくださいTensorFlow Liteの推論を詳細については。

# Perform TensorFlow Lite inference.
interp = interpreter.InterpreterWithCustomOps(
    model_content=tflite_model,
    custom_op_registerers=tf_text.tflite_registrar.SELECT_TFTEXT_OPS)
interp.get_signature_list()
{'serving_default': {'inputs': ['input'], 'outputs': ['tokens']} }

次に、TensorFlow Liteインタープリターが入力で呼び出され、上記のTensorFlowの結果と一致する結果が提供されます。

tokenize = interp.get_signature_runner('serving_default')
output = tokenize(input=input_data)
print('TensorFlow Lite result = ', output['tokens'])
TensorFlow Lite result =  [b'Some' b'minds' b'are' b'better' b'kept' b'apart']