文章目录

  • 解决什么问题
  • 本文创新点\贡献
  • 前人方法
  • 本文IDEA来源
  • 方法
    • 方法概述
    • 相关
    • 解决的点
    • 优点
    • 原理
    • Non-local Neural Networks
      • 方程式
      • 多种fff表达式
    • Non-local Block
      • 更高效的改动
  • 训练
  • 实验
  • 总结
  • 代码

解决什么问题

提出non-local操作来建立block,来捕捉长距离的依赖


本文创新点\贡献

提出的建立non-local block的方法能方便的插入到很多计算机视觉结构中,在视频分类、位姿估计和图像识别中都有很好的效果

这个图能很好说明什么叫non-local,前两个都是在中心的邻域做一些操作


前人方法

有使用很大的感受野来获取远距离依赖的尝试,之前的方法中长距离依赖只能通过重复的操作卷积、循环通过数据逐步传播信号,但是这样有局限性:

信号在多次的重复中消失?计算耗时?

  1. 计算效率低

  2. 优化困难

    作者在这里距离的是残差网络和长短期记忆网络,这俩个都对数据多次重复利用,不过残差网络也有找到response的能力?不同层数的特征图融合,能让相关的特征在一个图中显示出来?

  3. 在多次跳跃依赖的建模中有困难,比如远距离之间

    多次跳跃依赖是指关联的递进? 充电器->手机->人 这样的吗?


本文IDEA来源

没说


方法

方法概述

对每个位置都计算一个response,能更好的获得位置间的联系

相关

和self-attention相关,self-attention通过考虑全部位置,取其在嵌入空间中的加权平均值,来计算一个序列里某个位置的response

解决的点

长距离的相关点的response计算问题,延伸到了图像、视频上

优点

  1. 可以直接计算两个位置的交互,而不用考虑距离的问题
  2. 效率高,效果好,只用几个层
  3. 输入尺度多样,很容易和其他模型结合

原理

和其他方法的比较

  1. non-local考虑了全部的位置,而卷积和序列却不能考虑这么多信息
  2. 虽然考虑了全部的位置信息,但是又和全连接不同:
    non-local是基于不同位置之间的联系来计算response的,而全连接使用的是学习到的权重,并且直接多种输入大小,而全连接的输入大小是固定的且没有位置间的对应

    用的是“fff”来处理不同位置,而不是“WxWxWx

  3. 位置自由,可以放在深度神经网络的前面或后面,利于将non-local和local信息结合起来

Non-local Neural Networks

方程式

yi=1C(x)∑∀jf(xi,xj)g(xj)y_i = \frac{1}{C(x)} \sum_{\mathclap{\forall j}}f(x_i,x_j)g(x_j)yi=C(x)1jf(xi,xj)g(xj)
其中iii是输出位置的index,jjj代表全部的可能的位置,iii位置的response是和其他的jjj位置一起计算的
xxx是输入signal,可以是图片、序列、视频,一般是他们的特征
yyy是和xxx一样大的输出signal
成对函数fff计算iiijjj之间的标量
ggg函数计算在jjj位置的输入signa 的表达
1C(x)\frac{1}{C(x)}C(x)1用来正则化response

多种fff表达式

fgf\ gfg都有多种计算公式,而实验证明,不同的公式算出来的效果差别不是很大

先将ggg假设成简单的线性嵌入:
g(Xj)=Wgxjg(X_j) = W_g x_jg(Xj)=Wgxj
其中WgW_gWg是需要学习的权重矩阵,再空间上就是个1×11\times 11×1的卷积

Gaussian
f(xi,xj)=exiT⋅xjf(x_i,x_j) = e^{x^T_i \cdot x_j}f(xi,xj)=exiTxj

其中xi,xjx_i,x_jxi,xj也可以用欧式距离,但是点乘更方便深度学习计算
C(x)=∑∀jf(xi,xj)C(x) = \sum_{\forall j}f(x_i,x_j)C(x)=jf(xi,xj)

