如何测试张量流中的模型?

2024-03-28 10:01:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习本教程:

https://www.tensorflow.org/versions/r0.9/tutorials/mnist/beginners/index.html#mnist-for-ml-beginners

我想做的是以numpy数组的形式传入一个测试图像x,并查看得到的softmax分类值,可能是另一个numpy数组。我在网上找到的关于测试张量流模型的所有东西都是通过传递测试值、测试标签和输出精度来工作的。在我的例子中,我希望仅基于测试值输出模型标签。

这就是我所尝试的: 将tensorflow导入为tf 将numpy导入为np 从skipage导入颜色,io

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

for i in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

#so now its trained successfully, and W and b should be the stored "model" 

#now to load in a test image

greyscale_test = color.rgb2gray(io.imread('4.jpeg'))
greyscale_expanded = np.expand_dims(greyscale_test,axis=0)    #now shape (1,28,28)
x = np.reshape(greyscale_expanded,(1,784))     #now same dimensions as mnist.train.images

#initialize the variable
init_op = tf.initialize_all_variables()

#run the graph
with tf.Session() as sess:
    sess.run(init_op) #execute init_op
    print (sess.run(feed_dict={x:x}))    #this is pretty much just a shot in the dark. What would go here?

现在的结果是:

TypeError                                 Traceback (most recent call last)
<ipython-input-116-f232a17507fb> in <module>()
     36     sess.run(init_op) #execute init_op
---> 37     print (sess.run(feed_dict={x:x}))    #this is pretty much just a shot in the dark. What would go here?

TypeError: unhashable type: 'numpy.ndarray'

所以在训练时,sess.run通过了一个训练步骤和一个feed dict。当我试图评估一个张量x时,这个会进入feed dict吗?我会用sess.run吗?(看来我必须这样做),但是火车会怎么走?是否有“测试步骤”或“评估步骤”?


Tags: theruninnumpydatainittffeed
2条回答

你的tf.Session.run操作需要抓取 tf.Session.run(获取,feed_dict=None,options=None,run_metadata=None)

https://www.tensorflow.org/versions/r0.9/api_docs/python/client.html#session-management

打印(sess.run(train_step,feed_dict={x:x}))但它也需要一个feed_dict for y

你的意思是:

打印我们采样的随机值

您得到的是TypeError,因为您使用(可变的)numpy.ndarray作为字典的键,但键应该是tf.placeholder,值是anumpy数组。

以下调整解决了此问题:

x_placeholder = tf.placeholder(tf.float32, [None, 784])
# ...
x = np.reshape(greyscale_expanded,(1,784))
# ...
print(sess.run([inference_step], feed_dict={x_placeholder:x})) 

如果您只想对模型执行推断,这将打印一个带有预测的numpy数组。

如果要评估模型(例如计算精度),还需要输入相应的地面真值标签y,如下所示:

accuracy = sess.run([accuracy_op], feed_dict={x_placeholder:x, y_placeholder:y}

在您的例子中,accuracy_op可以定义如下:

correct_predictions = tf.equal(tf.argmax(predictions, 1), tf.cast(labels, tf.int64))
accuracy_op = tf.reduce_mean(tf.cast(correct_predictions, tf.float32))

这里,predictions是模型的输出张量。

相关问题 更多 >