SENet(Squeeze-and-Excitation Networks)算法笔记

SENet是一种用于深度学习的卷积神经网络结构,通过引入Squeeze-and-Excitation模块来学习特征的权重,提高模型对特征的选择性。在ImageNet数据集上,SENet显著降低了top-5错误率,且可以灵活地嵌入到其他网络结构中。SE模块由全局平均池化和两个全连接层组成,用于捕捉通道间信息并调整特征图的权重,实现端到端训练。

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

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

Sequeeze-and-Excitation(SE) block并不是一个完整的网络结构,而是一个子结构,可以嵌到其他分类或检测模型中,作者采用SENet block和ResNeXt结合在ILSVRC 2017的分类项目中拿到第一,在ImageNet数据集上将top-5 error降低到2.251%,原先的最好成绩是2.991%。
作者在文中将SENet block插入到现有的多种分类网络中,都取得了不错的效果。SENet的核心思想在于通过网络根据loss去学习特征权重,使得有效的feature map权重大,无效或效果小的feature map权重小的方式训练模型达到更好的结果。当然,SE block嵌在原有的一些分类网络中不可避免地增加了一些参数和计算量,但是在效果面前还是可以接受的。

也许通过给某一层特征配备权重的想法很多人都有,那为什么只有SENet成功了?个人认为主要原因在于权重具体怎么训练得到。就像有些是直接根据feature map的数值分布来判断;有些可能也利用了loss来指导权重的训练,不过全局信息该怎么获取和利用也是因人而异。

Figure1表示一个SE block。主要包含Squeeze和Excitation两部分,接下来结合公式来讲解Figure1。

这里写图片描述

首先Ftr这一步是转换操作(严格讲并不属于SENet,而是属于原网络,可以看后面SENet和Inception及ResNet网络的结合),在文中就是一个标准的卷积操作而已,输入输出的定义如下表示。

这里写图片描述

那么这个Ftr的公式就是下面的公式1(卷积操作,vc表示第c个卷积核,xs表示第

### 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 结构的各种经典分类器变体供快速部署测试之需。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值