Embedded Gaussian:

Gaussian函数的简单拓展,能计算嵌入空间的相似性
f(xi,xj)=eθ(xi)Tϕ(xj)f(x_i,x_j) = e^{\theta(x_i)^T\phi(x_j)}f(xi,xj)=eθ(xi)Tϕ(xj)

其中θ(xi)=Wθxi\theta(x_i) = W_{\theta}x_iθ(xi)=Wθxiϕ(xj)=Wϕxj\phi(x_j) = W_{\phi}x_jϕ(xj)=Wϕxj是两个嵌入

为什么又加了两个参数就能计算相似性了?

C(x)=∑∀jf(xi,xj)C(x) = \sum_{\forall j}f(x_i,x_j)C(x)=jf(xi,xj)

Softmax
Attention is all you need 论文中,使用了softmax,所以这也有个softmax版本的:
y=softmax(xTWθTWϕx)g(x)y = softmax(x^TW^T_{\theta}W_{\phi}x)g(x)y=softmax(xTWθTWϕx)g(x)

但是作者把这个softmax版本的应用到空间/时空间的图像/视频任务上,发现作用并不明显(指softmax),然后提供了其他的版本

前面两个Gaussian可以直接写成softmax

Dot product:
f(xi,xj)=θ(xi)Tϕ(xj)f(x_i,x_j) = \theta(x_i)^T\phi(x_j)f(xi,xj)=θ(xi)Tϕ(xj)

这是采用嵌入的版本,C(x)=NC(x) = NC(x)=NNNN就是xxx的位置的数量,这样能简化梯度计算,而且规范化是很有必要的,因为输入的大小是变化。

这里的NNN是下采样后的数量

Concatenation
f(xi,xj)=ReLU(wfT[θ(xi),ϕ(xj)])f(x_i,x_j) = ReLU(w^T_f[\theta(x_i),\phi(x_j)])f(xi,xj)=ReLU(wfT[θ(xi),ϕ(xj)])
其中[⋅,⋅][\cdot,\cdot][,]表示串联,而且wfw_fwf是一个权重向量,能把串联向量映射成标量
C(x)=NC(x) = NC(x)=N

之后就适当的选择版本,当成个参数来调吧


Non-local Block

封装到block中,这样能更好的合并到其他的结构中:
zi=Wzyi+xiz_i = W_z y_i + x_izi=Wzyi+xi
这个+xi+x_i+xi就是个残差操作,这个残差的操作可以在不破坏预训练模型的情况下,将non-local block插入到任何预训练的模型中(此时将WzW_zWz初始化为0)

这要怎么操作,虽然按理来说不需要啥权重,但是要怎么让改动的结构和权重对应上?看看6DVNet怎么做的


Non−localBlock计算图Non-local Block计算图NonlocalBlock

更高效的改动

通过参数的设置来提高效率

设置Wg,Wθ,WϕW_g,W_{\theta},W_{\phi}Wg,Wθ,Wϕ的通道数是xxx的通道数的一半,这是根据残差网路的论文来的,这样能减少计算量。

WzW_zWz的通道数和xxx一样,因为之后还要和xxx相加

通过下采样的trick还能用来进一步减少计算量

yyy的方程式改为:
yi=1C(x^)∑∀jf(xi,xj^)g(xj^)y_i = \frac{1}{C(\hat{x})}\sum_{\forall j}f(x_i,\hat{x_j})g(\hat{x_j})yi=C(x^)1jf(xi,xj^)g(xj^)
其中x^\hat{x}x^xxx的下采样版本,加个池化层就能做到,能减少
成对计算的1/41/41/4计算量。

Non-local Block计算图 ϕ\phiϕ后面加个池化层来完成。


训练

backbone: ResNet-50

学习率:共400K次迭代,一开始设置为0.01,每150K除10

动量:0.9

