se-net的个人理解

本文深入解析SENet(Squeeze-and-Excitation Networks)的原理与实现,阐述了如何通过通道注意力机制提升卷积神经网络(CNN)对关键特征的捕捉能力,尤其是在分类和目标检测任务中对物体中心点的权重分配。介绍了SENet的Squeeze和Excitation两个核心模块,以及它们如何帮助网络学习到不同通道的重要性和调整相应权重。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先感谢 SENet详解_AI人工智能与大数据-优快云博客

  • 问题的引入

传统的cnn中,各个通道的一般是相互独立的 ,就算有关系,也是全局或者部分感受野的关系(类比sppnet),那么其实在分类或者目标检测中,物体的中心点的权重和信息理所当然的应该比周边的信息多,比如人的脸比人的头的信息和细节更加的丰富,那么在cnn中如何体现了?

  • 解决思路

不同的特征层是特征的体现,那么要体现脸和头的细节的差别,就要针对不同的特征层有不同的权重。

  • 具体思路

分为两部分,Squeeze做的事情是把H*W*C压缩为1*1*C,相当于把H*W压缩成一维了,实际中一般是用global average pooling实现的。H*W压缩成一维后,相当于这一维参数获得了之前H*W全局的视野,感受野更广。

2. Excitation部分。得到Squeeze的1*1*C的表示后,加入一个FC全连接层,对每个通道的重要性进行预测,得到不同channel的重要性大小后再作用(softmax)到之前的feature map的对应channel上,直接相乘,再进行后续操作。
 

  • 代码:


class SELayer(nn.Module):
    def __init__(self, channel, reduction=16):
        super(SELayer, self).__init__()
        # 全局池化
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            # 压缩维度
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(inplace=True),
            # 扩展维度
            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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值