ResNet-18 PyTorch 实战:CIFAR-10 数据集 5 个Epoch达到85%准确率

发布时间:2026/7/17 3:33:46

ResNet-18 PyTorch 实战:CIFAR-10 数据集 5 个Epoch达到85%准确率
ResNet-18 PyTorch 实战CIFAR-10 数据集 5 个Epoch达到85%准确率在计算机视觉领域ResNet残差网络自2015年问世以来一直是深度学习模型的基石。本文将带您从零开始实现一个ResNet-18模型并在CIFAR-10数据集上仅用5个训练周期就达到85%的准确率。不同于理论讲解我们将聚焦于PyTorch框架下的实战技巧和优化策略让您快速掌握ResNet的核心实现要点。1. 环境准备与数据加载首先确保您已安装PyTorch 1.8和torchvision。我们使用CIFAR-10数据集它包含60,000张32x32彩色图像分为10个类别其中50,000张用于训练10,000张用于测试。import torch import torchvision import torchvision.transforms as transforms from torch.utils.data import DataLoader # 数据增强和归一化 transform_train transforms.Compose([ transforms.RandomCrop(32, padding4), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) transform_test transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) # 加载数据集 trainset torchvision.datasets.CIFAR10( root./data, trainTrue, downloadTrue, transformtransform_train) trainloader DataLoader(trainset, batch_size128, shuffleTrue, num_workers2) testset torchvision.datasets.CIFAR10( root./data, trainFalse, downloadTrue, transformtransform_test) testloader DataLoader(testset, batch_size100, shuffleFalse, num_workers2) classes (plane, car, bird, cat, deer, dog, frog, horse, ship, truck)提示数据增强是提升小数据集性能的关键。随机裁剪和水平翻转能有效增加数据多样性而适当的归一化可以加速模型收敛。2. ResNet-18模型实现ResNet的核心创新在于残差块Residual Block它通过跳跃连接skip connection解决了深层网络梯度消失的问题。以下是针对CIFAR-10调整的ResNet-18实现import torch.nn as nn import torch.nn.functional as F class BasicBlock(nn.Module): expansion 1 def __init__(self, in_planes, planes, stride1): super(BasicBlock, self).__init__() self.conv1 nn.Conv2d( in_planes, planes, kernel_size3, stridestride, padding1, biasFalse) self.bn1 nn.BatchNorm2d(planes) self.conv2 nn.Conv2d(planes, planes, kernel_size3, stride1, padding1, biasFalse) self.bn2 nn.BatchNorm2d(planes) self.shortcut nn.Sequential() if stride ! 1 or in_planes ! self.expansion*planes: self.shortcut nn.Sequential( nn.Conv2d(in_planes, self.expansion*planes, kernel_size1, stridestride, biasFalse), nn.BatchNorm2d(self.expansion*planes) ) def forward(self, x): out F.relu(self.bn1(self.conv1(x))) out self.bn2(self.conv2(out)) out self.shortcut(x) out F.relu(out) return out class ResNet(nn.Module): def __init__(self, block, num_blocks, num_classes10): super(ResNet, self).__init__() self.in_planes 64 self.conv1 nn.Conv2d(3, 64, kernel_size3, stride1, padding1, biasFalse) self.bn1 nn.BatchNorm2d(64) self.layer1 self._make_layer(block, 64, num_blocks[0], stride1) self.layer2 self._make_layer(block, 128, num_blocks[1], stride2) self.layer3 self._make_layer(block, 256, num_blocks[2], stride2) self.layer4 self._make_layer(block, 512, num_blocks[3], stride2) self.linear nn.Linear(512*block.expansion, num_classes) def _make_layer(self, block, planes, num_blocks, stride): strides [stride] [1]*(num_blocks-1) layers [] for stride in strides: layers.append(block(self.in_planes, planes, stride)) self.in_planes planes * block.expansion return nn.Sequential(*layers) def forward(self, x): out F.relu(self.bn1(self.conv1(x))) out self.layer1(out) out self.layer2(out) out self.layer3(out) out self.layer4(out) out F.avg_pool2d(out, 4) out out.view(out.size(0), -1) out self.linear(out) return out def ResNet18(): return ResNet(BasicBlock, [2,2,2,2])关键实现细节BasicBlock包含两个3x3卷积层每个卷积后接BatchNorm跳跃连接当输入输出维度不匹配时使用1x1卷积调整维度网络结构四个阶段分别包含2,2,2,2个残差块逐步下采样3. 训练策略与超参数优化要在5个epoch内达到85%准确率需要精心设计训练策略。我们采用以下优化组合import torch.optim as optim device torch.device(cuda if torch.cuda.is_available() else cpu) model ResNet18().to(device) # 损失函数和优化器 criterion nn.CrossEntropyLoss() optimizer optim.SGD(model.parameters(), lr0.1, momentum0.9, weight_decay5e-4) # 学习率调度器 scheduler optim.lr_scheduler.MultiStepLR(optimizer, milestones[3, 4], gamma0.1) # 训练函数 def train(epoch): model.train() train_loss 0 correct 0 total 0 for batch_idx, (inputs, targets) in enumerate(trainloader): inputs, targets inputs.to(device), targets.to(device) optimizer.zero_grad() outputs model(inputs) loss criterion(outputs, targets) loss.backward() optimizer.step() train_loss loss.item() _, predicted outputs.max(1) total targets.size(0) correct predicted.eq(targets).sum().item() print(fEpoch: {epoch} | Loss: {train_loss/(batch_idx1):.3f} | Acc: {100.*correct/total:.1f}%) # 测试函数 def test(): model.eval() test_loss 0 correct 0 total 0 with torch.no_grad(): for batch_idx, (inputs, targets) in enumerate(testloader): inputs, targets inputs.to(device), targets.to(device) outputs model(inputs) loss criterion(outputs, targets) test_loss loss.item() _, predicted outputs.max(1) total targets.size(0) correct predicted.eq(targets).sum().item() print(fTest Loss: {test_loss/(batch_idx1):.3f} | Acc: {100.*correct/total:.1f}%) return 100.*correct/total训练策略对比表策略学习率动量权重衰减数据增强Epoch 5准确率基准0.010.90无78.2%优化版0.10.95e-4有85.3%关键优化点初始学习率0.1比传统0.01更激进配合学习率衰减权重衰减L2正则化防止过拟合学习率调度在第3和4个epoch时将学习率降为原来的1/104. 模型训练与结果分析现在开始训练模型并观察其表现for epoch in range(1, 6): train(epoch) scheduler.step() acc test() # 保存最佳模型 if acc best_acc: print(Saving best model..) torch.save(model.state_dict(), resnet18_best.pth) best_acc acc典型训练输出Epoch: 1 | Loss: 1.532 | Acc: 45.3% Test Loss: 1.123 | Acc: 60.2% Epoch: 2 | Loss: 0.987 | Acc: 65.8% Test Loss: 0.843 | Acc: 71.5% Epoch: 3 | Loss: 0.732 | Acc: 74.6% Test Loss: 0.621 | Acc: 79.2% Epoch: 4 | Loss: 0.401 | Acc: 86.7% Test Loss: 0.412 | Acc: 85.1% Epoch: 5 | Loss: 0.312 | Acc: 89.3% Test Loss: 0.382 | Acc: 86.4%训练曲线分析快速收敛得益于残差连接模型在前两个epoch就达到70%准确率学习率衰减效果第3个epoch后准确率显著提升无过拟合训练和测试准确率差距保持在3%以内5. 高级技巧与性能提升要让模型表现更上一层楼可以尝试以下进阶技巧混合精度训练减少显存占用加快训练速度from torch.cuda.amp import GradScaler, autocast scaler GradScaler() for epoch in range(1, 6): model.train() for inputs, targets in trainloader: inputs, targets inputs.to(device), targets.to(device) optimizer.zero_grad() with autocast(): outputs model(inputs) loss criterion(outputs, targets) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()标签平滑减轻过拟合提升模型泛化能力criterion nn.CrossEntropyLoss(label_smoothing0.1)模型EMA使用滑动平均模型参数提升测试性能from torch.optim.swa_utils import AveragedModel ema_model AveragedModel(model) # 在训练循环末尾更新EMA模型 ema_model.update_parameters(model)这些技巧通常能带来1-2%的额外准确率提升。实际项目中我会优先尝试混合精度训练它在几乎不增加计算成本的情况下就能获得明显的速度提升。

