Python Day50
Task:
1.resnet结构解析
2.CBAM放置位置的思考
3.针对预训练模型的训练策略
a.差异化学习率
b.三阶段微调
1. ResNet结构解析
ResNet(残差网络)的核心思想是通过**残差连接(Skip Connection)**解决深层网络中的梯度消失问题。以ResNet18为例:
-
基本结构:
- 输入层:7x7卷积(stride=2),接3x3最大池化(stride=2)。
- 4个残差块组,每组包含2个残差块(共18层):
- 每个残差块由两个3x3卷积层组成,中间通过BatchNorm和ReLU连接。
- 每组第一个残差块可能进行下采样(步长=2),此时跳跃连接使用1x1卷积调整通道数和步长。
- 结尾:全局平均池化 + 全连接分类层。
-
残差块公式:
( \text{输出} = F(x) + x )
其中 ( F(x) ) 是两个卷积层的结果,跳跃连接直接相加。 -
维度匹配:当输入输出尺寸或通道数不同时,跳跃连接通过1x1卷积调整。
2. CBAM放置位置的思考
CBAM(通道+空间注意力模块)的最佳位置需权衡计算开销和性能提升:
-
常见位置:
- 残差块内部:在残差相加后加入CBAM(即 ( \text{CBAM}(F(x)+x) )),增强融合特征的注意力。
- 卷积块之间:在ResNet的每个残差块后或VGG的卷积层后插入,直接处理特征图。
-
实验结论:
- ResNet:CBAM放在残差相加后效果更佳(如ResNet的每个残差块末尾)。
- VGG:在卷积层后、激活函数前插入,避免破坏非线性表达。
3. 预训练模型的训练策略
a. 差异化学习率
- 原理:深层网络的特征更抽象,需更大调整;浅层特征(如边缘纹理)较通用,应微调。
- 实现:
- 分层设置学习率(如浅层lr=1e-5,深层lr=1e-3)。
- 工具支持:PyTorch的
param_groups
可为不同层分配不同学习率。
b. 三阶段微调
- 步骤:
- 冻结全部,仅训练分类头:适配新任务类别。
- 解冻部分骨干网络(如后3个残差块组),使用较低学习率微调。
- 整体网络训练:全解冻,使用更小学习率(如1e-5)精细调整。
4. ResNet18结构详解
以输入224x224图像为例:
- Conv1:7x7卷积(64通道,stride=2) → BN → ReLU。
- MaxPool:3x3池化(stride=2)。
- 残差块组:
- Layer1:2个残差块,64通道,无下采样。
- Layer2:2个残差块,128通道(首个块下采样)。
- Layer3:2个残差块,256通道(下采样)。
- Layer4:2个残差块,512通道(下采样)。
- Global Average Pooling → 全连接层(输出类别数)。
5. VGG16+CBAM微调策略实践
步骤1:插入CBAM模块
- 位置选择:在每个VGG卷积块末尾(池化层前)插入CBAM。
# 示例代码(PyTorch) class VGG16_CBAM(nn.Module):def __init__(self):super().__init__()self.features = vgg16(pretrained=True).features# 在第3、6、10、14、18层后插入CBAM(根据VGG结构)self.cbam1 = CBAM(64)self.cbam2 = CBAM(128)...def forward(self, x):for i, layer in enumerate(self.features):x = layer(x)if i in [3, 6, 10, 14, 18]: # 假设这些位置是卷积块末尾x = self.cbam1(x)return x
步骤2:差异化学习率设置
- 参数分组:
optimizer = torch.optim.Adam([{'params': model.features.parameters(), 'lr': 1e-5}, # 浅层{'params': model.cbam_layers.parameters(), 'lr': 1e-4}, {'params': model.classifier.parameters(), 'lr': 1e-3} # 深层 ])
步骤3:三阶段微调
- 阶段一:冻结
features
层,训练CBAM
和classifier
。 - 阶段二:解冻后两个卷积块(如features[-6:]),学习率设为1e-4。
- 阶段三:解冻全部,学习率衰减至1e-5,训练10个Epoch。
总结
- ResNet:残差连接是核心,CBAM放置于残差相加后。
- VGG+CBAM:在卷积块后插入,结合分阶段微调和分层学习率。
- 实践建议:通过消融实验确定CBAM位置,使用学习率scheduler(如CosineAnnealing)优化收敛。