TensorFlow运行模型——会话

TensorFlow中的会话(Session)拥有并管理TensorFlow程序运行时的所有资源,当所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄露问题。

TensorFlow中使用会话的模式有以下两种:

  • 第一种模式,需要明确调用会话生成函数和关闭会话函数,这个模式的代码流程如下:

    #创建一个会话
    sess = tf.Session()
    
    #使用这个创建好的会话来得到关心的运算的结果
    sess.run(……)
    
    #关闭会话使得本次运行中使用到的资源可以被释放
    sess.close()
    

    使用这种模式时,在所有计算完成之后,需要明确调用close()函数来关闭会话并释放资源,但是当程序因为异常而退出时,关闭会话的函数可能就不会被执行从而导致资源泄露

  • 第二种模式,通过Python的上下文管理器来使用会话,可以有效解决资源泄露这个问题,代码流程如下:

    #创建一个会话,并通过Python的上下文管理器来管理这个会话
    with tf.Session() as sess:
    
    	#使用这个创建好的会话来得到关心的运算的结果
    	sess.run(……)
    

    通过Python的上下文管理器机制,只要将所有的计算放在“with”内部,当上下文管理器退出时就会自动释放所有资源

TensorFlow会自动生成一个默认的计算图,如果没有特殊指定,计算会自动加到这个计算图当中,但TensorFlow不会自动生成默认的会话,而是需要手动指定,当默认的会话被指定后可以通过eval()函数来计算一个张量的取值,代码示例如下:

import tensorflow as tf

a = tf.constant([1.0,2.0], name="a")
b = tf.constant([2.0,3.0], name="b")
result = a + b

sess = tf.Session()

with sess.as_default():
    print(result.eval())    
print(sess.run(result))
print(result.eval(session=sess))

sess.close()

执行以上代码,会发现三个输出结果相同:

[3. 5.]
[3. 5.]
[3. 5.]

在交互环境下(如Python脚本或Jupyter编辑器),TensorFlow还提供了一种直接构造默认会话的函数——tf.InteractiveSession()函数,省去了将生成的会话注册为默认会话的过程,如下:

import tensorflow as tf

a = tf.constant([1.0,2.0], name="a")
b = tf.constant([2.0,3.0], name="b")
result = a + b

#自动将生成的会话注册为默认会话
sess = tf.InteractiveSession()
print(result.eval())

sess.close()

TensorFlow还支持在生成会话时通过tf.ConfigProto()函数配置相应参数,代码如下:

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

tf.ConfigProto()函数有以下两个参数:

  1. allow_soft_placement参数为True:代表某些计算无法被当前GPU支持时,可以自动调整到CPU上,而不是报错,可以提高代码的可移植性(默认为False)。

  2. log_device_placement参数为True:代表日志中会记录每个节点被安排在了哪个设备上以方便调试(参数被设置为False可以减少日志量)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章