【CV中的Attention机制】Selective Kernel Networks(SE进化版)

1. SKNet

SKNet是SENet的加强版,结合了SE opetator, Merge-and-Run Mappings以及attention on inception block的产物。其最终提出的也是与SE类似的一个模块,名为SK, 可以自适应调节自身的感受野。据作者说,该模块在超分辨率任务上有很大提升,并且论文中的实验也证实了在分类任务上有很好的表现。

这篇博客重画了SK模块示意图,详见下图,下图中上边的部分是重画的,下边的是论文中的图,虽然比较简洁,但是比较难理解。上边重画的部分分为了三个部分,而原来的模块分成了两个模块。

接下来对照着图先理一遍思路,然后再直接上pytorch版本的代码。

论文中说这个模块可以更好地实现多个分辨率,调节感受野,个人理解就是从不同的分支造成的。下边讲解对照上图进行:

原始feature map X 经过kernel size分别为3×3,5×5....以此类推的卷积进行卷积后得到U1,U2,U3三个,然后相加得到了U,相当于融合了多个感受野的信息。然后得到的U是C×H×W的(C代表channel,H代表height, W代表width)feature map,然后将H和W维度求平均值,具体做法是使用torch.mean完成,最终得到了关于channel的信息是一个C×1×1的一维向量,代表的是各个通道的信息的重要程度。

之后再用了一个线性变换,将原来的C维映射成z维度的信息,进行信息抽取,然后分别使用了三个线性变换,从z维度变为原来的c维度,这样完成了针对channel维度的信息提取,然后使用Softmax进行归一化,这时候每个channel对应一个分数,代表其channel的重要程度,这相当于一个打分mask。将这三个分别得到的mask分别乘以对应的U1,U2,U3,得到A1,A2,A3, 然后相加三个模块,进行信息融合,得到最终模块A, 模块A相比于最初的X经过了信息的提纯,具有了多尺度的信息。

经过以上分析,就能理解了作者的SK模块的构成了:

  • 从C线性变换为Z维,再到C维度,这个部分与SE operator比较像
  • 多分支的操作借鉴自:inception
  • 整个流程类似merge-and-run mapping

这就是merge-and-run mapping中提出的三个基础模块,与本文sk虽然没有直接联系,但是都是属于先进行分支,然后在合并,也类似于inception中的图。

2. pytorch代码

import torch.nn as nn
import torch

class SKConv(nn.Module):
    def __init__(self, features, WH, M, G, r, stride=1, L=32):
        """ Constructor
        Args:
            features: input channel dimensionality.
            WH: input spatial dimensionality, used for GAP kernel size.
            M: the number of branchs.
            G: num of convolution groups.
            r: the radio for compute d, the length of z.
            stride: stride, default 1.
            L: the minimum dim of the vector z in paper, default 32.
        """
        super(SKConv, self).__init__()
        d = max(int(features / r), L)
        self.M = M
        self.features = features
        self.convs = nn.ModuleList([])
        for i in range(M):
            self.convs.append(
                nn.Sequential(
                    nn.Conv2d(features,
                              features,
                              kernel_size=3 + i * 2,
                              stride=stride,
                              padding=1 + i,
                              groups=G), nn.BatchNorm2d(features),
                    nn.ReLU(inplace=False)))
        # self.gap = nn.AvgPool2d(int(WH/stride))
        print("D:", d)
        self.fc = nn.Linear(features, d)
        self.fcs = nn.ModuleList([])
        for i in range(M):
            self.fcs.append(nn.Linear(d, features))
        self.softmax = nn.Softmax(dim=1)

    def forward(self, x):
        for i, conv in enumerate(self.convs):
            fea = conv(x).unsqueeze_(dim=1)
            if i == 0:
                feas = fea
            else:
                feas = torch.cat([feas, fea], dim=1)
        fea_U = torch.sum(feas, dim=1)
        # fea_s = self.gap(fea_U).squeeze_()
        fea_s = fea_U.mean(-1).mean(-1)
        fea_z = self.fc(fea_s)
        for i, fc in enumerate(self.fcs):
            print(i, fea_z.shape)
            vector = fc(fea_z).unsqueeze_(dim=1)
            print(i, vector.shape)
            if i == 0:
                attention_vectors = vector
            else:
                attention_vectors = torch.cat([attention_vectors, vector],
                                              dim=1)
        attention_vectors = self.softmax(attention_vectors)
        attention_vectors = attention_vectors.unsqueeze(-1).unsqueeze(-1)
        fea_v = (feas * attention_vectors).sum(dim=1)
        return fea_v

if __name__ == "__main__":
    t = torch.ones((32, 256, 24,24))
    sk = SKConv(256,WH=1,M=2,G=1,r=2)
    out = sk(t)
    print(out.shape)

3. 资源

sknet论文地址:https://arxiv.org/pdf/1903.06586.pdf

作者知乎讲解:https://zhuanlan.zhihu.com/p/59690223

代码源自:https://github.com/implus/SKNet



画图、码字不易,求个关注

原文地址:https://www.cnblogs.com/pprp/p/12141761.html

时间: 2024-10-01 22:48:14

【CV中的Attention机制】Selective Kernel Networks(SE进化版)的相关文章

【CV中的Attention机制】易于集成的Convolutional Block Attention Module(CBAM模块)

