默认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