Je suivais le tenseur de codelabs pour les poètes et la formation a bien fonctionné, mais lorsque j’ai exécuté le script pour évaluer une image:
python -m scripts.label_image \
--graph=tf_files/retrained_graph.pb \
--image=tf_files/flower_photos/daisy/21652746_cc379e0eea_m.jpg
J'ai eu l'erreur suivante:
The name 'import/input' refers to an Operation not in the graph.
J'ai regardé autour de moi et cela a quelque chose à voir avec le choix des couches d'entrée et de sortie, le script label_image.py a les options 'entrée' et 'sortie' définies par défaut. L'architecture que j'utilise est 'inception_v3'.
J'ai changé ~/scripts/label_image.py ligne 77 et cela fonctionne:
de
input_layer = "input"
à
input_layer = "Mul"
Utilisez --input_layer name comme espace réservé. Cela fonctionnera car le script retrain.py a défini la valeur par défaut de input_layer comme "Placeholder".
python label_image.py
--graph=retrained_graph.pb
--labels=retrained_labels.txt
--output_layer=final_result
--image=testimage654165.jpg
--input_layer=Placeholder
Ce n'est pas tout le monde qui reçoit cette erreur. J'imagine que si vous utilisiez une architecture autre que MobileNet, cette erreur se produirait… ... Dans votre fichier label_image.py.
input_height = 299
input_width = 299
input_layer = "Mul"
Cela devrait le résoudre.
Comme @Mimii et @Celio l'ont mentionné: remplacez ~/scripts/label_image.py, à la ligne input_layer = "input"
par input_layer = "Mul"
ETmodifiez les dimensions d'entrée: input_height = 299
et input_width= 299
Utilisez ceci
curl -LO https://github.com/tensorflow/tensorflow/raw/master/tensorflow/examples/label_image/label_image.py
python label_image.py \
--graph=/tmp/output_graph.pb --labels=/tmp/output_labels.txt \
--input_layer=Placeholder \
--output_layer=final_result \
--image=$HOME/flower_photos/daisy/21652746_cc379e0eea_m.jpg
Désolé pour la réponse tardive . J'exécute le script python ci-dessous avec un modèle recyclé. Pouvez-vous essayer celui-ci?
Conditions requises: labels.txt et output.pb (modèle recyclé) doivent se trouver dans le même répertoire que mon scipt python. Enregistrez le code ci-dessous sous le nom test.py .__ et appelez-le ainsi: python test.py xxx.jpg
import sys
import tensorflow as tf
image_path = sys.argv[1]
image_data = tf.gfile.FastGFile(image_path, 'rb').read()
label_lines = [line.rstrip() for line
in tf.gfile.GFile("./labels.txt")]
with tf.gfile.FastGFile("./output.pb", 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
_ = tf.import_graph_def(graph_def, name='')
with tf.Session() as sess:
softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')
predictions = sess.run(softmax_tensor, \
{'DecodeJpeg/contents:0': image_data})
top_k = predictions[0].argsort()[-len(predictions[0]):][::-1]
for node_id in top_k:
human_string = label_lines[node_id]
score = predictions[0][node_id]
print('%s (score = %.5f)' % (human_string, score))
Dans le code "retrain.py", vous verrez un argument appelé '--final_tensor_name'. Si vous ne passez pas cet argument, il gardera 'final_result' ou 'Mul' (selon la version que vous utilisez) comme valeur par défaut.
Le seul moyen d'afficher les noms d'entrée et de sortie sans les fichiers de sortie d'apprentissage réels consiste à afficher le graphique dans TensorBoard du fichier 'frozen_graph.pb' ou, dans votre cas, le fichier 'retrained_graph.pb'.
C’est un bon moyen de sortir les fichiers requis pour les voir dans TensorBoard . https://Gist.github.com/jubjamie/2eec49ca1e4f58c5310d72918d991ef6
Une fois que vous avez exécuté ce code et que la sortie est passée dans le répertoire choisi, vous pouvez démarrer TensorBoard et l'afficher dans Chrome. Voir le graphique m'aide beaucoup puisque je suis un noob dans ce domaine.
Vous devriez ajouter --output_layer=final_result:0
en tant que paramètre.
Final call is : python -m scripts.label_image \
--graph=tf_files/retrained_graph.pb \
--output_layer=final_result:0 \
--image=tf_files/flower_photos/daisy/21652746_cc379e0eea_m.jpg
La définition de la couche d’entrée sur Mul fonctionne pour moi. Cependant, il semble ignorer mes paramètres de taille d’entrée et ne fait pas de magie pour redimensionner l’image en 299x299, ce que je suppose que Mul attend. J'ai fait ça:
set INPUT_WIDTH=194
set INPUT_HEIGHT=141
set INPUT_LAYER=Mul
python -m scripts.label_image --image=%IMAGE% --input_height=%INPUT_HEIGHT% \
--input_width=%INPUT_WIDTH% --graph=%GRAPH% \
--input_layer=%INPUT_LAYER% --output_layer=final_result
et obtenu ceci:
ValueError: Cannot feed value of shape (1, 141, 194, 3)
for Tensor 'import/Mul:0', which has shape '(1, 299, 299, 3)'
Et ohhh, en regardant le code, input_width et input_height sont ce qu'il faut normaliser à , ne pas normaliser à partir de . Donc tout va bien. J'avais aussi besoin d'ajouter mes étiquettes.
Ou vous pouvez exécuter des lignes de commande avec les options sans changer de code:
python -m scripts.label_image2 --graph=tf_files/retrained_graph.pb --
folder_images=../updated_images/testing --
labels=tf_files/retrained_labels.txt --input_layer=Mul --
input_height=299 --input_width=299