SENet(Squeeze-and-Excitation Networks)是2017年ImageNet竞赛的冠军模型,由Momenta公司开发。它通过显式地建模特征通道之间的相互依赖关系,引入了“通道注意力”的概念,让网络能够自动学习并增强重要特征,抑制不重要特征。下面我将从设计动机、核心原理、工作机制和优势特点几个方面,为你全面介绍SENet。


1. 设计动机:从特征平等走向特征加权

在SENet出现之前,传统的卷积神经网络(如ResNet、Inception等)默认将卷积层输出的所有特征通道视为同等重要。然而,在现实世界的图像中,不同特征通道对最终任务的贡献显然是不同的。例如,在识别一只狗的图像时,代表“毛发纹理”和“耳朵形状”的通道可能比代表“背景颜色”的通道更为关键。

SENet的设计灵感来源于注意力机制集成学习的思想。它希望通过一种轻量级的机制,让网络在训练过程中自动评估每个通道的重要性,并据此对特征进行动态校准,从而提升模型的表示能力。

2. 核心原理:挤压与激励

SENet的核心是一个称为 SE块(Squeeze-and-Excitation Block) 的模块。它并非一个独立的网络模型,而是一个可以方便地嵌入到现有任何CNN架构(如ResNet、VGG、Inception)中的组件。SE块的工作原理主要分为三个步骤:挤压(Squeeze)激励(Excitation) 和重标定(Scale)

  • 挤压(Squeeze): 全局信息嵌入
    在通过一组卷积操作得到特征图 U(尺寸为 H x W x C)后,SENet首先对每个通道进行全局平均池化。这一步将整个空间维度(H x W)上的特征压缩为一个单一的数值,生成一个 1 x 1 x C 的通道描述符。这个数值理论上具有全局感受野,代表了该通道上特征的全局分布情况。

  • 激励(Excitation): 自适应权重生成
    这是SE块最核心的部分。它接收挤压阶段输出的 1 x 1 x C 描述符,并通过两个全连接层来捕捉通道之间的相关性,并生成每个通道的权重。

    • 第一个全连接层是一个降维层,将通道数从 C 压缩为 C/rr 是一个缩放参数,通常取16),目的是减少参数量和计算复杂度。激活函数为ReLU。

    • 第二个全连接层是一个升维层,将通道数从 C/r 恢复回 C,以匹配原始特征图的通道数。最后通过Sigmoid激活函数,将输出值限制在 [0, 1] 之间,形成最终的通道权重。

  • 重标定(Scale): 特征加权
    将激励阶段学习到的通道权重(1 x 1 x C)逐通道地乘以原始特征图 U。这意味着,权重大的通道(重要的特征)被增强,权重小的通道(不重要的特征)被抑制,从而实现了特征的自适应重标定。

3. 工作机制与嵌入方式

下图展示了SE块如何嵌入到标准的Inception和ResNet模块中。这种即插即用的特性使得SENet具有极高的灵活性。

上图展示了两种神经网络模块的结构图:Inception模块(左)和残差(ResNet)模块(右)。每个模块下方是其嵌入SE块后的改进版本(SE-Inception和SE-ResNet),通过全局平均池化和两个全连接层来生成通道权重并对特征进行缩放。

从代码实现的角度看,一个典型的SE块结构非常简洁。以PyTorch为例,其核心代码如下:

from torch import nn

class SELayer(nn.Module):
    def __init__(self, channel, reduction=16):
        super(SELayer, self).__init__()
        # Squeeze: 全局平均池化
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        # Excitation: 两个全连接层
        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()
        # Squeeze操作
        y = self.avg_pool(x).view(b, c)
        # Excitation操作
        y = self.fc(y).view(b, c, 1, 1)
        # Scale操作: 将权重应用于原始特征图
        return x * y.expand_as(x)

4. 主要优势与影响

  • 显著的性能提升:通过引入极少的额外参数,SENet在ImageNet分类任务上将Top-5错误率降至2.25%,以绝对优势夺得2017年竞赛冠军。

  • 极高的模块化和灵活性:SE块可以无缝集成到任何主流CNN架构中,创造出SE-ResNet、SE-Inception等一系列高性能变体。

  • 良好的计算效率:通过设置降维参数 r,可以很好地平衡性能提升与计算开销。例如,在ResNet-50中嵌入SE块,参数量仅增加约10%,但计算量(FLOPs)的增加却微乎其微。

5. 总结框图

为了更直观地理解SENet的核心计算流程,下图总结了SE块的工作步骤:

流程图解读
上图清晰地展示了SENet的数据流。输入特征 U 首先经过挤压操作,聚合全局信息。然后通过两个全连接层进行激励,学习通道间的非线性关系并生成权重。最后,将这些权重通过重标定操作与原始特征 U 相乘,得到最终的输出。这种结构使网络能够全局地、自适应地关注最有信息量的特征通道,从而显著提升了模型的表征能力。

总结来说,SENet开创性地将注意力机制引入通道维度,其简洁高效的设计理念深刻影响了后续的注意力模型(如SKNet、ECA等),是深度学习发展史上的一个里程碑。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