【问题标题】:tensorflow summary requires to feed a placeholder, but I can't figure whytensorflow 摘要需要提供一个占位符,但我不知道为什么
【发布时间】:2017-04-28 11:27:00
【问题描述】:

在深入之前我正在测试摘要,并且我有以下截断的代码

import tensorflow as tf
import numpy as np

def test_placeholders():
    "Simply dump a placeholder to TensorBoard"
    x = tf.placeholder(tf.float32, [])
    sess = tf.Session()

    summary = tf.summary.scalar("x", x)
    train_writer = tf.summary.FileWriter('/tmp/tf/placeholder',
                                         sess.graph, flush_secs=1)

    r = sess.run(tf.global_variables_initializer())
    s = sess.run(summary, feed_dict={x: 1.57})
    train_writer.add_summary(s)

    train_writer.close()


def test_merge():
    "A simple function that make a loop computation and write down into TB"

    x = tf.placeholder(tf.float32)
    k = np.random.random() + 0.1

    # Create a session
    sess = tf.Session()
    sess.run(tf.global_variables_initializer())

    # define a single summary
    summary_x = tf.summary.scalar("x", x)

    train_writer = tf.summary.FileWriter('/tmp/tf/foo',
                                         sess.graph, flush_secs=1)

    # write some summaries
    for i in range(0, 5):
        # WORKS!
        summary = sess.run(summary_x, feed_dict={x: k * i * i})
        train_writer.add_summary(summary, i)

    # write some summaries using merge_all
    # (we have only one define summary)
    merged = tf.summary.merge_all()
    for i in range(5, 10):
        # FAILS: You must feed a value for placeholder ...
        summary = sess.run(merged, feed_dict={x: k * i * i})
        train_writer.add_summary(summary, i)

    train_writer.close()


if __name__ == '__main__':

    test_placeholders()    # if I comment this line ...
    test_merge()           # test_merge() works!?

所以基本上有两个函数可以创建一些循环并为 TensorBoard 编写一些日志。

问题:

每个功能都可以很好地相互隔离,但是,当我按顺序运行两个功能时,第二个在这里失败

# FAILS: You must feed a value for placeholder ...
summary = sess.run(merged, feed_dict={x: k * i * i})

因为它似乎 merged 包含上一个函数中未填充的内容。

tensorflow.python.framework.errors_impl.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"]()]]
Caused by op u'Placeholder', defined at:

深入研究代码,我发现 TF 为了方便起见将变量存储到 defaults 容器中,例如graph, _collections 来自以前的作品,所以调用

tf.reset_default_graph()

作为重置之前执行的所有内容。

问题:

什么是 tensorflow 风格,用于隔离和处理同一进程中的多个 TF 执行且不会相互干扰?

【问题讨论】:

  • (对不起标题。问题开始于在摘要执行中提供占位符的问题,但我同时找到了原因,所以这个问题更接近于 TF 编码隔离而不是摘要和缺失使用 merge_all() 方法提供信息)

标签: python tensorflow summary


【解决方案1】:

您遇到的问题与加载到同一图表的张量有关。 注意test_merge 包含merged = tf.summary.merge_all() 这会合并默认图表中收集的所有摘要,并且所有内容都加载到默认图表中,因此当您尝试评估summary = sess.run(merged, feed_dict={x: k * i * i}) 时,它也需要第一个函数的输入。如果您更改调用的顺序,您将看到您的代码执行。如果您需要单独的图表,这可能会出现问题,因此请尝试将所有内容加载到一个图表中 - 但如果您需要,那么这个答案可能有用Working with multiple graphs in TensorFlow

【讨论】:

  • 谢谢!这正是问题所在。使用 tf.reset_default_graph() 重置图形可以解决同一脚本中 tf 的正常使用问题。
【解决方案2】:

使用 tf.reset_default_graph()
在代码的开头将图形恢复为其默认值。有时 Tensorflow 会记住您之前运行的 feed_dict 。并且 feed_dict 可能与当前会话不同

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2011-07-15
    • 2016-09-18
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2018-02-15
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多