Migrar su código TFLite a TF2

Ver en TensorFlow.org Ejecutar en Google Colab Ver fuente en GitHub Descargar libreta

TensorFlow Lite (TFLite) es un conjunto de herramientas que ayuda a los desarrolladores a ejecutar la inferencia de ML en el dispositivo (dispositivos móviles, integrados e IoT). El convertidor TFLite es una de esas herramientas que convierte los modelos TF existentes en un formato de modelo TFLite optimizado que se puede ejecutar de manera eficiente en el dispositivo.

En este documento, aprenderá qué cambios debe realizar en su código de conversión de TF a TFLite, seguido de algunos ejemplos que hacen lo mismo.

Cambios en su código de conversión de TF a TFLite

  • Si está utilizando un formato de modelo TF1 heredado (archivo Keras, GraphDef congelado, puntos de control, tf.Session, etc.), actualícelo a TF1/TF2 SavedModel y use la API del convertidor TF2 tf.lite.TFLiteConverter.from_saved_model(...) para convertirlo en un modelo TFLite (consulte la Tabla 1).

  • Actualice los indicadores de la API del convertidor (consulte la Tabla 2).

  • Elimine las API heredadas, como tf.lite.constants . (por ejemplo: Reemplace tf.lite.constants.INT8 con tf.int8 )

// Tabla 1 // Actualización de la API del convertidor Python de TFLite

API de TF1 API de TF2
tf.lite.TFLiteConverter.from_saved_model('saved_model/',..) soportado
tf.lite.TFLiteConverter.from_keras_model_file('model.h5',..) eliminado (actualización al formato de modelo guardado)
tf.lite.TFLiteConverter.from_frozen_graph('model.pb',..) eliminado (actualización al formato de modelo guardado)
tf.lite.TFLiteConverter.from_session(sess,...) eliminado (actualización al formato de modelo guardado)

// Tabla 2 // Actualización de indicadores de la API de TFLite Python Converter

API de TF1 API de TF2
allow_custom_ops
optimizations
representative_dataset
target_spec
inference_input_type
inference_output_type
experimental_new_converter
experimental_new_quantizer
soportado







input_tensors
output_tensors
input_arrays_with_shape
output_arrays
experimental_debug_info_func
eliminado (argumentos de la API del convertidor no admitidos)




change_concat_input_ranges
default_ranges_stats
get_input_arrays()
inference_type
quantized_input_stats
reorder_across_fake_quant
eliminado (flujos de trabajo de cuantificación no admitidos)





conversion_summary_dir
dump_graphviz_dir
dump_graphviz_video
eliminado (en su lugar, visualice modelos usando Netron o visualize.py )


output_format
drop_control_dependency
eliminado (características no compatibles en TF2)

Ejemplos

Ahora verá algunos ejemplos para convertir modelos TF1 heredados en modelos guardados TF1/TF2 y luego convertirlos en modelos TF2 TFLite.

Configuración

Comience con las importaciones necesarias de 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

Cree todos los formatos de modelo TF1 necesarios.

# 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. Convierta un modelo guardado TF1 en un modelo TFLite

Antes: Convertir con TF1

Este es un código típico para la conversión de TFlite al estilo 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.

Después: Convertir con TF2

Convierta directamente el modelo guardado TF1 en un modelo TFLite, con un conjunto de indicadores de convertidor v2 más pequeños.

# 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. Convierta un archivo de modelo TF1 Keras en un modelo TFLite

Antes: Convertir con TF1

Este es un código típico para la conversión de TFlite al estilo 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.

Después: Convertir con TF2

Primero, convierta el archivo del modelo TF1 Keras a un modelo guardado TF2 y luego conviértalo a un modelo TFLite, con un conjunto de indicadores de convertidor v2 más pequeños.

# 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. Convierta un GraphDef congelado TF1 en un modelo TFLite

Antes: Convertir con TF1

Este es un código típico para la conversión de TFlite al estilo 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.

Después: Convertir con TF2

Primero, convierta el GraphDef congelado TF1 en un modelo guardado TF1 y luego conviértalo en un modelo TFLite, con un conjunto de indicadores de convertidor v2 más pequeños.

## 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.

Otras lecturas

  • Consulte la Guía TFLite para obtener más información sobre los flujos de trabajo y las funciones más recientes.
  • Si está utilizando código TF1 o formatos de modelo TF1 heredados (archivos Keras .h5 , GraphDef congelado .pb , etc.), actualice su código y migre sus modelos al formato TF2 SavedModel .