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

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

TensorFlow Lite (TFLite) مجموعه ای از ابزارهایی است که به توسعه دهندگان کمک می کند استنتاج ML را روی دستگاه (دستگاه های تلفن همراه، جاسازی شده و اینترنت اشیا) اجرا کنند. مبدل TFLite یکی از ابزارهایی است که مدل‌های 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 مراجعه کنید).

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

// جدول 1 // به روز رسانی API مبدل پایتون TFLite

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 Update

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 را به یک مدل TFLite تبدیل کنید، با یک پرچم مبدل v2 کوچکتر.

# 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 تبدیل کنید و سپس آن را به مدل TFLite تبدیل کنید، با مجموعه پرچم های مبدل v2 کوچکتر.

# 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 تبدیل کنید و سپس آن را به مدل TFLite تبدیل کنید، با یک پرچم مبدل v2 کوچکتر.

## 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 منتقل کنید.