参考博客:http://blog.csdn.net/lujiandong1/article/details/53448012
http://blog.csdn.net/lyc_yongcai/article/details/73467480
Session的种类:
(1)普通的tf.Session()
(2)tf.InteractivesSession()
为了便于使用诸如 IPython之类的 Python 交互环境, 可以使用InteractiveSession 代替 Session 类, 使用 Tensor.eval()和 Operation.run()方法代替Session.run(). 这样可以避免使用一个变量来持有会话。
(3)tf.train.Supervisor().managed_session()
与上面两种启动图相比较来说,Supervisor() 帮助我们处理一些事情:
(a) 自动去 checkpoint 加载数据或者初始化数据
(b) 自动有一个 Saver ,可以用来保存 checkpoint( sv.saver.save(sess, save_path))
(c) 有一个 summary_computed 用来保存 Summary
因此我们可以省略了以下内容:
(a)手动初始化或者从 checkpoint 中加载数据
(b)不需要创建 Saver 类, 使用 sv 内部的就可以
(c)不需要创建 Summary_Writer()
tensorflow使用图来定义计算,在session中来执行图中定义的计算
tensorflow会为我们指定一张默认的图.然后sesssion会直接和该默认图相关联.
如果新建一个张图,那么就存在2张图,
首先看如下程序:
import tensorflow as tf
with tf.Graph().as_default():
a = tf.constant([5], name='a')
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print(sess.run(a))
程序会报错,因为init = tf.global_variables_initializer()操作并没有被包含在tf.Graph()中,所以这个init操作是对于系统默认的计算图进行的,同时Session也是对应系统默认的计算图。
注:所有没被包含在我们新建图中的操作都默认存在系统创建的计算图中
以下2种修改方法:
1.将init操作和session都放到 with tf.Graph().as_default():中
import tensorflow as tf
with tf.Graph().as_default():
a = tf.constant([5], name='a')
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print(sess.run(a))
2.为新建的Graph()对象创建一个名字,在Session()对象中加入该名字,此时Session不需要放在Graph()域中
import tensorflow as tf
graph = tf.Graph()
with graph.as_default():
a = tf.constant([5], name='a')
init = tf.global_variables_initializer()
with tf.Session(graph=graph) as sess:
sess.run(init)
print(sess.run(a))
错误:session既然已经成为graph的session,就不能执行除graph计算图之外的操作
import tensorflow as tf
graph = tf.Graph()
with graph.as_default():
a = tf.constant([5], name='a')
init = tf.global_variables_initializer()
with tf.Session(graph=graph) as sess:
sess.run(init)
print(sess.run(a))