ResNet18+CIFAR10完整项目:云端跑通经典组合不求人
引言
如果你是刚入门深度学习的自学者,一定听说过CIFAR10这个经典数据集和ResNet18这个经典模型。这对组合就像"西红柿炒鸡蛋"一样,是每个AI学习者必做的入门菜。但问题来了:CIFAR10虽然只有60MB,但在普通笔记本上训练一个ResNet18模型可能需要20小时以上,漫长的等待让人抓狂。
别担心,今天我将带你用云端GPU资源,在1小时内完成这个经典项目的完整流程。就像用高压锅代替普通锅具,我们能大大缩短"烹饪时间"。这篇文章会手把手教你:
- 如何快速获取并预处理CIFAR10数据集
- 如何用PyTorch搭建ResNet18模型
- 如何利用云端GPU加速训练过程
- 如何评估模型性能并保存结果
整个过程不需要你配置复杂环境,所有代码都可以直接复制使用。跟着做,你就能在云端轻松跑通这个经典项目,为后续更复杂的学习打下坚实基础。
1. 环境准备:5分钟搞定云端GPU
首先我们需要一个强大的"厨房"——带GPU的云端环境。这里推荐使用CSDN星图镜像广场提供的PyTorch预置镜像,它已经装好了所有必要的工具。
1.1 选择合适的环境配置
对于CIFAR10这种规模的数据集,我们建议选择以下配置:
- GPU:至少8GB显存(如NVIDIA T4或RTX 3060)
- 内存:16GB以上
- 镜像:PyTorch 1.12+CUDA 11.3
1.2 一键启动环境
在CSDN星图镜像广场找到PyTorch镜像后,点击"一键部署",等待约1分钟环境就会准备就绪。部署完成后,你会获得一个Jupyter Notebook界面,这是我们接下来工作的主战场。
💡 提示
如果找不到PyTorch镜像,可以在搜索框输入"PyTorch"快速筛选。确保选择的镜像包含CUDA支持,这样才能使用GPU加速。
2. 数据准备:快速获取CIFAR10
CIFAR10数据集包含6万张32x32的彩色图片,分为10个类别(飞机、汽车、鸟、猫等)。PyTorch已经内置了这个数据集,我们可以轻松获取。
2.1 下载并加载数据集
在Jupyter Notebook中新建一个代码单元格,输入以下内容:
import torch from torchvision import datasets, transforms # 定义数据预处理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) # 下载并加载训练集和测试集 train_set = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) test_set = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) # 创建数据加载器 train_loader = torch.utils.data.DataLoader(train_set, batch_size=128, shuffle=True) test_loader = torch.utils.data.DataLoader(test_set, batch_size=128, shuffle=False) print(f"训练集大小: {len(train_set)}") print(f"测试集大小: {len(test_set)}")运行这段代码,它会自动下载CIFAR10数据集(约160MB)并进行预处理。你会看到输出显示训练集有50000张图片,测试集有10000张。
2.2 可视化样本数据
为了确认数据加载正确,我们可以随机查看一些样本:
import matplotlib.pyplot as plt import numpy as np # CIFAR10的类别名称 classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck') # 显示一些图像样本 def imshow(img): img = img / 2 + 0.5 # 反归一化 npimg = img.numpy() plt.imshow(np.transpose(npimg, (1, 2, 0))) plt.show() # 获取随机训练样本 dataiter = iter(train_loader) images, labels = next(dataiter) # 显示图像 imshow(torchvision.utils.make_grid(images[:4])) print(' '.join(f'{classes[labels[j]]:5s}' for j in range(4)))这段代码会显示4张随机选择的图片及其标签,帮助你直观了解数据集内容。
3. 模型构建:搭建ResNet18
ResNet18是一个相对轻量但性能优秀的卷积神经网络,特别适合初学者学习。PyTorch已经内置了ResNet的实现,我们可以直接调用。
3.1 加载预训练模型
在新建的代码单元格中输入:
import torchvision.models as models # 加载ResNet18模型(使用ImageNet预训练权重) model = models.resnet18(pretrained=True) # 修改最后一层全连接层,适配CIFAR10的10分类任务 num_ftrs = model.fc.in_features model.fc = torch.nn.Linear(num_ftrs, 10) # 将模型移动到GPU(如果可用) device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") model = model.to(device) print(model)这段代码做了三件事: 1. 加载预训练的ResNet18模型 2. 修改最后一层,使其输出10个类别(CIFAR10有10类) 3. 将模型移动到GPU(如果可用)
3.2 定义损失函数和优化器
接下来我们需要定义训练所需的损失函数和优化器:
import torch.optim as optim criterion = torch.nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)这里我们使用: - 交叉熵损失函数(适合分类任务) - SGD优化器(带动量,学习率设为0.001)
4. 模型训练:GPU加速实战
现在来到最核心的部分——训练模型。得益于云端GPU,这个过程会比本地快很多。
4.1 训练循环实现
在新建的代码单元格中输入以下训练代码:
# 训练轮数 num_epochs = 20 for epoch in range(num_epochs): # 训练阶段 model.train() running_loss = 0.0 for i, (inputs, labels) in enumerate(train_loader): inputs, labels = inputs.to(device), labels.to(device) # 清零梯度 optimizer.zero_grad() # 前向传播 + 反向传播 + 优化 outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() # 打印统计信息 running_loss += loss.item() if i % 100 == 99: # 每100个batch打印一次 print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 100:.3f}') running_loss = 0.0 print('训练完成!')这段代码会进行20轮(epoch)训练,每轮遍历整个训练集。在NVIDIA T4 GPU上,这个过程大约需要30-40分钟,相比CPU训练快10倍以上。
4.2 实时监控训练进度
为了更好监控训练过程,我们可以添加准确率计算:
def evaluate(model, data_loader): model.eval() correct = 0 total = 0 with torch.no_grad(): for images, labels in data_loader: images, labels = images.to(device), labels.to(device) outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() return 100 * correct / total # 在训练循环中添加评估 for epoch in range(num_epochs): # ...原有训练代码... # 每个epoch结束后评估 train_acc = evaluate(model, train_loader) test_acc = evaluate(model, test_loader) print(f'Epoch {epoch+1}: 训练准确率 {train_acc:.2f}%, 测试准确率 {test_acc:.2f}%')这样你就能看到模型在训练集和测试集上的实时表现。
5. 模型评估与保存
训练完成后,我们需要评估模型性能并保存结果。
5.1 最终评估
使用以下代码评估模型在测试集上的表现:
test_acc = evaluate(model, test_loader) print(f'最终测试准确率: {test_acc:.2f}%')使用上述配置,你应该能得到约85%-90%的测试准确率。这个结果已经相当不错,特别是考虑到我们只训练了20轮。
5.2 保存模型
为了后续使用,我们可以将训练好的模型保存下来:
# 保存整个模型 torch.save(model.state_dict(), 'resnet18_cifar10.pth') # 也可以只保存模型参数(更轻量) torch.save({ 'epoch': num_epochs, 'model_state_dict': model.state_dict(), 'optimizer_state_dict': optimizer.state_dict(), 'loss': criterion, }, 'resnet18_cifar10_checkpoint.pth')这样你就得到了两个模型文件,可以随时加载使用。
5.3 加载并使用模型
要加载保存的模型,可以使用以下代码:
# 加载模型 model = models.resnet18(pretrained=False) num_ftrs = model.fc.in_features model.fc = torch.nn.Linear(num_ftrs, 10) model.load_state_dict(torch.load('resnet18_cifar10.pth')) model = model.to(device) model.eval() # 使用模型进行预测 def predict(image): with torch.no_grad(): output = model(image) _, predicted = torch.max(output, 1) return predicted.item() # 示例:预测测试集中的第一张图片 test_image, _ = next(iter(test_loader)) test_image = test_image[0].unsqueeze(0).to(device) predicted_class = predict(test_image) print(f'预测类别: {classes[predicted_class]}') # 显示图片 imshow(test_image.cpu().squeeze())6. 常见问题与优化建议
在实践过程中,你可能会遇到一些问题。这里列出几个常见情况及解决方案。
6.1 训练准确率高但测试准确率低
这是典型的过拟合现象,可以尝试:
- 增加数据增强(在transform中添加随机翻转、裁剪等)
- 添加Dropout层
- 使用更小的学习率
- 提前停止(Early Stopping)
改进的数据预处理示例:
transform = transforms.Compose([ transforms.RandomHorizontalFlip(), transforms.RandomCrop(32, padding=4), transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ])6.2 训练速度慢
如果发现训练速度不如预期:
- 确认是否真的使用了GPU(检查torch.cuda.is_available())
- 尝试增大batch size(根据GPU显存调整)
- 使用混合精度训练(需要支持FP16的GPU)
6.3 内存不足
如果遇到CUDA out of memory错误:
- 减小batch size
- 使用梯度累积(多次小batch后更新一次参数)
- 清理不必要的缓存:torch.cuda.empty_cache()
总结
通过这篇文章,我们完整实现了ResNet18在CIFAR10数据集上的训练和评估。让我们回顾一下核心要点:
- 云端GPU大幅加速训练:相比本地CPU,使用云端GPU可以将20小时的训练缩短到1小时以内
- PyTorch简化模型开发:利用PyTorch内置的ResNet实现和数据集接口,我们只需少量代码就能完成复杂任务
- 迁移学习效果显著:即使不从头训练,使用预训练模型也能获得不错的结果
- 完整流程易于扩展:这套流程可以轻松适配其他数据集和模型,为你后续学习打下基础
现在你已经掌握了经典图像分类项目的完整实现方法,可以尝试调整参数、更换模型或数据集,进一步探索深度学习的奥秘。实测这套方案在云端环境运行非常稳定,是自学AI的绝佳起点。
💡获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。