九、SENet论文总结(完结)

九、SENet

论文导读

全称:Squeeze-and-Excition Networks

意义:较早将注意力机制引入卷积神经网络,并且该注意力机制是一种即插即用的模块,可嵌入任意主流的卷积神经网络中;

相关研究(STN)

STNet:空间变换网络,提出spatial transformer模块,用于增强CNN对图像的空间变换鲁棒性;

STNet在文本矫正任务中也可以使用,并且有不错的效果;

主要有三个模块:Localisation net(特征定位)、Grid generator(网格生成)、Sampler

8f91a3e5f747e60f79737c1d33cd994f.png

详情参考:文章

注意力机制

在原有网络的基础上,新增一个分支来提取Attention,并进行单独的训练;
在这里插入图片描述

上图还结合了ResNet的思想,在相乘部分加入残差模块;

CBAM:

Convolutional Block Attention Module:提出两阶段的注意力机制,一个针对通道维度,一个针对空间维度,证明了注意力机制可以分不同维度进行;

b7fa233b1ba01803500b14e62d5b4f9b.md.png

上面部分是忽略宽高,只关注通道数;下面部分是忽略通道数,只关注宽高,得到两个的权重特征值;

论文概要

Squeeze(Global Information Embedding):

实现:采用全局池化(平均池化),即压缩H和W至1*1,利用一个像素来表示一个通道,实现低维嵌入

Excitation(Adaptive Recallibration):

两个全连接层,第一个全连接层激活函数为ReLU、第二个全连接层激活函数为Sigmoid;

88b4c57ea60075bac52a7ed9ca69b4cf.png

整题流程

1、Squeeze:压缩特征图至向量形式;

2、Excitation:两个全连接层对特征向量进行映射变换;

(第一个全连接层的神经元个数需要除以一个Reduction ratio,代表压缩率,第二层的神经元数保持与输出一致)

3、Scale:将得到的权重向量与通道进行逐通道相乘;

SE Block的使用:

提出的为即插即用的网络模块——SE Module,例如在每一个Residual Block后嵌入SE Block;

FLOPs——衡量模型计算复杂度:

FLOPS:每秒浮点运算次数,用于衡量硬件设备的运算速度;

FLOPs:浮点运算数,用于衡量模型计算复杂度;

论文总结

关键点&创新点

1、提出SE模块生成通道维度的权重向量,用于特征"重构",实现强调重要特征,忽略不重要特征,增强模型的表征能力,提高模型性能;

2、设计一系列实验验证SE Block的有效性,特别是Ablation Study(控制变量学习)方法值得学习;

启发点

1、研究通道之间的关系,表明模型的发展已经从框架走向细节;

2、对注意力机制的解释,计算资源偏向有价值有意义的特征;

3、低维嵌入的理解,将数据做某种操作(变换、映射),将数据维度压缩之后,可称为Embedding;

4、实验结果表明,加入SE Blocks可作为模型增加深度的互补,同时增加SE Block和深度,均可带来性能提升;

5、SE block嵌入ResNet时,FC层不需要加偏置;

6、多个对比实验精度没有明显差异,证明SE block有很好的鲁棒性;

7、浅层网络学习到如边缘、颜色等普遍特征,深层网络学习到物体的轮廓等整体特征;

8、训练技巧:为了保持训练和测试一致,在最后几个epochs中,冻结BN层参数;

9、训练技巧:Batchsize越大,学习率也可以越大;

10、超参数Batchsize和Epoch对于模型的精度也有影响,较大的Batchsize往往能得到更高的精度;

论文代码

SE Block实现代码:

class SELayer(nn.Module):
    def __init__(self, channel, reduction=4):
        super(SELayer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
                nn.Linear(channel, channel // reduction),
                nn.ReLU(inplace=True),
                nn.Linear(channel // reduction, channel),        )
 
    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)
        y = torch.clamp(y, 0, 1)
        return x * y

总结:一些原理复杂的trick,往往只需要简单的代码就能实现,这也是把原理弄透彻后的好处;


至此CV-Baseline部分完结,接下来是目标检测模块的整理!

end!!!!完结散花!!!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值