2

产生 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])

我不知道我需要做什么。在我看来,这些代码是有效的。

4

1 回答 1

1

这里的问题几乎可以肯定是对 的调用tf.merge_all_summaries(),它不能很好地用于交互式(例如 IPython)使用。也许不直观,tf.merge_all_summaries()向图中添加了一个新操作,该操作依赖于在同一图中创建的所有摘要。当您使用 IPython 时,图表将记住您创建的所有摘要,即使在同一单元格的先前执行中也是如此。这可能会导致tf.merge_all_summaries()创建一个张量,该张量依赖于tf.placeholder()在单元的先前执行中创建的。

正如我在另一个答案中描述的那样,有两种主要的解决方法:

  1. 使用 .显式合并要计算的摘要tf.merge_summary([summary_1, summary_2, summary_3])

  2. 在显式块中创建图表with tf.Graph().as_default():,这将确保只有在该块中创建的摘要包含在合并中。

另请注意,每次运行时都会向图表tf.merge_all_summaries() 添加一个新操作。这意味着您的训练循环存在细微的内存泄漏,并将向图中添加 200 个相同操作的副本。为避免这种情况,您应该tf.merge_all_summaries()在训练循环之外调用并缓存结果张量。然后,您可以在训练循环中使用该张量来获得相同的结果。

于 2016-02-11T17:19:21.020 回答