تبدیل عملگرهای متن TensorFlow به TensorFlow Lite

مشاهده در TensorFlow.org در Google Colab اجرا شود در GitHub مشاهده کنید دانلود دفترچه یادداشت

بررسی اجمالی

مدل‌های یادگیری ماشین اغلب با استفاده از TensorFlow Lite در دستگاه‌های تلفن همراه، جاسازی‌شده و اینترنت اشیا برای بهبود حریم خصوصی داده‌ها و زمان پاسخ‌دهی کمتر استفاده می‌شوند. این مدل ها اغلب برای عملیات پردازش متن نیاز به پشتیبانی دارند. TensorFlow Text نسخه 2.7 و بالاتر عملکرد بهبود یافته، کاهش اندازه های باینری و عملیات بهینه سازی شده برای استفاده در این محیط ها را ارائه می دهد.

عملگرهای متنی

کلاس های متن TensorFlow زیر را می توان از داخل یک مدل TensorFlow Lite استفاده کرد.

  • FastWordpieceTokenizer
  • WhitespaceTokenizer

نمونه مدل

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

from tensorflow.lite.python import interpreter

مثال کد زیر فرآیند تبدیل و تفسیر در پایتون را با استفاده از یک مدل آزمایشی ساده نشان می دهد. توجه داشته باشید که وقتی از TensorFlow Lite استفاده می کنید، خروجی یک مدل نمی تواند یک شی tf.RaggedTensor باشد. با این حال، می توانید اجزای یک شی 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 را به TensorFlow Lite تبدیل کنید

هنگام تبدیل یک مدل TensorFlow با عملگرهای TensorFlow Text به TensorFlow Lite، باید به 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()
2022-02-01 12:09:02.062677: 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/tmpiiuhjdn6/assets
2022-02-01 12:09:03.705144: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
WARNING:absl:Buffer deduplication procedure will be skipped when flatbuffer library is not properly loaded
2022-02-01 12:09:03.705185: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
2022-02-01 12:09:03.921830: W tensorflow/compiler/mlir/lite/flatbuffer_export.cc:1902] 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 استفاده کنید.

توجه داشته باشید که در حالی که مثال زیر استنتاج در پایتون را نشان می‌دهد، مراحل در زبان‌های دیگر با برخی ترجمه‌های جزئی 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']