Dzień Społeczności ML jest 9 listopada! Dołącz do nas na aktualizacje z TensorFlow Jax i więcej Dowiedz się więcej

Migracja kodu TFLite do TF2

Zobacz na TensorFlow.org Uruchom w Google Colab Wyświetl źródło na GitHub Pobierz notatnik

TensorFlow Lite (TFLite) to zestaw narzędzi, który pomaga programistom uruchomić ML wnioskowanie na urządzeniu (telefony, wbudowane oraz urządzenia internetu przedmiotów). Konwerter TFLite jest jednym z takich narzędzi, które konwertuje objąć istniejącymi modele TF w zoptymalizowanym formacie modelu TFLite że można skutecznie działać na urządzeniu.

W tym dokumencie dowiesz się, jakie zmiany należy wprowadzić w kodzie konwersji TF na TFLite, a następnie przedstawisz kilka przykładów, które robią to samo.

Zmiany w kodzie konwersji TF na TFLite

  • Jeśli używasz formatu dziedzictwo modelu TF1 (plik Keras, mrożone GraphDef, punkty kontrolne, tf.Session itp), zaktualizować go do TF1 / TF2 SavedModel i używać API konwertera TF2 tf.lite.TFLiteConverter.from_saved_model(...) w celu przekształcenia go w modelu TFLite (patrz tabela 1).

  • Zaktualizuj flagi interfejsu API konwertera (patrz Tabela 2).

  • Usuń starsze API, takich jak tf.lite.constants . (np wymienić tf.lite.constants.INT8 z tf.int8 )

// Tabela 1 // Aktualizacja interfejsu API TFLite Python Converter

TF1 API TF2 API
tf.lite.TFLiteConverter.from_saved_model('saved_model/',..) utrzymany
tf.lite.TFLiteConverter.from_keras_model_file('model.h5',..) usunięto (aktualizacja do formatu SavedModel)
tf.lite.TFLiteConverter.from_frozen_graph('model.pb',..) usunięto (aktualizacja do formatu SavedModel)
tf.lite.TFLiteConverter.from_session(sess,...) usunięto (aktualizacja do formatu SavedModel)

// Tabela 2 // Aktualizacja flag interfejsu API konwertera TFLite w Pythonie

TF1 API TF2 API
allow_custom_ops
optimizations
representative_dataset
target_spec
inference_input_type
inference_output_type
experimental_new_converter
experimental_new_quantizer
utrzymany







input_tensors
output_tensors
input_arrays_with_shape
output_arrays
experimental_debug_info_func
usunięto (nieobsługiwane argumenty interfejsu API konwertera)




change_concat_input_ranges
default_ranges_stats
get_input_arrays()
inference_type
quantized_input_stats
reorder_across_fake_quant
usunięto (nieobsługiwane przepływy pracy kwantyzacji)





conversion_summary_dir
dump_graphviz_dir
dump_graphviz_video
usunięte (zamiast, wizualizacji modeli z Netron lub visualize.py )


output_format
drop_control_dependency
usunięto (funkcje nieobsługiwane w TF2)

Przykłady

Omówisz teraz kilka przykładów konwertowania starszych modeli TF1 na TF1/TF2 SavedModels, a następnie przekonwertowania ich na modele TF2 TFLite.

Ustawiać

Zacznij od niezbędnych importów 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

Utwórz wszystkie niezbędne formaty modeli 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. Konwertuj TF1 SavedModel na model TFLite

Przed: Konwersja z TF1

Jest to typowy kod konwersji TFlite w stylu 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.

Po: Konwersja z TF2

Bezpośrednio przekonwertuj TF1 SavedModel na model TFLite, z ustawionymi mniejszymi flagami konwertera 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. Konwertuj plik modelu TF1 Keras na model TFLite

Przed: Konwersja z TF1

Jest to typowy kod konwersji TFlite w stylu 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.

Po: Konwersja z TF2

Najpierw przekonwertuj plik modelu TF1 Keras na TF2 SavedModel, a następnie przekonwertuj go na model TFLite z ustawionymi mniejszymi flagami konwertera 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. Konwertuj zamrożony GraphDef TF1 na model TFLite

Przed: Konwersja z TF1

Jest to typowy kod konwersji TFlite w stylu 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.

Po: Konwersja z TF2

Najpierw przekonwertuj zamrożony GraphDef TF1 na TF1 SavedModel, a następnie przekonwertuj go na model TFLite z ustawionymi mniejszymi flagami konwertera 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.

Dalsza lektura

  • Zapoznaj się z TFLite Guide , aby dowiedzieć się więcej na temat przepływów pracy i najnowszych funkcji.
  • Jeśli używasz kodu TF1 lub starszych formatów modeli TF1 (Keras .h5 plików, mrożone GraphDef .pb itp), należy zaktualizować swój kod i przenieść swoje modele w formacie TF2 SavedModel .