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: Reemplacetf.lite.constants.INT8
contf.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 .