روز جامعه ML 9 نوامبر است! برای به روز رسانی از TensorFlow، JAX به ما بپیوندید، و بیشتر بیشتر بدانید

امضا در TensorFlow Lite

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

TensorFlow Lite از تبدیل مشخصات ورودی/خروجی مدل TensorFlow به مدل های TensorFlow Lite پشتیبانی می کند. مشخصات ورودی/خروجی "امضا" نامیده می شود. هنگام ایجاد یک SavedModel یا ایجاد عملکردهای مشخص می توان امضا را مشخص کرد.

امضا در TensorFlow Lite ویژگی های زیر را ارائه می دهد:

  • آنها ورودی و خروجی های مدل تبدیل شده TensorFlow Lite را با رعایت امضای مدل TensorFlow مشخص می کنند.
  • به یک مدل TensorFlow Lite اجازه دهید از چندین نقطه ورود پشتیبانی کند.

امضا از سه قسمت تشکیل شده است:

  • ورودی ها: نقشه ورودی ها از نام ورودی در امضا تا تانسور ورودی.
  • خروجی ها: نقشه ای برای نگاشت خروجی از نام خروجی در امضا به تانسور خروجی.
  • کلید امضا: نامی است که نقطه ورود نمودار را مشخص می کند.

برپایی

pip uninstall -y tensorflow keras
pip install tf-nightly
import tensorflow as tf

مدل نمونه

فرض کنید دو وظیفه داریم ، به عنوان مثال ، رمزگذاری و رمزگشایی ، به عنوان یک مدل TensorFlow:

class Model(tf.Module):

  @tf.function(input_signature=[tf.TensorSpec(shape=[None], dtype=tf.float32)])
  def encode(self, x):
    result = tf.strings.as_string(x)
    return {
         "encoded_result": result
    }

  @tf.function(input_signature=[tf.TensorSpec(shape=[None], dtype=tf.string)])
  def decode(self, x):
    result = tf.strings.to_number(x)
    return {
         "decoded_result": result
    }

از نظر امضا ، مدل TensorFlow فوق را می توان به شرح زیر خلاصه کرد:

  • امضا

    • کلید: رمزگذاری
    • ورودی ها: {"x"}
    • خروجی: {"encoded_result"}
  • امضا

    • کلید: رمزگشایی
    • ورودی ها: {"x"}
    • خروجی: {"decoded_result"}

تبدیل یک مدل با امضا

API های مبدل TensorFlow Lite اطلاعات امضای فوق را به مدل تبدیل شده TensorFlow Lite وارد می کند.

این قابلیت تبدیل در همه API های مبدل از TensorFlow نسخه 2.7.0 در دسترس است. نمونه های استفاده را ببینید.

از مدل ذخیره شده

model = Model()

# Save the model
SAVED_MODEL_PATH = 'content/saved_models/coding'

tf.saved_model.save(
    model, SAVED_MODEL_PATH,
    signatures={
      'encode': model.encode.get_concrete_function(),
      'decode': model.decode.get_concrete_function()
    })

# Convert the saved model using TFLiteConverter
converter = tf.lite.TFLiteConverter.from_saved_model(SAVED_MODEL_PATH)
converter.target_spec.supported_ops = [
    tf.lite.OpsSet.TFLITE_BUILTINS,  # enable TensorFlow Lite ops.
    tf.lite.OpsSet.SELECT_TF_OPS  # enable TensorFlow ops.
]
tflite_model = converter.convert()

