当前位置: 首页 > 编程日记 > 正文

non-local神经网络:通过非局部操作解决深度神经网络核心问题

640?wx_fmt=png

译者 | 李杰
出品 | AI科技大本营(ID:rgznai100)

回想一下我们熟悉的CNN、RNN。如下图所示,这些神经网络模型都是基于局部区域进行操作,属于local operations。为了获得长距离依赖,也就是图像中非相邻像素点之间的关系,本文另辟蹊径,提出利用non-local operations构建non-local神经网络。

640?wx_fmt=png
经典RNN,CNN网络结构

受计算机视觉中经典的非局部均值方法启发,作者的非局部操作是将所有位置对一个位置的特征加权和作为该位置的响应值。这种非局部操作可以应用于多种计算机视觉框架中,在视频分类、目标分类、识别、分割等等任务上,都有很好的表现。
简介

捕捉长距离依赖关系是深度神经网络的核心问题。以图像数据为例,要想捕捉长距离依赖,通常的做法是堆积卷积层,随着层数的加深,感受野越来越大,就能把原先非相邻的像素点纳入到一个整体考虑,获取的信息分布广度也越来越高。这种靠堆叠卷积层得到的感受野提升,需要不断重复卷积过程,而这种重复会带来几个弊端:首先,计算效率很低,层的加深意味着更多的参数,更复杂的关系;其次,优化困难,需要谨慎设计优化过程;最后,建模困难,尤其是对于那些多级依赖项,需要在不同距离位置传递信息。

在这篇论文中,作者将非局部操作作为一种简洁高效且通用的组件,用于捕获深度神经网络的中的长距离依赖关系。具体的non-local operation是受到计算机视觉中经典的非局部平均操作(non-localmean operation)启发,如下图所示,non-local operations在计算某个位置Xi Xi 的响应时,是考虑所有位置features的加权——所有位置可以是空间的,时间的,时空的,这意味着non-localoperations适用于图像、序列和视频问题。

640?wx_fmt=png

那么利用non-local operations有什么优点呢?

(a)与递归操作和卷积操作的渐进行为不同,non-localoperations通过计算任意两个位置之间的交互直接捕捉远程依赖,而不用局限于相邻点,摒弃了距离的概念。
(b)作者通过实验表明,在层数很少的情况下,non-localoperations都能取得非常好的性能表现。
(c)non-local可以作为一个组件,和其它网络结构结合。

在视频分类中,non-local operations可以发挥很好的效果。在视频中,长距离的相互作用发生在空间和时间中有距离的像素之间,一个单独的non-local块,可以用前向传播的方式直接捕获这些时空依赖关系。
背景知识
Non-local image processing

前文说过,non-local operations受到了计算机视觉中经典的非局部均值方法的启发,所以有必要说一下非局部均值方法。

非局部均值(non-local means)是经典滤波算法,通过计算图像中所有像素的加权平均值实现过滤。它的目的是使用与当前点纹理类似的区域,对当前点加权。也即加权因子,是基于被加权点与当前点的邻域的相似性产生,该算法首先选取两个window,分别为相似窗和搜索窗,相似窗被选取用于比较两个像素的相似性,搜索窗被选择用于确定计算相似像素的范围即:
640?wx_fmt=png
如下图所示,I是一个较大范围的搜索/加权框,w(x,y)是依赖邻域(黑灰色部分)算出的权重
640?wx_fmt=png

*如果想了解更多关于non-local means的知识,可参考下列文章:

https://blog.csdn.net/qianhen123/article/details/81043217blog.csdn.net
Non-local Neural Networks
1.通用表示

受到non-local means的启发,本文提出了关于non-localoperations的通用表示,公式如下所示:
640?wx_fmt=png
其中, x 是输入信号(图片,队列,视频,通常是特征),i  是输出位置(在空间、时间或时空中)的索引,它的响应值是通过j枚举所有可能位置来计算的。函数 f 计算 i 和所有 j 之间的相似关系,一元函数 g 计算输入信号在位置 j  的表示。最终的响应值通过响应因子 C(x) 进行标准化处理得到。

在上式中,图像中的每一个位置 j 都被考虑到。与之相对应的,我们可以考虑一下卷积的过程,一个3x3的卷积核,能覆盖到的位置只是位置 j  的相邻点,只能在相邻局部进行操作;我们再对比一下全连接过程,有以下几点不同:

