Hacer predicciones con un modelo de TensorFlow

81

Seguí los tutoriales de mnist dados y pude entrenar un modelo y evaluar su precisión. Sin embargo, los tutoriales no muestran cómo hacer predicciones dado un modelo. No me interesa la precisión, solo quiero usar el modelo para predecir un nuevo ejemplo y en la salida ver todos los resultados (etiquetas), cada uno con su puntaje asignado (ordenado o no).

user247866
fuente
Hice un repositorio donde puedes dibujar números y probar el modelo con tus propios datos. github.com/EddieOne/mnist-live-test No viene con instrucciones. Sin embargo, hice un video con una descripción general de alto nivel. youtube.com/watch?v=pudJU-cDkMo
Eddie

Respuestas:

73

En el ejemplo " Deep MNIST for Experts ", consulte esta línea:

Ahora podemos implementar nuestro modelo de regresión. ¡Solo se necesita una línea! Multiplicamos las imágenes de entrada vectorizadas x por la matriz de peso W, sumamos el sesgo by calculamos las probabilidades softmax que se asignan a cada clase.

y = tf.nn.softmax(tf.matmul(x,W) + b)

Simplemente tire del nodo y y tendrá lo que desea.

feed_dict = {x: [your_image]}
classification = tf.run(y, feed_dict)
print classification

Esto se aplica a casi cualquier modelo que cree; habrá calculado las probabilidades de predicción como uno de los últimos pasos antes de calcular la pérdida.

dga
fuente
1
Al probar esta sugerencia en el ejemplo de convnet (con y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) I get Invalid argument: You must feed a value for placeholder tensor 'Placeholder_2' with dtype float, para el ejemplo simple de softmax, funciona bien. ¿Alguna idea de por qué es así?)
Daniel Zakrisson
3
Puedo responder mi propio comentario: el ejemplo de convnet tiene una variable adicional en el feed_dict, me perdí agregar eso. En este caso, feed_dict debería verse así:feed_dict = {x: [your_image], keep_prob:1.0}
Daniel Zakrisson
La salida de su código será algo como [Falso Verdadero Falso ..., Verdadero Falso Verdadero], pero quiero convertir esto en [3 1 3 ..., 1 5 1], cuyas etiquetas de clase incorrectas en lugar de Falso . ¿Cómo podemos conseguir esa etiqueta que está mal clasificada en lugar de falsa?
Nomiluks
14
tf.run()parece haber sido eliminado, pero y.eval(feed_dict)funcionó para mí.
astromme
una idea más completa de esta pregunta, se puede encontrar aquí, github.com/tensorflow/tensorflow/issues/97 . Espero que ayude
Pramit
16

Como sugirió @dga, debe ejecutar su nueva instancia de los datos a través de su modelo ya predicho.

Aquí hay un ejemplo:

Suponga que siguió el primer tutorial y calculó la precisión de su modelo (el modelo es este :) y = tf.nn.softmax(tf.matmul(x, W) + b). Ahora toma su modelo y le aplica el nuevo punto de datos. En el siguiente código calculo el vector, obteniendo la posición del valor máximo. Muestre la imagen e imprima esa posición máxima.

from matplotlib import pyplot as plt
from random import randint
num = randint(0, mnist.test.images.shape[0])
img = mnist.test.images[num]

classification = sess.run(tf.argmax(y, 1), feed_dict={x: [img]})
plt.imshow(img.reshape(28, 28), cmap=plt.cm.binary)
plt.show()
print 'NN predicted', classification[0]
Salvador Dalí
fuente
4

2.0 Respuesta compatible : suponga que ha construido un modelo Keras como se muestra a continuación:

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

Luego entrene y evalúe el modelo usando el siguiente código:

model.fit(train_images, train_labels, epochs=10)
test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

Después de eso, si desea predecir la clase de una imagen en particular, puede hacerlo usando el siguiente código:

predictions_single = model.predict(img)

Si desea predecir las clases de un conjunto de imágenes, puede utilizar el siguiente código:

predictions = model.predict(new_images)

donde new_imageses una matriz de imágenes.

Para obtener más información, consulte este tutorial de Tensorflow .

Soporte de Tensorflow
fuente
2

La pregunta es específicamente sobre el tutorial de Google MNIST , que define un predictor pero no lo aplica. Siguiendo la guía de la publicación del blog TensorFlow Estimator de Jonathan Hui , aquí hay un código que se ajusta exactamente al tutorial de Google y hace predicciones:

from matplotlib import pyplot as plt

images = mnist.test.images[0:10]

predict_input_fn = tf.estimator.inputs.numpy_input_fn(
      x={"x":images},
      num_epochs=1,
      shuffle=False)

mnist_classifier.predict(input_fn=predict_input_fn)

for image,p in zip(images,mnist_classifier.predict(input_fn=predict_input_fn)):
    print(np.argmax(p['probabilities']))
    plt.imshow(image.reshape(28, 28), cmap=plt.cm.binary)
    plt.show()
Lars Ericson
fuente