前言: 这是CV中的Attention机制专栏的第一篇博客,并没有挑选实现起来最简单的SENet作为例子,而是使用了CBAM作为第一个讲解的模块,这是由于其使用的广泛性以及易于集成.目前cv领域借鉴了nlp领域的attention机制以后生产出了很多有用的基于attention机制的论文,attention机制也是在2019年论文中非常火.这篇cbam虽然是在2018年提出的,但是其影响力比较深远,在很多领域都用到了该模块,所以一起来看一下这个模块有什么独到之处,并学着实现它. 1. 什么是注意

【CV中的Attention机制】BiSeNet中的FFM模块与ARM模块

前言:之前介绍过一个语义分割中的注意力机制模块-scSE模块,效果很不错.今天讲的也是语义分割中使用到注意力机制的网络BiSeNet,这个网络有两个模块,分别是FFM模块和ARM模块.其实现也很简单,不过作者对注意力机制模块理解比较深入,提出的FFM模块进行的特征融合方式也很新颖. 1. 简介 语义分割需要丰富的空间信息和相关大的感受野,目前很多语义分割方法为了达到实时推理的速度选择牺牲空间分辨率,这可能会导致比较差的模型表现. BiSeNet(Bilateral Segmentation Ne

【CV中的Attention机制】CBAM的姊妹篇-BAM模块

1. BAM BAM全程是bottlenect attention module,与CBAM很相似的起名,还是CBAM的团队完成的作品. CBAM被ECCV18接受,BAM被BMVC18接收. CBAM可以看做是通道注意力机制和空间注意力机制的串联(先通道后空间),BAM可以看做两者的并联. 这个模块之所以叫bottlenect是因为这个模块放在DownSample 也就是pooling layer之前,如下图所示: 由于改论文与上一篇:CBAM的理论部分极为相似,下边直接进行实现部分. 2.

【从零开始学习YOLOv3】7. 教你在YOLOv3模型中添加Attention机制

前言:[从零开始学习YOLOv3]系列越写越多,本来安排的内容比较少,但是在阅读代码的过程中慢慢发掘了一些新的亮点,所以不断加入到这个系列中.之前都在读YOLOv3中的代码,已经学习了cfg文件.模型构建等内容.本文在之前的基础上,对模型的代码进行修改,将之前Attention系列中的SE模块和CBAM模块集成到YOLOv3中. 1. 规定格式 正如[convolutional],[maxpool],[net],[route]等层在cfg中的定义一样,我们再添加全新的模块的时候,要规定一下cfg

Deep Learning基础--理解LSTM/RNN中的Attention机制

导读 目前采用编码器-解码器 (Encode-Decode) 结构的模型非常热门,是因为它在许多领域较其他的传统模型方法都取得了更好的结果.这种结构的模型通常将输入序列编码成一个固定长度的向量表示,对于长度较短的输入序列而言,该模型能够学习出对应合理的向量表示.然而,这种模型存在的问题在于:当输入序列非常长时,模型难以学到合理的向量表示. 在这篇博文中,我们将探索加入LSTM/RNN模型中的attention机制是如何克服传统编码器-解码器结构存在的问题的. 通过阅读这篇博文,你将会学习到: 传

[NLP/Attention]关于attention机制在nlp中的应用总结

原文链接: https://blog.csdn.net/qq_41058526/article/details/80578932 attention 总结 参考:注意力机制(Attention Mechanism)在自然语言处理中的应用 Attention函数的本质可以被描述为一个查询(query)到一系列(键key-值value)对的映射,如下图. 在计算attention时主要分为三步: 第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等: 第二步

[转] 深度学习中的注意力机制

from: https://zhuanlan.zhihu.com/p/37601161 注意力模型最近几年在深度学习各个领域被广泛使用,无论是图像处理.语音识别还是自然语言处理的各种不同类型的任务中,都很容易遇到注意力模型的身影.所以,了解注意力机制的工作原理对于关注深度学习技术发展的技术人员来说有很大的必要. 人类的视觉注意力 从注意力模型的命名方式看,很明显其借鉴了人类的注意力机制,因此,我们首先简单介绍人类视觉的选择性注意力机制. 图1 人类的视觉注意力 视觉注意力机制是人类视觉所特有的大

DL4NLP —— seq2seq+attention机制的应用:文档自动摘要(Automatic Text Summarization)

两周以前读了些文档自动摘要的论文,精读了三篇并做了presentation.下面把相关内容简单整理一下. 文本自动摘要(Automatic Text Summarization)就是说在不改变文档原意的情况下,利用计算机程序自动地总结出文档的主要内容.自动摘要的应用场景非常多,例如新闻标题生成.科技文献摘要生成.搜索结果片段(snippets)生成.商品评论摘要等.在信息爆炸的互联网大数据时代,如果能用简短的文本来表达信息的主要内涵,无疑将有利于缓解信息过载问题. 一.概述 自动摘要可以从很多角

Multimodal —— 看图说话(Image Caption)任务的论文笔记(三)引入视觉哨兵的自适应attention机制

在此前的两篇博客中所介绍的两个论文,分别介绍了encoder-decoder框架以及引入attention之后在Image Caption任务上的应用. 这篇博客所介绍的文章所考虑的是生成caption时的与视觉信息无关的词的问题,如"the"."of"这些词其实和图片内容是没什么关系的:而且,有些貌似需要视觉特征来生成的词,其实也可以直接通过语言模型来预测出来,例如"taking on a cell"后生成"phone".