权重衰减:0.0001

dropout:全局池化后使用,比例是0.5

使用BatchNorm来未调模型,能减少过拟合,BN的缩放参数初始化成0

loss变化曲线loss变化曲线loss线


实验


效果图效果图

网络深度和block数量的比较网络深度和block数量的比较block
越深的网络,越多的non-local block,效果越好,作者使用了残差块做了消融实验,说明了效果提升并不是网络变深的原因,而是non-local block的功劳


增加block的位置探究增加block的位置探究block
如果添加的太晚的话,特征图较小(7×77\times 77×7)的话,效果也不好,所以要看特征图的大小

MaskRCNN的效果提升Mask\ RCNN的效果提升MaskRCNN


总结

感觉主要是对[ Attention is all you need ]做了些改动,yyy的公式是相似的,作者又提出了很多版本的yyy的公式,最终选择哪个公式还是要看应用的环境,亮点应该在与从NLP领域迁移到了CV领域,而且做成了一个容易插入的block


代码

点乘版本的代码,这是源码

import torch
from torch import nnclass NL_block(nn.Module):def __init__(self,input_dim,sub_sample,bn):super(NL_block, self).__init__()self.input_dim = input_dimself.sub_sample = sub_sampleself.sub_dim = self.input_dim // 2self.bn = bnif self.sub_dim == 0:self.sub_dim = 1Conv = nn.Conv2dMaxpool = nn.MaxPool2dBatchNorm = nn.BatchNorm2dself.theta = Conv(self.input_dim,self.sub_dim,kernel_size=1,stride=1)self.phi = Conv(self.input_dim,self.sub_dim,kernel_size=1,stride=1)self.g = Conv(self.input_dim,self.sub_dim,kernel_size=1,stride=1)# theta的 HxW 不能取半,否则就回不到原来的维度了if self.sub_sample:self.phi = nn.Sequential(self.phi,Maxpool(kernel_size=2))self.g = nn.Sequential(self.g,Maxpool(kernel_size=2))if self.bn:self.W = nn.Sequential(Conv(self.sub_dim,self.input_dim,kernel_size=1,stride=1),BatchNorm(num_features=self.input_dim))else:self.W = Conv(self.sub_dim,self.input_dim)def forward(self,x):batch = x.shape[0]# theta并没有下采样,现在是原版的所有元素400个,通道数减少了一般x_theta = self.theta(x).view((batch,-1,self.sub_dim)) # 5 400 4# 对phi进行下采样,x的总数变成了100x_phi  = self.phi(x).view((batch,self.sub_dim,-1))  # 5 4 100# 让原版的特征图的每个元素都和所有的下采样的元素对应起来,这里的100维度代表权值f = torch.matmul(x_theta,x_phi) # 5 400 100# g也下采样g_x = self.g(x).view(batch,-1,self.sub_dim) # 5 100 4N = x_phi.shape[2]f_div_c = f / N# 5 4 20 20# 如此每个元素都是下采样后所有元素的加权和y = torch.matmul(f_div_c,g_x).view(batch,self.sub_dim,*x.size()[2:])z = self.W(y) + xreturn zif __name__ = "__main__":x = torch.randn((5,8,20,20))model = NL_block(x.shape[1],True,True)result = model(x)

