Vorhersagen mit einem TensorFlow-Modell treffen

81

Ich folgte den gegebenen mnist-Tutorials und konnte ein Modell trainieren und seine Genauigkeit bewerten. Die Tutorials zeigen jedoch nicht, wie man anhand eines Modells Vorhersagen trifft. Ich bin nicht an Genauigkeit interessiert, ich möchte nur das Modell verwenden, um ein neues Beispiel vorherzusagen, und in der Ausgabe werden alle Ergebnisse (Beschriftungen) mit der zugewiesenen Punktzahl (sortiert oder nicht) angezeigt.

user247866
quelle
Ich habe ein Repository erstellt, in dem Sie Zahlen zeichnen und das Modell mit Ihren eigenen Daten testen können. github.com/EddieOne/mnist-live-test Es werden keine Anweisungen geliefert . Ich habe jedoch ein Video mit einem Überblick auf hoher Ebene gemacht. youtube.com/watch?v=pudJU-cDkMo
Eddie

Antworten:

73

Im Beispiel " Deep MNIST for Experts " finden Sie diese Zeile:

Wir können jetzt unser Regressionsmodell implementieren. Es dauert nur eine Zeile! Wir multiplizieren die vektorisierten Eingabebilder x mit der Gewichtsmatrix W, addieren die Vorspannung b und berechnen die Softmax-Wahrscheinlichkeiten, die jeder Klasse zugewiesen sind.

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

Ziehen Sie einfach am Knoten y und Sie haben das, was Sie wollen.

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

Dies gilt für nahezu jedes Modell, das Sie erstellen. Sie haben die Vorhersagewahrscheinlichkeiten als einen der letzten Schritte berechnet, bevor Sie den Verlust berechnen.

dga
quelle
1
Wenn Sie diesen Vorschlag Prüfung auf dem convnet Beispiel (mit y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) I erhalten Invalid argument: You must feed a value for placeholder tensor 'Placeholder_2' with dtype float, aus dem einfachen softmax Beispiel funktioniert es gut Irgendwelche Ideen , warum dies so ist.?
Daniel Zakrisson
3
Ich kann meinen eigenen Kommentar beantworten: Das Convnet-Beispiel hat eine zusätzliche Variable im feed_dict, die ich nicht hinzugefügt habe. In diesem Fall sollte der feed_dict folgendermaßen aussehen:feed_dict = {x: [your_image], keep_prob:1.0}
Daniel Zakrisson
Die Ausgabe Ihres Codes wird etwas wie [Falsch Richtig Falsch ..., Richtig Falsch Richtig] sein, aber ich möchte dies in [3 1 3 ..., 1 5 1] konvertieren, das falsche Klassenbezeichnungen anstelle von Falsch enthält . Wie können wir dieses Etikett erhalten, das falsch anstatt falsch klassifiziert ist?
Nomiluks
14
tf.run()scheint entfernt worden zu sein, hat aber y.eval(feed_dict)für mich gearbeitet.
Astromme
Ein vollständigerer Gedanke zu dieser Frage finden Sie hier, github.com/tensorflow/tensorflow/issues/97 . Hoffe es hilft
Pramit
16

Wie von @dga vorgeschlagen, müssen Sie Ihre neue Instanz der Daten über Ihr bereits vorhergesagtes Modell ausführen.

Hier ist ein Beispiel:

Angenommen, Sie haben das erste Tutorial durchgearbeitet und die Genauigkeit Ihres Modells berechnet (das Modell lautet :) y = tf.nn.softmax(tf.matmul(x, W) + b). Jetzt greifen Sie zu Ihrem Modell und wenden den neuen Datenpunkt darauf an. Im folgenden Code berechne ich den Vektor und erhalte die Position des Maximalwerts. Zeigen Sie das Bild und drucken Sie diese maximale Position.

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 Dali
quelle
4

2.0-kompatible Antwort : Angenommen, Sie haben ein Keras-Modell wie unten gezeigt erstellt:

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'])

Trainieren und bewerten Sie das Modell anschließend mit dem folgenden Code:

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

Wenn Sie danach die Klasse eines bestimmten Bildes vorhersagen möchten, können Sie dies mit dem folgenden Code tun:

predictions_single = model.predict(img)

Wenn Sie die Klassen einer Reihe von Bildern vorhersagen möchten, können Sie den folgenden Code verwenden:

predictions = model.predict(new_images)

Wo new_imagesist ein Array von Bildern.

Weitere Informationen finden Sie in diesem Tensorflow-Tutorial .

Tensorflow-Unterstützung
quelle
2

Die Frage bezieht sich speziell auf das Google MNIST-Lernprogramm , das einen Prädiktor definiert, ihn jedoch nicht anwendet. Unter Verwendung der Anleitung aus Jonathan Huis TensorFlow Estimator-Blogbeitrag finden Sie hier Code, der genau zum Google-Tutorial passt und Vorhersagen macht:

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
quelle