# Print the signatures from the converted model
interpreter = tf.lite.Interpreter(model_content=tflite_model)
signatures = interpreter.get_signature_list()
print(signatures)
2021-10-07 13:26:24.918744: 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: content/saved_models/coding/assets
{'decode': {'inputs': ['x'], 'outputs': ['decoded_result']}, 'encode': {'inputs': ['x'], 'outputs': ['encoded_result']} }
2021-10-07 13:26:25.298018: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
2021-10-07 13:26:25.298052: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
2021-10-07 13:26:25.298061: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:372] Ignored change_concat_input_ranges.
2021-10-07 13:26:25.343445: W tensorflow/compiler/mlir/lite/flatbuffer_export.cc:1899] TFLite interpreter needs to link Flex delegate in order to run the model since it contains the following Select TFop(s):
Flex ops: FlexAsString, FlexStringToNumber
Details:
    tf.AsString(tensor<?xf32>) -> (tensor<?x!tf_type.string>) : {device = "", fill = "", precision = -1 : i64, scientific = false, shortest = false, width = -1 : i64}
    tf.StringToNumber(tensor<?x!tf_type.string>) -> (tensor<?xf32>) : {device = "", out_type = f32}
See instructions: https://www.tensorflow.org/lite/guide/ops_select
INFO: Created TensorFlow Lite delegate for select TF ops.
INFO: TfLiteFlexDelegate delegate: 1 nodes delegated out of 1 nodes with 1 partitions.

از مدل Keras

# Generate a Keras model.
keras_model = tf.keras.Sequential(
    [
        tf.keras.layers.Dense(2, input_dim=4, activation='relu', name='x'),
        tf.keras.layers.Dense(1, activation='relu', name='output'),
    ]
)

# Convert the keras model using TFLiteConverter.
# Keras model converter API uses the default signature automatically.
converter = tf.lite.TFLiteConverter.from_keras_model(keras_model)
tflite_model = converter.convert()

# Print the signatures from the converted model
interpreter = tf.lite.Interpreter(model_content=tflite_model)

signatures = interpreter.get_signature_list()
print(signatures)
INFO:tensorflow:Assets written to: /tmp/tmp7ji0olgi/assets
{'serving_default': {'inputs': ['x_input'], 'outputs': ['output']} }
2021-10-07 13:26:25.967916: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
2021-10-07 13:26:25.967951: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
2021-10-07 13:26:26.029813: W tensorflow/compiler/mlir/lite/flatbuffer_export.cc:704] Cannot get mac count for %0 = "tfl.fully_connected"(%arg0, %cst, %cst_1) {fused_activation_function = "RELU", keep_num_dims = false, weights_format = "DEFAULT"} : (tensor<?x4xf32>, tensor<2x4xf32>, none) -> tensor<?x2xf32>

2021-10-07 13:26:26.029851: W tensorflow/compiler/mlir/lite/flatbuffer_export.cc:704] Cannot get mac count for %1 = "tfl.fully_connected"(%0, %cst_0, %cst_1) {fused_activation_function = "RELU", keep_num_dims = false, weights_format = "DEFAULT"} : (tensor<?x2xf32>, tensor<1x2xf32>, none) -> tensor<?x1xf32>

از توابع بتنی

model = Model()

# Convert the concrete functions using TFLiteConverter
converter = tf.lite.TFLiteConverter.from_concrete_functions(
    [model.encode.get_concrete_function(),
     model.decode.get_concrete_function()], model)
converter.target_spec.supported_ops = [
    tf.lite.OpsSet.TFLITE_BUILTINS,  # enable TensorFlow Lite ops.
    tf.lite.OpsSet.SELECT_TF_OPS  # enable TensorFlow ops.
]
tflite_model = converter.convert()

# Print the signatures from the converted model
interpreter = tf.lite.Interpreter(model_content=tflite_model)
signatures = interpreter.get_signature_list()
print(signatures)
INFO:tensorflow:Assets written to: /tmp/tmp63yjmj97/assets
INFO:tensorflow:Assets written to: /tmp/tmp63yjmj97/assets
{'decode': {'inputs': ['x'], 'outputs': ['decoded_result']}, 'encode': {'inputs': ['x'], 'outputs': ['encoded_result']} }
2021-10-07 13:26:26.156465: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
2021-10-07 13:26:26.156501: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
2021-10-07 13:26:26.192370: W tensorflow/compiler/mlir/lite/flatbuffer_export.cc:1899] TFLite interpreter needs to link Flex delegate in order to run the model since it contains the following Select TFop(s):
Flex ops: FlexAsString, FlexStringToNumber
Details:
    tf.AsString(tensor<?xf32>) -> (tensor<?x!tf_type.string>) : {device = "", fill = "", precision = -1 : i64, scientific = false, shortest = false, width = -1 : i64}
    tf.StringToNumber(tensor<?x!tf_type.string>) -> (tensor<?xf32>) : {device = "", out_type = f32}
