我该如何编码feed_dict

时间:2016-01-31 17:00:49

标签: tensorflow tensorboard

  

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

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

1 个答案:

答案 0 :(得分:1)

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

正如我在another answer中所描述的那样,有两种主要的解决方法:

  1. 使用tf.merge_summary([summary_1, summary_2, summary_3])明确合并您要计算的摘要。

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

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