python - train - tensorflow para poetas: "El nombre ''importación/entrada'' se refiere a una Operación que no está en el gráfico".
tensorflow tutorial pdf (11)
Estaba siguiendo el tensorflow de codelabs para poetas y el entrenamiento funcionó bien, pero cuando ejecuté el script para evaluar una imagen:
python -m scripts.label_image /
--graph=tf_files/retrained_graph.pb /
--image=tf_files/flower_photos/daisy/21652746_cc379e0eea_m.jpg
Tuve el siguiente error:
The name ''import/input'' refers to an Operation not in the graph.
Miré a mi alrededor y tiene algo que ver con la elección de la capa de entrada y salida, el script label_image.py tiene "entrada" y "salida" establecidos por defecto. La arquitectura que estoy usando es ''inception_v3''.
Cambié ~ / scripts / label_image.py línea 77 y funciona:
desde
input_layer = "input"
a
input_layer = "Mul"
Como @Mimii y @Celio mencionaron: cambiar ~ / scripts / label_image.py, en la línea input_layer = "input"
por input_layer = "Mul"
Y cambiar las dimensiones de entrada: input_height = 299
y input_width= 299
Debe agregar --output_layer=final_result:0
como parámetro.
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
Dentro del código "retrain.py" verá un argumento llamado ''--final_tensor_name''. Si no pasa ese argumento, mantendrá ''final_result'' o ''Mul'' (dependiendo de la versión que use) como predeterminado.
La única forma de ver los nombres de entrada y salida sin los archivos de salida de entrenamiento reales es ver el gráfico en TensorBoard del ''frozen_graph.pb'' o en su caso el archivo ''retrained_graph.pb''.
Esta es una buena forma de generar los archivos necesarios para verlos en TensorBoard. https://gist.github.com/jubjamie/2eec49ca1e4f58c5310d72918d991ef6
Una vez que ejecute ese código y tenga la salida en el directorio elegido, puede iniciar TensorBoard y verlo en Chrome. Ver la gráfica me ayuda mucho ya que soy un noob en esta área.
Establecer la capa de entrada a Mul funciona para mí. Sin embargo, parece estar ignorando la configuración de mi tamaño de entrada y no hace nada mágico para cambiar el tamaño de la imagen a 299x299, que supongo que Mul espera. Hice esto:
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
y obtuve esto:
ValueError: Cannot feed value of shape (1, 141, 194, 3)
for Tensor ''import/Mul:0'', which has shape ''(1, 299, 299, 3)''
Y ohhh, mirar el código, input_width y input_height son los elementos a los que se debe normalizar, no a los que se debe normalizar. Así que todo está bien. También necesitaba agregar mis etiquetas.
Lo siento por la respuesta tardía. Ejecuto el script de Python a continuación con un modelo reentrenado. ¿Puedes probar este?
Requisitos: labels.txt y output.pb (modelo reentrenado) deben estar en el mismo directorio con mi fragmento de Python. Guarde el código a continuación como test.py Y llámelo como: 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))
No todos están recibiendo este error. Supongo que si utilizó alguna otra arquitectura aparte de MobileNet, aparecerá este error. En su archivo label_image.py cambie los valores a:
input_height = 299
input_width = 299
input_layer = "Mul"
Esto debería resolverlo.
O puede ejecutar las líneas de comando con las opciones sin cambiar los códigos:
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
Tienes que hacer algunos cambios en label_image.py
en la carpeta de scripts
input_height = 299
Cambia input_height a 299 desde 224
input_width = 299
Cambiar input_width a 299 desde 224
input_mean = 128
input_std = 128
input_layer = "Mul"
Cambia input_layer a Mul desde la entrada
output_layer = "final_result"
Salida:
Evaluation time (1-image): 1.901s
daisy (score=0.98584)
sunflowers (score=0.01136)
dandelion (score=0.00210)
tulips (score=0.00066)
roses (score=0.00004)
Para más información, consulte esta página.
Utilice el nombre --input_layer como marcador de posición. Funcionará porque el script retrain.py ha establecido el valor predeterminado de input_layer como "Marcador de posición".
python label_image.py
--graph=retrained_graph.pb
--labels=retrained_labels.txt
--output_layer=final_result
--image=testimage654165.jpg
--input_layer=Placeholder
Utilizar esta
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