See instructions: https://www.tensorflow.org/lite/guide/ops_select

امضا را اجرا کنید

API های استنتاج TensorFlow از اجرای مبتنی بر امضا پشتیبانی می کنند:

  • دسترسی به تنسورهای ورودی/خروجی از طریق نام ورودی ها و خروجی ها ، که با امضا مشخص شده است.
  • اجرای هر نقطه ورود نمودار جداگانه ، با کلید امضا مشخص شده است.
  • پشتیبانی از روش اولیه سازی SavedModel.

پیوندهای زبان جاوا ، C ++ و پایتون در حال حاضر در دسترس هستند. به بخش های زیر مثال بزنید.

جاوا

try (Interpreter interpreter = new Interpreter(file_of_tensorflowlite_model)) {
  // Run encoding signature.
  Map<String, Object> inputs = new HashMap<>();
  inputs.put("x", input);
  Map<String, Object> outputs = new HashMap<>();
  outputs.put("encoded_result", encoded_result);
  interpreter.runSignature(inputs, outputs, "encode");

  // Run decoding signature.
  Map<String, Object> inputs = new HashMap<>();
  inputs.put("x", encoded_result);
  Map<String, Object> outputs = new HashMap<>();
  outputs.put("decoded_result", decoded_result);
  interpreter.runSignature(inputs, outputs, "decode");
}

C ++

SignatureRunner* encode_runner =
    interpreter->GetSignatureRunner("encode");
encode_runner->ResizeInputTensor("x", {100});
encode_runner->AllocateTensors();

TfLiteTensor* input_tensor = encode_runner->input_tensor("x");
float* input = input_tensor->data.f;
// Fill `input`.

encode_runner->Invoke();

const TfLiteTensor* output_tensor = encode_runner->output_tensor(
    "encoded_result");
float* output = output_tensor->data.f;
// Access `output`.

پایتون

# Load the TFLite model in TFLite Interpreter
interpreter = tf.lite.Interpreter(model_content=tflite_model)

# Print the signatures from the converted model
signatures = interpreter.get_signature_list()
print('Signature:', signatures)

# encode and decode are callable with input as arguments.
encode = interpreter.get_signature_runner('encode')
decode = interpreter.get_signature_runner('decode')

# 'encoded' and 'decoded' are dictionaries with all outputs from the inference.
input = tf.constant([1, 2, 3], dtype=tf.float32)
print('Input:', input)
encoded = encode(x=input)
print('Encoded result:', encoded)
decoded = decode(x=encoded['encoded_result'])
print('Decoded result:', decoded)
Signature: {'decode': {'inputs': ['x'], 'outputs': ['decoded_result']}, 'encode': {'inputs': ['x'], 'outputs': ['encoded_result']} }
Input: tf.Tensor([1. 2. 3.], shape=(3,), dtype=float32)
Encoded result: {'encoded_result': array([b'1.000000', b'2.000000', b'3.000000'], dtype=object)}
Decoded result: {'decoded_result': array([1., 2., 3.], dtype=float32)}

محدودیت های شناخته شده

  • از آنجا که مترجم TFLite ایمنی موضوع را تضمین نمی کند ، دونده امضا از همان مترجم به طور همزمان اجرا نمی شود.
  • پشتیبانی از C/iOS/Swift هنوز در دسترس نیست.

به روز رسانی

  • نسخه 2.7
    • ویژگی امضای چندگانه پیاده سازی شده است.
    • همه API های مبدل از نسخه دو مدل های TensorFlow Lite را با امضای فعال ایجاد می کنند.
  • نسخه 2.5
    • از ویژگی های امضای طریق در دسترس است from_saved_model API مبدل.