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)优化收敛。
相关推荐
时央12345637 分钟前
C#使用Tuple方法实现OpreateResultModel功能
运维·开发语言·c#
爱学习的白杨树40 分钟前
Spring Cloud Gateway 介绍
java·运维·开发语言
丘山子1 小时前
别再滥用 None 了!这才是 Python 处理缺失值的好方法
后端·python·面试
数量技术宅1 小时前
数字合约价格发现功能
python·数据分析·量化策略·数字货币·量化投资
大千AI助手1 小时前
Python3安装MySQL-python踩坑实录:从报错到完美解决的实战指南
数据库·python·mysql·mysqlclient·mysql-python
倔强青铜三1 小时前
Python相对导入的终极翻车现场:为啥你的代码总报错?
人工智能·python·面试
丘山子1 小时前
Python 字典是有序数据结构吗?是你以为的那种有序吗?
后端·python·面试
elon_z2 小时前
【项目实训#09】智能代码文件助手模式前后端设计与实现
python·ai编程
byte轻骑兵2 小时前
【C++特殊工具与技术】优化内存分配(五):显式析构函数的调用
开发语言·c++
天天爱吃肉82182 小时前
《零基础读懂新能源汽车》——V2G/电池梯次利用/氢能源生态级技术拆解与商业预言
数据库·python·汽车·能源·创业创新