Tensorflow数据流图
2019-01-07 本文已影响0人
zer0like
0x01 数据流图
数据流图:用节点和有向边描述数学运算的有向无环图
节点:代表各类操作(operation),具体包括数学运算、数据填充、结果输出和变量读写等
有向边:描述节点间的输入、输出关系,而张量(Tensor)则在边上流动
基于梯度下降的机器学习问题,在TensorFlow的数据流图中通常可分为两个阶段:
- 前向图求值:用户编写,主要包括定义模型的目标和损失函数,输入输出的形状和类型
- 后向图计算梯度:TensorFlow的优化器生成,主要用来计算模型的梯度以及梯度的更新
0x02 节点
前向图中,节点称为操作(operation)主要包括三类:
- 数学函数或表达式:如加减乘除等
- 储存模型参数的变量(Variable):比如卷积中的卷积核和偏置
- 占位符(Placeholder):用来描述输入输出的形状,便于用户利用其抽象结构来定义模型,执行时需要填充对应的数据
后向图中,节点也会分为三类:
- 梯度值:经过前向图计算出的模型参数的梯度
- 更新模型参数的操作:定义如何将梯度值更新到对应的模型参数
- 更新后的模型参数:优化器中的参数与前向图中的参数一一对应,但是参数进行了更新,用户下一轮训练
0x03 有向边
有向边定义操作之间的关系,主要包括两类:
- 传输数据,绝大的有向边都是此类,用来流动张量
- 定义控制依赖,泰国设定节点的前置依赖决定相关节点的执行顺序,又被称为控制边
所有的节点都通过数据边和控制边相连,入度为0的节点,即没有前置依赖的节点可直接执行,其他节点必须等所有依赖节点执行完才可执行
0x04 执行原理
从宏观的角度可分为四个步骤:
- 以节点的名称做关键字、入度作为值,构建散列表,并将此数据流图上的所有节点都放入散列表中
- 为此数据流图创建一个可执行节点队列,将散列表中入度为0的节点加入到队列中,并从散列表中删除这些节点
- 依次执行队列中的每一个节点,执行成功后将此节点输出指向的节点的入度减1,更新散列表中对应节点的入度值。
- 重复上面两个步骤直到执行队列为空。
注意:TensorFlow的编程模式(声明式编程)决定了其执行的顺序并不完全依赖于与代码中定义的顺序,而与节点之间的逻辑关系以及运行时库的实现机制相关。