使用TensorFlow模型进行预测


81

我遵循了给定的mnist教程,并且能够训练模型并评估其准确性。但是,这些教程没有显示如何在给定模型的情况下进行预测。我对准确性不感兴趣,我只想使用模型来预测一个新示例,然后在输出中查看所有结果(标签),每个结果都有其分配的分数(排序或不排序)。


我建立了一个存储库,您可以在其中绘制数字并使用自己的数据测试模型。github.com/EddieOne/mnist-live-test它没有附带说明。但是,我确实制作了具有较高概述的视频。youtube.com/watch?v=pudJU-cDkMo
艾迪(Eddie)

Answers:


73

在“ Deep MNIST for Experts ”示例中,请参见以下行:

现在,我们可以实现回归模型。只需要一行!我们将向量化的输入图像x乘以权重矩阵W,加上偏差b,然后计算分配给每个类别的softmax概率。

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

只需拉上节点y,您就会拥有所需的内容。

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

这几乎适用于您创建的任何模型-在计算损失之前,您已经将预测概率计算为最后步骤之一。


1
当在convnet示例中测试此建议时(对于简单的softmax示例,y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) 我使用getInvalid argument: You must feed a value for placeholder tensor 'Placeholder_2' with dtype float可以正常工作。为什么这样的任何想法?
Daniel Zakrisson

3
我可以回答我自己的评论:convnet示例在feed_dict中有一个附加变量,我错过了添加它的麻烦。在这种情况下,feed_dict应该如下所示:feed_dict = {x: [your_image], keep_prob:1.0}
Daniel Zakrisson

您的代码的输出将像[False True False ...,True False True]之类的东西,但是我想将其转换为[3 1 3 ...,1 5 1],该类的标签不正确,而不是False 。我们如何才能获得错误分类而不是错误分类的标签?
Nomiluks '16

14
tf.run()似乎已被删除,但y.eval(feed_dict)为我工作。
astromme '16

有关此问题的更完整的想法,请参见github.com/tensorflow/tensorflow/issues/97。希望对您
有所

16

正如@dga建议的那样,您需要通过已经预测的模型来运行数据的新实例。

这是一个例子:

假设您通过了第一个教程并计算了模型的准确性(模型是:)y = tf.nn.softmax(tf.matmul(x, W) + b)。现在,您获取模型并将新数据点应用于该模型。在下面的代码中,我计算向量,获得最大值的位置。显示图像并打印最大位置。

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]

4

2.0兼容答案:假设您已建立Keras模型,如下所示:

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

然后使用以下代码训练和评估模型:

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

之后,如果要预测特定图像的类别,则可以使用以下代码进行:

predictions_single = model.predict(img)

如果要预测一组图像的类别,可以使用以下代码:

predictions = model.predict(new_images)

new_images图像数组在哪里。

有关更多信息,请参阅此Tensorflow教程


2

这个问题专门针对Google MNIST教程,该教程定义了一个预测变量,但没有应用它。根据乔纳森·惠(Jonathan Hui)的TensorFlow Estimator博客文章的指导,以下代码完全适合Google教程并进行预测:

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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.