FA_CNN卷积神经网络十二_CIFAR10全流程PyTorch

发布时间:2026/10/23 2:53:40

FA_CNN卷积神经网络十二_CIFAR10全流程PyTorch FAFormulas and AlgorithmCNNConvolutional Neural Network1. 项目概述本文基于 PyTorch 框架使用经典的 CIFAR10 数据集完整演示一个图像分类模型的训练与验证流程。内容涵盖使用 GPU 加速训练一个自定义卷积神经网络CNN训练 30 个轮次epoch并记录训练过程中的损失与准确率训练完成后使用训练好的模型对真实图片狗、飞机进行识别验证通过本文你将掌握 PyTorch 从数据加载、模型搭建、训练、测试到模型保存与加载的完整套路。2. 环境准备在开始之前请确保你的环境中已安装以下依赖pipinstalltorch torchvision pillow tensorboardtorch / torchvisionPyTorch 核心库与视觉工具库pillow图像处理库用于读取和预处理图片tensorboard训练过程可视化工具同时建议准备一块可用的 NVIDIA GPU显存建议 4GB 以上以加速训练过程。3. 数据集准备CIFAR10 数据集包含 10 个类别的 60000 张 32×32 彩色图片其中训练集 50000 张测试集 10000 张。类别包括飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船、卡车。使用torchvision.datasets.CIFAR10可以自动下载并加载数据集importtorchvision# 训练集train_datatorchvision.datasets.CIFAR10(./dataset,trainTrue,transformtorchvision.transforms.ToTensor(),downloadTrue)# 测试集test_datatorchvision.datasets.CIFAR10(./dataset,trainFalse,transformtorchvision.transforms.ToTensor(),downloadTrue)print(训练数据集的长度{}.format(len(train_data)))print(测试数据集的长度{}.format(len(test_data)))输出结果训练数据集的长度50000 测试数据集的长度100004. 构建卷积神经网络模型我们定义一个名为Tudui的卷积神经网络结构如下3 层卷积层Conv2d每层后接最大池化MaxPool2d展平层Flatten2 层全连接层LinearfromtorchimportnnclassTudui(nn.Module):def__init__(self):super(Tudui,self).__init__()self.model1nn.Sequential(nn.Conv2d(3,32,5,1,2),# 输入通道3输出通道32卷积核5×5步长1填充2nn.MaxPool2d(2),nn.Conv2d(32,32,5,1,2),nn.MaxPool2d(2),nn.Conv2d(32,64,5,1,2),nn.MaxPool2d(2),nn.Flatten(),# 展平后变成 64*4*4nn.Linear(64*4*4,64),nn.Linear(64,10))defforward(self,x):xself.model1(x)returnx5. 训练配置5.1 设备选择优先使用 GPU 进行训练并提供了多种设备指定方式importtorch# 方式一直接指定 cudadevicetorch.device(cuda)# 方式二指定具体 GPU 编号# device torch.device(cuda:0)# 方式三自动判断# device torch.device(cuda if torch.cuda.is_available() else cpu)5.2 数据加载器使用DataLoader将数据集分批加载每批 64 张图片fromtorch.utils.dataimportDataLoader train_dataloaderDataLoader(train_data,batch_size64)test_dataloaderDataLoader(test_data,batch_size64)5.3 损失函数与优化器损失函数交叉熵损失CrossEntropyLoss适用于多分类任务优化器随机梯度下降SGD学习率设为 0.01# 创建网络模型并移动到设备tuduiTudui().to(device)# 损失函数loss_fnnn.CrossEntropyLoss().to(device)# 优化器learning0.01# 1e-2 就是 0.01optimizertorch.optim.SGD(tudui.parameters(),learning)6. 完整训练流程6.1 训练主循环训练共进行 30 个轮次每轮包含训练步骤和测试步骤importtimefromtorch.utils.tensorboardimportSummaryWriter# 记录训练/测试次数total_train_step0total_test_step0epoch30# TensorBoard 记录writerSummaryWriter(logs)start_timetime.time()foriinrange(epoch):print(-----第 {} 轮训练开始-----.format(i1))# 训练步骤tudui.train()# 启用 dropout、batchnorm 等层fordataintrain_dataloader:imgs,targetsdata imgsimgs.to(device)targetstargets.to(device)outputstudui(imgs)lossloss_fn(outputs,targets)# 优化器调优optimizer.zero_grad()# 梯度清零loss.backward()# 反向传播optimizer.step()# 更新参数total_train_step1iftotal_train_step%1000:end_timetime.time()print(训练次数{}Loss{}.format(total_train_step,loss.item()))print(耗时{} 秒.format(end_time-start_time))writer.add_scalar(train_loss,loss.item(),total_train_step)# 测试步骤tudui.eval()# 关闭 dropout、batchnorm 等层total_test_loss0total_accuracy0withtorch.no_grad():# 不计算梯度fordataintest_dataloader:imgs,targetsdata imgsimgs.to(device)targetstargets.to(device)outputstudui(imgs)lossloss_fn(outputs,targets)total_test_lossloss.item()accuracy(outputs.argmax(1)targets).sum()total_accuracyaccuracyprint(整体测试集上的Loss{}.format(total_test_loss))print(整体测试集上的正确率{}.format(total_accuracy/test_data_size))writer.add_scalar(test_loss,total_test_loss,total_test_step)writer.add_scalar(test_accuracy,total_accuracy/test_data_size,total_test_step)total_test_step1# 保存模型torch.save(tudui,./model/tudui_{}.pth.format(i))print(模型已保存)writer.close()6.2 训练过程关键输出以下是训练过程中的部分关键输出展示了损失下降与准确率提升的趋势训练数据集的长度50000 测试数据集的长度10000 -----第 1 轮训练开始----- 训练次数100Loss2.2807211875915527 整体测试集上的Loss305.39513182640076 整体测试集上的正确率0.29249998927116394 模型已保存 -----第 10 轮训练开始----- 训练次数7100Loss1.284026861190796 整体测试集上的Loss195.0189254283905 整体测试集上的正确率0.560699999332428 模型已保存 -----第 20 轮训练开始----- 训练次数14900Loss0.6770450472831726 整体测试集上的Loss168.21677833795547 整体测试集上的正确率0.6384999752044678 模型已保存 -----第 30 轮训练开始----- 训练次数22700Loss0.733674168586731 整体测试集上的Loss174.22026354074478 整体测试集上的正确率0.6488999724388123 模型已保存从输出可以看出训练损失从第 1 轮的约 2.28 下降到第 30 轮的约 0.73测试集准确率从约 29.2% 提升到约 64.9%训练耗时约 317 秒约 5.3 分钟7. 模型验证识别真实图片训练完成后我们使用保存的模型对真实图片进行识别。这里以「狗」和「飞机」两张图片为例。7.1 验证狗图片importtorchvisionfromPILimportImagefromtorchimportnnimporttorch image_pathimgs/dog.pngimageImage.open(image_path)# PIL 类型图片imageimage.convert(RGB)# RGBA 转 RGBprint(image)# 图片预处理缩放至 32×32 并转为张量transformtorchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),torchvision.transforms.ToTensor()])imagetransform(image)print(image.shape)# 加载模型GPU 训练CPU 加载modeltorch.load(model/tudui_29.pth,map_locationtorch.device(cpu))print(model)# 转为四维符合网络输入要求imagetorch.reshape(image,(1,3,32,32))model.eval()withtorch.no_grad():outputmodel(image)print(output)print(output.argmax(1))# 概率最大类别的输出输出结果PIL.Image.Image image modeRGB size307x173 at 0x1A23417EDA0 torch.Size([3, 32, 32]) tensor([[ 1.3921, -5.8952, 6.7765, 2.6106, 3.3179, 6.3351, -5.1229, 3.0367, -8.6725, -5.5459]], grad_fnAddmmBackward0) tensor([2])输出tensor([2])表示模型预测该图片属于类别 2即「鸟」。注意这里模型将狗识别为鸟说明模型在部分类别上仍存在误判可通过增加训练轮次或优化模型结构来提升准确率。7.2 验证飞机图片importtorchvisionfromPILimportImagefromtorchimportnnimporttorch image_pathimgs/plane.pngimageImage.open(image_path)imageimage.convert(RGB)print(image)transformtorchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),torchvision.transforms.ToTensor()])imagetransform(image)print(image.shape)# 加载模型modeltorch.load(model/tudui_29.pth,map_locationtorch.device(cpu))print(model)imagetorch.reshape(image,(1,3,32,32))model.eval()withtorch.no_grad():outputmodel(image)print(output)print(output.argmax(1))输出结果PIL.Image.Image image modeRGB size245x181 at 0x1A236055908 torch.Size([3, 32, 32]) tensor([[ 3.9218, 1.2536, 1.1701, 0.1064, 2.2779, -4.4623, 0.0393, -4.2867, 2.3805, -2.1321]], grad_fnAddmmBackward0) tensor([0])输出tensor([0])表示模型预测该图片属于类别 0即「飞机」。识别正确8. 总结与优化建议8.1 总结本文完整演示了使用 PyTorch 训练 CIFAR10 图像分类模型的流程数据准备使用torchvision.datasets.CIFAR10自动下载并加载数据模型构建自定义 CNN 网络包含卷积、池化、全连接层训练配置交叉熵损失 SGD 优化器GPU 加速训练与测试30 轮训练每轮记录损失与准确率模型保存与加载使用torch.save/torch.load保存和加载模型图片验证对真实图片进行预处理并预测类别8.2 优化建议增加训练轮次当前 30 轮准确率约 64.9%可尝试训练 50 轮或更多调整学习率可尝试使用学习率衰减策略如StepLR数据增强使用随机裁剪、翻转等操作提升模型泛化能力更换优化器尝试Adam优化器通常收敛更快模型结构优化增加卷积层深度或使用残差结构ResNet9. 完整代码以下是训练部分的完整代码可直接复制运行importtorchvisionimporttorchfromtorchimportnnfromtorch.utils.dataimportDataLoaderfromtorch.utils.tensorboardimportSummaryWriterimporttime# 设备选择devicetorch.device(cuda)# 定义模型classTudui(nn.Module):def__init__(self):super(Tudui,self).__init__()self.model1nn.Sequential(nn.Conv2d(3,32,5,1,2),nn.MaxPool2d(2),nn.Conv2d(32,32,5,1,2),nn.MaxPool2d(2),nn.Conv2d(32,64,5,1,2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(64*4*4,64),nn.Linear(64,10))defforward(self,x):xself.model1(x)returnx# 准备数据集train_datatorchvision.datasets.CIFAR10(./dataset,trainTrue,transformtorchvision.transforms.ToTensor(),downloadTrue)test_datatorchvision.datasets.CIFAR10(./dataset,trainFalse,transformtorchvision.transforms.ToTensor(),downloadTrue)train_data_sizelen(train_data)test_data_sizelen(test_data)print(训练数据集的长度{}.format(train_data_size))print(测试数据集的长度{}.format(test_data_size))# 数据加载器train_dataloaderDataLoader(train_data,batch_size64)test_dataloaderDataLoader(test_data,batch_size64)# 创建模型tuduiTudui().to(device)# 损失函数loss_fnnn.CrossEntropyLoss().to(device)# 优化器learning0.01optimizertorch.optim.SGD(tudui.parameters(),learning)# 训练参数total_train_step0total_test_step0epoch30# TensorBoardwriterSummaryWriter(logs)start_timetime.time()foriinrange(epoch):print(-----第 {} 轮训练开始-----.format(i1))tudui.train()fordataintrain_dataloader:imgs,targetsdata imgsimgs.to(device)targetstargets.to(device)outputstudui(imgs)lossloss_fn(outputs,targets)optimizer.zero_grad()loss.backward()optimizer.step()total_train_step1iftotal_train_step%1000:end_timetime.time()print(训练次数{}Loss{}.format(total_train_step,loss.item()))print(耗时{} 秒.format(end_time-start_time))writer.add_scalar(train_loss,loss.item(),total_train_step)tudui.eval()total_test_loss0total_accuracy0withtorch.no_grad():fordataintest_dataloader:imgs,targetsdata imgsimgs.to(device)targetstargets.to(device)outputstudui(imgs)lossloss_fn(outputs,targets)total_test_lossloss.item()accuracy(outputs.argmax(1)targets).sum()total_accuracyaccuracyprint(整体测试集上的Loss{}.format(total_test_loss))print(整体测试集上的正确率{}.format(total_accuracy/test_data_size))writer.add_scalar(test_loss,total_test_loss,total_test_step)writer.add_scalar(test_accuracy,total_accuracy/test_data_size,total_test_step)total_test_step1torch.save(tudui,./model/tudui_{}.pth.format(i))print(模型已保存)writer.close()
延伸阅读

