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

Keep using tensors created before using tf.reset_default_graph()

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

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

并通过

在tensorboard中将其可视化
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,我仍然会收到有关图形为空的错误消息。

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

当您调用 tf.reset_default_graph() it simply, well, resets the default graph to a new 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)。