简介
SENet是2017年ImageNet比赛的冠军,2018年CVPR引用量第一。论文链接:SENet
意义
较早的将attention引入到CNN中,模块化化设计。
目的:
SE模块的目的是想通过一个权重矩阵,从通道域的角度赋予图像不同位置不同的权重,得到更重要的特征信息。
主要操作
SE模块的主要操作:挤压(Squeeze)、激励(Excitation)
算法流程图
通过一系列操作得到一个
过程
第一步、
Transformation
注意:在常用的卷积神经网络中Transformation操作一般为一个卷积操作。我们通常在聊SE注意力时通常不包含这一步。
第二步、
Squeeze
注释:对
公式:
此外:论文中给出了使用平均池化与最大池化的实验对比。
第三步、
Excitation
第四步、
Scale
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站上有很多大佬的讲解视频,喜欢视频讲解的可以看一下。
文章出处登录后可见!
已经登录?立即刷新