(1)在non-localoperation的公式中,响应值是通过计算不同区域之间的关系得到的,而在全连接层中,是通过赋给每个神经元一个学到的权重。换而言之,在全连接层中,Xi 和 Xj 的关系不能通过一个函数 f 得到。
(2)non-local公式支持可变大小的输入,并在输出中保持相应的大小,在全连接层中,要求固定大小的输入和输出,并且由于被拉伸成一列,丢失了原有的位置信息。
(3)在与CNN结合位置来看,non-local operation非常灵活,可以添加到深度神经网络中的前半部分,而全连接层通常被用在最后,这既是一个不同,也给了我们一个启发:能够构建一个更丰富的层次结构,将非本地信息和本地信息结合起来。
640?wx_fmt=png
神经网络中的全连接层

2. ff 和 g 的实例化

本小节将会介绍一个non-local operation公式中的函数f  和 g 的具体形式表示。

为了简洁表示,可以把 g 看做是一个线性转化,其中:
640?wx_fmt=png
其中, Wg 是需要学习的权重矩阵,可以通过空间上的1x1卷积实现(本文只考虑CNN,不过多探讨RNN)

接下来讨论成对函数 f 的形式:

  • Gaussian

f函数的功能主要是相似度计算和度量,一个通常的想法是利用点积衡量相似度(dot-product similarity),为什么点积可以衡量相似度呢,这可以通过余弦相似度公式简化而来,余弦相似度计算下式所示,
640?wx_fmt=png
如果我们只用点积,相当于减少了计算量和计算复杂度,而且还能达到类似的效果。

那么, f 函数可以用高斯函数表示如下:
640?wx_fmt=png
那么此时归一化因子 C(x)可以设置为:

640?wx_fmt=png
  • Embedded Gaussian

基于高斯函数的一个简单扩展,是计算嵌入空间中的相似度,即:
640?wx_fmt=png
其中,θ和φ是两个嵌入,embedding会构建一个映射,将一个空间里的实体抛射到一个线性向量空间里去,这样一来可以在向量空间里计算度量它们的距离,可以表示为:
640?wx_fmt=png
相应的,归一化因子 C(x)可以表示为:
640?wx_fmt=png
*Embedded Gaussian操作与self-attention很类似,实际上,self-attention是其一个特例。但是作者认为,这种注意力不是不可或缺的,f 函数的表现形式还可以有下列两种:

  • Dot product
通过点乘进行相似度计算:
640?wx_fmt=png
归一化因子可以直接设置为N,也就是X的所有位置数。
  • Concatenation
640?wx_fmt=png
其中,[·, ·] 表示维度拼接操作, Wf 实现从向量到标量的转化。

3. Non-localBlock

non-local operation的公式表示已经得到,为了将其与现有的框架结合起来,我们需要将其封装到非本地块(non-localblock)中,一个non-local block可以用下式表示:
640?wx_fmt=png
其中, yi 就是non-localoperation的输出,当看到“+XiXi ”的时候是不是有点熟悉?没错,这里也用了一个残差连接。之所以要用残差,是因为这种结构能够在不破坏原始网络结构的基础上,很方便的将non-local block嵌入模型中去。如下图所示,以一个f为Embedded Gaussian为例,featuremap的输入为TxHxWx1024,两个映射θφ都是1x1x1卷积形式,⊗表示矩阵乘操作,⊕表示元素加操作。
640?wx_fmt=png
一个时空non-localblock

基于该结构, f 函数的形式无论是上文中的Gaussian,Embedded Gaussian,Dot product等,都能通过矩阵乘轻松实现。

非局部块的成对计算在高层次的特征映射中是轻量级的。在上图的block中,一般T=4,H=W=14或者7,矩阵乘法的两两运算复杂度与传统卷积计算不相上下。为了进一步提升模型效率,还进行了如下调整:

(1)将 θ,φ,g的通道数设置为输入feature maps的一半,这样会大大减少计算量
(2)采用抽样的方式,进一步减轻计算量,将non-local改进为如下公式:
640?wx_fmt=png
其中,x^是x经过池化后得到,在空间域中执行这个操作,可以将成对计算的数量减少1/4。这个技巧不会改变非局部的行为,只会使计算变得更稀疏,实现起来也很简单,只需要在上图中θ,g中将一个最大池化层即可。
实验

原文作者做了大量详实的实验,本文只截取几个结果,说明non-local 的有效性。

在视频任务中的表现

