会话拥有并管理Tensorflow程序的所有资源,类似于操作系统中的进程控制块PCB。当所有计算完成之后需要关闭会话来帮助系统回收资源。否则会出现资源泄露的问题。
Tensorflow 中使用会话的模式一般有两种:
1:明确调用会话生成函数和关闭会话函数,
#创建一个会话
sess = tf.Session()
#使用这个创建好的会话结果,
sess.run(...)
#关闭会话使本次运行中使用的资源得以被释放
sess.close()
在执行这种模式的时候,明确需要调用Sesssion.close()函数来关闭会话并释放资源。当程序出现异常请况下,关闭函数可能就不能被执行,导致内存泄漏。Tensorflow 可以通过 Python 的上下文管理器来使用会话,给出一例:
#创建一个会话,用Python 中的上下文管理器来展示如何使用这种模式。
with tf.Session() as sess:
#使用这创建好的回话来计算自己关心的结果。
sess.run(....)
#不在需要再调用“Session.close()"函数来关闭会话,
#当上下文退出时,会话关闭,资源释放自动完成
Tensorflow 会自动生成一张默认的计算图,如果没有特殊指令,运算会自动加入其中。TensorFolw的会话也有类似的机制,但不会自动生成,需要手动指定。当默认的会话被指定之后可以通过tf.Tensor.eval函数来计算一个张量的取值。给出一例:
sess = tf.Session()
with sess.as_default():
print(result.eval())
以下代码也可以完成相应的功能:
sess = tf.Session()
#下面两个命令有相同的功能
print(sess.run(result))
print(result.eval(session = sess))
在交互式环境下,(比如Python脚本或者Jupyter的编辑器下),通过设置默认会话的方式获取张量的取值更加方便。给出一例:
sess = tf.InteractiveSession()
print(result.eval())
sess.close()
无论那种模式都可以通过ConfigProto Protocol Buffer 来配置需要生成的会话。给出一例:
config = tf.ConfigProto(allow_soft_placement=True,
log_device_placement = True)
sess1 = tf.InteractiveSession(config=config)
sess2 = tf.Session(config = config)
通过ConfigProto 可以配置类似并行的线程数,Gpu分配策略,运算超时等策略。最常用的:
1:allow_soft_placement = true时:Gpu可以放在cpu运算
a: 无法在GPU运算
b:无gpu资源
c: 运算输入包括对cpu计算结果的引用
参数默认为False ,但是为了可移植性更强,设为True。
2:log_device_placement = true时:会将记录每一个节点被安排在那个设备上以方便调试。
当他设置为Flase 可减少日志量。