Converti i modelli TensorFlow

Questa pagina descrive come convertire un modello TensorFlow in un modello TensorFlow Lite (un formato ottimizzato FlatBuffer identificato dall'estensione del file .tflite) utilizzando il convertitore TensorFlow Lite.

Flusso di lavoro della conversione

Il diagramma seguente illustra il flusso di lavoro di alto livello per la conversione del modello:

Flusso di lavoro del convertitore TFLite

Figura 1. Flusso di lavoro del convertitore.

Puoi convertire il tuo modello utilizzando una delle seguenti opzioni:

  1. API Python (consigliata): consente di integrare la conversione nella pipeline di sviluppo, applicare ottimizzazioni, aggiungere metadati e molte altre attività che semplificano il processo di conversione.
  2. Riga di comando: supporta solo la conversione del modello di base.

API Python

Codice di supporto: per scoprire di più sull'API di conversione TensorFlow Lite, esegui print(help(tf.lite.TFLiteConverter)).

Converti un modello TensorFlow utilizzando tf.lite.TFLiteConverter. Un modello TensorFlow viene archiviato usando il formato SaveModel e generato utilizzando le API tf.keras.* di alto livello (un modello Keras) o le API tf.* di basso livello (da cui vengono generate funzioni concrete). Di conseguenza, hai a disposizione le tre opzioni seguenti (gli esempi sono riportati nelle sezioni successive):

L'esempio seguente mostra come convertire un SavedModel in un modello 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)

Converti un modello Keras

L'esempio seguente mostra come convertire un modello Keras in un modello 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)

Convertire funzioni concrete

L'esempio seguente mostra come convertire funzioni concrete in un modello 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)

Altre funzionalità

  • Applica le ottimizzazioni. Un'ottimizzazione comune utilizzata è la quantizzazione successiva all'addestramento, che può ridurre ulteriormente la latenza e le dimensioni del modello con una perdita minima di precisione.

  • Aggiungi metadata, per semplificare la creazione di codice wrapper specifico per la piattaforma durante il deployment dei modelli sui dispositivi.

Errori di conversione

Di seguito sono riportati gli errori di conversione più comuni e le relative soluzioni:

Strumento a riga di comando

Se hai installato TensorFlow 2.x da pip, utilizza il comando tflite_convert. Per visualizzare tutti i flag disponibili, utilizza il seguente 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.

Se la sorgente TensorFlow 2.x è stata scaricata e vuoi eseguire il convertitore da tale origine senza creare e installare il pacchetto, puoi sostituire "tflite_convert" con "bazel run tensorflow/lite/python:tflite_convert --" nel comando.

Conversione di un SaveModel

tflite_convert \
  --saved_model_dir=/tmp/mobilenet_saved_model \
  --output_file=/tmp/mobilenet.tflite

Conversione di un modello Keras H5

tflite_convert \
  --keras_model_file=/tmp/mobilenet_keras_model.h5 \
  --output_file=/tmp/mobilenet.tflite