目录

一、预训练核心概念

1. 预训练定义与价值

二、主流分类预训练模型

经典模型对比表

三、图像预训练模型发展史

里程碑演进路线

四、预训练策略详解

1. 迁移学习技术矩阵

2. 学习率设置技巧

五、ResNet预训练实战

1. 完整微调代码

2. 特征提取模式

六、预训练模型选择指南

模型选型决策树

七、高级技巧

1. 渐进式解冻

2. 自定义数据预处理

八、模型保存与加载

安全保存方案

九、常见问题解决方案

预训练应用问题排查

十、扩展学习资源


一、预训练核心概念

1. 预训练定义与价值

核心优势:

  • 迁移学习:将通用特征知识迁移到新任务

  • 数据效率:减少对标注数据量的需求

  • 性能提升:通常优于从零训练的模型

二、主流分类预训练模型

经典模型对比表

模型名称参数量输入尺寸Top-1准确率特点
ResNet5025.5M224×22476.15%残差连接
EfficientNet-B05.3M224×22477.1%复合缩放
ViT-B/1686M224×22477.9%纯Transformer
ConvNeXt-T28M224×22482.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或图像尺寸

十、扩展学习资源

  1. 官方文档:

  2. 论文精读:

  3. 实践项目:

    • 在CIFAR-100上比较不同预训练模型

    • 实现自定义数据集的渐进式解冻训练

@浙大疏锦行

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