共计 2146 个字符,预计需要花费 6 分钟才能阅读完成。
背景介绍
预训练模型在深度学习领域扮演着重要角色。它们是在大型数据集上训练好的模型,可以直接用于特定任务,或者通过微调(fine-tuning)适应新的任务。对于计算资源有限或数据量不足的场景,使用预训练模型可以大大节省时间和计算成本。

CIFAR-10 是一个经典的图像分类数据集,包含 10 个类别的 60000 张 32×32 彩色图像,每个类别 6000 张。虽然图像尺寸较小,但它常被用来验证模型的有效性。ResNet18 是一个相对轻量级的残差网络,适合在 CIFAR-10 这样的数据集上进行快速实验。
痛点分析
新手在使用 CIFAR-10 官方预训练的 ResNet18 权重时,经常会遇到以下问题:
- 权重不匹配 :直接加载 ImageNet 预训练的权重时,由于输入尺寸和类别数的不同,会导致模型无法正常工作。
- 输入维度错误 :CIFAR-10 的图像尺寸是 32×32,而 ResNet18 默认的输入尺寸是 224×224,直接输入会导致维度错误。
- 迁移学习效果不佳 :微调时学习率设置不当或数据预处理不正确,导致模型性能提升有限。
- GPU 内存不足 :批量大小设置过大,导致显存溢出。
技术实现
使用 PyTorch 加载官方权重的正确方法
首先,我们需要安装必要的库:
import torch
import torchvision
from torchvision import transforms
from torch import nn, optim
加载预训练的 ResNet18 模型:
# 加载预训练的 ResNet18 模型
model = torchvision.models.resnet18(pretrained=True)
修改模型以适应 CIFAR-10
由于 CIFAR-10 的图像尺寸和类别数与 ImageNet 不同,我们需要对模型进行一些调整:
# 修改第一层卷积层,适应 32x32 的输入
model.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False)
# 修改全连接层,输出类别数为 10
model.fc = nn.Linear(model.fc.in_features, 10)
数据预处理
正确的数据预处理对模型性能至关重要:
# 定义数据预处理
transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.4914, 0.4822, 0.4465), (0.247, 0.243, 0.261))
])
# 加载 CIFAR-10 数据集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=128, shuffle=False, num_workers=2)
避坑指南
输入数据标准化处理注意事项
CIFAR-10 的均值和标准差与 ImageNet 不同,因此不能直接使用 ImageNet 的标准化参数。正确的标准化参数应该是:
mean = [0.4914, 0.4822, 0.4465]
std = [0.247, 0.243, 0.261]
学习率设置经验值
对于迁移学习,通常建议:
- 预训练层使用较小的学习率(如 0.001)
- 新添加的层使用较大的学习率(如 0.01)
可以通过以下方式实现:
# 定义优化器
optimizer = optim.SGD([{'params': model.conv1.parameters(), 'lr': 0.001},
{'params': model.fc.parameters(), 'lr': 0.01}
], momentum=0.9)
GPU 内存不足的解决方案
如果遇到 GPU 内存不足的问题,可以尝试:
- 减小批量大小(batch size)
- 使用梯度累积(gradient accumulation)
- 使用混合精度训练(mixed precision training)
效果验证
在 CIFAR-10 测试集上的准确率对比:
- 未微调的模型:约 50%
- 微调后的模型:约 90%
扩展思考
该模型可以轻松扩展到其他相似的图像分类任务。只需修改最后全连接层的输出维度,并可能调整输入预处理。例如,对于 CIFAR-100 数据集:
model.fc = nn.Linear(model.fc.in_features, 100)
实践建议
- 尝试不同的优化器(如 Adam)
- 实验不同的学习率调度策略(如余弦退火)
- 使用数据增强提高模型泛化能力
- 尝试冻结部分层,只训练特定的层
通过以上步骤,你应该能够成功使用 CIFAR-10 官方预训练的 ResNet18 权重,并在自己的项目中实现良好的性能。
正文完
