Cette page explique comment convertir un modèle TensorFlow en modèle TensorFlow Lite (un format FlatBuffer optimisé identifié par l'extension de fichier .tflite
) à l'aide du convertisseur TensorFlow Lite.
Workflow de conversion
Le schéma ci-dessous illustre le workflow général de conversion de votre modèle:
Figure 1. Workflow de conversion
Vous pouvez convertir votre modèle en utilisant l'une des options suivantes:
- API Python (recommandée) : permet d'intégrer la conversion dans votre pipeline de développement, d'appliquer des optimisations, d'ajouter des métadonnées et de nombreuses autres tâches qui simplifient le processus de conversion.
- Ligne de commande: cette option n'accepte que la conversion de modèles de base.
API Python
Code d'aide: pour en savoir plus sur l'API de conversion TensorFlow Lite, exécutez print(help(tf.lite.TFLiteConverter))
.
Convertir un modèle TensorFlow à l'aide de tf.lite.TFLiteConverter
Un modèle TensorFlow est stocké au format SavedModel et généré à l'aide des API tf.keras.*
de haut niveau (un modèle Keras) ou des API tf.*
de bas niveau (à partir desquelles vous générez des fonctions concrètes). Par conséquent, vous disposez des trois options suivantes (vous trouverez des exemples dans les sections suivantes):
tf.lite.TFLiteConverter.from_saved_model()
(recommandé): convertit un SavedModel.tf.lite.TFLiteConverter.from_keras_model()
: convertit un modèle Keras.tf.lite.TFLiteConverter.from_concrete_functions()
: convertit des fonctions concrètes.
Convertir un modèle SavedModel (recommandé)
L'exemple suivant montre comment convertir un SavedModel en un modèle 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)
Convertir un modèle Keras
L'exemple suivant montre comment convertir un modèle Keras en modèle 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)
Convertir des fonctions concrètes
L'exemple suivant montre comment convertir des fonctions concrètes en un modèle 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)
Autres fonctions
Appliquez des optimisations. Une optimisation fréquemment utilisée est la quantification post-entraînement, qui permet de réduire davantage la latence et la taille de votre modèle avec une perte de justesse minimale.
Ajoutez des métadonnées pour créer plus facilement du code de wrapper spécifique à la plate-forme lorsque vous déployez des modèles sur des appareils.
Erreurs de conversion
Vous trouverez ci-dessous les erreurs de conversion courantes et leur solution:
Erreur :
Some ops are not supported by the native TFLite runtime, you can enable TF kernels fallback using TF Select.
Solution: l'erreur se produit lorsque votre modèle comporte des opérations TF sans implémentation TFLite correspondante. Pour résoudre ce problème, utilisez l'opération TF dans le modèle TFLite (recommandé). Si vous souhaitez générer un modèle uniquement avec des opérations TFLite, vous pouvez soit ajouter une requête pour l'opération TFLite manquante dans le problème GitHub n° 21526 (laissez un commentaire si votre requête n'a pas déjà été mentionnée) ou créer l'opération TFLite vous-même.
Erreur :
.. is neither a custom op nor a flex op
Solution: si cette opération TF est:
Compatible avec TF: l'erreur se produit, car l'opération TF ne figure pas dans la liste d'autorisation (liste exhaustive des opérations TF compatibles avec TFLite). Pour résoudre ce problème, procédez comme suit:
Non compatible avec TF: l'erreur se produit, car TFLite n'a pas connaissance de l'opérateur TF personnalisé que vous avez défini. Pour résoudre ce problème, procédez comme suit:
- Créez l'opération TF.
- Convertissez le modèle TF en modèle TFLite.
- Créez l'opération TFLite et exécutez l'inférence en l'associant à l'environnement d'exécution TFLite.
Outil de ligne de commande
Si vous avez installé TensorFlow 2.x à partir de pip, exécutez la commande tflite_convert
. Pour afficher tous les indicateurs disponibles, utilisez la commande suivante:
$ 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 la source TensorFlow 2.x n'est pas chargée et que vous souhaitez exécuter le convertisseur à partir de cette source sans compiler ni installer le package, vous pouvez remplacer "tflite_convert
" par "bazel run tensorflow/lite/python:tflite_convert --
" dans la commande.
Convertir un SavedModel
tflite_convert \
--saved_model_dir=/tmp/mobilenet_saved_model \
--output_file=/tmp/mobilenet.tflite
Convertir un modèle Keras H5
tflite_convert \
--keras_model_file=/tmp/mobilenet_keras_model.h5 \
--output_file=/tmp/mobilenet.tflite