Tensorflow中 Graph和Session的关系

来源:互联网 发布:小老头软件官网 编辑:程序博客网 时间:2024/05/18 14:44

默认Session问题

  • session创建后,如果没有指定graph,则该session会调用默认的graph。
  • 调用默认graph的话,session创建语句可以在文件任意位置。因为即使session放在前文,后文里若是定义了新的graph节点,这些节点也会加到默认graph中,接下来调用该session时,调用的也是新的默认graph。
  • 如果以sess = tf.Session()创建session,则该session不会作为下文的默认session,需要以with语句开头调用该session后,才作为下文的默认session。如果以sess = tf.InteractiveSession()创建session, 则该session即是下文的默认session。默认session的好处是可以直接使用operation.run()或tensor.eval(),无需指定session来run。
  • with语句有个好处是,该代码块结束后,session会自动close。

默认Graph问题

  • 如果不指定graph,创建的新节点都会加入到默认graph中。注意,该graph是一个全局默认graph,也就说如果你定义了一个函数,这个函数里增加了一些节点,那么,每次调用这个函数,都会在默认graph中增加新节点!因此,如果想要定义类来实现算法,那么以防这种情况,建议将所有的节点操作放在类的初始化init方法中,这样对于每个实例,初始化也只会执行一次而已。
  • 有个要特别注意的节点操作tf.global_variables_intializer()。该项操作读取的是当前默认graph中的variable,如果在前文中定义就会出现问题!举个例子,我在前文中定义init_var = tf.global_variables_intializer(),然后中间加入新的variable, 最后再执行init_var.run(),这样就会出现编译错误信息Attempting to use uninitialized value beta1_power!也就是我今天遇到的编译问题!我们只能重新执行tf.global_variables_intializer().run()才行!

总结

其实上面说了那么多问题,其实只要规范好代码就可以避免上述问题。所谓的规范就是,session创建和variable初始化这两个步骤,都在graph定义完成后再执行!

转载自https://levylv.github.io/2017/questions-about-graph-and-session-of-tensorflow.html

原创粉丝点击