Je suis nouveau avec le travail sur Tensorflow. J'ai un modèle enregistré après la formation en tant que fichier pb, je veux utiliser tensorflow mobile et il est important de travailler avec le fichier TFLITE. Le problème est que la plupart des exemples que j'ai trouvés après avoir recherché les convertisseurs sur Google sont des commandes sur le terminal ou cmd. Pouvez-vous me partager un exemple de conversion en fichiers tflite en utilisant le code python?
Merci
Suite à cela exemple TF vous pouvez passer le paramètre "--Saved_model_dir" pour exporter le dossier saved_model.pb et variables dans un répertoire (aucun répertoire existant) avant d'exécuter le script retrain.py:
python retrain.py ...... --saved_model_dir /home/..../export
Afin de convertir votre modèle en tflite, vous devez utiliser la ligne ci-dessous:
convert_saved_model.convert(saved_model_dir='/home/.../export',output_arrays="final_result",output_tflite='/home/.../export/graph.tflite')
Remarque: vous devez importer convert_saved_model:
à partir de tensorflow.contrib.lite.python import convert_saved_model
N'oubliez pas que vous pouvez convertir en tflite de 2 manières:
Mais la façon la plus simple est d'exporter saved_model.pb avec des variables au cas où vous voudriez éviter d'utiliser des outils de construction comme Bazel.
Vous pouvez convertir directement en tflite dans python directement. Vous devez figer le graphique et utiliser toco_convert . Il a besoin des noms d'entrée et de sortie et les formes à déterminer avant d'appeler l'API comme dans le cas de la ligne de commande.
Copié de documentation , où un graphique "gelé" (sans variables) est défini dans le cadre de votre code:
import tensorflow as tf
img = tf.placeholder(name="img", dtype=tf.float32, shape=(1, 64, 64, 3))
val = img + tf.constant([1., 2., 3.]) + tf.constant([1., 4., 4.])
out = tf.identity(val, name="out")
with tf.Session() as sess:
tflite_model = tf.contrib.lite.toco_convert(sess.graph_def, [img], [out])
open("test.tflite", "wb").write(tflite_model)
Dans l'exemple ci-dessus, il n'y a pas d'étape de gel du graphe car il n'y a pas de variables. Si vous avez des variables et exécutez toco sans geler le graphique, c'est-à-dire en convertissant d'abord ces variables en constantes, alors toco se plaindra!
Ensuite, vous n'avez pas besoin de la session. Vous pouvez appeler directement l'API toco:
path_to_frozen_graphdef_pb = '...'
input_tensors = [...]
output_tensors = [...]
frozen_graph_def = tf.GraphDef()
with open(path_to_frozen_graphdef_pb, 'rb') as f:
frozen_graph_def.ParseFromString(f.read())
tflite_model = tf.contrib.lite.toco_convert(frozen_graph_def, input_tensors, output_tensors)
Ensuite, vous devez charger la session et figer le graphique avant d'appeler toco:
path_to_graphdef_pb = '...'
g = tf.GraphDef()
with open(path_to_graphdef_pb, 'rb') as f:
g.ParseFromString(f.read())
output_node_names = ["..."]
input_tensors = [..]
output_tensors = [...]
with tf.Session(graph=g) as sess:
frozen_graph_def = tf.graph_util.convert_variables_to_constants(
sess, sess.graph_def, output_node_names)
# Note here we are passing frozen_graph_def obtained in the previous step to toco.
tflite_model = tf.contrib.lite.toco_convert(frozen_graph_def, input_tensors, output_tensors)
Cela peut arriver si vous n'avez pas défini le graphique, ex. vous avez téléchargé le graphique quelque part ou utilisé une API de haut niveau comme les tf.estimators qui vous cachent le graphique. Dans ce cas, vous devez charger le graphique et fouiller pour comprendre les entrées et sorties avant d'appeler toco. Voir ma réponse à this SO question .
C'est ce qui a fonctionné pour moi: (modèle SSD_InceptionV2)
python /tensorflow/models/research/object_detection/export_tflite_ssd_graph.py --pipeline_config_path annotations/ssd_inception_v2_coco.config --trained_checkpoint_prefix trained-inference-graphs/inference_graph_v7.pb/model.ckpt --output_directory trained-inference-graphs/inference_graph_v7.pb/tflite --max_detections 3
tflite_convert --output_file=test.tflite --graph_def_file=tflite_graph.pb --input_arrays=normalized_input_image_tensor --output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3' --input_shape=1,300,300,3 --allow_custom_ops
Maintenant, les entrées/sorties je ne sais pas 100 comment obtenir cela, mais ce code m'aide avant:
import tensorflow as tf
frozen='/tensorflow/mobilenets/mobilenet_v1_1.0_224.pb'
gf = tf.GraphDef()
gf.ParseFromString(open(frozen,'rb').read())
[n.name + '=>' + n.op for n in gf.node if n.op in ( 'Softmax','Placeholder')]
[n.name + '=>' + n.op for n in gf.node if n.op in ( 'Softmax','Mul')]
converter = tf.contrib.lite.TFLiteConverter.from_frozen_graph(
frozen_model_filename, INPUT_NODE, OUTPUT_NODE)
tflite_model = converter.convert()
open(TFLITE_OUTPUT_FILE, "wb").write(tflite_model)
INPUT_NODE et OUTPUT_NODE sont les listes de noms d'entrée et de sortie respectivement.