SE 注意力模块 原理分析与代码实现

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 本文介绍SE注意力模块,它是在SENet中提出的,SENet是ImageNet 2017的冠军模型;SE模块常常被用于CV模型中,能较有效提取模型精度,所以给大家介绍一下它的原理,设计思路,代码实现,如何应用在模型中。

 一、SE 注意力模块

SE 注意力模块,它是一种通道注意力模块;常常被应用与视觉模型中。即插即用,是指通过它能对输入特征图进行通道特征加强,而且最终SE模块输出,不改变输入特征图的大小。

    • 首先解释一下SE的含义,S是指Squeeze,压缩的意思;把输入特征图中的空间信息进行压缩。
    • E是指Excitation,激励的意思;学习到的通道注意力信息,与输入特征图进行结合,最终得到具有通道注意力的特征图。

    下面分析一下,SE是如何实现通道注意力的;首先看一下,模块的结构:

    image.gif编辑

    它主要由两部分组成,压缩、激励;模型的流程思路如下:

      1. 首先输入特征图,它的维度是H*W*C;
      2. 对输入特征图进行空间特征压缩;实现:在空间维度,实现全局平均池化,得到1*1*C的特征图;
      3. 对压缩后的特征图,进行通道特征学习;实现:通过FC全连接层操作学习,得到具有通道注意力的特征图,它的维度还是1*1*C;
      4. 最后将通道注意力的特征图1*1*C、原始输入特征图H*W*C,进行逐通道乘以权重系数,最终输出具有通道注意力的特征图;

      其中,在FC全连接层学习通道注意力信息中,是对每个通道的重要性进行预测,得到不同channel的重要性大小后再作用。

      备注: SE模块的出处论文:https://arxiv.org/abs/1709.01507?utm_source=ld246.com

      注意力机制的实现思路:

        • 通常,对特征图进行通道注意力操作,首先对特征图的空间维度进行压缩,然后学习不同通道的重要性;
        • 对特征图进行空间注意力操作,首先对特征图的通道维度进行压缩,然后学习不同空间部位的重要性;


        二、代码实现

        实现SE模块的代码前,首先看一下,它是的流程结构,这里以resnet为基础实现的:

        image.gif

        基于pytorch版本的代码如下:

        class se_block(nn.Module):
            def __init__(self,channels,ratio=16):
                super(SE, self).__init__()
                # 空间信息进行压缩
                self.avgpool=nn.AdaptiveAvgPool2d(1)
                # 经过两次全连接层,学习不同通道的重要性
                self.fc=nn.Sequential(
                    nn.Linear(channels,channels//ratio,False),
                    nn.ReLU(),
                    nn.Linear(channels//ratio, channels, False),
                    nn.Sigmoid()
                )
            def forward(self,x):
                b,c,_,_ = x.size() #取出batch size和通道数
                # b,c,w,h->b,c,1,1->b,c 压缩与通道信息学习
                avg = self.avgpool(x).view(b,c)
                #b,c->b,c->b,c,1,1 激励操作
                y = self.fc(avg).view(b,c,1,1) 
                return x * y.expand_as(x)

        image.gif


        三、SE应用在模型中

        SE模块常常被用于CV模型中,能较有效提取模型精度;它是即插即用,是指通过它能对输入特征图进行通道特征加强,而且最终SE模块输出,不改变输入特征图的大小。

        应用示例1:

        在主干网络(Backbone)中,加入SE模块,加强通道特征,提高模型性能;

        应用示例2:

        在主干网络(Backbone)末尾,加入SE模型,加强整体的通道特征,提高模型性能;

        应用实例3:

        在多尺度特征分支中,加入SE模块,加强加强通道特征,提高模型性能。

        总体评价:通常,SE模块能提升模型的精度;但速度会下降一点,毕竟它有FC全连接层。

        本文只供大家参考与学习,谢谢~

        后面还会介绍其它注意力模型:SK-Nets、CBAM、DANet、ECA-Net、CA等注意力模块。

        相关实践学习
        基于函数计算一键部署掌上游戏机
        本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
        建立 Serverless 思维
        本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
        相关文章
        |
        2月前
        |
        机器学习/深度学习 自然语言处理 并行计算
        Self-Attention 原理与代码实现
        Self-Attention 原理与代码实现
        |
        2月前
        解释一下ConditionVariable的工作原理。
        解释一下ConditionVariable的工作原理。
        29 6
        |
        人工智能 算法 数据挖掘
        简述k-means算法基本原理,并针对如何自适应确定k值
        简述k-means算法基本原理,并针对如何自适应确定k值
        300 0
        简述k-means算法基本原理,并针对如何自适应确定k值
        |
        12月前
        |
        数据采集 算法 数据可视化
        MMdetection框架速成系列 第03部分:简述整体构建细节与模块+训练测试模块流程剖析+深入解析代码模块与核心实现
        按照抽象到具体方式,从多个层次进行训练和测试流程深入解析,从最抽象层讲起,到最后核心代码实现,希望帮助大家更容易理解 MMDetection 开源框架整体构建细节
        521 0
        |
        机器学习/深度学习 人工智能 PyTorch
        |
        算法 编译器 Linux
        非线性优化--NLopt原理介绍及使用方法
        既然NLopt是解决非线性优化的问题,那么先说明下什么是非线性优化。
        非线性优化--NLopt原理介绍及使用方法
        |
        机器学习/深度学习
        DL之self-attention:self-attention自注意力机制模块思路的8个步骤及其代码实现
        DL之self-attention:self-attention自注意力机制模块思路的8个步骤及其代码实现
        TP5怎么使用模型
        TP5怎么使用模型
        104 0
        |
        算法框架/工具 Caffe
        Caffe Softmax 层的实现原理【细节补充】
        Caffe Softmax 层的实现原理【细节补充】
        140 0
        Caffe Softmax 层的实现原理【细节补充】
        针对100G QSFP28 SR4光模块的特征及工作原理进行分析
        100G光模块是为了适应网络市场由10G逐渐向40G、100G发展的趋势而诞生的传输速率为100G的光模块,在构建100G网络系统中发挥了至关重要的作用。 由于光通信行业的快速发展,用户对高速率的产品需越来越多,现在低速率的光模块已经开始不能满足用户的传输需求。
        2118 0