Di chuyển mã TFLite của bạn sang TF2

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ằng tf.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 .