会话管理
class tf.Session
运行TensorFlow所有操作的会话管理类。
会话管理封装了所有被执行的操作对象,并且计算所有张量的值,例如:
# 创建一个图.
a = tf.constant(5.0)
b = tf.constant(6.0)
c = a * b
# 在会话里运行图
sess = tf.Session()
# 计算张量 `c`.
print(sess.run(c))
会话有很多自己的资源:比如变量、队列和访问器,这些资源当会话不需要时就会释放这些资源,以便回收相应的资源,所以当调用close()函数,或者在环境管理器的模式下运行,也会自动回收这些资源:
# 使用 `close()`函数.
sess = tf.Session()
sess.run(...)
sess.close()
# 使用环境管理器
with tf.Session() as sess:
sess.run(...)
会话可以通过ConfigProto函数使用protocol buffer协议来获取所有配置变量,比如创建一个会话时,可以使用软件限制来代替硬件设备,并打印相应的结果,可以像下面这样创建会话:
# 创建会话运行图,打开软件限制和打印选项
sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True,
log_device_placement=True))
tf.Session.__init__(target='', graph=None, config=None)
创建一个TF的会话,它是一个构造函数。
调用这个函数时如果没有设置相应的图,就会使用默认的图。如果创建了多个图来表示算法,就需要创建多个会话,以便会话与图对应。不过每个会话只能使用一个图,每个图可以使用在不同的会话里,在这种情况一般在构造时指定相应的图到会话构造函数。
参数:
target: (可选) ,将要连接引擎,默认是使用进程内的引擎。可以查看分布式的TF例子。
graph: (可选)将要运行的图集
config: (可选)使用ConfigProto定义 protocol buffer缓冲定义的配置选项。
tf.Session.run(fetches, feed_dict=None, options=None, run_metadata=None)
运行对图的操作以及对张量求值并返回。
本函数仅对TF的张量流图运行一步计算,并且它只计算需要运行的部分流图和需要返回张量值变量或常量的运算操作,也就是对字典参数feed_dict里定义的张量进行计算,如果没有相关的图或者张量,它是不作任何的操作和计算。
求值返回的参数fetches可以一个图参数,或者任意嵌套的列表、元组、命名元组、或包含图元素的字典对象等等。图元素的值可以是下面任何一种类型:
操作。 返回值将是None。
张量。返回值是numpy里的ndarray数据表示。
SparseTensor。返回值是SparseTensorValue包含的值。
get_tensor_handle op。返回值是numpy里的ndarray数据表示。
字符串。返回值是张量的名称或操作过程的名称。
run()函数返回值形式与参数里设置的值形式是一样的。
例如:
a = tf.constant([10, 20])
b = tf.constant([1.0, 2.0])
# 获取返回一个值
v = session.run(a)
# v 是numpy的数组array [10, 20]
# 获取返回一个列表
v = session.run([a, b])
# v是一个两个元素的列表:numpy的数组array [10, 20]和1-D数组array [1.0, 2.0]
# 获取回来的值可以是列表、元组、命名元组、字典:
MyData = collections.namedtuple('MyData', ['a', 'b'])
v = session.run({'k1': MyData(a, b), 'k2': [b, a]})
# v 将是一个字典返回。
可选参数feed_dict允许调用者设置图里的张量,每个键可以下面类型值:
如果键是张量,值可以是Python常数、字符串、列表或者numpy的数组ndarray。
如果键是未知数的占位符placeholder,值的行列形式要与占位符保持一致。
如果键是SparseTensor,值应该是SparseTensorValue。
如果键是嵌套元组的张量或SparseTensor,那么值也是对应嵌套元组,并且是同样的结构排列。
在feed_dict参数里的每个值都应该可以转换为numpy的数组array表示,数组的类型是键中对应的dtype类型。
可选参数options是表示[RunOptions]项的内容。主要用允许控制这一步流图运行的一些特定功能,比如打开调试输出信息。
可选参数run_metadata是[RunMetadata]项的内容。在合适的时候,这一步产生的非张量的输出会写到这项里。例如,当用户配置为跟踪时配置文件的信息就会写入此项,以便外面可以查看。
参数:
fetches: 图对象,图元素的列表,图元素的字典,或者图元素的嵌套列表。
feed_dict: 图元素对应值的字典。
options: [RunOptions]项的protocol buffer协议内容。
run_metadata: [RunMetadata]项的 protocol buffer协议内容。
返回值:
如果获取图的一个元素,就返回一个值;如果获取一个列表的值,就返回一个列表;与上面描述的一样。
异常:
RuntimeError: 如果会话无效状态返回此值,比如已经关闭还想使用。
TypeError: 如果fetches或feed_dict类型参数的键错误返回。
ValueError: 如果fetches 或 feed_dict的键的张量变量不存返回。
tf.Session.close()
关闭会话。
调用此函数来释放所有会话分配的资源。
异常:
如果tf.errors.OpError等于下面任何一个异常将会关闭TF的会话:tf.Session.graph图已经被设置过。
tf.Session.as_default()
设置会话管理器里默认的任务。当调用此函数之后,可以在Operation.run() 或 Tensor.eval()里使用时,不需要传送sess参数,并且此默认任务不会随着环境管理器退出而关闭,必须明确地调用close()函数来关闭这个会话。
比如可以这样使用:
c = tf.constant(..)
sess = tf.Session()
with sess.as_default():
assert tf.get_default_session() is sess
print(c.eval())
要注意的是,获取当前默认的函数是使用tf.get_default_session()函数,而不是上面这个函数。
像下面的例子说明要明确地调用close()函数来关闭任务:
c = tf.constant(...)
sess = tf.Session()
with sess.as_default():
print(c.eval())
# ...
with sess.as_default():
print(c.eval())
sess.close()
另外一个种选择,你可以这样使用
with tf.Session():
print(c.eval())
形式来创建一个会话,当环境管理器退出或者发生异常退出时,就可以自动关闭会话。另外一点要说明的是,当前线程运行默认的图是缺省的图,如果你自己创建一个新线程,又想把任务作为这个线程的缺省会话,就必须在线程里明确地调用下面的语句:with sess.as_default(): 。
返回值:
返回使用这个会话做默认会话的会话管理器。
tf.Session.reset(target, containers=None, config=None)
释放目标target参数里的所有资源,并且关闭所有连接的任务。本函数主要使用在分布式的会话管理里,当调用本函数之后所有变量都会复位,任何会话以目标为名称的会话都被关闭。
参数:
target: 执行引擎连接的目标对象。
containers: 资源名称的字符串列表,或者设置为None时,释放所有容器的资源。
config: (可选) 配置参数的Protocol buffer协议内容.
异常:
tf.errors.OpError: 当复位子类时异常抛出。
tf.Session.__enter__() 进入函数,使用未明。
tf.Session.__exit__(exec_type, exec_value, exec_tb) 退出函数,使用未明。
class tf.InteractiveSession
创建交互式环境的会话管理器,比如在shell下面。
InteractiveSession创建的会话对象与普通的会话对象在创建时有点不一样,它在构造函数时把这个会话当作默认会话关联到这个线程里,以便后面所有使用张量的操作Tensor.eval()和操作符Operation.run()运行,都不需要明显地调用会话任务对象作为参数传送给函数。因此这个函数在shell、IPython notebooks等工具下,就非常方便使用。
例如:
sess = tf.InteractiveSession()
a = tf.constant(5.0)
b = tf.constant(6.0)
c = a * b
# 在这里直接调用'c.eval()',而不需要传送'sess'参数。
print(c.eval())
sess.close()
值得注意时普通的会话也可以使用with语句来创建等同作用的功能,比如下面代码就在非交互式的环境下:
a = tf.constant(5.0)
b = tf.constant(6.0)
c = a * b
with tf.Session():
# 在这里同样调用 'c.eval()'函数时,不用传送sess参数。
print(c.eval())
tf.InteractiveSession.__init__(target='', graph=None, config=None)
创建一个交互式的TF会话。
如果在构造时没有指明graph图参数,那么它会把当前默认的图作为会话默认图集。如果在同一个进程里创建(tf.Graph())了不同的图,必须使用不同的会话来运行图,但是每个图可以使用在多个不同的会话里,在这种情况下,常常需要指定图参数到会话里。
参数:
target: (可选)执行引擎连接的目标,默认是进程内引擎。
graph: (可选)会话要运行的图。
config: (可选)ConfigProto定义的内容来配置会话
tf.InteractiveSession.close()
关闭交互式会话。
tf.get_default_session()
获取当前线程的默认会话。
返回值:
当前线程里默认的会话。