通道注意力机制 SENet(Squeeze-and-Excitation Network)是2017年提出的一种用于提升卷积神经网络(CNN)性能的注意力机制,其核心思想是通过动态学习通道(Channel)的重要性,自适应地调整各通道的权重。以下是其原理的逐步解析:
1. 核心结构:Squeeze-and-Excitation Block
SENet通过插入轻量级的 SE Block 模块实现通道注意力,该模块包含三个关键步骤:
(1) Squeeze(压缩)
- 目的:将全局空间信息压缩到通道描述符中,捕获通道的全局特征。
- 操作:对输入特征图 ( X \in \mathbb{R}^{H \times W \times C} ) 的每个通道执行全局平均池化(Global Average Pooling, GAP),生成一个长度为 ( C ) 的向量 ( z \in \mathbb{R}^C ):
[
z_c = \frac{1}{H \times W} \sum_{i=1}^H \sum_{j=1}^W x_c(i,j)
]- ( z_c ) 表示第 ( c ) 个通道的全局信息。
(2) Excitation(激励)
- 目的:学习通道间的非线性关系,生成各通道的权重(即重要性分数)。
- 操作:通过一个两层的全连接网络(FC + ReLU + FC + Sigmoid):
[
s = \sigma(W_2 \cdot \delta(W_1 \cdot z))
]- ( W_1 \in \mathbb{R}^{\frac{C}{r} \times C} ) 和 ( W_2 \in \mathbb{R}^{C \times \frac{C}{r}} ) 是全连接层权重,( r ) 是压缩比(通常取16),用于降低计算量。
- ( \delta ) 是ReLU激活函数,( \sigma ) 是Sigmoid函数,将输出限制在 ([0,1]) 之间。
- 输出 ( s \in \mathbb{R}^C ) 是各通道的权重向量。
(3) Scale(缩放)
- 目的:将学习到的权重应用于原始特征图。
- 操作:对输入特征图 ( X ) 的每个通道乘以对应的权重 ( s_c ):
[
\tilde{x}_c = s_c \cdot x_c
]- 重要通道的权重接近1,次要通道的权重接近0,实现通道级特征选择。
2. 关键特点
- 轻量高效:SE Block仅增加少量参数(约 ( \frac{2C^2}{r} )),却能显著提升模型性能。
- 即插即用:可嵌入任何CNN架构(如ResNet、Inception等),无需修改主干网络。
- 动态调整:根据输入内容自适应地重新校准通道响应。
3. 直观理解
- Squeeze:相当于让网络“看到”整个图像后,每个通道的重要性。
- Excitation:通过全连接层模拟通道间的竞争与合作关系。
- Scale:强化有用特征,抑制冗余特征。
4. 代码示例(PyTorch风格)
import torch
import torch.nn as nn
class SEBlock(nn.Module):
def __init__(self, channels, reduction=16):
super().__init__()
self.squeeze = nn.AdaptiveAvgPool2d(1) # Squeeze: GAP
self.excitation = nn.Sequential(
nn.Linear(channels, channels // reduction),
nn.ReLU(inplace=True),
nn.Linear(channels // reduction, channels),
nn.Sigmoid()
)
def forward(self, x):
b, c, _, _ = x.shape
z = self.squeeze(x).view(b, c) # [B, C, 1, 1] -> [B, C]
s = self.excitation(z).view(b, c, 1, 1) # [B, C] -> [B, C, 1, 1]
return x * s # Scale
5. 效果与应用
- 性能提升:在ImageNet上,SE-ResNet50的top-1错误率比原始ResNet50降低约1.5%。
- 应用场景:分类、检测、分割等视觉任务,尤其在资源受限时(如移动端模型)表现优异。
SENet通过简单的“压缩-激励-缩放”机制,实现了通道维度的自适应特征校准,成为注意力机制中的经典方法。后续的CBAM、ECA-Net等均受其启发,进一步融合了空间注意力或优化计算效率。
// 来源:https://www.nzw6.com