Xem trên TensorFlow.org | Chạy trong Google Colab | Xem nguồn trên GitHub | Tải xuống sổ ghi chép |
TensorFlow Lite (TFLite) là một bộ công cụ giúp các nhà phát triển chạy suy luận ML trên thiết bị (thiết bị di động, nhúng và IoT). Bộ chuyển đổi TFLite là một trong những công cụ chuyển đổi các mô hình TF đang hoạt động thành một định dạng mô hình TFLite được tối ưu hóa để có thể chạy trên thiết bị một cách hiệu quả.
Trong tài liệu này, bạn sẽ tìm hiểu những thay đổi nào bạn cần thực hiện đối với mã chuyển đổi TF sang TFLite, tiếp theo là một số ví dụ thực hiện tương tự.
Các thay đổi đối với mã chuyển đổi TF sang TFLite của bạn
Nếu bạn đang sử dụng định dạng mô hình TF1 kế thừa (tệp Keras, GraphDef cố định, điểm kiểm tra, tf.Session, v.v.), hãy cập nhật nó lên TF1 / TF2 SavedModel và sử dụng API trình chuyển đổi TF2
tf.lite.TFLiteConverter.from_saved_model(...)
để chuyển đổi nó thành mô hình TFLite (tham khảo Bảng 1).Cập nhật cờ API của bộ chuyển đổi (tham khảo Bảng 2).
Xóa các API kế thừa như
tf.lite.constants
. (ví dụ: Thay thếtf.lite.constants.INT8
bằngtf.int8
)
// Bảng 1 // Cập nhật API TFLite Python Converter
API TF1 | API TF2 |
---|---|
tf.lite.TFLiteConverter.from_saved_model('saved_model/',..) | được hỗ trợ |
tf.lite.TFLiteConverter.from_keras_model_file('model.h5',..) | đã loại bỏ (cập nhật lên định dạng SavedModel) |
tf.lite.TFLiteConverter.from_frozen_graph('model.pb',..) | đã loại bỏ (cập nhật lên định dạng SavedModel) |
tf.lite.TFLiteConverter.from_session(sess,...) | đã loại bỏ (cập nhật lên định dạng SavedModel) |
// Bảng 2 // Cập nhật cờ API trình chuyển đổi Python TFLite
API TF1 | API TF2 |
---|---|
allow_custom_ops optimizations representative_dataset target_spec inference_input_type inference_output_type experimental_new_converter experimental_new_quantizer | được hỗ trợ |
input_tensors output_tensors input_arrays_with_shape output_arrays experimental_debug_info_func | đã loại bỏ (đối số API của trình chuyển đổi không được hỗ trợ) |
change_concat_input_ranges default_ranges_stats get_input_arrays() inference_type quantized_input_stats reorder_across_fake_quant | đã loại bỏ (quy trình lượng tử hóa không được hỗ trợ) |
conversion_summary_dir dump_graphviz_dir dump_graphviz_video | đã loại bỏ (thay vào đó, trực quan hóa các mô hình bằng Netron hoặc visual.py ) |
output_format drop_control_dependency | đã loại bỏ (các tính năng không được hỗ trợ trong TF2) |
Các ví dụ
Bây giờ bạn sẽ hướng dẫn một số ví dụ để chuyển đổi mô hình TF1 cũ thành Mô hình lưu TF1 / TF2 và sau đó chuyển đổi nó thành mô hình TFLite TF2.
Thành lập
Bắt đầu với các lần nhập TensorFlow cần thiết.
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
Tạo tất cả các định dạng mô hình TF1 cần thiết.
# 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. Chuyển đổi TF1 SavedModel thành một mô hình TFLite
Trước: Chuyển đổi với TF1
Đây là mã điển hình cho chuyển đổi TFlite kiểu 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.
Sau: Chuyển đổi với TF2
Trực tiếp chuyển đổi TF1 SavedModel thành mô hình TFLite, với bộ cờ chuyển đổi v2 nhỏ hơn được đặt.
# 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. Chuyển đổi tệp mô hình TF1 Keras thành mô hình TFLite
Trước: Chuyển đổi với TF1
Đây là mã điển hình cho chuyển đổi TFlite kiểu 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.
Sau: Chuyển đổi với TF2
Đầu tiên, chuyển đổi tệp mô hình TF1 Keras thành TF2 SavedModel và sau đó chuyển đổi nó thành mô hình TFLite, với bộ cờ chuyển đổi v2 nhỏ hơn.
# 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. Chuyển đổi GraphDef cố định TF1 thành mô hình TFLite
Trước: Chuyển đổi với TF1
Đây là mã điển hình cho chuyển đổi TFlite kiểu 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.
Sau: Chuyển đổi với TF2
Đầu tiên, chuyển đổi GraphDef cố định TF1 thành TF1 SavedModel và sau đó chuyển đổi nó thành mô hình TFLite, với bộ cờ chuyển đổi v2 nhỏ hơn.
## 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.
đọc thêm
- Tham khảo Hướng dẫn TFLite để tìm hiểu thêm về quy trình làm việc và các tính năng mới nhất.
- Nếu bạn đang sử dụng mã TF1 hoặc các định dạng mô hình TF1 kế thừa (tệp
.h5
, GraphDef.pb
, v.v.), vui lòng cập nhật mã của bạn và di chuyển mô hình của bạn sang định dạng TF2 SavedModel .