TensorFlow快速入门与实战笔记(1)
24 Feb 2019 |
Chinese/中文,
IT,
Note
本文是在学习课程TensorFlow快速入门与实战时的笔记
目录
模块与架构
API
不同级别的API
架构
在应用层,几种语言的 API 都是建立在 C API的封装(除了C++拥有一套完整的封装)
运行核心实现了一些运算中的关键数据结构。具体而言包含Tensor和相关操作的定义等等。
而运行操作是由下面的核函数实现的。
XLA,通过中间表示层和编译器的优化,将可化简的运算合并为更大粒度的运算提高效率。
数据流图
TensorFlow 数据流腿是一种声明式的编程范式。相比命令式更加靠近目的,靠近数理逻辑。
更加适用于结构化抽象画。
从入度为零的点开始计算。
优势
- 并行计算快(损耗低)
- 分布式计算快(CPUs,GPUs,TPUs)
- 预编译优化(XLA)
- 可移植性好(Language-independent representation)
Tensor
在数学中张量是一种几何实体,广义上表示任意形式的“数据”。
张量可以理解标量,向量等数据实体在高维空间上的推广。
在TensorFlow中,Tensor表示相同数据类型的多维数组。
因此,它具有两个重要的属性:
- 数据类型(e.g 浮点型)
- 数组形状(各个维度的大小,i.e shape)
Notice:
- 张量是用来表示多维数据的
- 是执行操作时的输入或输出数据
- 用户通过执行操作来创建或计算张量
- 张量的形状可以部分定义,允许在运行时通过形状推断计算得出
常用张量
tf.constant //常量
tf.placeholder //占位符
tf.Varibale //变量
示例代码
Variable
维护特定节点的状态,如模型参数。
tf.Variable
是一个操作,返回值是一种特殊张量(不依赖计算,不会被清理,常驻内存)
示例代码
Notice:这里仅仅是在描述,没有真正进行计算
变量使用流程
Operation
在TensorFlow的数据流图中,每个节点对应一个具体操作。因此,操作时模型功能的实际载体。
按照功能粉丝一下三种:
- 储存节点:有状态的变量操作,通常用来存储型参数;
- 计算节点:无状态的计算或控制操作,主要负责算法逻辑表达或流程控制;
- 数据节点:数据的占位符操作,用于描述图外输入数据的属性;
典型的计算和控制操作
Placeholder
表示图外输入的数据,e.g训练和测试数据。
数据流图描述了算法模型的计算拓扑,其中的各个操作(节点)都是抽象的函数映射或数学表达式。
换句话说,数据流图本身知识一个具有计算拓扑和内部结构的“壳”(类似都代数式)。
在用户向其填充数据之前,图中没有真正执行任何计算。
因此,在TensorFlow中尽量避免使用逻辑控制。
Session
会话提供了估算张量和执行操作的运行环境,它是发放计算任务的客户端,所有计算任务都由他连接的执行引擎完成。
会话操作
获取张量值的另外两种方法:估算张量(Tensor.eval
)与执行操作(Operation.run
)
估算最终都会调用Session.run()
执行原理
当我们调用sess.run(train_op)
语句执行训练时:
- 程序内部提取操作依赖的所有前置操作。这些操作的节点共同组成一幅子图。
- 程序会将子图中的计算、储存和数据节点,
按照各自的执行设备分类,在相同设备上组成一幅局部图。
- 每个设备上的局部图在实际执行时,
根据节点时间的依赖关系将各个节点有序的加载到设备上执行
本地执行
可以在创建节点时指定相应的执行设备。
Optimizer
训练机制
- 模型:
y = f(x) = w * x + b
,其中x是输入数据,y是模型输出的推理值,w和b是模型参数(训练的对象)。
- 损失函数:
loss = L(y,y_-)
,其中y_是x对应真实值,loss为损失函数输出的损失值。
- 优化算法:
w <- w + alpha * grad(w), b <- b + alpha * grad(b)
,其中grad(w)和grad(b)分别表示当损失值为loss时,模型参数w和b各自的梯度值,alpha为学习率。
优化器
优化器是实现优化算法个的载体。
一次典型的迭代优化应分为一下三个步骤:
- 计算梯度:调用compute_gradients方法;
- 处理梯度:按需处理梯度值,e.g.梯度裁剪和梯度加权等;
- 应用梯度:调用apply_gradients方法,将处理后的梯度值应用到模型参数中
内置优化器