文章转自微信公众号:【机器学习炼丹术】

参考目录:

0 概述

首先,这个论文中的模块,叫做non-local block,然后这个思想是基于NLP中的self-attention自注意力机制的。所以在提到CV中的self-attention,最先想到的就是non-local这个论文。这个论文提出的动机如下:

卷积运算和递归操作都在空间或时间上处理一个local邻域;只有在重复应用这些运算、通过数据逐步传播信号时,才能捕获long-range相关性。

换句话说,在卷积网络中,想要增加视野域,就要不断的增加卷积层数量和池化层数量,换句话说,增加视野域就是增加网络的深度。这样必然会增加计算的成本,参数的数量,还需要考虑梯度消失问题。

  • long-time相关性在NLP中,就是指一句话中,两个距离很远的单词的相关性,在CV中则是指一个图片中距离很远的两个部分的相关性。一般CNN识别物体,都是只关注物体周围的像素,而不会考虑很远的地方,这也就是CNN的一个特性,局部视野域。在某些情况下,这是天然优势,当然也可能变成劣势。

1 主要内容

本次我们学习先看代码,然后再从论文中解析代码。

1.1 Non local的优势

  • 通过少的参数,少的层数,捕获远距离的依赖关系;
  • 即插即用

1.2 pytorch复现