(1)不同 f函数的效果

如下表,以ResNet-50为backbone,本文提出的四张成对函数相比baseline都有很好的提升
640?wx_fmt=png

(2)添加non-localblock的stage

如下表,还是以ResNet-50为backbone,将non-local块插入到哪一个阶段,一个non-local块在res2、res3或res4的提升效果是相似的,而对res5的提升稍微小一些。
640?wx_fmt=png
(3)与SOTA视频分类网络对比

如下表,本文的方法远远超过了所有现有的基于RGB或RGB +流的方法,且与2017年分类比赛冠军模型结果不相上下。

640?wx_fmt=png

在图像任务中的表现

(1)目标检测和实例分割
如下表,一个单独的non-local block超越了了所有的R50/101和X152baseline,包括检测和分割的所有指标。APbox在所有情况下增加约一个点。

640?wx_fmt=png

(2)关键点检测
在Mask R-CNN中,测试non-local对于关键点检测的提升,如下表,在R101的baseline上,在头部添加4个non-local block会导致让 AP增加一个约一个点。
640?wx_fmt=png结论

本文提出了一种新的神经网络Non-Local Neural Networks,它通过非局部操作来捕捉远程依赖关系。non-local block可以与任何现有的网络结构相结合。证明了非局部建模在视频分类、目标检测和分割、姿态估计等任务中的重要性。在所有的任务上,一个简单的non-local块可以很好的提升baseline,non-local block的提出,为传统卷积的提升提供了更多的启发和可能性。

论文链接:
Non-localNeural Networksarxiv.org
GitHub链接:
https://github.com/facebookresearch/video-nonlocal-netgithub.com

