当前位置: 首页 > java >正文

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

总结

  • ResNet:残差连接是核心,CBAM放置于残差相加后。
  • VGG+CBAM:在卷积块后插入,结合分阶段微调和分层学习率。
  • 实践建议:通过消融实验确定CBAM位置,使用学习率scheduler(如CosineAnnealing)优化收敛。
http://www.xdnf.cn/news/14086.html

相关文章:

  • 酷柚易汛ERP 2025-06-12系统升级日志
  • Windows 文件复制利器:ROBOCOPY 拷贝命令指南
  • 聊聊 Glide | 不看源码,只聊设计
  • tp3.1临时连接指定数据库,切片分类in查询,带过滤需要的数据
  • 工业化超声波清洗设备的五大关键特性
  • DeviceNet转PROFINET转换方案:基于S7-1500主站控制欧姆龙CJ2M从站设备
  • 2007-2020年各省国内专利申请授权量数据
  • UVM验证—第二课(一):核心基类阶段机制
  • Deepseek+python - 自动图表生成
  • Arduino学习-红外感应
  • 聊一聊 - 如何写好README文档
  • ABB 216EA61B HESG448230R1/G
  • OpenLayers 图层叠加控制
  • Windows10搭建FTP服务器
  • python中的zip函数
  • Python的格式化输入输出
  • 深入理解 @JsonGetter:精准掌控前端返回数据格式!
  • cpp 绑定方案大比拼
  • SpringBoot实现权限管理系统完整指南(附源码)
  • 【Code】COP FOR THE STRUCTURAL USE OF STEEL 2011 (2023 Edition)
  • SDPA(Scaled Dot-Product Attention)详解
  • CE 标志新门槛:智能门锁 EN 18031 认证合规路径与成本分析
  • 分布式锁模板工具类
  • 2025企业级BI产品评测和推荐
  • 在 WinForms 中制作无边框窗体通过鼠标拖动移动和调整大小,难点是我窗体上被标题栏和状态栏dock之后很难选中
  • 短视频矩阵系统开发实战:PHP实现SaaS独立部署
  • deepimagej-plugin开源程序是用于运行深度学习模型的 ImageJ 插件
  • 【解决方案】Kali 2022.3修复仓库密钥一键安装docker,docker compose
  • 开发环境与生产环境的 yml 文件与配置
  • 1分钟理解FreeRtos中的信号量知识