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)优化收敛。
相关推荐
海哥编程7 分钟前
Python 数据分析(二):Matplotlib 绘图
python·数据分析·matplotlib
苦学编程的谢23 分钟前
MyBatis_3
java·开发语言·后端·mybatis
go54631584651 小时前
Python点阵字生成与优化:从基础实现到高级渲染技术
开发语言·人工智能·python·深度学习·分类·数据挖掘
猫头虎1 小时前
2025年02月11日 Go生态洞察:Go 1.24 发布亮点全面剖析
开发语言·后端·python·golang·go·beego·go1.19
仰望天空—永强1 小时前
PS 2025【七月最新v26.5】PS铺软件安装|最新版|附带安装文件|详细安装说明|附PS插件
开发语言·图像处理·python·图形渲染·photoshop
寒士obj1 小时前
JVM 内存结构
java·开发语言·jvm
MediaTea1 小时前
Python 库手册:xmlrpc.client 与 xmlrpc.server 模块
开发语言·python
悦悦子a啊2 小时前
Python之--字典
开发语言·python·学习
水军总督2 小时前
OpenCV+Python
python·opencv·计算机视觉
qyhua2 小时前
Windows 平台源码部署 Dify教程(不依赖 Docker)
人工智能·windows·python