【问题标题】:Keep using tensors created before using tf.reset_default_graph()继续使用在使用 tf.reset_default_graph() 之前创建的张量
【发布时间】:2019-07-17 13:37:49
【问题描述】:

我是 tensorflow/tensorboard 的新手,我正在尝试弄清楚如何使用它们。 我创建了一个简单的图表,它添加了一些常量,比如

a = tf.constant(10.0)
b = tf.constant(50.0)
sum = a + b

并在张量板中可视化它

writer = tf.summary.FileWriter('test_graph/')
writer.add_graph(tf.get_default_graph())
writer.flush()

到目前为止一切正常,图表已正确可视化。

如果我使用 tf.reset_default_graph() 并再次打开 tensorboard,正如预期的那样,我收到了消息:

Graph visualization failed: the graph is empty....

此时,我尝试简单地运行:

sum_new = a + b

所以,基本上我是通过使用在重置图形之前创建的张量 a 和 b 来定义 sum_new 的。我没有收到任何错误,因为 a 和 be 仍然存在于内存中。但是,如果我打开 tensorboard,我仍然会收到有关图表为空的错误消息。

为什么会这样?如果我创建了一个图表然后将其删除,有没有办法在新图表中继续使用重置之前定义的变量?

【问题讨论】:

    标签: python tensorflow tensorboard


    【解决方案1】:

    当您调用tf.reset_default_graph() 时,它会将默认图表重置为新的tf.Graph 实例。 TensorFlow 保留了一个默认的单例图对象,重置它意味着在默认图中创建的任何新操作都将位于与以前不同的图上。

    但是,这并不意味着之前的默认图表已被删除。实际上,除了丢失对它的所有引用之外,不能删除图形(因此基本上当您无法通过任何方式获得对对象的引用时)。在您的示例中,您有ab,它们是第一个默认图中的操作产生的两个张量,我们称之为g1。调用tf.reset_default_graph() 后,默认图现在为g2,为空。但是,g1 仍然存在,您实际上可以通过 a.graphb.graph 获得对它的引用。如果你这样做writer.add_graph(a.graph),你将能够在 TensorBoard 中看到它。

    现在,当您在重置默认图表后执行sum_new = a + b 时会发生什么。一般来说,我们会假设在默认图中创建了一个新的加法运算,现在是g2。但是,它的工作方式并非完全一样。事实上,如果我们尝试这样做,TensorFlow 会抱怨,因为ab 不属于g2,而是属于g1。发生的情况是,当 TensorFlow 进行新操作时,它会查看其参数,并在与它们相同的图中进行新操作。因此,sum_new 将再次在g1 中创建一个新的加法操作。正如我所说,如果您将a.graph 写入TensorBoard,您将能够看到它。

    有趣的是,如果您执行sum_new = a + 20.0,它仍然可以工作,并创建一个新的常量操作(用于20.0)并在g1 中添加一个。但是,如果你这样做sum_new = a + tf.constant(20.0),那么它最终会失败。 tf.constant(20.0) 是在新的默认图 g2 中创建的,当您尝试使用 a 对其进行操作时,它会失败,因为张量属于不同的图。

    一个可能相关的结论是tf.reset_default_graph() 不一定会从以前的默认图表中删除并释放内存,所以如果您有非常重的图表要删除(我认为这不太常见,因为内存通常由会话消耗),请确保删除对它的所有引用(例如,在这种情况下,您可以使用del a, b)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 2017-12-29
      • 2018-06-10
      • 1970-01-01
      相关资源
      最近更新 更多