עזרה להגן על שונית המחסום הגדולה עם TensorFlow על Kaggle הצטרפו אתגר

העברת קוד TFLite שלך ​​ל- TF2

הצג באתר TensorFlow.org הפעל ב-Google Colab צפה במקור ב-GitHub הורד מחברת

TensorFlow לייט (TFLite) הוא סט של כלים המסייעת למפתחים להריץ ML היקש על-מכשיר (נייד, משובצים, והתקנים IOT). ממיר TFLite הוא כלי אחד כזה כי המתגיירים הקיימות בדגמים TF לתבנית מודל TFLite מותאם שניתן להפעיל ביעילות על-התקן.

במסמך זה, תלמד אילו שינויים עליך לבצע בקוד ההמרה TF ל-TFLite, ולאחר מכן מספר דוגמאות שעושות את אותו הדבר.

שינויים בקוד ההמרה של TF ל-TFLite

  • אם אתה משתמש בפורמט מודל TF1 מורשת (קובץ Keras, קפוא GraphDef, מחסומים, tf.Session, וכו '), לעדכן אותו TF1 / TF2 SavedModel ולהשתמש API ממיר TF2 tf.lite.TFLiteConverter.from_saved_model(...) כדי להמיר אותו מודל TFLite (עיין בטבלה 1).

  • עדכן את דגלי ה-API של הממיר (עיין בטבלה 2).

  • הסר APIs מורשת כגון tf.lite.constants . (למשל: החלף tf.lite.constants.INT8 עם tf.int8 )

// טבלה 1 // עדכון API של TFLite Python Converter API

API של TF1 API של 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 Converter API

API של TF1 API של TF2
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
הוסר (זרימות עבודה של קוונטיזציה לא נתמכות)





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

זהו קוד טיפוסי להמרת 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. המר GraphDef קפוא TF1 למודל 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

ראשית, המר את GraphDef הקפוא TF1 ל-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 .