(*本文为 AI科技大本营投稿文章,转载请微信联系 1092722531


精彩推荐



2019 中国大数据技术大会(BDTC)再度来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。5 折票倒计时 7 天!

640?wx_fmt=png

推荐阅读

640?wx_fmt=png

你点的每个“在看”,我都认真当成了AI

相关文章:

fgets()用法笔记

为了避免缓冲区溢出,从终端读取输入时应当用fgets()代替gets()函数。但是这也将带来一个问题,因为fgets()的调用格式是: fgets (buf, MAX, fp)fgets (buf, MAX, stdin) buf是一个char数组的名称,MAX是字符串的最大长度&#xff0c…

iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘

原文地址:http://blog.csdn.net/xiaotanyu13/article/details/7711954 iOS上面对键盘的处理很不人性化,所以这些功能都需要自己来实现, 首先是点击return和屏幕隐藏键盘 这个首先引用双子座的博客 http://my.oschina.net/plumsoft/blog/42545…

深度学习可解释性问题如何解决?图灵奖得主Bengio有一个解

作者 | Yoshua Bengio, Tristan Deleu等译者 | 刘畅,编辑 | Just出品 | AI科技大本营(ID:rgznai100)自 2012 年以来,深度学习的发展有目共睹,今年 3 月,为此做出巨大贡献的 Yoshua Bengio、Yann Lecun和Geo…

zepto打造一款移动端划屏插件

效果图 样式1 样式2 调用 正常情况下应该是后台生成的html代码&#xff0c;但还是写了一套操作tab页的方法 调用简便如下&#xff1a; <link rel"stylesheet" href"kslider.css" type"text/css"/> <script type"text/javascript&q…

swift使用xib绘制UIView

目标&#xff1a;用xib绘制一个UIView&#xff0c;在某个ViewController中调用。 三个文件&#xff1a;ViewController.swift DemoView.swift DemoView.xib 首先&#xff0c;可以专心将DemoView.xib画出来&#xff0c;别忘记DemoView.xib中UIView的一处设置 然后&#x…

吴恩达老师深度学习视频课笔记:深度卷积网络

Why look at case studies?&#xff1a;过去几年&#xff0c;计算机视觉研究中的大量研究都集中在如何把卷积层、池化层以及全连接层这些基本构件组合起来形成有效的卷积神经网络。找感觉最好的方法之一就是去看一些案例&#xff0c;就像很多人通过看别人的代码来学习编程一样…

测试工程师的好日子来啦?Testin发布AI测试产品,提升易用性和自动化效率

2019年10月26日&#xff0c;以"AI未来"为主题的第二届NCTS中国云测试行业峰会在北京国际会议中心正式开幕。在本次大会上&#xff0c;Testin 总裁徐琨正式发布测试业务Testin云测的全新AI产品iTestin。作为 Testin 人工智能战略中的重要一环&#xff0c;iTestin 融合…

Discuz DB层跨库映射关系表名前缀BUG修复后产生的新bug

新的逻辑引入了新的bug&#xff0c;会导致在跨多库连接时&#xff0c;产生表名前缀映射混乱&#xff0c;需要再做逻辑上的修复。 function table_name($tablename) {if(!empty($this->map) && !empty($this->map[$tablename])) {$id $this->map[$tablename];…

swift语言的Block

[cpp] view plaincopy// // blockDemo.swift // swiftDemo // // Created by apple on 14-6-29. // Copyright (c) 2014年 fengsh. All rights reserved. // import Foundation //无参无返回值 typealias funcBlock () -> () //或者 () -> …

吴恩达老师深度学习视频课笔记:目标检测

目标定位&#xff1a;如下图,图像分类任务就是算法遍历图像&#xff0c;判断其中的对象是不是car。图像定位分类(classification with localization)不仅要用算法判断图像中的是不是car&#xff0c;还要在图像中标记出car的位置。图像分类的思路可以帮助学习分类定位&#xff0…

国际顶级学界业界大咖云集,9 场技术论坛布道,2019 嵌入式智能国际大会强势来袭!...

2019 嵌入式智能国际大会即将来袭&#xff01;购票官网&#xff1a;https://dwz.cn/z1jHouwE2019年12月6日-8日&#xff0c;2019嵌入式智能国际大会将在深圳华侨城洲际大酒店举行。本次大会由哈尔滨工业大学&#xff08;深圳&#xff09;、清华大学国际研究生院、CSDN、嵌入式视…

Linux简介总结

1. Linux 就是Unix, 但是Unix 并不一定是Linux.2. 三种软件模式&#xff1a;商业软件&#xff0c;共享软件&#xff0c;自由软件。3. 为什么使用Linux? 它是一个自由软件。第一&#xff1a;可免费提供给任何用户使用。第二&#xff1a;它的源代码公开和可自…

Swift中编写单例的正确方式

本文由CocoaChina译者leon(社区ID)翻译自krakendev 原文&#xff1a;THE RIGHT WAY TO WRITE A SINGLETON 转载请保持所有内容和链接的完整性。 在之前的帖子里聊过状态管理有多痛苦&#xff0c;有时这是不可避免的。一个状态管理的例子大家都很熟悉&#xff0c;那就是单例。使…

C语言中的弱符号与强符号介绍

弱符号(Weak symbol)是链接器(ld)在生成ELF(Executable and Linkable Format,缩写为ELF&#xff0c;可执行和可链接格式&#xff0c;是一种用于可执行文件、目标文件、共享库和核心转储的标准文件格式。ELF文件有两种索引&#xff1a;程序标头中记载了运行时所需的段&#xff0…

Simple Transformer:用BERT、RoBERTa、XLNet、XLM和DistilBERT进行多类文本分类

作者 | Thilina Rajapakse译者 | Raku编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】本文将介绍一个简单易操作的Transformers库——Simple Transformers库。它是AI创业公司Hugging Face在Transformers库的基础上构建的。Hugging Face Transfor…

StarUML中时序图添加小人

转载于 http://blog.csdn.net/longyuhome/article/details/9011629 在看时序图的例子的时候&#xff0c;发现有些的时序图上有小人的图标&#xff0c;可是一些UML工具却没有找到小人的图标&#xff0c;这让我很闹心&#xff0c;一直没解决&#xff0c;今天终于将该问题给解…

Swift学习: 从Objective-C到Swift

作者&#xff1a;方秋枋&#xff08;GitHub&#xff09; 这篇文章是自己学习Swift的笔记与深化。希望这篇文章能够帮助已经有Objective-C经验的开发者更快地学习Swift。同时也品味到Swift的精妙之处。 结论放在开头:我认为Swift比Objective-C更优雅,更安全同时也更现代,更性感…

C/C++中static关键字用法汇总

1. 函数内static局部变量&#xff1a;变量在程序初始化时被分配&#xff0c;直到程序退出前才被释放&#xff0c;也就是static是按照程序的生命周期来分配释放变量的&#xff0c;而不是变量自己的生命周期。多次调用&#xff0c;仅需一次初始化。2. cpp内的static全局变量&…

CornerNet: 成对关键点物体检测 | CSDN博文精选

作者 | 贾小树来源 | CSDN博客文章目录1、论文总述2、使用锚定框的两个缺点3、角点检测比边界框中心或 proposals效果好的两个原因4、corner pooling5、用于Grouping Corners的 embedding vector的工作原理6、正负样本的分配方式&#xff08;改进的focal loss&#xff09;7、角…

PHP创建日志记录(已封装)

1 <?php2 3 class Logs{4 private $_filepath; //文件路径5 private $_filename; //文件名6 private $_filehandle; //文件引擎7 8 9 public function Logs($dir null,$filename null){ 10 11 $this->_filepath empty($dir) ? : $d…

如何用Swift实现一个好玩的弹性动画

本文由CocoaChina译者浅夏旧时光翻译自Raywenderlich 原文&#xff1a;How To Create an Elastic Animation with Swift 每个像样的iOS应用程序一定会有自定义元素、自定义UI以及自定义动画等等很多自定义的东西。 假如你想让你的应用脱颖而出&#xff0c;你必须花费一些时间为…

深入探讨Python的import机制:实现远程导入模块 | CSDN博文精选

来源 | Python编程时光&#xff08;ID:Python-Time&#xff09;所谓的模块导入&#xff0c;是指在一个模块中使用另一个模块的代码的操作&#xff0c;它有利于代码的复用。也许你看到这个标题&#xff0c;会说我怎么会发这么基础的文章&#xff1f;与此相反。恰恰我觉得这篇文章…

吴恩达老师深度学习视频课笔记:人脸识别

什么是人脸识别&#xff1a;人脸验证和人脸识别的区别&#xff0c;如下图&#xff1a;One-shot learning&#xff1a;人脸识别所面临的挑战就是需要解决一次学习(one-shot learning)问题。这意味着在绝大多数人脸识别应用中你需要通过单单一张图像或者单单一个人脸图像就能去识…

用小白鼠喝毒药

题设&#xff1a;有N瓶水&#xff0c;其中有一瓶水有剧毒&#xff0c;如果小白鼠喝了会在24小时的时候死亡。 问&#xff1a;用多少只小白鼠能够检测出哪瓶水有剧毒&#xff1f; 要求&#xff1a;用的小白鼠数量少并且用时要短&#xff0c;并给出合理的过程与结论。 我的解题思…

怎样在swift中创建CocoaPods

本文由yake_099&#xff08;博客&#xff09;翻译自raywenderlich&#xff0c;作者&#xff1a;Joshua Greene 原文&#xff1a;How to Create CocoaPods with Swift 你可能对一些比较著名的开源的CocoaPods框架比较熟悉&#xff0c;比如Alamofire、MBProgressHUD。但是有时你…

吴恩达老师深度学习视频课笔记:神经风格迁移(neural style transfer)

什么是神经风格迁移(neural style transfer)&#xff1a;如下图&#xff0c;Content为原始拍摄的图像&#xff0c;Style为一种风格图像。如果用Style来重新创造Content照片&#xff0c;神经风格迁移可以帮你生成Generated图像。深度卷积网络在学什么&#xff1a;如下图&#xf…

“Jupyter的杀手”:Netflix发布新开发工具Polynote

作者 | Michael Li 译者 | Rosie 编辑 | Jane 出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】10 月 29 日&#xff0c;Netflix 公开了他们内部开发的 Polynote。现如今&#xff0c;大型高科技公司公开其内部的工具或服务&#xff0c;然后受到业界…

System Center 2012 r2优点

System Center 2012System Center2012 是一个全面的管理平台&#xff0c;可帮助你轻松、高效地管理数据中心、客户端设备和混合云 IT 环境。为您提供了针对私有云、托管云和公有云基础结构和应用程序服务的通用管理工具集。可按照您的需求&#xff0c;为生产基础架构、可预期应…

Swift 闭包表达式

闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C 中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。 闭包的形式主要有三种&#xff1a; 1. 全局函数是一个有名字但不会捕获任何值的闭包 2. 嵌套函数是一个有名字并可以捕获其封…

GNU AWK中BEGIN/END使用举例

以下是使用gnu awk将test.cpp文件拆分成两个文件a.cpp和b.cpp&#xff0c;其中b.cpp仅存放test.cpp中的数据&#xff0c;其它内容存放在a.cpp文件中。test.cpp内容如下&#xff1a; #include <stdio.h> #include <iostream> #include <string>int main() {//…