TensorFlow运行模型----会话

会话拥有并管理TensorFlow程序运行时的所有资源。当所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄露的问题。TensorFlow中使用会话的模式一般有两种,第一种模式需要明确调用会话生成函数和关闭会话函数,这种模式的代码流程如下:

#创建一个会话
sess=tf.Session()
#使用这个创建好的会话来得到关心的运算的结果。比如可以调用sess.run(result)
#来得到上篇博文中张量result的取值
sess.run(...)
#关闭会话使得本次运行中使用的资源可以被释放
sess.close()

使用这种模式时,在所有计算完成后,需要明确调用Session.close函数来关闭会话并释放资源。然而,当程序因为异常而退出时,关闭会话的函数可能不会被执行从而导致资源泄露。为解决异常退出时资源释放的问题,TensorFlow可以通过Python的上下文管理器来使用会话。以下代码展示了如何使用这种模式。

#创建一个会话,并通过Python中的上下文管理器来管理这个会话。
with tf.Session() as sess:
	#使用这个创建好的会话来计算关心的结果。
	sess.run(...)
#不需要再调用“Session.close()”函数来关闭会话,
#当上下文退出时会话关闭和资源释放也自动完成了。

TensorFlow会自动生成一个默认的计算图,如果没有特殊指定,运算会自动加入到这个计算图中。TensorFlow中的会话也有类似的机制,但TensorFlow不会自动生成默认的会话,而是需要手动指定。当默认的会话被指定之后可以通过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))

在交互式环境下,通过设置默认会话的方式来获取张良的取值更加方便。所以TensorFlow提供了一种在交互式环境下直接构建默认会话的函数,这个函数就是tf.InteractiveSession。使用这个函数会自动将生成的会话注册为默认会话。以下代码展示了tf.InteractiveSession函数的用法。

sess=tf.InteractiveSession()
print(result.eval())
sess.close()

通过tf.InteractiveSession函数可以省去将产生的会话注册为默认会话的过程。无论使用哪种方法都可以通过ConfigProto Protocol Buffer来配置需要生成的会话。下面给出了通过ConfigProto配置会话的方法:

config=tf.ConfigProto(allow_softplacement=True,log_device_placement=True)
sess1=tf.InteractiveSession(config=config)
sess2=tf.Session(config=config)

通过ConfigProto可以配置类似并行的线程数、GPU分配策略、运算超时时间等参数。在这些参数中,最常使用的有两个。第一个是allow_soft_placement,这是一个布尔型的参数,当它为True时,在以下任意一个条件成立的时候,GPU上的运算可以放到CPU上进行:
1.运算无法在GPU上进行;
2.没有GPU资源(比如运算被指定在第二个GPU上运行,但是机器只有一个GPU);
3.运算输入包含对CPU计算结果的引用;
这个参数的默认值是False,但是为了使得代码的可移植性更强,在有GPU的环境下这个参数一般会被设置为True。不同的GPU驱动版本可能对计算得支持略微有区别,通过将allow_soft_placement参数设置为True,当某些运算无法被当前GPU支持时,可以自动调整到CPU上,而不是报错。类似的,通过将这个参数设置为True可以让程序在拥有不同数量的GPU机器上顺利运行。
第二个使用得比较多地配置参数是log_device_placement。这也是一个布尔型参数,当它为True时日志中将会记录每个节点被安排在了那个设备上以方便调试。而在生产环境中将这个参数设置为False可以减少日志量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值