Non-local Neural Networks论文理解相关推荐

  1. Every Document Owns Its Structure: Inductive Text Classification via Graph Neural Networks论文理解

    [标题] <Every Document Owns Its Structure: Inductive Text Classification via Graph Neural Networks& ...

  2. Exploring the Connection Between Binary andSpiking Neural Networks论文解读

    Exploring the Connection Between Binary andSpiking Neural Networks论文解读 前言 总说 提出B-SNN(论文中为Ⅲ) 实验和结果(论文 ...

  3. Procedural Noise Adversarial Examples for Black-Box Attacks on Deep Neural Networks论文笔记

    Procedural Noise Adversarial Examples for Black-Box Attacks on Deep Neural Networks论文笔记 0. 概述 如今一些深度 ...

  4. Sequence to Sequence Learning with Neural Networks论文翻译

    Sequence to Sequence Learningwith Neural Networks论文翻译 摘要 深度神经网络是在困难的学习任务中取得卓越性能的强大模型.尽管拥有大量的标记训练集,DN ...

  5. 《Understanding the Effective Receptive Field in Deep Convolutional Neural Networks》理解深卷积神经网络中的有效感受野

    前言 论文推荐来自B站UP-启释科技,该up对感受野和卷积有深刻的理解 推荐感受野视频讲解: 深度理解感受野(一) 深度理解感受野(二) 深度理解感受野(三) 深度理解感受野(四) 深度理解感受野(五 ...

  6. ImageNet Classification with Deep Convolutional Neural Networks论文翻译——中英文对照

    文章作者:Tyan 博客:noahsnail.com  |  CSDN  |  简书 翻译论文汇总:https://github.com/SnailTyan/deep-learning-papers- ...

  7. ImageNet Classification with Deep Convolutional Neural Networks论文翻译——中文版

    文章作者:Tyan 博客:noahsnail.com  |  CSDN  |  简书 翻译论文汇总:https://github.com/SnailTyan/deep-learning-papers- ...

  8. EWC:Overcoming catastrophic forgetting in neural networks论文笔记

    EWC:Overcoming catastrophic forgetting in neural networks 概要 根据某些参数对先前任务的重要性来缓解某些参数权重的学习率 EWC 约束重要的参 ...

  9. 【注意力机制】Squeeze-and-Excitation Networks论文理解

    摘要   卷积操作:   卷积操作是卷积神经网络(CNNs)的核心构造块,它通过融合每一层局部接受域(感受野)内的空间和信道信息使网络构建信息特征.大量先前的研究已经调查了这种关系的空间成分,试图通过 ...

最新文章

  1. Linux13-bash脚本编程基础及配置文件
  2. PPT文件转avi/wmv/mpeg格式最好的软件
  3. python【力扣LeetCode算法题库】66-加一
  4. 通过反射获取无参构造方法并使用
  5. 推荐VSCode12个比较实用的插件
  6. linux连接建立的时间,用timedatectl在Linux中检查当前时区及更改时区(创建符号链接来更改时区)...
  7. 手把手教你成为年薪60万的架构师
  8. C语言bound函数,C/C++-STL中lower_bound与upper_bound的用法以及cmp函数
  9. Linux CentOS 7 安装 Redis
  10. 下载量超 20 亿的 8 款 Android 应用涉广告欺诈,谁在“猎杀”猎豹移动?
  11. 彩虹代刷网用php几,php彩虹代刷网八套模板源码+教程
  12. 固态硬盘使用一段时间后测速变慢的解决方法
  13. 机器学习:噪声和错误
  14. C++制作“简单”小游戏
  15. Android inflate解析
  16. 相忘于江湖—记一位朋友
  17. 凭借近2亿的年销量,小米三年超越苹果的可能性有多大?
  18. 关于写javaweb项目,遇到的问题:三层架构
  19. 11月18日——离noip还有1天[游戏王YGO]
  20. 【CXY】JAVA基础 之 Collections

热门文章

  1. scratch编写游戏:火柴人避开防守投篮
  2. 交易履约之订单中心实践
  3. 台式计算机经常使用的硬盘是什么尺寸,台式机固态硬盘多大合适
  4. iOS 偏好设置 NSUserDefault
  5. Audition 2021(Au)下载安装及详细安装教程
  6. ssm学生综合素质评价系统
  7. 景安网络快云mysql版本_景安快云数据库使用教程
  8. linux 文件大小写敏感,大小写敏感的问题
  9. WordCount的理解与MapReduce的执行过程
  10. Windows 10自带的磁盘Check工具