- CNN 有很多卷积核,输出很多通道(特征图)
- 有的通道很重要(比如边缘、纹理)
- 有的通道没用
- 通道注意力就是:自动给每个通道算一个权重,重要的通道权重变大,不重要的变小
SE 通道注意力(Squeeze-and-Excitation)
是最常用、最简单、效果最好的通道注意力。
结构只有 3 步:
- Squeeze(压缩):对每个通道做全局平均池化 → 得到 1×1×C
- Excitation(激励):两层全连接 + Sigmoid → 得到每个通道的权重
- Scale(缩放):权重 × 原特征 → 强化重要通道
python
import torch
import torch.nn as nn
import torch.nn.functional as F
# ===================== 通道注意力(SE Block) =====================
class SEBlock(nn.Module):
def __init__(self, in_channels, reduction=16):
super(SEBlock, self).__init__()
# 1. 全局平均池化 → (B, C, 1, 1)
self.avg_pool = nn.AdaptiveAvgPool2d(1)
# 2. 两层全连接学习通道权重
self.fc = nn.Sequential(
nn.Linear(in_channels, in_channels // reduction),
nn.ReLU(inplace=True),
nn.Linear(in_channels // reduction, in_channels),
nn.Sigmoid()
)
def forward(self, x):
batch, C, H, W = x.size()
# Squeeze
out = self.avg_pool).view(batch, C)
# Excitation
weight = self.fc(out).view(batch, C, 1, 1)
# 原特征 × 权重
return x * weight
通道注意力的好处
- 几乎不增加计算量
- 即插即用,所有 CNN 都能加
- 分类、检测、分割 全都能涨点
- 配合 ResNet、MobileNet、自己的小 CNN 都极强