SE net:Squeeze-and-Excitation Networks论文解读

SENet是一种引入通道注意力机制的卷积神经网络,通过Squeeze和Excitation块学习和分配通道间的依赖关系,提升特征表达能力。该网络在ImageNet数据集上取得了显著的性能提升,特别是在图像识别任务上。

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

近期对有关注意力机制的两篇文章进行了解读。分别是可以嵌入到很多网络结构中去的SE block的提出论文SENet,以及在GAN生成领域引入注意力机制的SAGAN。这两篇文章都是很经典的文章,这里将其详细整理一下。

SE Net:Squeeze-and-Excitation Networks (CVPR2018)

    这篇文章的主要贡献是对通道间的依赖关系、各通道特征的权重进行了学习和分配。

    卷积神经网络(CNN)的核心构件是卷积运算符,它使网络在每一层的局部接受域内融合空间和通道信息构造信息特征。很多现有的研究都试图通过在整个特征层次上提高空间编码的质量来增强CNN的特征表达能力。在SENet中,将重点放在通道间关系上,提出一个新颖的架构单元,“squeeze和excitation”(SE block),通过显式建模通道(channel)之间的相互依赖性来自适应地重新校准通道特征的响应。

    SEnet是2017年由Momenta在提出的全新图像识别结构,它通过对特征通道间的相关性进行建模,把重要的特征进行强化来提升准确率。在ILSVRC 2017分类比赛中获得冠军,在ImageNet数据集上将top-5 error降低到2.251%,相对于2016年的冠军有了约25%的提升(2.991%)。

论文:Squeeze-and-Excitation Networks
论文链接:https://arxiv.org/abs/1709.01507
作者Caffe代码地址:https://github.com/hujie-frank/SENet
PyTorch代码地址:https://github.com/miraclewkf/SENet-PyTorch

(1)、主要原理和结构
   分Squeeze和excitation两块儿。SE block的结构图如下,

其中,Ftr为传统的卷积特征提取结构,X和U为其输入和输出,。计算公式为,

                                                                 

这与之前的卷积结构相同,SE block增加的在后面阶段。Squeeze操作即Fsq,目的是为了在后面的全连接层处理之前,先对全局信息进行一个融合,实际上是做了一个Global Average Pooling操作(在pytroch中,对U的W和H做平均池化;在Ttensorflow中有两种实现方式,分别为直接使用tf.reduce_mean()和使用 from tflearn.layers.conv import global_avg_pool,直接用global_avg_pool)。全局平均池化得到1*1*C的数据。随后进行excitation操作,包括FC(1*1*C/r,不使用bias)--> ReLu -->FC(1*1*C,不使用bias) --> Sigmoid。使用Sigmoid将特征值限制在[0,1]范围内。最后Scale后的值与特征U中C个通道分别相乘,作为下一级输入。通过网络对Scale值的学习,增强重要特征,减弱不重要特征,使得提取的特征指向性更强。

下面是pytorch版本的SE block实现代码:

from torch import nn


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):
  
### Squeeze-and-Excitation Networks (SENet) 的实现细节与算法原理 #### 算法原理 Squeeze-and-Excitation Networks 是一种用于增强卷积神经网络性能的技术,其核心思想在于通过学习通道之间的关系来重新校准特征的重要性。具体来说,它通过对不同通道的特征进行全局池化操作(squeeze),然后基于这些统计信息生成权重向量(excitation),最后将这些权重应用于原始特征图上以突出重要特征并抑制不重要的部分[^4]。 以下是 SE 模块的主要组成部分及其作用: 1. **Squeeze**: 对于输入的特征图 \( X \in \mathbb{R}^{C \times H \times W} \),其中 \( C \) 表示通道数,\( H \) 和 \( W \) 分别表示高度和宽度,SE 模块会对每个通道执行全局平均池化操作,得到一个描述全局空间分布的一维向量 \( z_c \in \mathbb{R}^C \)[^4]。 2. **Excitation**: 使用两个全连接层构建一个小规模的子网络,第一个全连接层会减少维度至 \( r \)-th 倍 (\( r \geq 1 \)),第二个全连接层恢复到原来的维度,并通过激活函数(如 ReLU 或 sigmoid)调整权重值范围。最终输出的是一个归一化的权重视图 \( s \in [0, 1]^C \)[^4]。 3. **Reweight**: 将上述计算所得的权重加权应用回原特征图上的每一个对应位置处,形成新的特征表达形式\[ Y_{ijc}=X_{ijc}\cdot s_c\][^4]。 这种机制允许模型自适应地关注更有意义的部分而忽略其他无关紧要的内容,从而提升整体表现效果。 #### 实现细节 下面展示了一个简单的 PyTorch 版本的 SEBlock 定义方式: ```python import torch.nn as nn import torch 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() # 获取batch size以及channel数量 y = self.avg_pool(x).view(b, c) y = self.fc(y).view(b, c, 1, 1) return x * y.expand_as(x) # Example usage within Residual Block or any other architecture component. ``` 此代码片段定义了一种标准型态下的 SE 层结构,可以嵌入到现有的 CNN 架构之中作为附加组件使用。 #### 论文下载链接 关于 SENet 更详细的理论阐述可参阅原文献《Squeeze-and-Excitation Networks》,该文章发表于 CVPR 2018 年会上。可以通过以下地址访问 PDF 文件版本: https://arxiv.org/abs/1709.01507 另外值得注意的是,在实际工程实践中也可以考虑直接调用预训练好的模型库比如 torchvision.models 中已经包含了支持 SE 结构的各种经典分类器变体供快速部署测试之需。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值