ดูบน TensorFlow.org | ทำงานใน Google Colab | ดูแหล่งที่มาบน GitHub | ดาวน์โหลดโน๊ตบุ๊ค |
TensorFlow Lite (TFLite) คือชุดเครื่องมือที่ช่วยให้นักพัฒนาเรียกใช้การอนุมาน ML บนอุปกรณ์ (อุปกรณ์เคลื่อนที่ อุปกรณ์ฝังตัว และอุปกรณ์ IoT) ตัว แปลง TFLite เป็นเครื่องมืออย่างหนึ่งที่แปลงโมเดล TF ที่มีอยู่ให้เป็นรูปแบบโมเดล TFLite ที่ปรับให้เหมาะสมซึ่งสามารถทำงานบนอุปกรณ์ได้อย่างมีประสิทธิภาพ
ในเอกสารนี้ คุณจะได้เรียนรู้การเปลี่ยนแปลงที่คุณต้องทำในโค้ดการแปลง TF เป็น TFLite ตามด้วยตัวอย่างบางส่วนที่ทำเช่นเดียวกัน
การเปลี่ยนแปลงรหัสการแปลง TF เป็น TFLite
หากคุณกำลังใช้รูปแบบโมเดล TF1 ดั้งเดิม (ไฟล์ Keras, GraphDef ที่ตรึงไว้, จุดตรวจ, tf.Session เป็นต้น) ให้อัปเดตเป็น TF1/TF2 SavedModel และใช้ TF2 converter API
tf.lite.TFLiteConverter.from_saved_model(...)
เพื่อแปลงเป็นโมเดล TFLite (ดูในตารางที่ 1)อัปเดตแฟล็กตัวแปลง API (ดูตารางที่ 2)
ลบ API รุ่นเก่า เช่น
tf.lite.constants
(เช่น: แทนที่tf.lite.constants.INT8
ด้วยtf.int8
)
// ตารางที่ 1 // การอัปเดต TFLite Python Converter API
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 แฟล็ก 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 | ถูกลบออก (เวิร์กโฟลว์ quantization ที่ไม่รองรับ) |
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
นี่คือรหัสทั่วไปสำหรับการแปลง TF1 แบบ 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
นี่คือรหัสทั่วไปสำหรับการแปลง TF1 แบบ 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
นี่คือรหัสทั่วไปสำหรับการแปลง TF1 แบบ 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 Guide เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับเวิร์กโฟลว์และคุณสมบัติล่าสุด
- หากคุณใช้โค้ด TF1 หรือรูปแบบโมเดล TF1 รุ่นเก่า (ไฟล์ Keras
.h5
, GraphDef.pb
ที่ตรึงไว้ ฯลฯ) โปรดอัปเดตโค้ดและย้ายโมเดลของคุณเป็นรูปแบบ TF2 SavedModel