SENet

SENet


学习参考资料:https://blog.youkuaiyun.com/qq_39297053/article/details/130676316?spm=1001.2014.3001.5502

前言

SENet,胡杰(Momenta)在2017.9提出,通过显式地建模卷积特征通道之间的相互依赖性来提高网络的表示能力,即,通道维度上的注意力机制。SE块以微小的计算成本为现有的最先进的深层架构产生了显著的性能改进,SENet block和ResNeXt结合在ILSVRC 2017赢得第一名。

背景
  • 提出背景:卷积核通常被看做是在局部感受野上,在空间上和通道维度上同时对信息进行相乘求和的计算。现有网络很多都是主要在空间维度方面来进行特征的融合(如Inception的多尺度)。

  • 通道维度的注意力机制:在常规的卷积操作中,输入信息的每个通道进行计算后的结果会进行求和输出,这时每个通道的重要程度是相同的而通道维度的注意力机制,则通过学习的方式来自动获取到每个特征通道的重要程度(即feature map层的权重),以增强有用的通道特征,抑制不重要的通道特征。

  • 说起卷积对通道信息的处理,有人或许会想到逐点卷积,即kernel大小为1X1的常规卷积。与1X1卷积相比,SENet是为每个channel重新分配一个权重(即重要程度)。而1X1卷积只是在做channel的融合计算,顺带进行升维和降维,也就是说每个channel在计算时的重要程度是相同的。

    1 * 1卷积等价于全连接层

SE模块

SENet是一种基于注意力机制的卷积神经网络架构。其主要思想是通过自适应地重新校准卷积特征的通道响应。SENet中的"Squeeze"和"Excitation"操作分别对应着该过程的两个主要步骤。

Squeeze:压缩操作是全局信息嵌入的过程,主要用于对空间维度进行全局平均池化,得到每个通道的全局空间信息,形成一个通道描述符。(即下图中 F s q F_{sq} Fsq的操作,得到 1 × 1 × C 1 \times 1 \times C 1×1×C 大小的)

换句话说,通过这个操作,我们可以获得每个特征通道的全局上下文信息。

Excitation:激励操作是通过一个全连接(Fully Connected, FC)层来学习非线性交互,以便捕获特征通道之间的依赖关系。具体来说,首先通过一个全连接层(FC)对通道描述符进行降维(通常通过一个收缩因子进行降维,例如16),然后通过ReLU激活函数进行非线性变换,接着再通过一个全连接层(FC)恢复到原始维度,并通过sigmoid激活函数将其映射到0到1之间,得到每个通道的权重。这个权重就可以用来重新校准原始特征通道。

通过这种方式,SENet可以有效地模拟特征通道之间的依赖关系,并且能够动态地调整每个特征通道的权重,从而提高模型的表现。

  1. 输入经过一系列传统卷积得到特征图,对先做一个Global Average Pooling,输出的数据,这个特征向量一定程度上可以代表之前的输入信息,论文中称之为压缩(Squeeze)操作。

  2. 再经过两个全连接来学习通道间的重要性,用Sigmoid限制到[0, 1]的范围,这时得到的输出可以看作每个通道重要程度的权重,论文中称之为扩展(Excitation)操作。

  1. 最后,把这个的权重乘到对应通道上,这时就根据权重对的通道进行了重要程度的重新分配

image-20230628093947887

模型效果

SE 模块可以嵌入到现在几乎所有的网络结构中,而且都可以得到不错的效果提升,用过的都说好。

在大部分模型中嵌入SENet要比非SENet的准确率更高出1%左右,而计算复杂度上只是略微有提升,具体如下图所示。 而且SE块会使训练和收敛更容易。CPU推断时间的基准测试:224×224的输入图像,ResNet-50 164ms,SE-ResNet-50 167ms。

总结

SENet模型是一种通过自适应地重新加权输入特征图的通道来增强模型表达能力的卷积神经网络结构。由胡杰等人在2018年提出。
SENet的核心思想是通过一个“Squeeze-and-Excitation”模块来学习输入特征图的通道之间的关系,从而自适应地调整特征图中每个通道的权重。具体来说,“Squeeze-and-Excitation”模块包含两个步骤。
“Squeeze”:通过全局池化操作,将输入特征图的每个通道压缩成一个标量,用于表示该通道的重要性。
“Excitation”:使用一个小型的全连接神经网络,学习一个激活函数,将上一步中得到的每个通道的重要性进行自适应调整,并重新加权输入特征图的通道。
通过这样的操作,SENet可以自适应地增强模型的表达能力,减少冗余信息的传递,并且在不增加网络复杂度的情况下提高模型的准确率。此外,SENet可以很容易地嵌入到其他深度卷积神经网络结构中,使得其更容易应用于实际的计算机视觉任务中。
SENet模型在许多视觉任务中都取得了出色的表现,比如在ImageNet图像分类任务中,SENet-154取得了迄今为止最好的单模型结果。同时,SENet还被广泛应用于各种其他视觉任务中,如目标检测、语义分割等。

### SE Net 深度学习架构简介 SENet(Squeeze-and-Excitation Network)是一种用于提升卷积神经网络性能的深度学习架构,它通过引入一种称为“通道注意力机制”的方式来增强特征表示能力[^1]。具体来说,SENet通过对不同通道上的特征图赋予不同的权重,使得模型能够更加关注重要的特征。 #### 架构组成 SENet的核心思想可以分为三个部分: 1. **Squeeze(压缩)**:全局平均池化操作被用来获取每个通道上特征图的空间信息,并将其转换为一维向量。这一步骤减少了计算复杂度并保留了重要信息[^3]。 2. **Excitation(激励)**:通过全连接层和激活函数构建一个小型子网络,该子网络会生成一组权重值,这些权重反映了各个通道的重要性程度。 3. **Reweight(重加权)**:最后将得到的权重重新作用于原始输入张量中的对应位置,从而实现动态调整各通道贡献的效果。 以下是基于 PyTorch 的简单实现代码示例: ```python import torch.nn as 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): 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) # 将 SEBlock 添加到 ResNet 中的一个例子 def se_resnet_block(): block = nn.Sequential( nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, padding=1), nn.BatchNorm2d(64), nn.ReLU(), SELayer(channel=64), # 插入 SE Layer nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, padding=1), nn.BatchNorm2d(64), nn.ReLU() ) return block ``` 上述代码展示了如何创建一个基本的 Squeeze-and-Excitation 层以及如何将其嵌入到现有的 CNN 结构中[^2]。 #### 使用教程 为了更好地理解 SENet 并实际运用到项目当中,可以从以下几个方面入手: 1. 学习官方论文《Squeeze-and-Excitation Networks》及其背后的理论基础; 2. 参考已有的开源实现案例,比如 GitHub 上由 `moskomule` 提供的 PyTorch 版本 或者 Keras 社区分享的文章; 3. 实践过程中注意调试超参数设置,例如缩减比例 (`reduction`) 对最终效果的影响。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值