En esta página, se describe cómo convertir un modelo de TensorFlow a un modelo de TensorFlow Lite (un formato FlatBuffer optimizado que se identifica con la extensión de archivo .tflite
) con el conversor de TensorFlow Lite.
Flujo de trabajo de las conversiones
En el siguiente diagrama, se ilustra el flujo de trabajo de alto nivel para convertir tu modelo:
Figura 1: Flujo de trabajo del usuario que generó una conversión
Puedes convertir el modelo usando una de las siguientes opciones:
- API de Python (recomendada): Te permite integrar la conversión en la canalización de desarrollo, aplicar optimizaciones, agregar metadatos y muchas otras tareas que simplifican el proceso de conversión.
- Línea de comandos: Solo admite la conversión básica de modelos.
API de Python
Código de ayuda: Para obtener más información sobre la API del conversor
de TensorFlow Lite, ejecuta print(help(tf.lite.TFLiteConverter))
.
Convierte un modelo de TensorFlow con tf.lite.TFLiteConverter
.
Un modelo de TensorFlow se almacena con el formato de modelo guardado y se genera con las APIs de tf.keras.*
de alto nivel (un modelo de Keras) o las APIs de tf.*
de bajo nivel (desde las que generas funciones concretas). Como resultado, tienes las siguientes tres opciones (los ejemplos se encuentran en las siguientes secciones):
tf.lite.TFLiteConverter.from_saved_model()
(recomendado): Convierte un SavedModel.tf.lite.TFLiteConverter.from_keras_model()
: Convierte un modelo de Keras.tf.lite.TFLiteConverter.from_concrete_functions()
: Convierte funciones concretas.
Convierte un modelo guardado (recomendado)
En el siguiente ejemplo, se muestra cómo convertir un SavedModel en un modelo de TensorFlow Lite.
import tensorflow as tf
# Convert the model
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) # path to the SavedModel directory
tflite_model = converter.convert()
# Save the model.
with open('model.tflite', 'wb') as f:
f.write(tflite_model)
Convierte un modelo de Keras
En el siguiente ejemplo, se muestra cómo convertir un modelo de Keras en un modelo de TensorFlow Lite.
import tensorflow as tf
# Create a model using high-level tf.keras.* APIs
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(units=1, input_shape=[1]),
tf.keras.layers.Dense(units=16, activation='relu'),
tf.keras.layers.Dense(units=1)
])
model.compile(optimizer='sgd', loss='mean_squared_error') # compile the model
model.fit(x=[-1, 0, 1], y=[-3, -1, 1], epochs=5) # train the model
# (to generate a SavedModel) tf.saved_model.save(model, "saved_model_keras_dir")
# Convert the model.
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
# Save the model.
with open('model.tflite', 'wb') as f:
f.write(tflite_model)
Convierte funciones concretas
En el siguiente ejemplo, se muestra cómo convertir funciones concretas en un modelo de TensorFlow Lite.
import tensorflow as tf
# Create a model using low-level tf.* APIs
class Squared(tf.Module):
@tf.function(input_signature=[tf.TensorSpec(shape=[None], dtype=tf.float32)])
def __call__(self, x):
return tf.square(x)
model = Squared()
# (ro run your model) result = Squared(5.0) # This prints "25.0"
# (to generate a SavedModel) tf.saved_model.save(model, "saved_model_tf_dir")
concrete_func = model.__call__.get_concrete_function()
# Convert the model.
converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func],
model)
tflite_model = converter.convert()
# Save the model.
with open('model.tflite', 'wb') as f:
f.write(tflite_model)
Otras funciones
Aplica optimizaciones. Una optimización que se usa con frecuencia es la cuantización posterior al entrenamiento, que puede reducir aún más la latencia y el tamaño del modelo con una pérdida mínima de exactitud.
Agrega metadatos, que facilitan la creación de código de wrapper específico de la plataforma cuando se implementan modelos en dispositivos.
Errores de conversión
Los siguientes son errores de conversión comunes y sus soluciones:
Error:
Some ops are not supported by the native TFLite runtime, you can enable TF kernels fallback using TF Select.
Solución: El error se produce porque tu modelo tiene operaciones de TF que no tienen una implementación de TFLite correspondiente. Puedes resolverlo mediante la operación de TF en el modelo de TFLite (recomendado). Si solo quieres generar un modelo con operaciones de TFLite, puedes agregar una solicitud para la operación de TFLite faltante en el problema #21526 de GitHub (deja un comentario si tu solicitud aún no se mencionó) o crear la operación de TFLite.
Error:
.. is neither a custom op nor a flex op
Solución si esta operación de TF tiene las siguientes características:
Compatibilidad con TF: El error se produce porque falta la op de TF en la lista de entidades permitidas (una lista exhaustiva de operaciones de TF compatibles con TFLite). Puedes resolverlo de la siguiente manera:
No se admite en TF: El error se produce porque TFLite no reconoce el operador de TF personalizado que definiste. Puedes resolverlo de la siguiente manera:
- Crea la op de TF.
- Convierte el modelo de TF en un modelo de TFLite.
- Crea la op de TFLite y ejecuta la inferencia con solo vincularla al entorno de ejecución de TFLite.
Herramienta de línea de comandos
Si instalaste TensorFlow 2.x desde pip, usa el comando tflite_convert
. Para ver todas las marcas disponibles, usa el siguiente comando:
$ tflite_convert --help
`--output_file`. Type: string. Full path of the output file.
`--saved_model_dir`. Type: string. Full path to the SavedModel directory.
`--keras_model_file`. Type: string. Full path to the Keras H5 model file.
`--enable_v1_converter`. Type: bool. (default False) Enables the converter and flags used in TF 1.x instead of TF 2.x.
You are required to provide the `--output_file` flag and either the `--saved_model_dir` or `--keras_model_file` flag.
Si descargaste la fuente de TensorFlow 2.x y deseas ejecutar el conversor desde esa fuente sin compilar ni instalar el paquete, puedes reemplazar “tflite_convert
” por “bazel run tensorflow/lite/python:tflite_convert --
” en el comando.
Cómo convertir un modelo guardado
tflite_convert \
--saved_model_dir=/tmp/mobilenet_saved_model \
--output_file=/tmp/mobilenet.tflite
Cómo convertir un modelo de Keras H5
tflite_convert \
--keras_model_file=/tmp/mobilenet_keras_model.h5 \
--output_file=/tmp/mobilenet.tflite