[关闭]
@songying 2018-12-11T20:47:53.000000Z 字数 1520 阅读 1769

TensorFlow 数据流图

TensorFlow


https://zhuanlan.zhihu.com/p/33034626

简介

在Tensorlow中,算法模型由数据流图构成,数据流图是由节点与有向边构成的有向无环图,而每个节点就对应一个操作,而节点上的每个操作三需要分配到具体的物理设备之上的。有向边描述的是节点之间的输入,输出关系,边上流动着的三表示高维数据的张量。

在深度学习问题中,模型通常包括前向图求值与反向图求梯度两个过程。

  • 前向图由用户编码完成。
  • 后向图由Tensorflow的的Optimizer自动生成。

基本概念

1. 节点

节点可分为下面三类:

  1. 计算节点: 表示无状态的计算或控制操作,主要负责算法逻辑表达或流程控制。其对应的计算操作抽象为Operation。
  2. 存储节点: 表示有状态的变量操作,常用来存储模型参数。其对应的操作抽象为Variable
  3. 数据节点: 表示特殊的占位符操作,用于描述待输入数据的属性。其对应的操作抽象为Placeholder。

其中,无状态节点指的是其输出由输入张量和节点操作共同确定,而有状态的节点,其输出还会受到节点内部保存的状态值影响。

对应到前向图中, 节点可以分为以下三类:

  1. 计算节点: 数学函数或表达式,。
  2. 存储节点: 存储模型参数的Variable:
  3. 数据节点:占位符: 占位符通常用来描述输入,输出数据的类型和形状等,便于用户利用数据的抽象结构直接定义模型。在数据流图执行时,占位符需要填充对应数据。

对应到后向图中,节点同样分为以下三类:

  1. 梯度值: 经过前向计算出的模型参数的梯度
  2. 更新模型参数的操作: 定义如何将梯度值更新到对应的模型参数w,b
  3. 更新后的模型参数: W,b

2. 有向边

有向边描述的是节点间输入,输出关系,边上的流动数据是代表着高维数据的张量。有向边可以分为两类:

  1. 用于传输数据: 绝大部分流动着张量的边都是如此,用实线表示,简称数据边。
  2. 用于定义控制依赖,通过设置节点的前置依赖决定相关节点的执行顺序,用虚线表三,称为控制边。

所有节点都通过数据边与控制边连接。入读为0的节点没有前置依赖,可以立即执行; 入度非

3. 执行原理

在数据流图中,各个节点的执行顺序并不完全依赖于代码中定义的顺序,而是节点之间的逻辑关系以及运行时库的实现机制相关。

当使用TensorFlow执行指定数据流图时,过程分为四个步骤:

  1. 以节点名称作为关键字,入度作为值,创建一张散列表,并将此数据流图上的所有节点放入散列表中。
  2. 为数据流图创建一个可执行队列,将散列表中入度为0的节点加入到该队列中,并从散列表中删除这些节点。
  3. 依次执行该队列中的每一个节点,执行成功后将该节点指向的节点入度值减1,更新散列表中对应节点的入度值。
  4. 重复2,3, 直到可执行节点队列变为空。

数据流图计算原理

数据流图的计算包含控制流与数据流两条主线。

  • 控制流方面,Session 是计算流程和相关对象生命周期的管理者,目的是保证计算时序的正确性和有效性。
  • 数据流方面,Graph是算法逻辑与张量数据的承载者。

数据流图的计算可以分为三个层次: 应用层逻辑,会话生命周期,算法核函数执行。

  1. 应用层逻辑:
  2. 会话周期层次:
  3. 算法核函数执行层次:

数据流图的创建

用户通过应用层API来定义数据流图,但此时的数据流图并不能直接用于运行时核心的内部计算,通过Seesion的构造和运行,定义的数据流图可以转化成运行时核心可执行的数据流图格式,整个过程就称为数据流图的创建过程。

转化过程的输入为应用层定义的数据流图格式(tf.Graph), 输出为核心层定义的数据流图格式(c++实现的Graph)

1. 流程与抽象

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注