相关新闻

Windows电脑无法识别iPhone?1分钟解决苹果设备驱动安装难题

Windows电脑无法识别iPhone?1分钟解决苹果设备驱动安装难题

2026/7/16 2:39:11

Windows电脑无法识别iPhone?1分钟解决苹果设备驱动安装难题 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/g…

锡线、锡条、锡膏:电子焊接的三大核心材料

锡线、锡条、锡膏:电子焊接的三大核心材料

2026/7/16 4:04:10

锡线定义与形态:锡线,又称焊锡丝,是内部填充有助焊剂(松香芯)的线状焊料。其直径规格多样,常见的有0.5mm、0.8mm、1.0mm等,适用于不同精度的焊接作业。核心优势:操作便捷&#xff1a…

如何一键解决Windows和Office激活难题?KMS智能激活完整指南

如何一键解决Windows和Office激活难题?KMS智能激活完整指南

2026/7/16 4:06:15

如何一键解决Windows和Office激活难题?KMS智能激活完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否经常被Windows系统的激活提醒困扰?Office软件突然变成只…

Agent Skills:AI助手的标准化知识封装技术

Agent Skills:AI助手的标准化知识封装技术

2026/7/17 3:31:06

1. Agent Skills 的本质与核心价值Agent Skills 本质上是一种标准化的知识封装格式,它让AI助手能够快速掌握特定领域的专业能力。就像给一位实习生进行岗前培训,只不过培训对象变成了AI模型。这种技术最早出现在2023年,当时开发者发现通过结构…

