第3章 TensorFlow入门
3.1 TensorFlow计算模型——计算图
计算图是TF框架中最基本的概念,所有的计算都会被转化为计算图上的点,下面详细介绍计算图。
3.1.1 计算图的概念
Tensor——张量,可以理解为多维数组;
Flow——流,体现了计算模型,表达了张量之间通过计算相互转化的过程;
每个计算都会被转化为计算图上的一个节点,节点之间的边描述了计算之间的依赖关系
3.1.2 计算图的使用
Tensorflow程序会分为两个阶段:
第一阶段需要定义计算图中的所有计算
第二阶段执行计算
函数 | 效果 |
---|---|
tf.get_default_graph | 获取当前默认的计算图 |
tf.Graph | 生成新的计算图 |
tf.Graph_device | 指定运算设备 |
计算图的另一个功能:有效整理TF程序中的资源
通过集合来整合资源:
函数 | 效果 |
---|---|
tf.add_to_collection | 将资源加入一个或多个集合 |
tf.get_collection | 获取一个集合中的所有资源 |
为方便使用,TF也自动管理了一些常用的集合
集合名称 | 集合内容 | 使用场景 |
---|---|---|
tf.GraphKeys.VARIABLES | 所有变量 | 持久化TensorFlow模型 |
tf.GraphKeys.TRAINABLE_VARIABLES | 可学习的变量 | 模型训练、生成模型可视化内容 |
tf.GraphKeys.SUMMARIES | 日志生成相关张量 | TensorFlow计算可视化 |
tf.GraphKeys.QUEUE_RUNNERS | 处理输入的QueueRunner | 输入处理 |
tf.GRaphKeys.MOVING_AVEGAGE_VARIABLES | 所有计算了滑动平均值的变量 | 计算变量的滑动平均值 |
3.2 TensorFlow数据模型——张量
张量是TF的数据管理形式
3.2.1 张量的概念
在TF程序中,所有的数据都是通过张量的形式来表示的,从功能角度看,张量可以被理解为多维数组,其中零阶张量表示标量(scalar),也就是一个数;一阶张量表示向量(vector),也就是也一维数组;n阶张量可以理解为n维数组。
张量的实现:并不是直接采用数组的形式,而只是对tensorflow中计算结果的引用。
张量保存的是什么:并不是真正的数字,而是保存如何得到这些数字的计算过程。
张量的属性:名字(name)、维度(shape)、类型(type)
Tensor("MatMul:0", shape=(1, 1), dtype=int32)
- 名字:张量的唯一标识符,且说明了张量是如何计算出来的;
node:src_output
的形式
- node:节点名称
- src_output:当前张量来自第几个节点的第几个输出(
MatMul:0
表示计算节点“MatMul
的第一个结果”)
- 维度:描述了张量的维度信息(shape=(1, 1)表示该张量是二维数组)
- 类型:每个张量会有一个唯一的类型(TF会对所有参与运算的张量进行类型检查,不匹配会报错)
3.2.2 张量的使用
- 第一类:对中间结果进行引用,当一个计算包含很多中间结果时,使用张量可以提高代码可读性。
a=tf.constant([1.0,2.0],name="a")
b=tf.constant([2.0,3.0],name="b")
result=a+b
- 第二类:当计算图构造完成之后,张量可以用来获得计算结果,也就是得到真实的数字。
虽然张量本身没有存储具体数字,但可以通过会话(session)来得到具体数字
3.3 TensorFlow运行模型——会话
会话(session):执行定义好的运算
会话拥有并管理TensorFlow程序运行时的所有资源,当所有计算完成之后需要关闭会话来回收资源,否则可能出现资源泄露的问题。
会话模式有两种:
- 第一种模式:需要明确调用会话生成函数和关闭会话函数(当程序异常退出时,关闭会话函数可能不会执行,导致资源泄露)
# 创建一个会话
sess = tf.Session()
# 使用这个创建好的会话得到关心的运算结果
sess.run(result)
# 关闭会话
sess.close()
- 第二种模式:通过Python上下文管理机制
with tf.Session() as sess:
sess.run(result)
# 当上下文退出时会话关闭,资源可以被释放。
会话如何生成:指定默认会话(默认会话不会自动生成),通过 tf.Tensor.eval
函数计算张量取值。
run和eval的区别:ecal一次只能得到一个节点的值,run可以得到多个节点的值
sess = tf.Session()
with sess.as_default():
print(result.eval())
[ 4. 6.]
以下代码实现相同的功能:
sess = tf.Session()
# 下面的两个命令有相同的功能
print(sess.run(result))
print(result.eval(session = sess))
使用tf.InteractiveSession()
构建会话:
通过默认会话的方式获取张量的取值会更加方便,TensorFlow提供了一种在交互式环境下直接构建默认会话的函数,会自动将生成的会话注册为默认会话。
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)
allow_soft_placement=True
在下面的任意一个条件成立,GPU的运算可以放到CPU上进行:
运算无法在GPU上执行;
没有GPU资源(比如运算被指定在第二个GPU上运行,但是机器只有一个GPU);
运算输入包含对CPU计算结果的引用。
log_device_placement=True日志中将会记录每个节点被安排在了哪个设备上以方便调试。