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

انتقال کد TFLite خود به TF2

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

TensorFlow بازگشت به محتوا | (TFLite) مجموعه ای از ابزار است که کمک می کند تا توسعه دهندگان را اجرا استنتاج ML بر روی دستگاه (تلفن همراه، تعبیه شده، و دستگاه های IOT). مبدل TFLite یکی از این ابزار که تبدیل exisiting مدل TF به بهینه سازی یک فرمت مدل TFLite است که می تواند موثر بر روی دستگاه اجرا می باشد.

در این سند ، شما یاد می گیرید که باید چه تغییراتی در کد تبدیل TF به TFLite خود ایجاد کنید ، و چند مثال که همین کار را انجام می دهند دنبال می کنید.

تغییرات در کد تبدیل TF به TFLite شما

  • اگر شما با استفاده از یک قالب مدل TF1 میراث (فایل Keras منجمد GraphDef، پست های بازرسی، tf.Session، و غیره)، به روز رسانی آن به TF1 / TF2 SavedModel و با استفاده از API مبدل TF2 tf.lite.TFLiteConverter.from_saved_model(...) آن را تبدیل به یک مدل TFLite (اشاره به جدول 1).

  • پرچم های API مبدل را به روز کنید (به جدول 2 مراجعه کنید).

  • حذف رابط های برنامه کاربردی میراث مانند tf.lite.constants . (به عنوان مثال: به جای tf.lite.constants.INT8 با tf.int8 )

// جدول 1 // به روز رسانی API TFLite Python Converter

TF1 API TF2 API
tf.lite.TFLiteConverter.from_saved_model('saved_model/',..) پشتیبانی
tf.lite.TFLiteConverter.from_keras_model_file('model.h5',..) حذف شد (به روز رسانی به قالب SavedModel)
tf.lite.TFLiteConverter.from_frozen_graph('model.pb',..) حذف شد (به روز رسانی به قالب SavedModel)
tf.lite.TFLiteConverter.from_session(sess,...) حذف شد (به روز رسانی به قالب SavedModel)

// جدول 2 // به روز رسانی TFLite Python Converter API Flags

TF1 API TF2 API
allow_custom_ops
optimizations
representative_dataset
target_spec
inference_input_type
inference_output_type
experimental_new_converter
experimental_new_quantizer
پشتیبانی







input_tensors
output_tensors
input_arrays_with_shape
output_arrays
experimental_debug_info_func
حذف شد (آرگومان های API مبدل پشتیبانی نشده)




change_concat_input_ranges
default_ranges_stats
get_input_arrays()
inference_type
quantized_input_stats
reorder_across_fake_quant
حذف شده (جریانهای کمی سازی پشتیبانی نشده)





conversion_summary_dir
dump_graphviz_dir
dump_graphviz_video
حذف (به جای آن، تجسم مدل با استفاده از Netron یا visualize.py )


output_format
drop_control_dependency
حذف شد (ویژگی های پشتیبانی نشده در TF2)

مثال ها

اکنون چند نمونه را برای تبدیل مدلهای TF1 قدیمی به TF1/TF2 SavedModels و سپس تبدیل آن به مدلهای TF2 TFLite بررسی می کنید.

برپایی

با واردات لازم TensorFlow شروع کنید.

import tensorflow as tf
import tensorflow.compat.v1 as tf1
import numpy as np

import logging
logger = tf.get_logger()
logger.setLevel(logging.ERROR)

import shutil
def remove_dir(path):
  try:
    shutil.rmtree(path)
  except:
    pass

تمام فرمت های مدل TF1 لازم را ایجاد کنید.

# Create a TF1 SavedModel
SAVED_MODEL_DIR = "tf_saved_model/"
remove_dir(SAVED_MODEL_DIR)
with tf1.Graph().as_default() as g:
  with tf1.Session() as sess:
    input = tf1.placeholder(tf.float32, shape=(3,), name='input')
    output = input + 2
    # print("result: ", sess.run(output, {input: [0., 2., 4.]}))
    tf1.saved_model.simple_save(
        sess, SAVED_MODEL_DIR,
        inputs={'input': input}, 
        outputs={'output': output})
print("TF1 SavedModel path: ", SAVED_MODEL_DIR)

# Create a TF1 Keras model
KERAS_MODEL_PATH = 'tf_keras_model.h5'
model = tf1.keras.models.Sequential([
    tf1.keras.layers.InputLayer(input_shape=(128, 128, 3,), name='input'),
    tf1.keras.layers.Dense(units=16, input_shape=(128, 128, 3,), activation='relu'),
    tf1.keras.layers.Dense(units=1, name='output')
])
model.save(KERAS_MODEL_PATH, save_format='h5')
print("TF1 Keras Model path: ", KERAS_MODEL_PATH)

# Create a TF1 frozen GraphDef model
GRAPH_DEF_MODEL_PATH = tf.keras.utils.get_file(
    'mobilenet_v1_0.25_128',
    origin='https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_0.25_128_frozen.tgz',
    untar=True,
) + '/frozen_graph.pb'

print("TF1 frozen GraphDef path: ", GRAPH_DEF_MODEL_PATH)
TF1 SavedModel path:  tf_saved_model/
TF1 Keras Model path:  tf_keras_model.h5
Downloading data from https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_0.25_128_frozen.tgz
2621440/2617289 [==============================] - 0s 0us/step
2629632/2617289 [==============================] - 0s 0us/step
TF1 frozen GraphDef path:  /home/kbuilder/.keras/datasets/mobilenet_v1_0.25_128/frozen_graph.pb

