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(通道+空间注意力模块)的最佳位置需权衡计算开销和性能提升:

  • 常见位置

    1. 残差块内部:在残差相加后加入CBAM(即 ( \text{CBAM}(F(x)+x) )),增强融合特征的注意力。
    2. 卷积块之间:在ResNet的每个残差块后或VGG的卷积层后插入,直接处理特征图。
  • 实验结论

    • ResNet:CBAM放在残差相加后效果更佳(如ResNet的每个残差块末尾)。
    • VGG:在卷积层后、激活函数前插入,避免破坏非线性表达。

3. 预训练模型的训练策略

a. 差异化学习率
  • 原理:深层网络的特征更抽象,需更大调整;浅层特征(如边缘纹理)较通用,应微调。
  • 实现
    • 分层设置学习率(如浅层lr=1e-5,深层lr=1e-3)。
    • 工具支持:PyTorch的param_groups可为不同层分配不同学习率。
b. 三阶段微调
  • 步骤
    1. 冻结全部,仅训练分类头:适配新任务类别。
    2. 解冻部分骨干网络(如后3个残差块组),使用较低学习率微调。
    3. 整体网络训练:全解冻,使用更小学习率(如1e-5)精细调整。

4. ResNet18结构详解

以输入224x224图像为例:

  1. Conv1:7x7卷积(64通道,stride=2) → BN → ReLU。
  2. MaxPool:3x3池化(stride=2)。
  3. 残差块组
    • Layer1:2个残差块,64通道,无下采样。
    • Layer2:2个残差块,128通道(首个块下采样)。
    • Layer3:2个残差块,256通道(下采样)。
    • Layer4:2个残差块,512通道(下采样)。
  4. Global Average Pooling → 全连接层(输出类别数)。

5. VGG16+CBAM微调策略实践

步骤1:插入CBAM模块
  • 位置选择 :在每个VGG卷积块末尾(池化层前)插入CBAM。

    python 复制代码
    # 示例代码(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:差异化学习率设置
  • 参数分组

    python 复制代码
    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:三阶段微调
  1. 阶段一 :冻结features层,训练CBAMclassifier
  2. 阶段二:解冻后两个卷积块(如features[-6:]),学习率设为1e-4。
  3. 阶段三:解冻全部,学习率衰减至1e-5,训练10个Epoch。

总结

  • ResNet:残差连接是核心,CBAM放置于残差相加后。
  • VGG+CBAM:在卷积块后插入,结合分阶段微调和分层学习率。
  • 实践建议:通过消融实验确定CBAM位置,使用学习率scheduler(如CosineAnnealing)优化收敛。
相关推荐
虾球xz9 分钟前
CppCon 2018 学习:THE MOST VALUABLE VALUES
开发语言·c++·学习
赶紧去巡山25 分钟前
pyhton基础【23】面向对象进阶四
python
旷世奇才李先生1 小时前
PyCharm 安装使用教程
ide·python·pycharm
阿蒙Amon1 小时前
C#扩展方法全解析:给现有类型插上翅膀的魔法
开发语言·c#
这里有鱼汤1 小时前
“对象”?对象你个头!——Python世界观彻底崩塌的一天
后端·python
尘浮7281 小时前
60天python训练计划----day59
开发语言·python
wh39331 小时前
使用Python将PDF转换成word、PPT
python·pdf·word
船长@Quant2 小时前
数学视频动画引擎Python库 -- Manim Voiceover 语音服务 Speech Services
python·数学·manim·动画引擎·语音旁白
Chef_Chen2 小时前
从0开始学习R语言--Day39--Spearman 秩相关
开发语言·学习·r语言
不学会Ⅳ2 小时前
Mac M芯片搭建jdk源码环境(jdk24)
java·开发语言·macos