产生AE的代码
x = tf.placeholder(tf.float32, [None, 784])
keep_prob = tf.placeholder("float")
for step in range(2000):
batch_xs, batch_ys = mnist.train.next_batch(BATCH_SIZE)
sess.run(train_step, feed_dict={x: batch_xs, keep_prob: (1 - DROP_OUT_RATE) }) # feed_dict
if step % 10 == 0:
summary_op = tf.merge_all_summaries()
summary_str = sess.run(summary_op, feed_dict={x: batch_xs, keep_prob: 1.0})
summary_writer.add_summary(summary_str, step)
if step % 100 == 0:
print(loss,eval(session=sess, feed_dict={x: batch_xs, keep_prob: 1.0}))
我收到的是错误消息
InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder' with dtype float
[[Node: Placeholder = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]
在日志中
File "<ipython-input-9-c70541b6146b>", line 18, in <module>
x = tf.placeholder(tf.float32, [None, 784])
我不知道自己需要做什么。在我看来,这些代码是有效的。
答案 0 :(得分:1)
这里的问题几乎肯定是对tf.merge_all_summaries()
的调用,它对交互式(例如IPython)的使用效果不佳。也许不直观地,tf.merge_all_summaries()
向图表添加了一个新操作,该操作依赖于在同一图表中创建的所有摘要。当您使用IPython时,图表将记住您创建的所有摘要,即使在同一单元格的先前执行中也是如此。这可能会导致tf.merge_all_summaries()
创建一个张量,该张量取决于先前执行单元格时创建的tf.placeholder()
。
正如我在another answer中所描述的那样,有两种主要的解决方法:
使用tf.merge_summary([summary_1, summary_2, summary_3])
明确合并您要计算的摘要。
在显式with tf.Graph().as_default():
块中创建图表,这将确保合并中仅包含该块中创建的摘要。
另请注意,tf.merge_all_summaries()
每次运行时都会向图表添加一个新操作。这意味着您的训练循环有一个微妙的内存泄漏,并将相同的操作系统添加200个副本到图表。为避免这种情况,您应该在训练循环之外调用tf.merge_all_summaries()
并缓存生成的张量。然后,您可以在训练循环中使用该张量来获得相同的结果。