SE注意力机制

简介

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

意义

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

目的:

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

主要操作

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

算法流程图

在这里插入图片描述
通过一系列操作得到一个SE注意力机制的权重矩阵,对原特征进行重构(不同颜色表示不同的数值,用来衡量通道的重要性)

过程

第一步、

Transformation SE注意力机制:给定一个input特征图SE注意力机制,让其经过SE注意力机制操作生成特征图SE注意力机制
注意:在常用的卷积神经网络中Transformation操作一般为一个卷积操作。我们通常在聊SE注意力时通常不包含这一步。

第二步、

SqueezeSE注意力机制::这一步将特征图进行全局平均池化,生成一个SE注意力机制的向量,这样每个通道让一个数值表示。
注释:对SE注意力机制实现全局低维嵌入,相当于一个数值拥有该通道的全局感受野。
公式:在这里插入图片描述

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

第三步、

ExcitationSE注意力机制:这一步通过两层全连接层完成,通过权重W生成我们我所要的权重信息,其中W是通过学习得到的,用来显示的建模我们我需要的特征相关性。
在这里插入图片描述

第四步、

ScaleSE注意力机制:由算法流程图可以看出,第四步的操作是将第三步生成权重向量SE注意力机制对特征图SE注意力机制进行权重赋值,得到我们想要的特征图SE注意力机制,其尺寸大小与特征图SE注意力机制完全一样,SE模块不改变特征图的小大。
在这里插入图片描述

SE模块的结构图

在这里插入图片描述

实现代码

import torch.nn as nn

class SEModel(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()
        )

    def forward(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站上有很多大佬的讲解视频,喜欢视频讲解的可以看一下。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年2月23日 下午12:45
下一篇 2023年2月23日 下午12:47

相关推荐