1. یک TF1 SavedModel را به یک مدل TFLite تبدیل کنید

قبل: تبدیل با TF1

این کد معمولی برای تبدیل TFlite به سبک TF1 است.

converter = tf1.lite.TFLiteConverter.from_saved_model(
    saved_model_dir=SAVED_MODEL_DIR,
    input_arrays=['input'],
    input_shapes={'input' : [3]}
)
converter.optimizations = {tf.lite.Optimize.DEFAULT}
converter.change_concat_input_ranges = True
tflite_model = converter.convert()
# Ignore warning: "Use '@tf.function' or '@defun' to decorate the function."
2021-09-22 20:02:56.143221: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-09-22 20:02:56.143267: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
2021-09-22 20:02:56.143274: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.

بعد: تبدیل با TF2

به طور مستقیم TF1 SavedModel را با یک پرچم مبدل کوچکتر v2 به یک مدل TFLite تبدیل کنید.

# Convert TF1 SavedModel to a TFLite model.
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir=SAVED_MODEL_DIR)
converter.optimizations = {tf.lite.Optimize.DEFAULT}
tflite_model = converter.convert()
2021-09-22 20:02:56.207882: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-09-22 20:02:56.207923: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
2021-09-22 20:02:56.207930: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.

2. فایل مدل TF1 Keras را به مدل TFLite تبدیل کنید

قبل: تبدیل با TF1

این کد معمولی برای تبدیل TFlite به سبک TF1 است.

converter = tf1.lite.TFLiteConverter.from_keras_model_file(model_file=KERAS_MODEL_PATH)
converter.optimizations = {tf.lite.Optimize.DEFAULT}
converter.change_concat_input_ranges = True
tflite_model = converter.convert()
2021-09-22 20:02:56.608343: 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-09-22 20:02:57.119836: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-09-22 20:02:57.119881: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
2021-09-22 20:02:57.119888: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.

بعد: تبدیل با TF2

ابتدا ، فایل مدل TF1 Keras را به TF2 SavedModel تبدیل کرده و سپس آن را با یک پرچم مبدل کوچکتر v2 به مدل TFLite تبدیل کنید.

# Convert TF1 Keras model file to TF2 SavedModel.
model = tf.keras.models.load_model(KERAS_MODEL_PATH)
model.save(filepath='saved_model_2/')

# Convert TF2 SavedModel to a TFLite model.
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir='saved_model_2/')
tflite_model = converter.convert()
2021-09-22 20:02:57.943564: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-09-22 20:02:57.943608: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
2021-09-22 20:02:57.943614: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.

3. یک GraphDef یخ زده TF1 را به یک مدل TFLite تبدیل کنید

قبل: تبدیل با TF1

این کد معمولی برای تبدیل TFlite به سبک TF1 است.

converter = tf1.lite.TFLiteConverter.from_frozen_graph(
    graph_def_file=GRAPH_DEF_MODEL_PATH,
    input_arrays=['input'],
    input_shapes={'input' : [1, 128, 128, 3]},
    output_arrays=['MobilenetV1/Predictions/Softmax'],
)
converter.optimizations = {tf.lite.Optimize.DEFAULT}
converter.change_concat_input_ranges = True
tflite_model = converter.convert()
2021-09-22 20:02:58.139650: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-09-22 20:02:58.139707: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
2021-09-22 20:02:58.139721: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.

بعد: تبدیل با TF2

ابتدا ، GraphDef یخ زده TF1 را به TF1 SavedModel تبدیل کنید و سپس آن را با یک پرچم مبدل کوچکتر v2 به مدل TFLite تبدیل کنید.

## Convert TF1 frozen Graph to TF1 SavedModel.

# Load the graph as a v1.GraphDef
import pathlib
gdef = tf.compat.v1.GraphDef()
gdef.ParseFromString(pathlib.Path(GRAPH_DEF_MODEL_PATH).read_bytes())

# Convert the GraphDef to a tf.Graph
with tf.Graph().as_default() as g:
  tf.graph_util.import_graph_def(gdef, name="")

# Lookup the input and output tensors.
input_tensor = g.get_tensor_by_name('input:0') 
output_tensor = g.get_tensor_by_name('MobilenetV1/Predictions/Softmax:0')

# Save the graph as a TF1 Savedmodel
remove_dir('saved_model_3/')
with tf.compat.v1.Session(graph=g) as s:
  tf.compat.v1.saved_model.simple_save(
      session=s,
      export_dir='saved_model_3/',
      inputs={'input':input_tensor},
      outputs={'output':output_tensor})

# Convert TF1 SavedModel to a TFLite model.
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir='saved_model_3/')
converter.optimizations = {tf.lite.Optimize.DEFAULT}
tflite_model = converter.convert()
2021-09-22 20:02:58.874490: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format.
2021-09-22 20:02:58.874538: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency.
2021-09-22 20:02:58.874545: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.

خواندن بیشتر

  • به مراجعه راهنمای TFLite برای کسب اطلاعات بیشتر در مورد گردش و ویژگی های.
  • اگر شما در حال استفاده از کد TF1 و یا فرمت های مدل TF1 میراث (Keras .h5 فایل ها، GraphDef منجمد .pb ، و غیره)، لطفا کد خود را به روز رسانی و مهاجرت مدل های خود را به فرمت TF2 SavedModel .