ช่วยปกป้อง Great Barrier Reef กับ TensorFlow บน Kaggle เข้าร่วมท้าทาย

การย้ายรหัส TFLite ของคุณไปยัง TF2

ดูบน 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 API tf.lite.TFLiteConverter.from_saved_model(...) เพื่อแปลงเป็นรูปแบบ TFLite A (โปรดดูตารางที่ 1)

  • อัปเดตแฟล็กตัวแปลง API (ดูตารางที่ 2)

  • APIs ลบมรดกเช่น 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 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
ถูกลบออก (เวิร์กโฟลว์ 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 ที่จะเรียนรู้เพิ่มเติมเกี่ยวกับขั้นตอนการทำงานและคุณสมบัติล่าสุด
  • หากคุณกำลังใช้รหัส TF1 หรือมรดกรูปแบบรูปแบบ TF1 (Keras .h5 ไฟล์ GraphDef แช่แข็ง .pb ฯลฯ ) โปรดอัปเดตรหัสของคุณและย้ายรูปแบบของคุณไปยัง รูปแบบ TF2 SavedModel