首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tensorflow: sess.run([x])不工作,但sess.run([y])使用相同的feed_dict

Tensorflow: sess.run([x])不工作,但sess.run([y])使用相同的feed_dict
EN

Stack Overflow用户
提问于 2019-06-03 23:25:50
回答 1查看 113关注 0票数 0

我正在学习Tensorboard,并且遵循this tutorial.中的代码

下面是我的代码:

代码语言:javascript
复制
import tensorflow as tf
LOGDIR = "/tmp/mnist_tutorial/"
mnist = tf.contrib.learn.datasets.mnist.read_data_sets(train_dir=LOGDIR + "data", one_hot=True)

def conv_layer(input, size_in, size_out, name="conv"):
    with tf.name_scope(name):
        w = tf.Variable(tf.zeros([5, 5, size_in, size_out]))
        b = tf.Variable(tf.zeros([size_out]))
        conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding="SAME")
        act = tf.nn.relu(conv + b)
        tf.summary.histogram("weights", w)
        tf.summary.histogram("biases", b)
        tf.summary.histogram("activations", act)
        return act


def fc_layer(input, size_in, size_out, name="fc"):
    with tf.name_scope(name):
        w = tf.Variable(tf.zeros([size_in, size_out]))
        b = tf.Variable(tf.zeros([size_out]))
        act = tf.nn.relu(tf.matmul(input, w)+b)
        tf.summary.histogram("weights", w)
        tf.summary.histogram("biases", b)
        tf.summary.histogram("activations", act)
        return act

x = tf.placeholder(tf.float32, shape=[None, 784], name='x')
x_image = tf.reshape(x, [-1, 28, 28, 1])
tf.summary.image('input', x_image, 3)

y = tf.placeholder(tf.float32, shape=[None, 10], name='labels')

conv1 = conv_layer(x_image, 1, 32, name='conv1')
pool1 = tf.nn.max_pool(conv1, ksize=[1,2,2,1], strides=[1,2,2,1], padding="SAME")

conv2 = conv_layer(pool1, 32, 64, name='conv2')
pool2 = tf.nn.max_pool(conv2, ksize=[1,2,2,1], strides=[1,2,2,1], padding="SAME")
flattened = tf.reshape(pool2, [-1, 7*7*64])

fc1 = fc_layer(flattened, 7*7*64, 1024, name='fc1')
logits = fc_layer(fc1, 1024, 10, name='fc2')

with tf.name_scope('xent'):
    xent = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=y))
    tf.summary.scalar('cross_entropy', xent)

with tf.name_scope('train'):
    train_step = tf.train.AdamOptimizer(1e-4).minimize(xent)

with tf.name_scope('accruacy'):
    correct_prediction = tf.equal(tf.argmax(logits,1), tf.argmax(y, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    tf.summary.scalar('accruacy', accuracy)

summ = tf.summary.merge_all()

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    # writer =tf.summary.FileWriter("tmp/mnist_demo/1")
    # writer.add_graph(sess.graph)
    # writer.close()

    for i in range(20):
        batch = mnist.train.next_batch(100)

        # Occasionally report back the accruacy

        if i%2 == 0:
            [train_accruacy] = sess.run([accuracy], feed_dict={x:batch[0], y:batch[1]}) # works
#             [s, train_accruacy] = sess.run([summ, accuracy], feed_dict={x:batch[0], y:batch[1]}) #error!
            print("step %d, training accruacy %g" % (i, train_accruacy))

    sess.run(train_step, feed_dict={x:batch[0],y:batch[1]})

当我使用下面这一行时,我遇到了一个错误:

[s, train_accruacy] = sess.run([summ, accuracy], feed_dict={x:batch[0], y:batch[1]}) #error!

这是我得到的错误消息:

You must feed a value for placeholder tensor 'x' with dtype float and shape [?,784] [[{{node x}} = Placeholder[dtype=DT_FLOAT, shape=[?,784], _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

我知道我输入的张量不是(x,784)的正确形状。

然而,我不明白为什么是[train_accruacy] = sess.run([accuracy], feed_dict={x:batch[0], y:batch[1]}) # works。毕竟,我将相同的东西输入到相同的占位符变量中,这些变量接受相同形状的张量。

除非我完全错了,否则sess.run([argument], feed_dict=...)的第一个参数描述了要返回的张量。我看不出这对我输入的数据的形状有什么影响。

另外:这个模型应该有一个错误。

对于那些感兴趣的人,完整的代码是here

也可能是返回数据类型不同?tf.summary.merge_all()返回一个字符串张量,但我怀疑这是导致问题的原因。

我似乎在网上找不到任何关于这个问题的文档。这是应该发生的吗?

EN

回答 1

Stack Overflow用户

发布于 2019-06-05 11:02:07

我会回答我自己的问题:

def conv_layer()之前添加了tf.reset_default_graph()

如果不想使用tf.reset_default_graph()

原来我在同一个会话中输入了两个张量,这是tensorflow不允许的。

代码语言:javascript
复制
for i in range(20):
    batch = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={x:batch[0],y:batch[1]})
    # Occasionally report back the accruacy

    if i%2 == 0:
        [train_accruacy] = sess.run([accuracy], feed_dict={x:batch[0], y:batch[1]}) # works
#             [s, train_accruacy] = sess.run([summ, accuracy], feed_dict={x:batch[0], y:batch[1]}) #error!
        print("step %d, training accruacy %g" % (i, train_accruacy))

上面的代码不起作用。结果表明,由于某种原因,i%2下面的第一行代码在张量batch[0]中馈送很好,然而,当它注释掉该行并将其替换为第二行时,似乎tensorflow并没有‘刷新’出x占位符变量,因此两个单独的张量被馈送到输入(来自单独的sess.run())事件中。

下面的代码可以工作:

代码语言:javascript
复制
for i in range(2000):
    batch = mnist.train.next_batch(100)
    if i%10 !=0:
        sess.run(train_step, feed_dict={x:batch[0],y:batch[1]})
        # Occasionally report back the accruacy

    if i%10 == 0:
        [train_accuracy, s] = sess.run([accuracy, summ], feed_dict={x: batch[0], y: batch[1]})
        print("step %d, training accruacy %g" % (i, train_accuracy))
        writer.add_summary(s,i)

在这里,张量被单独输入,一切都运行得很好。

如果有人能让我知道为什么会这样,或者这是不是一个bug,我会很高兴的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56430357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档