python打卡 DAY 44 预训练模型
·
目录
一、预训练核心概念
1. 预训练定义与价值

核心优势:
-
迁移学习:将通用特征知识迁移到新任务
-
数据效率:减少对标注数据量的需求
-
性能提升:通常优于从零训练的模型
二、主流分类预训练模型
经典模型对比表
| 模型名称 | 参数量 | 输入尺寸 | Top-1准确率 | 特点 |
|---|---|---|---|---|
| ResNet50 | 25.5M | 224×224 | 76.15% | 残差连接 |
| EfficientNet-B0 | 5.3M | 224×224 | 77.1% | 复合缩放 |
| ViT-B/16 | 86M | 224×224 | 77.9% | 纯Transformer |
| ConvNeXt-T | 28M | 224×224 | 82.1% | CNN现代化改造 |
三、图像预训练模型发展史
里程碑演进路线

四、预训练策略详解
1. 迁移学习技术矩阵
| 策略 | 训练方式 | 适用场景 | 数据需求 |
|---|---|---|---|
| 特征提取 | 冻结骨干网络 | 小数据集 | <1k样本 |
| 微调全部 | 全网络训练 | 大数据集 | >10k样本 |
| 分层学习率 | 不同层不同LR | 中等数据 | 1k-10k样本 |
2. 学习率设置技巧
# 分层学习率示例
optimizer = torch.optim.Adam([
{'params': model.backbone.parameters(), 'lr': 1e-5}, # 浅层小学习率
{'params': model.head.parameters(), 'lr': 1e-3} # 分类头大学习率
])
五、ResNet预训练实战
1. 完整微调代码
import torchvision
from torchvision.models import ResNet50_Weights
# 1. 加载预训练模型
model = torchvision.models.resnet50(weights=ResNet50_Weights.IMAGENET1K_V2)
# 2. 替换分类头
num_classes = 10 # 假设新任务有10类
model.fc = torch.nn.Linear(model.fc.in_features, num_classes)
# 3. 训练配置
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)
criterion = torch.nn.CrossEntropyLoss()
# 4. 训练循环
for epoch in range(10):
model.train()
for inputs, labels in train_loader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
2. 特征提取模式
# 冻结所有骨干层
for param in model.parameters():
param.requires_grad = False
# 仅训练分类头
model.fc = torch.nn.Linear(model.fc.in_features, num_classes)
optimizer = torch.optim.Adam(model.fc.parameters(), lr=1e-3)
六、预训练模型选择指南
模型选型决策树

七、高级技巧
1. 渐进式解冻
# 分阶段解冻层
def unfreeze_layers(model, epoch):
if epoch == 5:
for param in model.layer4.parameters():
param.requires_grad = True
elif epoch == 10:
for param in model.layer3.parameters():
param.requires_grad = True
2. 自定义数据预处理
# 匹配预训练模型的预处理
weights = ResNet50_Weights.IMAGENET1K_V2
preprocess = weights.transforms() # 自动获取正确的预处理
# 应用到数据集
dataset = MyDataset(transform=preprocess)
八、模型保存与加载
安全保存方案
# 保存完整模型架构+权重
torch.save({
'model_state': model.state_dict(),
'class_to_idx': dataset.class_to_idx,
'optimizer_state': optimizer.state_dict()
}, 'model_checkpoint.pth')
# 加载时重建模型结构
checkpoint = torch.load('model_checkpoint.pth')
model.load_state_dict(checkpoint['model_state'])
九、常见问题解决方案
预训练应用问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 性能下降 | 预处理不一致 | 使用模型对应的标准化参数 |
| 训练震荡 | 学习率过大 | 减小分类头学习率 |
| 过拟合 | 模型太大 | 增加Dropout或早停 |
| 显存不足 | 输入尺寸过大 | 减小batch size或图像尺寸 |
十、扩展学习资源
-
官方文档:
-
论文精读:
-
ResNet: Deep Residual Learning
-
-
实践项目:
-
在CIFAR-100上比较不同预训练模型
-
实现自定义数据集的渐进式解冻训练
-
更多推荐
所有评论(0)