【python深度学习】Day 50 预训练模型+CBAM模块
- resnet结构解析
- CBAM放置位置的思考
- 针对预训练模型的训练策略
- 差异化学习率
- 三阶段微调
ps:今日的代码训练时长较长,3080ti大概需要40min的训练时长
作业:
- 好好理解下resnet18的模型结构
- 尝试对vgg16+cbam进行微调策略
今日主题:给预训练模型,增加模块来优化其效果,
在此过程中会遇到两个问题:预训练模型的结构和权重是固定的,如果修改其中的模型结构,是否会大幅影响其性能。其次,是训练的时候如何训练才可以更好的避免破坏原有的特征提取器的参数。
所以今天的内容,我们需要回答以上2个问题。
1. resnet18中如何插入cbam模块?
经典的 ResNet-18 模型可以将其看作一个处理流水线,图像数据从一端进去,分类结果从另一端出来。整个过程可以分为三个主要部分:
2. 预训练策略
(1)差异化学习率
把我们的模型想象成一个公司团队来执行新项目 (CIFAR-10 分类任务):
- 预训练层 (ResNet 部分):他们是经验丰富的**资深专家**。他们已经很懂得如何处理通用图像特征,不需要大的改动。
- 新模块 (CBAM 和分类头):他们是刚入职的**实习生**,对新任务一无所知,需要快速学习和试错。
作为 CEO,我们的训练策略是:
- 给实习生设置一个较高的学习率 (例如 `1e-3`),让他们快速成长。
- 给专家设置一个极低的学习率(例如 `1e-5`),告诉他们:“保持现状,根据实习生的表现稍作微调即可。”
(2)三阶段式解冻与微调
1. 阶段一 (Epoch 1-5): 预热“实习生”
解冻部分: 仅解冻分类头 (`fc`) 和所有 `CBAM` 模块。
冻结部分: 冻结 ResNet18 的所有主干卷积层 (`conv1`, `bn1`, `layer1` 至 `layer4`)。
目标: 先利用强大的预训练特征,让模型快速学习新任务的分类边界,同时让注意力模块找到初步的关注点。
学习率: `1e-3` (使用较高学习率加速收敛)。
2. 阶段二 (Epoch 6-20): 唤醒“高层专家”
解冻部分: 在上一阶段的基础上,额外解冻高层语义相关的卷积层 (`layer3`, `layer4`)。
冻结部分: 底层特征提取层 (`conv1`, `bn1`, `layer1`, `layer2`) 仍然冻结。
目标: 释放模型的高层特征提取能力,使其适应新任务的抽象概念 (例如“鸟的轮廓”比“一条边”更抽象)。
学习率: `1e-4` (降低学习率,避免新解冻的层因梯度过大而破坏其宝贵的预训练权重)。
3. 阶段三 (Epoch 21-50): 全员协同微调
解冻部分: 解冻模型的所有层,进行端到端微调。
冻结部分: 无。
目标: 让模型的底层特征 (如边缘、纹理) 也与新任务进行对齐,做最后的精细化调整,提升整体性能。
学习率: `1e-5` (使用最低的学习率,在整个模型上缓慢、稳定地进行全局优化)。