张量流张量未正确整形

2024-05-19 12:04:38 发布

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

我已经创建了一个脚本,它与TensorFlow的Deep MNIST for Experts教程中所描述的脚本一致。在

然而,当我的脚本尝试将x张量从维度[-1,28,28,1]重新塑造为维度[-1,28,28,1]时,它很早就返回了一个错误。我很困惑,因为教程也成功地做了同样的事情,但是它给我带来了以下错误:

ValueError: Cannot feed value of shape (100, 784) for Tensor 'Reshape:0', which has shape '(?, 28, 28, 1)'

我的python脚本全文如下:

^{pr2}$

这就是我怀疑发生错误的地方:

^{3}$

一。在

print(sess.run(accuracy, feed_dict={x: mnist.test.images,y_: mnist.test.labels}))

Tags: test脚本fortensorflowfeed错误教程事情
2条回答

我已经修复了你的代码,应该可以正常工作了。在

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


x = tf.placeholder(dtype = tf.float32, shape = [None,784])
y_ = tf.placeholder(dtype = tf.float32, shape = [None, 10])


W1 = tf.Variable(tf.random_normal([5,5,1,32]))
b1 = tf.Variable(tf.random_normal([32]))

x_image = tf.reshape(x,[-1,28,28,1]) 

output1 = tf.add(tf.nn.conv2d(x_image,W1, strides =[1,1,1,1], padding = "SAME"), b1)
output1 = tf.nn.relu(output1)
output1 = tf.nn.max_pool(output1, ksize = [1,2,2,1], strides = [1,2,2,1], padding = "SAME")


W2 = tf.Variable(tf.random_normal([5,5,32,64]))
b2 = tf.Variable(tf.random_normal([64]))


output2 = tf.add(tf.nn.conv2d(output1,W2, strides = [1,1,1,1], padding = "SAME"), b2)
output2 = tf.nn.relu(output2)
output2 = tf.nn.max_pool(output2, ksize = [1,2,2,1], strides = [1,2,2,1], padding = "SAME")
output2 = tf.reshape(output2, [-1, 7*7*64])



W_fc = tf.Variable(tf.random_normal([7*7*64,1024]))
b_fc = tf.Variable(tf.random_normal([1024]))

output3 = tf.add(tf.matmul(output2,W_fc), b_fc )
output3 = tf.nn.relu(output3)
output3 = tf.nn.dropout(output3, keep_prob = 0.85)


W_final = tf.Variable(tf.random_normal([1024,10]))
b_final = tf.Variable(tf.random_normal([10]))


predictions = tf.add(tf.matmul(output3,W_final), b_final)


cost = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(labels = y_  ,logits = predictions))
optimiser = tf.train.AdamOptimizer(1e-4).minimize(cost)
correct_prediction = tf.equal(tf.argmax(predictions, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))



with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(20000):
        batch = mnist.train.next_batch(50)
        if i % 100 == 0:
            train_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1]})
            print('step %d, training accuracy %g' % (i, train_accuracy))
        optimiser.run(feed_dict={x: batch[0], y_: batch[1]})
    print('test accuracy %g' % accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels,}))

你的主要问题是

^{pr2}$

作为目标的张量应该是一个普通的目标。 我还删除了对变量初始值设定项和运行优化器的多余调用-

sess = tf.InteractiveSession()
tf.global_variables_initializer().run()


for i in range(7000):
    batchx_s,batchy_s = mnist.train.next_batch(100)
    sess.run(optimiser, feed_dict = {x:batchx_s, y_:batchy_s})

上面看起来好像是从别的地方来的:) 最后,我添加了一些根据上述教程改编的打印语句,了解您的培训是如何实时执行的总是很好的

问题是,当您运行图形时,您没有将输入值(mnist.test.images)赋给输入占位符,因为您已经将另一个操作的结果赋给了x(在您的代码中,我可以看到{},但可能在其他地方有其他赋值,因为错误消息建议使用形状(?, 10))进行加法操作。TensorFlow允许您为图形中的任何张量输入值(不仅仅是占位符),因此它认为您试图用输入替换一些中间结果。只需在其定义和run调用中将保存输入张量的Python变量重命名为类似于x_input的变量,并注意以后不要覆盖它。在

相关问题 更多 >

    热门问题