OctaveConv_pytorch通道注意力清单:SENet、ECA-Net与SRM三种实现一网打尽
【免费下载链接】OctaveConv_pytorchPytorch implementation of newly added convolution项目地址: https://gitcode.com/gh_mirrors/oc/OctaveConv_pytorch
OctaveConv_pytorch 是一个 PyTorch 卷积算子实现库(Beyond Convolution),除了经典的 OctaveConv,它还内置了SENet、ECA-Net、SRM 三种通道注意力模块的 ResNet 完整实现,并配套了 ImageNet 训练脚本,非常适合想快速上手通道注意力机制的初学者。
上图是项目中最核心的 OctaveConv 结构(将特征分为高低频两组处理)。而通道注意力则解决另一个问题:让网络学会"哪些通道更重要",把有限的计算力集中在有效特征上。
三种通道注意力模块速览 📌
| 模块 | 注意力原理 | 参数开销 | 可选 ResNet 型号 | 源码文件 |
|---|---|---|---|---|
| SENet | 全局平均池化 + 两层全连接,学习通道间依赖 | 中等 | se_resnet18/34/50/101/152 | libs/nn/resnet_se.py |
| ECA-Net | 一维卷积直接建模通道邻域关系,不降维 | 极低(近零) | eca_resnet50/101/152 | libs/nn/resnet_eca.py |
| SRM | 风格池化(均值+标准差)+ 可学习风格融合 | 极低 | srm_resnet18/34/50/101/152、srm_resnext50_32x4d、srm_resnext101_32x8d | libs/nn/resnet_srm.py |
三者都采用"即插即用"方式嵌入 ResNet 残差块:在 block 最后一个卷积 + BN 之后、残差相加之前插一个注意力层,输出为逐通道的加权系数(0~1),与特征图逐元素相乘。
SENet 通道注意力:最经典的两层全连接实现
SENet(Squeeze-and-Excitation)是通道注意力开山之作,SELayer 的流程非常直观:
- 压缩(Squeeze):用
AdaptiveAvgPool2d(1)把每张特征图压成一个数,得到通道描述向量; - 激励(Excitation):两层全连接 + ReLU + Sigmoid,学习各通道的重要性权重;
- 重标定:权重乘回原特征图。
在 resnet_se.py 中可以看到,self.se被插入在BasicBlock的bn2之后;文件末尾 L179-L223 提供了从 ResNet18 到 ResNet152 的完整工厂函数。
ECA-Net 高效通道注意力:用一维卷积替代全连接
SENet 的"先降维再升维"会丢失通道间的位置关系,而 eca_layer 用一段一维卷积直接在通道维上建模邻域信息:
- 不压缩通道数,避免信息损失;
- 卷积核大小随通道数自适应(本实现默认
k_size=3); - 几乎不增加参数量,推理速度提升明显,是轻量级部署场景的首选。
该模块同样被插在残差块的bn2/bn3之后(见 L59-L70),eca_resnet50 等工厂函数 可直接调用。
SRM 风格重校准:感知整幅图像风格的通道注意力
SRM(Style-based Recalibration Module)的独到之处在于它关注的是图像风格(如光照、纹理分布),而不仅是通道激活:
- 风格池化:对每个通道计算均值和标准差,拼成
C×2的风格特征; - 风格融合:与可学习参数
cfc(C×2)相乘求和,再经过 BN 和 Sigmoid 得到逐通道权重; - 重标定:输出权重乘回输入张量,自适应地调整特征。
完整逻辑见 SRMLayer,其中cfc、bn.weight、bn.bias被标记为srm_param以便差异化学习率。注意它的插入位置略有不同——在残差相加之前(L135-L146)。工厂函数 额外提供了 ResNeXt 版本。
快速上手:三种模型一键切换 🚀
所有模型都通过 libs/nn/__init__.py 统一导出,注册进 main_imagenet.py 的模型表。本地推理只需三行:
from libs.nn import se_resnet50, eca_resnet50, srm_resnet50 model = eca_resnet50().cuda()训练时通过-a参数切换架构即可,例如:
python main_imagenet.py -a srm_resnet50 --data <ImageNet目录> --epochs 120项目附带了可直接参考的分布式训练模板 exp/train_val_step_se_resnet50.sh(8 卡、120 epoch、30/60/90 衰减、5 epoch 热启动),照抄参数结构换成其它-a模型名就能跑。环境依赖见 requirement.txt(torch、torchvision、apex)。
如何选择?一张表帮你决策 ✅
- 求稳、可复现论文基线→
se_resnet50(论文对照最方便) - 追求低开销、移动端/实时场景→
eca_resnet50(参数几乎为零) - 数据存在明显风格差异(光照/场景漂移)→
srm_resnet50(按风格自适应重标定) - 想对比注意力收益→ 用同一数据集分别训练三种模型,
test_speed.py可辅助评估前向速度
以上就是 OctaveConv_pytorch 中三种通道注意力实现的全部要点:SENet 经典、ECA 轻量、SRM 风格感知,按需取用即可。
【免费下载链接】OctaveConv_pytorchPytorch implementation of newly added convolution项目地址: https://gitcode.com/gh_mirrors/oc/OctaveConv_pytorch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考