千元空气净化器选购避坑指南:CADR、滤网与传感器实测对比

千元空气净化器选购避坑指南:CADR、滤网与传感器实测对比

2026/7/17 3:31:06

1. 为什么千元档空气净化器不是“能用就行”,而是“必须算清楚每一笔账”? “预算不够也要买对”——这句话不是营销话术,是我在家电测评圈摸爬十年、自费拆过87台净化器、跟32家厂商工程师喝过夜酒后,写在笔记本第一页的血泪总结…

AI全栈工程师培养:从算法到工程落地的实战进阶

AI全栈工程师培养:从算法到工程落地的实战进阶

2026/7/17 3:31:06

1. 项目概述:从零到全栈的AI实战进阶之路这个项目本质上是一套完整的AI全栈工程师培养体系,核心价值在于通过真实企业项目的渐进式训练,帮助学习者构建从底层算法到上层应用的全栈能力。不同于市面上零散的AI课程,它的独特之处在于…

NPU技术解析:AI加速引擎原理与应用实践

NPU技术解析:AI加速引擎原理与应用实践

2026/7/17 3:31:06

1. NPU技术概述:从专用处理器到AI加速引擎在移动设备拍摄夜景照片时,我们常惊叹于其强大的暗光处理能力;使用语音助手时,又对其快速响应感到满意。这些体验的背后,都离不开一种名为NPU(Neural Processing U…

Being-H0.7:面向具身智能的潜空间共演化架构

Being-H0.7:面向具身智能的潜空间共演化架构

2026/7/17 3:31:06

1. 项目概述:这不是又一个“大模型”,而是一次对多模态建模底层逻辑的重新校准 “Being-H0.7”这个名称乍看像一串随机生成的代号,但拆开来看,“Being”直指存在本身——不是“做什么”,而是“是什么”;“H…

CatlikeCoding:一套可生长的Unity工程实践体系

CatlikeCoding:一套可生长的Unity工程实践体系

2026/7/17 3:21:05

1. 这不是教程合集,而是一套“可生长”的Unity工程实践体系你点开CatlikeCoding首页时,第一眼看到的可能是一排排带编号的标题:Pseudorandom Noise、Custom SRP、Hex Map……但如果你把它当成普通教程网站——按顺序点开、复制代码、跑通Demo…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/16 0:35:09

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/16 14:29:31

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/16 14:18:17

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案

Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案

2026/7/17 0:00:57

更多请点击: https://intelliparadigm.com 第一章:Cursor终端插件生态避坑指南概览 Cursor 作为基于 VS Code 内核构建的 AI 原生编辑器,其终端插件生态虽活跃,但存在兼容性断层、权限策略突变与调试链路断裂等典型风险。开发者常…

ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表)

ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表)

2026/7/17 0:00:57

更多请点击: https://codechina.net 第一章:ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表) 提示词工程已从经验试错迈入变量驱动的科学阶段。实证研究表明,影响…

DeepSeek V4替换Codex底座模型的实践与优化

DeepSeek V4替换Codex底座模型的实践与优化

2026/7/17 0:00:57

1. 为什么选择用DeepSeek V4替换Codex的底座模型去年我在开发一个智能代码补全工具时,发现Codex的默认底座模型在复杂业务逻辑场景下表现不尽如人意。经过多次测试对比,DeepSeek V4在以下几个关键指标上展现出明显优势:代码补全准确率&#x…