为什么我们需要TensorFlow tf.Graph?

时间:2016-09-21 11:11:29

标签: tensorflow

目的是什么:

with tf.Graph().as_default()

我有一些使用上述的tensorflow代码。 但是,代码只有一个图表,为什么我们需要这个呢?

2 个答案:

答案 0 :(得分:51)

TL; DR :这是不必要的,但这是一个很好的做法。

由于始终会注册默认图表,因此每个操作和变量都会放入默认图表中。 但是,该语句创建了一个新图形,并将所有内容(在其范围内声明)放入此图形中。 如果图表是唯一的图表,那么它就没用了。但这是一个很好的做法,因为如果你开始使用许多图表,那么更容易理解操作和变量的位置。 由于这个陈述没有任何成本,无论如何写它都会更好。只是为了确保如果将来重构代码,定义的操作属于您最初选择的图形。

答案 1 :(得分:11)

当你必须为你创建的每个操作明确指定图形时,它是一个神器。

我还没有看到任何令人信服的案例需要多个图表,因此您通常可以隐藏图表并使用tf.reset_default_graph()来清除图表

一些问题:

  • 默认图形堆栈是线程本地的,因此在多个线程中创建操作将创建多个图形
  • 会话保留其图表的句柄(sess.graph),因此如果您在致电tf.reset_default_graph()之前创建会话,您的会话图将与您的默认图表不同,这意味着您创建的新操作赢了& #39;可以在那个sesson中运行

当您点击其中一个问题时,您可以将特定graph(即,从另一个帖子中的tf.get_default_graph()sess.graph)设置为默认图表,如下所示:

self.graph_context = graph.as_default()   # save it to some variable that won't get gc'ed
self.graph_context.enforce_nesting = False
self.graph_context.__enter__()