继续使用在使用tf.reset_default_graph()之前创建的张量

时间:2019-07-17 13:37:49

标签: python tensorflow tensorboard

我是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()并再次按预期方式打开张量板,则会收到消息:

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

这时,我只是尝试运行:

sum_new = a + b

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

为什么会这样?如果我创建一个图形然后将其删除,是否有任何方法可以在新图形中继续使用在重置之前定义的变量?

1 个答案:

答案 0 :(得分: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)。