عرض على TensorFlow.org | تشغيل في Google Colab | عرض المصدر على جيثب | تحميل دفتر |
TensorFlow Lite (TFLite) عبارة عن مجموعة من الأدوات التي تساعد المطورين على تشغيل استدلال ML على الجهاز (الأجهزة المحمولة والمدمجة وأجهزة إنترنت الأشياء). محول TFLite هو أحد هذه الأدوات التي تحول نماذج TF الموجودة إلى تنسيق نموذج TFLite محسن يمكن تشغيله بكفاءة على الجهاز.
في هذا المستند ، ستتعرف على التغييرات التي تحتاج إلى إجرائها على رمز تحويل TF إلى TFLite ، متبوعًا ببعض الأمثلة التي تفعل الشيء نفسه.
تغييرات على رمز تحويل TF الخاص بك إلى TFLite
إذا كنت تستخدم تنسيق نموذج TF1 قديم (ملف Keras ، GraphDef مجمدة ، نقاط التحقق ، tf.Session ، إلخ) ، قم بتحديثه إلى TF1 / TF2 SavedModel واستخدم محول TF2 API
tf.lite.TFLiteConverter.from_saved_model(...)لتحويله إلى نموذج TFLite (راجع الجدول 1).قم بتحديث إشارات API الخاصة بالمحول (راجع الجدول 2).
قم بإزالة واجهات برمجة التطبيقات القديمة مثل
tf.lite.constants. (على سبيل المثال: استبدلtf.lite.constants.INT8بـtf.int8)
// الجدول 1 // تحديث واجهة برمجة تطبيقات محول TFLite Python
| واجهة برمجة تطبيقات TF1 | واجهة برمجة تطبيقات TF2 |
|---|---|
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
| واجهة برمجة تطبيقات TF1 | واجهة برمجة تطبيقات TF2 |
|---|---|
allow_custom_opsoptimizationsrepresentative_datasettarget_specinference_input_typeinference_output_typeexperimental_new_converterexperimental_new_quantizer | أيد |
input_tensorsoutput_tensorsinput_arrays_with_shapeoutput_arraysexperimental_debug_info_func | تمت إزالته (وسيطات واجهة برمجة تطبيقات المحول غير المدعومة) |
change_concat_input_rangesdefault_ranges_statsget_input_arrays()inference_typequantized_input_statsreorder_across_fake_quant | تمت إزالته (تدفقات عمل التكميم غير المدعومة) |
conversion_summary_dirdump_graphviz_dirdump_graphviz_video | تمت إزالته (بدلاً من ذلك ، تصور النماذج باستخدام Netron أو visualize.py ) |
output_formatdrop_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. تحويل TF1 GraphDef مجمدة إلى نموذج 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
أولاً ، قم بتحويل TF1 GraphDef المجمدة إلى 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،.pbمجمدة ، إلخ) ، يرجى تحديث الكود وترحيل النماذج الخاصة بك إلى تنسيق TF2 SavedModel .
عرض على TensorFlow.org
تشغيل في Google Colab
عرض المصدر على جيثب
تحميل دفتر