更多相关文章

2026/10/23 2:53:40

PTFE高频覆铜板制造能力评估:从参数、工艺到数据核验

PTFE覆铜板在高频PCB中的价值通常由Dk/Df规格书体现,但材料参数本身并不保证制造可行性。PTFE的表面能、CTE和力学特性使它在孔金属化、钻孔、去钻污和混压环节引入若干可测量的工艺风险。本文不以“选型推荐”为目标,而是把公开标准、工艺文献和专利中出…

2026/10/23 7:29:10

从零跑通 Pokemon Auto Chess:本地部署完整指南

从零跑通 Pokemon Auto Chess:本地部署完整指南 【免费下载链接】pokemonAutoChess Pokemon Auto Chess Game. Made by fans for fans. Open source, non profit. All rights to the Pokemon Company. 项目地址: https://gitcode.com/GitHub_Trending/po/pokemonA…

2026/10/23 7:29:10

3步打造专属启动体验:PCL2轻量级启动器深度评测

3步打造专属启动体验:PCL2轻量级启动器深度评测 解决传统启动器3大痛点 在数字化工作流中,启动器作为用户与系统交互的第一道门户,其体验直接影响工作效率。PCL2(Personal Configurable Lightweight Launcher 2)作为一…

2026/10/22 11:29:28

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/23 0:02:26

Verilog实现FPGA密码锁:矩阵键盘与状态机设计实战

说实话,这几年接触了不少想入门FPGA的朋友,如果你问哪个项目能一口气把Verilog的核心基本功串起来,我通常会推荐电子密码锁。这个项目看着不起眼,却把矩阵键盘扫描、按键消抖、状态机设计、动态显示刷新、外设控制这些数字逻辑里的…

2026/10/23 0:02:26

数据服务监控运维实战:从指标体系到告警治理与故障排查

周末凌晨两点,手机震了。第一反应是“数据服务挂了”。打开电脑看了下,果然,某张核心报表的数据产出时间已经超过SLA两小时,下游三个业务方连着发来问询。这种场景,做过大数据运维的人都不会陌生。数据服务的监控与运维…

2026/10/23 0:02:26

FreeRTOS任务通知实战详解:内核原理、API与避坑指南

裸机编程切到RTOS之后,任务之间的通信和同步永远是躲不开的坎。前面聊过队列、信号量、互斥锁、事件组,这次把FreeRTOS任务通知(Task Notification)单独拎出来讲透。原因很简单:任务通知是FreeRTOS里最容易用错、也最容…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