控制流

只要对tensorflow有一点了解,都应该知道graph是tensorflow最基本的一个结构。Tensorflow的所有计算都是以图作为依据的。图的nodes表示一些基本的数学运算,比如加法,卷积,pool等。Node使用protoBuf来进行描述,包括node的名字,op,input等,详细可以参看tensorflow中的node_def.proto文件。Node对应的op使用C++来进行实现。图中的边表示了数据流动的方向以及节点之间的依赖关系。比如A->B就表示B必须在A执行完之后才能够执行。以下是inception网络的图结构。

当了解了tensorflow的一些基本op之后,我们会存在这样的疑问。对于需要分支跳转,循环的部分,tensorflow是如何实现的。比如tf.cond,tf.while_loop这些语句在底层是如何表示的呢?tensorflow定义一些基本的控制原语,通过一定的组合可以完成高层次控制语言的实现,比如a=op?C:D这样的语句。

tensorflow控制流的设计原则是通过引入最少的控制模块,利用这些控制模块可以表示很多复杂应用广泛的控制过程。这些控制模块还能够适应并发,分布式运算,同时能够实现自动微分。在tensorflow,一个计算节点在执行帧(execution frame,类比进程的栈帧)里执行。控制流原语负责创建和管理执行。直观地理解,TF运行时建立一个个执行帧,在执行帧里执行所有属于这个执行帧的计算节点。执行帧可以嵌套(父子关系)。来自不同执行帧且没有依赖关系的计算节点可以并行计算。这里介绍5种最基本的控制原语。

1 switch

依据控制条件p,选择性将输入数据d传播到两个输出端。

2 merge

Merge算子将一个可用输入传给输出,只要有任意一个输入可用,switch就可以执行。

3 enter

Enter算子依据执行帧唯一标识名称将输入传递到相应执行帧。Enter算子用于将一个tensor从一个执行帧传递到子执行帧。

4 exit

Exit算子用于将子执行帧的数据传递父执行帧。

5 nextIteration

netIteration算子可以将其输入传递到当前执行帧的下一个iteration。Tensorflow的runtime可以随时跟踪执行帧中的iteration。任何一个op都有一个唯一的iteration ID进行标识。

现在我们来看这几种原子指令是如何实现条件判断和循环的。

Tensorflow中条件判断cond(pre, fn1, fn2)实现的伪代码如下:

首先创建一个条件控制context,这个context会调用两个不同的计算图。使用哪个计算图由条件pre来决定。最后将调用两个计算图的结果通过merge节点输出到下一个计算图。使用merge节点是为了保证只要有一个图有了结果就可以马上输送到下一个节点进行后续计算。用图描述如下:

对于循环语句,tensorflow中使用一下伪代码来完成:

首先创建一个循环控制context。然后创建一个enter和merge节点来导入循环体变量。使用enter节点是通过帧名识别这个循环体从而去执行。Merge是将循环变量传递给判断条件图,进行循环判定。加入的switch节点用于对循环条件判断的结果进行计算图选择。循环体内部计算结果需要进行多次循环,所以进入了nextIteration节点。Switch的false输出用于终止循环,所以进入exit节点将最终结果输出。

有了这些控制节点,tensorflow就可以将一个图分割成多个子图,并部署到多个硬件执行设备上。在两个子图分割处,添加send和receive节点用于不同设备之间数据通信。Tensorflow对节点如何分配没有限制,只要这个节点可以在这个设备上执行,就可以分配。如果没有这些控制节点,那么一幅图中的一个节点就只能执行一次,有了这些控制节点,计算图就能够有更多计算方式。一个节点可以循环执行多次,还可以被分配到不同设备执行。

Tensorflow可以支持自动微分。当用户建立了计算图和定义了loss函数后,tensorflow会根据计算图的结构建立反向传播图。给定一个计算节点,可以通过映射到计算公式方式进而求取微分。从而能够找出其反向传播的节点的表示。对于控制节点来说,enter的反向传播节点是exit,switch的反向传播节点是merge(对于cond来说),或者nextIteration+merge(对于while_loop来说)。Merge的反向传播节点是switch。nextIteration的反向传播节点是identity。Enter的反向传播节点是exit。有了这些对应关系,就可以自动来推断反向传播图。从而求取梯度了。而且可以在多个设备上进行计算分配。

比如对于cond条件判断,如果其不是loop中的条件判断,那么其正向传播图和反向传播图的映射关系为:

优化器

优化器是在原始计算图基础上进行优化,提高计算在硬件上的效率。优化主要有几个目标:简化图结构,降低最大的硬件存储使用率,进行硬件友好的图转化。图优化方法有很多,有些和硬件无关,有些和硬件的具体实现细节相关。高层次优化是对图进行一定简化,它对硬件是透明的。通过简化可以去除一些冗余计算。比如常数折叠,多余控制节点去除等。还有一些利用结合律,分配律等对公式进行简化,比如:

1) 图的简化可以删除一些冗余计算,将图用最终等效结果替换。比如一个建立tensor的过程:

将tensor的shape创建和数据创建合并,直接用常数替换。这样就去除了shape创建过程。

2) 常数折叠可以将两个以上常数用一个常数替代,需要优化器进行一些计算。比如:

3) 代数优化利用算术的性质进行一定转化。比如:

addN相当于硬件上可支持的一个并行计算单元,可以一次计算多个输入。所以可以将连续的三个加法用一个并行加法替换。

第二个利用了算术的分配律和结合律将三个具有相同乘数提取出来。最后一个对逻辑进行了等效转化,从而减少了计算节点。

这个matrix+scalar的时候需要对scalar先进行广播,然后再加。转化后减少了广播次数。

这两个消除了冗余计算。

4) ​op融合将多个计算节点融合为一个节点来计算。这个是和硬件有关的,比如一个硬件计算单元可以完成conv+batch_norm,那么就可以实现这样的计算融合,就不需要单独多出来一个计算单元。常用的op融合有:

5) 存储优化的目的是为了降低对片外的访问频率,这样能够提高数据运算效率,减少等待数据加载时间。

往期文章

1 GPU,多核CPU和AI芯片的存储结构

2 让推荐系统更快:Nvidia Merlin架构

tensorflow 目标分割_Tensorflow中的控制流和优化器相关推荐

  1. (Tensorflow之四)激活函数、交叉熵及优化器

    一.激活函数 激活函数的主要作用是提供网络的非线性建模能力.如果没有激活函数,那么该网络仅能够表达线性映射,此时即便有再多的隐藏层,其整个网络跟单层神经网络也是等价的.因此也可以认为,只有加入了激活函 ...

  2. 【机器学习基础】在机器学习项目中该如何选择优化器

    作者:Philipp Wirth   编译:ronghuaiyang 导读 几种流行的优化器的介绍以及优缺点分析,并给出了选择优化器的几点指南. 本文概述了计算机视觉.自然语言处理和机器学习中常用的优 ...

  3. 使用什么优化器_在机器学习项目中该如何选择优化器?

    导读 几种流行的优化器的介绍以及优缺点分析,并给出了选择优化器的几点指南. 本文概述了计算机视觉.自然语言处理和机器学习中常用的优化器.此外,你会找到一个基于三个问题的指导方针,以帮助你的下一个机器学 ...

  4. DRO:SFM任务中的深度循环优化器(阿里巴巴AI Lab)

    代码.论文地址:在公众号「3D视觉工坊」,后台回复「DRO」,即可直接下载. Motivation: 解决一个优化问题,常见的优化器比如梯度下降法, 牛顿法等, 一般会先计算梯度------>再 ...

  5. Apache Spark 2.2中基于成本的优化器(CBO)(转载)

    Apache Spark 2.2最近引入了高级的基于成本的优化器框架用于收集并均衡不同的列数据的统计工作 (例如., 基(cardinality).唯一值的数量.空值.最大最小值.平均/最大长度,等等 ...

  6. Pytorch框架中SGD&Adam优化器以及BP反向传播入门思想及实现

    因为这章内容比较多,分开来叙述,前面先讲理论后面是讲代码.最重要的是代码部分,结合代码去理解思想. SGD优化器 思想: 根据梯度,控制调整权重的幅度 公式: 权重(新) = 权重(旧) - 学习率 ...

  7. 实践实战:在PoC中的Oracle 12c优化器参数推荐(含PPT)

    最近,Oracle数据库优化器的产品经理 Nigel Bayliss 发布了一篇文档,介绍:Setting up the Oracle Optimizer for PoCs - 在PoC测试中优化器参 ...

  8. pytorch中的学习率与优化器【lr_scheduler与optimizer】

    pytorch中优化器的使用流程大致为: for input, target in dataset:optimizer.zero_grad()output = model(input)loss = l ...

  9. 深度学习框架TensorFlow系列之(五)优化器1

    1 背景 梯度下降算法是目前最流行的优化算法之一,并且被用来优化神经网络的模型.业界知名的深度学习框架TensorFlow.Caffe等均包含了各种关于梯度下降优化器的实现.然而这些优化器经常被用作黑 ...

最新文章

  1. android环境安装之android4.2安装(转)
  2. 皮一皮:这小伙子怎么能掌握这么多高深技术!!!
  3. 【开发环境】PyCharm 配置 GitHub ( 从 GitHub 中 Clone 代码到 PyCharm 开发环境中 )
  4. 凭证 90000000 保存(帐户确定出错)
  5. python 画图_学python画图最快的方式——turtle小海龟画图
  6. html怎么把一段文字设置为连接到下一个网页的按钮,网页设计三合一模拟试题(一)...
  7. Java 字符编码与解码
  8. Signal 通过区块链慈善组织 The Giving Block 接受加密货币货币捐赠
  9. 新手安装Ubuntu操作系统
  10. Apache Shiro Java 反序列化漏洞解决修复记录
  11. Pannellum:实例之自动加载全景图
  12. C 入门 第五节 多维数组 字符串数组
  13. Android 创建Mpaas项目
  14. 矩阵 LUP 分解 解线性方程组 求行列式值 矩阵求逆 算法说解
  15. 最基本的几种 CSS 文字滤镜效果 - 蓝色理想
  16. SQL Server 数据库之分离和附加数据库
  17. 模数转换器(ADC)
  18. Ubuntu 16 AX201网卡安装后无法使用WIFI解决办法
  19. ibm jazz_Jazz源代码管理管理指南
  20. Cypher 语句实战

热门文章

  1. 石油勘探是属于计算机应用中的,计算机在石油勘探开发中的应用论文
  2. MySQL8.0.x 版本安装步骤傻瓜式教程【官方版】
  3. java 定时任务(三):cron表达式
  4. POSIX 串口编程指南
  5. [react] 在React中你有遇到过安全问题吗?怎么解决?
  6. Taro+react开发(44)taro基本使用
  7. 前端学习(3252):react脚手架
  8. 工作275:表单验证重置
  9. 工作总结7:自定义样式
  10. 前端学习(2251)提交代码