tensorflow 目标分割_Tensorflow中的控制流和优化器

b6e1da6acca65972fd3c4f835c01e6dd.png

控制流

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

c78785014bd33b56f75b3c6cf2cbcb5c.png

当了解了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)实现的伪代码如下:

8568d4b1bdc2be67c1c6589b90bcf34b.png

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

fbe3d6c889e2de6ff7ef4516ca805164.png

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

eb520138033d6c8cb3e1c828749e0bc0.png

873785c47c525b1f2323d56aa0d8bb5f.png

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

f2b10f594ce41184d5e05c9aba1aeff4.png

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

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

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

16ef9df8ea93470a4a69629fecef46aa.png

优化器

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

b97b3a464faac6c8fc2ef33b9f367aa6.png

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

d3838cb896b2e63c33c1fbe8276e8bbe.png

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

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

1d03632861bcecbd03fe6abcfb3010c7.png

0a6ef6463678cbedf01452841e2a5f82.png

53ba9d295521c3ef82339d5f114e69ad.png

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

3a51a2b6eebb46bc589aaa38453c3b6f.png

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

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

acd5a62ba2bf80ef93898b5740e51587.png

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

11e880098a418a71a2966404d73a3496.png

这两个消除了冗余计算。

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

b62b44ef29e2e685d28b4b7393bf430e.png

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

往期文章

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

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

6ca5b480dcfa5299ac483ec56e83ee41.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Reflector 已经out了,试试ILSpy

Reflector是.NET开发中必备的反编译工具。即使没有用在反编译领域,也常常用它来检查程序集的命名规范,命名空间是否合理,组织类型的方法是否需要改善。举例说明,它有一个可以查看程序集完整名称的功能,请看下图 这里的…

Go语言通过odbc驱动连接华为高斯数据库

1.下载odbc驱动 下载后安装psqlodbc_x64.msi 安装成功后可在odbc数据源中看到以下内容 2.测试odbc驱动 在用户dsn中选择添加 输入对应的连接内容点击test 如果显示以下内容则表示驱动正常可使用odbc连接高斯数据库 3.go 语言编写 其中依赖包需要使用命令安装 go get github.c…

activiti高亮显示图片_【正点原子FPGA连载】第二十章SD卡读BMP图片HDMI显示实验领航者 ZYNQ 之嵌入式开发指南...

1)实验平台:正点原子领航者ZYNQ开发板2)平台购买地址:https://item.taobao.com/item.htm?&id6061601087613)全套实验源码手册视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.htm…

.net Redis缓存优化提高加载速度和服务器性能(一)

距离上次服务器将图片转义至oss服务器提交加载速度已经有一段时日了 对于图片转移至oss服务器优化前后的结果可以查看我之前编写的文章点击查看 如今随着商户数的增多,数据的增多,服务器的性能再一次达到了顶峰,并且由于是点餐系统的缘故订…

火星人谚语系列之六:一次真实应用

总目录:之一,之二,之三,之四,之五,之六,之七,之八这是2011年7月的一次QQ群对话记录,做了匿名化处理,并重新调整了顺序,以便于阅读。对话的开始&am…

ubuntu 启动图形界面命令_Windows 10 远程连接 Ubuntu 18.04 Server图形界面

目录 0. 环境信息和说明Ubuntu 18.04上安装xrdp远程ubuntu-desktop桌面服务Ubuntu 18.04上安装xrdp远程Xfce桌面服务Ubuntu 18.04上安装vnc远程Xfce桌面服务0.环境信息和说明-----------Ubuntu版本# cat /etc/os-releaseNAME"Ubuntu"VERSION"18.04.3 LTS (Bioni…

动态条形图(RunBargraph)用于数据展示

最近公司项目需要做各种图标展示,用了Echarts的条形图和柱状图,但是老板还是觉得不够生动,看来时候祭出大招了 由此衍生在空余时间写下了此篇博客,首先还是看效果图: 注意,此图中数据并非真实数据,只是为…

网页实现凭证金额分割线_一位整理过5000个网页书签的大神分享:实用的书签管理方案...

我们在日常使用使用搜索引擎的过程中,会逐渐累积各式各样丰富的网站。而当我们保存的书签过多的时候,如果没有一套实用的管理方案,就会造成书签混乱,加大我们搜索的难度。所以,下面跟大家分享一套实用的书签管理方案&a…

【Python基础】11_Python中的字符串

1.字符串的定义 可以使用""双引号,也可以使用单引号定义字符串,一般使用双引号定义。 2.字符串的操作 判断类型: 查找和替换 大小写切换: 文本对齐 注:string.center(weight,str) 以str填充对齐,…