class Self_Attn(nn.Module):
""" Self attention Layer"""
def __init__(self,in_dim,activation):
super(Self_Attn,self).__init__()
self.chanel_in = in_dim
self.activation = activation self.query_conv = nn.Conv2d(in_channels = in_dim , out_channels = in_dim//8 , kernel_size= 1)
self.key_conv = nn.Conv2d(in_channels = in_dim , out_channels = in_dim//8 , kernel_size= 1)
self.value_conv = nn.Conv2d(in_channels = in_dim , out_channels = in_dim , kernel_size= 1)
self.gamma = nn.Parameter(torch.zeros(1)) self.softmax = nn.Softmax(dim=-1)
def forward(self,x):
"""
inputs :
x : input feature maps( B X C X W X H)
returns :
out : self attention value + input feature
attention: B X N X N (N is Width*Height)
"""
m_batchsize,C,width ,height = x.size()
proj_query = self.query_conv(x).view(m_batchsize,-1,width*height).permute(0,2,1) # B X CX(N)
proj_key = self.key_conv(x).view(m_batchsize,-1,width*height) # B X C x (*W*H)
energy = torch.bmm(proj_query,proj_key) # transpose check
attention = self.softmax(energy) # BX (N) X (N)
proj_value = self.value_conv(x).view(m_batchsize,-1,width*height) # B X C X N out = torch.bmm(proj_value,attention.permute(0,2,1) )
out = out.view(m_batchsize,C,width,height) out = self.gamma*out + x
return out,attention

1.3 代码解读

输入特征图为BatchxChannelxHeightxWidth,我们先把这个输入特征图x分别放入:

  • query卷积层,得到BatchxChannel//8xHeightxWidth
  • key卷积层,得到BatchxChannel//8xHeightxWidth
  • value卷积层,得到BatchxChannelxHeightxWidth

我们要逐个像素的计算query和key的相似度,然后相似度高的像素更为重要,相似度低的像素就不那么重要,每个像素我们用channel//8这个长度的向量来表示。(这里可能比较抽象,毕竟self-attention的原版是NLP领域的,non-local是从NLP中照搬过来的,所以不太好直接理解

相似度计算是通过向量的乘法来表示的,那么我们肯定不能把这个HeightxWidth这么多像素一个一个计算像素的相似度。所以我们把BatchxChannel//8xHeightxWidth转换成BatchxChannel//8xN的形式,这里的N是HeightxWidth,N表示图中像素的数量

然后我们用torch.bmm()来做矩阵的乘法:(N,Channel//8)和(Channel//8,N)两个矩阵相乘,得到一个(N,N)的矩阵。

这个(N,N)矩阵中的第i行第j列元素的值,是图中i位置像素和j位置像素的相关性!然后我们把value矩阵和这个(N,N)再进行一次矩阵乘法,这样得到的输出,就是考虑了全局信息的特征图了。

第二次矩阵乘法中,是(Channel,N)和(N,N)的相乘,得到的输出的特征图中的每一个值,都是N个值的加权平均,这也说明了输出的特征图中的每一个值,都是考虑了整张图的像素的。

1.4 论文解读

上图是论文中对于non-local的结构图。可以看到,先通过1x1的卷积,降低一下通道数,然后通过\(\theta和\phi\)分别是query和key,然后这两个卷积得到(N,N)的矩阵,然后再与\(g\)(value)进行矩阵乘法。

好吧我承认和代码在通道数上略微有些出入,但是大体思想相同。

2 总结

  • 经过了non-local的特征图,视野域扩大到了全图,而且并没有增加很多的参数。
  • 但是因为经过了BMM矩阵呢的乘法,梯度计算图急速扩大,因此计算和内存会消耗很大。因此,我在网络的深层(特征图尺寸较小的时候),才会加上一层non-local层。但是!!!论文中说,尽量放在靠前的层,所以在计算力允许的情况下,往前放。
  • 这个方法在一部分的任务中,确实有提升,我自己试过,还可以。
  • 后续又有很多来降低这个计算消耗的算法,之后我们在讲,喜欢的点个关注和赞吧~

注意力论文解读(1) | Non-local Neural Network | CVPR2018 | 已复现的更多相关文章

  1. 论文解读《Bilinear Graph Neural Network with Neighbor Interactions》

    论文信息 论文标题:Bilinear Graph Neural Network with Neighbor Interactions论文作者:Hongmin Zhu, Fuli Feng, Xiang ...

  2. 论文翻译:2020_Densely connected neural network with dilated convolutions for real-time speech enhancement in the time domain

    提出了模型和损失函数 论文名称:扩展卷积密集连接神经网络用于时域实时语音增强 论文代码:https://github.com/ashutosh620/DDAEC 引用:Pandey A, Wang D ...

  3. 论文笔记之:Progressive Neural Network Google DeepMind

    Progressive Neural Network  Google DeepMind 摘要:学习去解决任务的复杂序列 --- 结合 transfer (迁移),并且避免 catastrophic f ...

  4. 论文解读(MPNN)Neural Message Passing for Quantum Chemistry

    论文标题:DEEP GRAPH INFOMAX 论文方向:  论文来源:ICML 2017 论文链接:https://arxiv.org/abs/1704.01212 论文代码: 1 介绍 本文的目标 ...

  5. 端到端文本识别CRNN论文解读

    CRNN 论文: An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Applica ...

  6. 论文笔记:(2019)GAPNet: Graph Attention based Point Neural Network for Exploiting Local Feature of Point Cloud

    目录 摘要 一.引言 二.相关工作 基于体素网格的特征学习 直接从非结构化点云中学习特征 从多视图模型中学习特征 几何深度学习的学习特征 三.GAPNet架构 3.1 GAPLayer 局部结构表示 ...

  7. 论文解读(GCC)《GCC: Graph Contrastive Coding for Graph Neural Network Pre-Training》

    论文信息 论文标题:GCC: Graph Contrastive Coding for Graph Neural Network Pre-Training论文作者:Jiezhong Qiu, Qibi ...

  8. 论文解读(SDNE)《Structural Deep Network Embedding》

    论文题目:<Structural Deep Network Embedding>发表时间:  KDD 2016 论文作者:  Aditya Grover;Aditya Grover; Ju ...

  9. 【论文阅读】Sequence to Sequence Learning with Neural Network

    Sequence to Sequence Learning with NN <基于神经网络的序列到序列学习>原文google scholar下载. @author: Ilya Sutske ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:Qt Designer中spacer部件的orientation属性

    在Designer的spacers部件中有2个部件,分别是Horizontal Spacer和Vertical Spacer,这两个部件都有orientation属性,表示Spacer部件的方向. 如 ...

  2. 常见SQL注入点判断

    sql注入手工检测 SQL注入手工检测 1基本检测 数字型 字符型 搜索型 POST注入 布尔盲注 报错注入 堆叠注入 判断是什么数据库 2绕过技巧 大小写 替换关键字 使用编码 注释和符号 等价函数 ...

  3. Kubernetes-21:Apiserver等证书修改使用年限

    Kubernetes证书使用年限修改方法   Kubernetes的apiservice.crt证书默认只有一年的使用期限,查看方法: cd /etc/kubernetes/pki [root@Cen ...

  4. 自学linux——22.粘滞位的了解及使用

    粘滞位的了解及使用 一.权限 1.文件的权限 r (read) :可读取该文件的实际内容w(write):可以编辑,新增或者修改该文件的内容(但不含删除该文件)x(execute):代表该文件可以被系 ...

  5. 第四篇 Scrum 冲刺博客

    一.站立式会议 1. 会议照片 2. 工作汇报 团队成员名称 昨日(25日)完成的工作 今天(26日)计划完成的工作 工作中遇到的困难 陈锐基 - 完善表白墙动态的全局状态管理 - 完成发布页面的布局 ...

  6. P4267 [USACO18FEB]Taming the Herd

    说实话感觉不是一道蓝题--感觉挺水的,不过为了水题解,水题就够了(其实是觉得思考的过程比较典型,记录一下) 题解 刚开始看这道题感觉上没什么思路,但是我们可以先考虑用 \(O(n)\) 的时间去枚举发 ...

  7. STL——容器(Map & multimap)的查找

    map.find(key);   //查找键key是否存在,若存在,返回该键的元素的迭代器:若不存在,返回map.end(); map.count(key);   //返回容器中键值为key的对组个数 ...

  8. js--数组的map()方法的使用

    javaScript中Array.map()的用法 前言 作为一个刚刚踏入前端世界的小白,工作中看到身边同事大佬写的代码就像古诗一样简介整齐,而我的代码如同一堆散沙,看上去毫无段落感,而且简单的功能需 ...

  9. css样式规则

    在css样式规则中: 1.选择器用于指定CSS样式作用的HTML对象,花括号内是对该对象设置的具体样式. 2.属性和属性值以"键值对"的形式出现. 3.属性是对指定的对象设置的样式 ...

  10. 仵航说 前后端分离,文件上传下载(springBoot+vue+elementUI)仵老大

    1.介绍 ​ 本文主要是介绍前后端分离的上传下载,后端使用的是SpringBoot,持久层用的是mybatis-plus,前端用的Vue,UI用的elementUI,测试了一下,文本,图片,excel ...