TensorFlow 入门
TensorFlow 运行模型一一会话
-
TensorFlow 使用会话(session)来执行定义好的运算。
-
会话拥有并管理 TensorFlow 程序运行时的所有资源。
-
所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄漏的问题。
-
TensorFlow 中使用会话的模式一般有两种。
- 第一种模式需要明确调用会话生成函数和关闭会话函数。
- 使用这种模式时,在所有计算完成之后,需要明确调用 Session.close 函数来关闭会话并释放资源。
- 然而,当程序因为异常而退出时,关闭会话的函数可能就不会被执行从而导
致资源泄漏。
- 第二种模式需要使用with来管理会话。
- 为了解决异常退出时资源释放的问题,TensorFlow 可以通过 Python 的上下文管理器来使用会话。
- 通过 Python 上下文管理器的机制,只要将所有的计算放在“with”的内部就可以。
- 当上下文管理器退出时候会自动释放所有资源,这样既解决了因为异常退出时资源释放的问题,同时也解决了忘记调用 Session.close 函数而产生的资源泄漏。
# 以向量加法为例,当运行如下代码时,并不会得到加法的结果,而会得到对结果的一个引用。 import tensorflow as tf # tf.constant是一个计算,这个计算的结果为一个张量,保存在变量a中。 a = tf.constant([1.0, 2.0], name="a") b = tf.constant([2.0, 3.0], name="b") result = tf.add(a, b, name="add") print(result) # 输出:Tensor("add:0", shape=(2,), dtype=float32) # 第一种模式:创建一个会话。 sess = tf.Session() # 使用这个创建好的会话来得到关心的运算的结果。 # 比如可以调用sess.run(result)来得到张量result的取值。 print(sess.run(result)) # 关闭会话使得本次运行中使用到的资源可以被释放。 sess.close() # 输出[ 3. 5.] # 第二种模式:创建一个会话,并通过Python中的上下文管理器来管理这个会话。 with tf.Session() as sess: # 使用创建好的会话来计算关心的结果。 print(sess.run(result)) """ 不需要再调用“Session.close()”函数来关闭会话, 当上下文退出时会话关闭和资源释放也自动完成了。 """ # 输出[ 3. 5.]
- 第一种模式需要明确调用会话生成函数和关闭会话函数。
-
TensorFlow 会自动生成一个默认的计算图,如果没有特殊指定,运算会自
动加入这个计算图中,TensorFlow 中的会话也有类似的机制,但 TensorFlow 不会自动生成默认的会话,而是需要手动指定。当默认的会话被指定之后,可以通过 tf.Tensor.eval 函数来计算一个张量的取值 。 -
在交互式环境下(比如 Python 脚本或者 Jupyter 的编辑器下),通过设置默认会话的方式来获取张量的取值更加方便。所以 TensorFlow 提供了 一种在交互式环境下直接构建默认会话的函数。这个函数就是 tf.lnteractiveSession,使用这个函数会自动将生成的会话注册为默认会话。
# 通过设定默认会话计算张量的取值。 import tensorflow as tf a = tf.constant([1.0, 2.0], name="a") b = tf.constant([2.0, 3.0], name="b") result = tf.add(a, b, name="add") sess = tf.Session() with sess.as_default(): print(result.eval()) # 输出[ 3. 5.] sess = tf.Session() # 以下两个命令有相同的功能。 print(sess.run(result)) print(result.eval(session=sess)) sess.close() # 输出两个[ 3. 5.] # 通过tf.InteractiveSession函数可以省去将产生的会话注册为默认会话的过程。 sess = tf.InteractiveSession() print(sess.run(result)) sess.close() # 输出[ 3. 5.]
-
ConfigProto配置会话
- 无论使用哪种方法都可以通过 ConfigProto Protocol Buffer来配置需要生成的会话。
- 通过 ConfigProto 可以配置类似并行的线程数、GPU 分配策略、运算超时时间等参数。
- 在这些参数中,最常使用的有两个。
- 第一个是 allow_soft_placement,这是一个布尔型的参数,当它为 True 时, 在以下任意一个条件成立时,GPU 上的运算可 以放到 CPU 上进行:
- 运算无法在 GPU 上执行。
- 没有 GPU 资源(比如运算被指定在第二个 GPU 上运行,但是机器只有个 GPU)。
- 运算输入包含对 CPU 计算结果的引用。
- 这个参数的默认值为False,但是为了使得代码的可移植性更强,在有 GPU 的环境下这个参数一般会被设置为True。不同的 GPU 驱动版本可能对计算的支持有略微的区别,通过 allow_soft_placement 参数设为True,当某些运算无法被当前 GPU 支持时,可以自动调整到 CPU 上,而不是报错。类似地,通过将这个参数设置为 True,可以让程序在拥有不同数量的 GPU 机器上顺利运行。
- 第二个使用得比较多的配置参数是 log_device_placement ,这也是一个布尔型的参数,当它为 True 时日志中将会记录每个节点被安排在哪个设备上以方便调试。而在生产环境中将这个参数设置为 False 可以减少日志量。
- 第一个是 allow_soft_placement,这是一个布尔型的参数,当它为 True 时, 在以下任意一个条件成立时,GPU 上的运算可 以放到 CPU 上进行: