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…

MFC对话框打印预览异常问题解决

昨天在别人的电脑上成功运行了上次我写的打印预览程序,但是今天换了一台电脑就不能运行了,让我觉得非常奇怪。 提示的错误信息是“内存XXXX不能为read”,“mfc100d.dll”中有未经处理的异常。 奇怪的是,我加了try catch语句后依然…

[html] 请实现一个网站加载进度条

[html] 请实现一个网站加载进度条 import { memo } from react; import { useLifecycles } from react-use; import NProgress from nprogress; import nprogress/nprogress.css;const ProgressLine memo(() > {useLifecycles(() > {NProgress.start();},() > {NPro…

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服务器优化前后的结果可以查看我之前编写的文章点击查看 如今随着商户数的增多,数据的增多,服务器的性能再一次达到了顶峰,并且由于是点餐系统的缘故订…

DSA通讯协议

1.DSA-接口规范 DSA总线是一个异步,双向的,内部设计用于在一组两个微处理器之间的通信总线。 它有三个双向线: ● DATA -启动同步和数据传输 ● STB -数据选通(当STB为低电平时数据是有效的) ● ACK -启动同步&#xf…

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

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

[html] 怎样禁用页面中的右键、打印、另存为、复制等功能?

[html] 怎样禁用页面中的右键、打印、另存为、复制等功能&#xff1f; <body oncontextmenuself.event.returnValuefalse onselectstart"return false">个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。…

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)用于数据展示

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

找到的程序集清单定义与程序集引用不匹配

使用 MVCPager 做分页&#xff0c;调试时出现如上错误&#xff0c;甚是郁闷。自己使用的版本是 MvcPager1.5Mvc2.dll 使用 ILDASM 查看 manifest 也都没问题&#xff0c;真是奇了怪了。抱着试试看的态度把 MvcPager1.5Mvc2.dll 重命名成 MvcPager.dll 尼玛的居然成功了&#xf…

面试准备-Shell脚本

一、Shell脚本是什么&#xff1f; 一个Shell脚本是一个文本文件&#xff0c;包含一个或多个命令。我们经常需要使用多个命令来完成一项任务&#xff0c;我们可以添加这些所有命令在一个文本文件(Shell脚本)来完成这些日常工作任务。 二、运行 Shell 脚本有两种方法&#xff1a;…

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

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

[html] 实现一个页面锁屏的功能

[html] 实现一个页面锁屏的功能 <!DOCTYPE html> <html> <head> <title>Ctrll监控锁屏</title> </head> <body> <div id"message_div"></div> <script type"text/javascript" languageJavaScri…

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

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

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

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

利用分区优化SQL

一个哥们QQ问我&#xff0c;这个SQL怎么优化&#xff0c;它要跑160秒 SQL> explain plan for select a.so_region_code so_region_code,2 a.so_county_code so_county_code,3 a.so_org_id so_org_id,4 d.org_type_id org_…

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

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

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…