Conversor de TensorFlow Lite

El conversor de TensorFlow Lite toma un modelo de TensorFlow y genera un modelo de TensorFlow Lite (un formato FlatBuffer optimizado que se puede identificar mediante la extensión de archivo .tflite). Para usar el conversor, tienes dos opciones:

  1. API de Python (recomendada): Facilita las tareas de convertir modelos como parte de la canalización del desarrollo de modelos, aplicar optimizaciones, agregar metadatos y muchas otras funciones.
  2. Línea de comandos: Solo admite la conversión básica de modelos.

Flujo de trabajo del conversor de TFLite

API de Python

Código de ayuda: Para identificar la versión instalada de TensorFlow, ejecuta print(tf.__version__). Si deseas obtener más información sobre la API del conversor de TensorFlow Lite, ejecuta print(help(tf.lite.TFLiteConverter)).

Si instalaste TensorFlow 2.x, tienes las dos siguientes opciones: (si instalaste TensorFlow 1.x, consulta GitHub).

En el siguiente ejemplo, se muestra cómo convertir un modelo guardado 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
  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])
tflite_model = converter.convert()

# Save the model.
with open('model.tflite', 'wb') as f:
  f.write(tflite_model)

Otras funciones

  • Aplica optimizaciones. La cuantización posterior al entrenamiento es una optimización que se usa con frecuencia y que puede reducir aún más la latencia y el tamaño del modelo con una pérdida mínima de exactitud.

  • Maneja operaciones no compatibles. Si tu modelo cuenta con operadores, tienes las siguientes opciones:

    1. Compatible con TensorFlow, pero no compatible con TensorFlow Lite: Si tienes restricciones de tamaño, debes crear el operador de TensorFlow Lite; de lo contrario, usa operadores de TensorFlow en tu modelo de TensorFlow Lite.

    2. No compatible con TensorFlow: Debes crear el operador de TensorFlow y, luego, crear el operador de TensorFlow Lite. Si no pudiste crear el operador de TensorFlow o no quieres crear uno (no se recomienda, procede con precaución), aún así puedes realizar la conversión con el atributo custom_opdefs y, luego, crear el operador de TensorFlow Lite directamente. El atributo custom_opdefs es una string que contiene una (o una lista de) OpDef o uno o varios protocolos de definición de operador. A continuación, se muestra un ejemplo de TFLiteAwesomeCustomOp con 1 entrada, 1 salida y 2 atributos:

  converter.custom_opdefs="""name: 'TFLiteAwesomeCustomOp' input_arg:
  { name: 'In' type: DT_FLOAT } output_arg: { name: 'Out' type: DT_FLOAT }
  attr : { name: 'a1' type: 'float'} attr : { name: 'a2' type: 'list(float)'}"""

Herramienta de línea de comandos

Se recomienda que uses la API de Python mencionada anteriormente, de ser posible.

Si instalaste TensorFlow 2.x desde pip, usa el comando tflite_convert de la siguiente manera (si instalaste TensorFlow 2.x desde el código fuente, puedes reemplazar 'tflite_convert' por 'bazel run //tensorflow/lite/python:tflite_convert --' en las secciones subsiguientes, y si instalaste TensorFlow 1.x, consulta GitHub (referencia, ejemplos))

tflite_convert: Para ver todas las etiquetas 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.

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

Próximos pasos

  • Agrega metadatos, ya que facilitan la creación de código del wrapper específico de la plataforma cuando se implementan modelos en dispositivos.
  • Usa el intérprete de TensorFlow Lite para ejecutar la inferencia en un dispositivo cliente (p. ej., dispositivo móvil, incorporado).