J'ai téléchargé un retrained_graph.pb
et retrained_labels.txt
fichier d'un modèle que j'ai formé au service cognitif Azure. Maintenant, je veux créer une application Android utilisant ce modèle et pour ce faire, je dois la convertir au format TFLite. J'ai utilisé toco et j'obtiens l'erreur suivante:
ValueError: Invalid tensors 'input' were found.
Je suis fondamentalement en train de suivre ce tutoriel et j'ai un problème à l'étape 4 et je copie directement le code du terminal: https://heartbeat.fritz.ai/neural-networks-on-mobile-devices-with-tensorflow-lite- a-tutorial-85b41f53230c
sans bazel vous pouvez essayer le code suivant
pip uninstall tensorflow
pip install tf-nightly
pip show protobuf
Si protobuf est la version 3.6.1, passez à l'installation de la version préliminaire de 3.7.0.
pip uninstall protobuf
pip install protobuf==3.7.0rc2
Je n'arrivais toujours pas à faire fonctionner la version en ligne de commande. Il ne cessait de renvoyer l'erreur: "tflite_convert: error: –input_arrays et –output_arrays sont requis avec –graph_def_file" bien que les deux paramètres aient été fournis. Cependant, cela a fonctionné en Python.
import tensorflow as tf
graph_def_file = "model.pb"
input_arrays = ["model_inputs"]
output_arrays = ["model_outputs"]
converter = tf.lite.TFLiteConverter.from_frozen_graph(
graph_def_file, input_arrays, output_arrays)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)
Je fais suite à ma réponse précédente, vous pouvez utiliser le script suivant pour convertir votre modèle formé sur ssd mobilenet en tflte en utilisant
python object_detection/export_tflite_ssd_graph \
--pipeline_config_path ssd_0.75_export/pipeline.config \
--trained_checkpoint_prefix ssd_0.75_export/model.ckpt \
--output_directory ssd_to_tflite_output
Pour ce faire, vous devez d'abord être présent dans le dossier de recherche de l'API de détection d'objet tensorflow, et modifier le chemin/nom du fichier selon vos noms. Si ce travail correct, essayez d'exécuter ce script à partir du dossier de recherche et réexécutez:
protoc object_detection/protos/*.proto --python_out=.
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
import tensorflow as tf
gf = tf.GraphDef()
m_file = open('frozen_inference_graph.pb','rb')
for n in gf.node:
print( n.name )
le premier est les tableaux input_arrays les noms sont les tableaux_sortie (il peut y en avoir plus d'un en fonction du nombre de sorties du modèle)
ma sortie
Pour exécuter le convertisseur tflite sur votre machine locale, vous aurez besoin de bazel et de toco.
Et si vous lisez certains problèmes dans GitHub, dans certaines versions de Tensrflow tflite cause beaucoup de problèmes. Pour surmonter ce problème, certains recommandent d'utiliser tf tous les soirs!
Pour éviter tout cela, utilisez simplement Google Colab pour convertir votre .pb en .lite ou .tflite.
Depuis que Colab a commencé à avoir l'option "upload" pour télécharger vos fichiers dans le noyau actuel, c'est à mon avis le moyen le plus simple sans avoir à vous soucier des autres packages et de leurs dépendances.
Voici le carnet Colab:
https://drive.google.com/file/d/1lDcttsmZC0Y6dXxwe0EVZUsyVoR8HuR-/view?usp=sharing
Vous pouvez télécharger votre fichier .pb de deux manières vers la session en cours:
i) (La manière la plus simple) Après avoir exécuté la première cellule du portable ci-dessus, le lecteur sera monté. Donc, sur votre partie gauche de l'écran, allez dans la colonne des fichiers et faites un clic droit sur le dossier que vous souhaitez télécharger votre fichier .pb et choisissez le téléchargement. Utilisez ensuite les commandes "ls" et "cd" pour accéder au dossier et exécuter la cellule du convertisseur tflite.
ii) Exécutez la cellule avec la commande files.upload () et cliquez sur Parcourir et choisissez le fichier .pb sur votre machine locale.
Une fois le fichier téléchargé, indiquez son chemin d'accès à la variable "localpb" ainsi que le nom du modèle .lite. Ensuite, exécutez simplement la cellule ayant le comamnd "TFLiteConverter".
Et le tour est joué. Un modèle tflite devrait apparaître dans votre lecteur. Faites simplement un clic droit dessus et téléchargez-le sur votre machine locale pour exécuter les inférences.
Vous pouvez utiliser l'utilitaire tflite_convert qui fait partie du paquet tensorflow 1.10 (ou supérieur).
L'utilisation simple de l'inférence flottante est quelque chose comme:
tflite_convert \
--output_file=/tmp/retrained_graph.tflite \
--graph_def_file=/tmp/retrained_graph.pb \
--input_arrays=input \
--output_arrays=output
Où entrée et sortie - sont les tenseurs d'entrée et de sortie de votre graphique tensorflow
L'erreur indique que vous n'avez pas entré le bon
--input_arrays
De TF Lite Developer Guide Je cite:
"La définition des arguments input_array et output_array n'est pas simple . La manière la plus simple de trouver ces valeurs consiste à explorer le graphique à l'aide de TensorBoard . "
L'utilisation du Tensorboard n'est pas difficile non plus, en exécutant simplement cette commande
tensorboard --logdir=path/to/log-directory
Voir le TensorBoard à
localhost:6006
Substituer Mul
à input
l'a corrigé pour moi.
IMAGE_SIZE=299
tflite_convert \
--graph_def_file=tf_files/retrained_graph.pb \
--output_file=tf_files/optimized_graph.lite \
--input_format=TENSORFLOW_GRAPHDEF \
--output_format=TFLITE \
--input_shape=1,${IMAGE_SIZE},${IMAGE_SIZE},3 \
--input_array=Mul \
--output_array=final_result \
--inference_type=FLOAT \
--input_data_type=FLOAT
C'est probablement parce que pendant le processus de recyclage, les tenseurs d'entrée et de sortie ont été renommés. S'il s'agit d'un graphique inceptionv3 recyclé, essayez d'utiliser Mul comme nom du tenseur d'entrée et final_result comme nom du tenseur de sortie.
bazel run --config=opt //tensorflow/contrib/lite/toco:toco -- \
... other options ...
--input_shape=1,299,299,3 \
--input_array=Mul \
--output_array=final_result
Ajustement similaire si vous utilisez tflife_convert comme le suggère Aleksandr.
importer tensorflow en tant que tf
!tflite_convert \
--output_file "random.tflite" \
--graph_def_file "pb file path" \
--input_arrays "input tensor name" \
--output_arrays "output tensor name"