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

use*_*504 43 tensorflow

目的是什么:

with tf.Graph().as_default()
Run Code Online (Sandbox Code Playgroud)

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

nes*_*uno 54

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

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


Yar*_*tov 11

当你必须为你创建的每个操作显式指定图形时,这是一个神器.

我没有看到任何令人信服的案例需要多个图表,因此您通常可以避免使用图表隐式并tf.reset_default_graph()在您想要擦除石板时使用

一些陷阱:

  • 默认图形堆栈是线程本地的,因此在多个线程中创建ops将创建多个图形
  • 会话保持其图形(sess.graph)的句柄,因此如果您在调用之前创建会话tf.reset_default_graph(),您的会话图将与您的默认图表不同,这意味着您创建的新操作将无法在该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__()
Run Code Online (Sandbox Code Playgroud)