C# 淘宝商品微信返利助手开发-(一)返利助手原理

系列教程一目录:返利助手原理 系列教程二目录:返利助手开放文档以及帐号申请地址 系列教程三目录:返利助手开发(1)API介绍 系列教程四目录:返利助手开发(2)淘宝分享的内容如何只取…

c++ class struct同名_相对于C语言,C++对struct做了非常多的扩充,功能更全面了

我有相当长的一段时间(数月)没有更新文章了。并不是我放弃了写技术文章,而是因为这段时间,我把精力主要放在了图像智能算法的学习上了。去年12月时,我对图像智能算法还懵懵懂懂,做着 Linux 嵌入式应用程序开发,现在我已…

Burp破解安装(1.7和2.0)

依赖 由于Brup是使用java语言开发的&#xff0c;因此我们需要本地有jdk8的环境&#xff0c;教程自己百度或者<a href"https://www.runoob.com/java/java-environment-setup.html">https://www.runoob.com/java/java-environment-setup.html</a>&#xff…

C# ASP.NET MVC 微信和支付宝H5支付开发及Demo

微信和支付宝H5支付 最近开发任务遇到了一个要在手机浏览器里面调起微信和支付宝去支付的开发需求&#xff0c;以前都是做的扫码支付或者JSAPI都是在软件内部支付的&#xff0c;没遇到过在自己浏览器内唤醒微信或者支付宝的支付这种开发在开发的过程中遇到了许多问题和坑点这里…

dbnetlib sqlserver不存在或拒绝访问_SQL Server数据库损坏和修复

常见错误解读823错误错误信息是&#xff1a;“在文件%ls中、偏移量为%#016I64x的位置执行%S_MSG期间&#xff0c;操作系统已经向SQL Server返回了错误%ls。”“The operating systemreturned error %ls to SQL Server during a %S_MSGat offset %#016I64x in file %ls.”例如&a…

C# ASP.NET MVC 阿里云短信验证码Demo

相信大家在开发过程中又很多使用到验证码验证的功能&#xff0c;今天将验证码的验证整理一下写了一个Demo 通过本篇后你能学习到: 阿里云短信服务Drapper连接SQL Server进行增改操作JS前端倒计时 完成后效果如下: (一)首先我们要使用短信我们先注册短信服务所需的内容 1.首先…

mybatis generator生成example_[Springboot系列] SpringBoot与Mybatis结合

本文作者&#xff1a;cuifuanMybatis 是一个持久层ORM框架&#xff0c;负责Java与数据库数据交互&#xff0c;也可以简易理解为中介&#xff0c;相对于它&#xff0c;还有个中介是hibernate,不过在mybatis中sql语句的灵活性&#xff0c;可优化性比较强&#xff0c;这也是现在大…

在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(二)---静态文件如何部署...

目前&#xff0c;较为成熟的技术是采用laravelS组件&#xff0c;注意和laravel 区别laravelS多了一个大写的S&#xff0c;由于laravelS默认监听5200端口&#xff0c;所以laravel项目要做一些调整 例如&#xff1a; 静态文件引入的方式-----从静态资源服务器加载我们熟悉的js和c…

Linux上Oracle 11g安装步骤图解(超详细图文教程)附带导入数据和新建数据库教程

首先本文采用Docker方式快速在Linux上安装 目录 1.安装Docker容器 (1)登陆服务器&#xff0c;输入命令安装Docker容器 (2)安装完成后运行下列代码如果弹出Docker版本则表示安装成功 (3)启动Docker并设置跟随系统开机启动 (4)由于国内系统拉取国外镜像缓慢所以我们在开始安…

python中import sys_python import sys出错怎么办

当在pycharm中输入如下代码时&#xff1a;import sys 一、问题&#xff1a; sys下出现红色波浪线&#xff0c;按CtrlF1显示的信息为&#xff1a;no module named sys。 二、原因&#xff1a; 在装Python解释器时&#xff0c;我为了图方便装的是 Python 3.7.0a4 的embeddable版本…

Windows phone7 软件发布:理财计算器(包括wp7房贷计算器,wp7个税计算器,wp7存款利息计算器)...

前一段时间&#xff0c;需要经常用到贷款计算器的功能&#xff0c;这样有利于我们做出更好的决策。但是我们只能通过银行的工作人员的计算器来计算&#xff0c;给我带来了极大的不便和损失&#xff0c;由此便萌生了开发一个Windows phone7版的贷款计算器的功能。 此计算器目前的…