0


SE注意力机制

SENet-通道注意力笔记

简介

SENet是2017年ImageNet比赛的冠军,2018年CVPR引用量第一。论文链接:SENet

意义

较早的将attention引入到CNN中,模块化化设计。

目的:

SE模块的目的是想通过一个权重矩阵,从通道域的角度赋予图像不同位置不同的权重,得到更重要的特征信息。

主要操作

SE模块的主要操作:挤压(Squeeze)、激励(Excitation)

算法流程图

在这里插入图片描述
通过一系列操作得到一个

    1
   
   
    ∗
   
   
    1
   
   
    ∗
   
   
    C
   
  
  
   1*1*C
  
 
1∗1∗C的权重矩阵,对原特征进行重构(不同颜色表示不同的数值,用来衡量通道的重要性)

过程

第一步、

Transformation

    (
   
   
    F
   
   
    
    
     t
    
   
   
    
    
     r
    
   
   
    )
   
  
  
   (F{_t}{_r})
  
 
(Ft​r​):给定一个input特征图

 
  
   
    X
   
  
  
   X
  
 
X,让其经过

 
  
   
    F
   
   
    
    
     t
    
   
   
    
    
     r
    
   
  
  
   F{_t}{_r}
  
 
Ft​r​操作生成特征图

 
  
   
    U
   
  
  
   U
  
 
U。

注意:在常用的卷积神经网络中Transformation操作一般为一个卷积操作。我们通常在聊SE注意力时通常不包含这一步。

第二步、

Squeeze

    (
   
   
    F
   
   
    
    
     s
    
   
   
    
    
     q
    
   
   
    (
   
   
    ⋅
   
   
    )
   
   
    )
   
  
  
   (F{_s}{_q}(·))
  
 
(Fs​q​(⋅))::这一步将特征图进行全局平均池化,生成一个

 
  
   
    1
   
   
    ∗
   
   
    1
   
   
    ∗
   
   
    C
   
  
  
   1*1*C
  
 
1∗1∗C的向量,这样每个通道让一个数值表示。

注释:对

    U
   
  
  
   U
  
 
U实现全局低维嵌入,相当于一个数值拥有该通道的全局感受野。

公式:在这里插入图片描述

此外:论文中给出了使用平均池化与最大池化的实验对比。
在这里插入图片描述

第三步、

Excitation

    (
   
   
    F
   
   
    
    
     e
    
   
   
    
    
     x
    
   
   
    )
   
  
  
   (F{_e}{_x})
  
 
(Fe​x​):这一步通过两层全连接层完成,通过权重W生成我们我所要的权重信息,其中W是通过学习得到的,用来显示的建模我们我需要的特征相关性。

在这里插入图片描述
通过两个全连接层

    W
   
   
    
    
     1
    
   
  
  
   W{_1}
  
 
W1​ ,

 
  
   
    W
   
   
    
    
     2
    
   
  
  
   W{_2}
  
 
W2​对上一步得到的向量

 
  
   
    z
   
  
  
   z
  
 
z进行处理,得到我们想要的通道权重值

 
  
   
    s
   
  
  
   s
  
 
s,经过两层全连接层后,s中不同的数值表示不同通道的权重信息,赋予通道不同的权重。

注意:两层全连接层之间存在一个超参数

    R
   
  
  
   R
  
 
R, 向量

 
  
   
    z
   
  
  
   z
  
 
z

 
  
   
    (
   
   
    1
   
   
    ∗
   
   
    1
   
   
    ∗
   
   
    C
   
   
    )
   
  
  
   (1*1*C)
  
 
(1∗1∗C)经过第一层全连接层后维度由


 
  
   
    (
   
   
    1
   
   
    ∗
   
   
    1
   
   
    ∗
   
   
    C
   
   
    )
   
  
  
   (1*1*C)
  
 
(1∗1∗C)变为

 
  
   
    (
   
   
    1
   
   
    ∗
   
   
    1
   
   
    ∗
   
   
    C
   
   
    /
   
   
    R
   
   
    )
   
  
  
   (1*1*C/R)
  
 
(1∗1∗C/R),再经过第二层全连接层为度由

 
  
   
    (
   
   
    1
   
   
    ∗
   
   
    1
   
   
    ∗
   
   
    C
   
   
    /
   
   
    R
   
   
    )
   
  
  
   (1*1*C/R)
  
 
(1∗1∗C/R)变为

 
  
   
    (
   
   
    1
   
   
    ∗
   
   
    1
   
   
    ∗
   
   
    C
   
   
    )
   
  
  
   (1*1*C)
  
 
(1∗1∗C)。第一层全连接层的激活函数为ReLU,第二层全连接层的激活函数为Sigmoid。
第四步、

Scale

    (
   
   
    F
   
   
    
    
     
      s
     
     
      c
     
     
      a
     
     
      l
     
     
      e
     
    
   
   
    )
   
  
  
   (F{_{scale}})
  
 
(Fscale​):由算法流程图可以看出,第四步的操作是将第三步生成权重向量

 
  
   
    s
   
  
  
   s
  
 
s对特征图

 
  
   
    U
   
  
  
   U
  
 
U进行权重赋值,得到我们想要的特征图

 
  
   
    
     X
    
    
     ~
    
   
  
  
   \tilde X
  
 
X~,其尺寸大小与特征图

 
  
   
    U
   
  
  
   U
  
 
U完全一样,SE模块不改变特征图的小大。

在这里插入图片描述
通过生成的特征向量

    s
   
  
  
   s
  
 
s(

 
  
   
    1
   
   
    ∗
   
   
    1
   
   
    ∗
   
   
    C
   
  
  
   1*1*C
  
 
1∗1∗C)与特征图

 
  
   
    U
   
  
  
   U
  
 
U(

 
  
   
    H
   
   
    ∗
   
   
    W
   
   
    ∗
   
   
    C
   
  
  
   H*W*C
  
 
H∗W∗C),对应通道相乘,即特征图

 
  
   
    U
   
  
  
   U
  
 
U中每个通道的

 
  
   
    H
   
   
    ∗
   
   
    W
   
  
  
   H*W
  
 
H∗W个数值都乘

 
  
   
    s
   
  
  
   s
  
 
s中对应通道的权值。

SE模块的结构图

在这里插入图片描述
SE模块是一个即插即用的模块,在上图中左边是在一个卷积模块之后直接插入SE模块,右边是在ResNet结构中添加了SE模块。

实现代码

import torch.nn as nn

classSEModel(nn.Module):def__init__(self, channel, reduction=16):super(SEModel, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid())defforward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c,1,1)return x * y.expand_as(x)

网上有较多的公开代码,都可以进行参考。

最后

SE模块在使用时如何选择添加的位置是值得考虑的问题,如何实现最大化的提升。
MobileNetV3中使用了SE模块,通过神经网络架构搜索进行了最优位置选择,值得思考与学习。

如有错误,望大家指正。B站上有很多大佬的讲解视频,喜欢视频讲解的可以看一下。


本文转载自: https://blog.csdn.net/renxingshen2022/article/details/125773673
版权归原作者 renxingshen2022 所有, 如有侵权,请联系我们删除。

“SE注意力机制”的评论:

还没有评论