Pytorch【9】训练+验证完整实战流程|划分数据集、准确率计算

从代码学习深度学习 - 多GPU训练 PyTorch 版 深度学习模型的训练通常需要大量计算资源,尤其是在处理大规模数据集或复杂模型时,单GPU的性能可能成为瓶颈。多GPU并行训练通过将计算任务分配到多个GPU上,可以显著加速训练过程。PyTorch 提供了强大的多GPU支持,例如通过实现数据并行,适合快速上手。本文将基于一个实际的多GPU训练示例,展示如何使用 PyTorch 在 MNIST 数据集上训练一个卷积神经网络(CNN)。我们将完整呈现代码,解析其实现原理,并展示训练结果的可视化。 阅读详情

标签:Pytorch、训练验证流程、准确率、数据集划分、model.eval()
简介:真实项目不能只跑训练loss!必须划分训练集、验证集,每轮训练后在验证集上评估模型效果,防止过拟合。本文搭建一套工业界标准的训练+验证模板,可直接复用。

一、前言

前面已经掌握张量、自动求导、网络搭建、损失优化、Dataset/DataLoader、模型保存加载。
之前的代码只有训练,缺少验证环节,存在几个问题:

  1. 无法判断模型是否过拟合(训练loss很低,陌生数据效果很差)
  2. 看不到准确率指标(分类任务最关心acc)
  3. 没有标准化的epoch循环结构

标准流程:
每个epoch:

  1. 训练阶段:开启 model.train(),前向、反向、更新参数
  2. 验证阶段:开启 model.eval(),torch.no_grad(),只计算loss和指标,不更新权重
  3. 一轮结束后打印训练loss、验证loss、验证准确率
  4. 根据验证指标保存最优模型

二、数据集划分:train / val

两种常用方案:

  1. 手动划分文件列表(适合自己的图片数据集)
  2. torch.utils.data.random_split 直接划分数据集(快速原型首选)
from torch.utils.data import random_split

# 原始完整数据集
full_dataset = datasets.MNIST(root="./data", train=True, transform=trans, download=True)
# 按照 8:2 划分训练集、验证集
train_size = int(0.8 * len(full_dataset))
val_size = len(full_dataset) - train_size
train_dataset, val_dataset = random_split(full_dataset, [train_size, val_size])

train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=64, shuffle=False)

✅ 训练集 shuffle=True;验证集 shuffle=False,保证评估稳定

三、准确率计算逻辑(分类任务)

模型输出:batch × class_num,是各个类别的logits

  • torch.max(outputs, dim=1) 取出每个样本预测分数最大的类别索引
  • 和真实label对比,统计相等的数量,除以总样本数得到准确率
outputs = model(imgs)
preds = torch.max(outputs, dim=1)[1]
correct = torch.sum(preds == labels)
acc = correct.item() / labels.size(0)

四、完整可运行代码(MNIST手写数字分类)

import torch
import torch.nn as nn
from torch.utils.data import DataLoader, random_split
from torchvision import datasets, transforms

# 1. 设备自动选择
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"use device: {device}")

# 2. 数据预处理
trans = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])

# 3. 数据集划分
full_data = datasets.MNIST(root="./data", train=True, transform=trans, download=True)
train_ds, val_ds = random_split(full_data, [int(0.8*len(full_data)), len(full_data)-int(0.8*len(full_data))])
train_loader = DataLoader(train_ds, batch_size=64, shuffle=True)
val_loader = DataLoader(val_ds, batch_size=64, shuffle=False)

# 4. 简单网络
class MnistNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Sequential(
            nn.Flatten(),
            nn.Linear(28*28, 128),
            nn.ReLU(),
            nn.Linear(128, 10)
        )
    def forward(self, x):
        return self.fc(x)

model = MnistNet().to(device)
loss_fn = nn.CrossEntropyLoss()
opt = torch.optim.Adam(model.parameters(), lr=1e-3)

# 5. 主训练循环
epoch_num = 10
best_val_acc = 0.0

for epoch in range(epoch_num):
    # ========== 训练阶段 ==========
    model.train()
    train_loss_sum = 0.0
    for imgs, labels in train_loader:
        imgs, labels = imgs.to(device), labels.to(device)
        outputs = model(imgs)
        loss = loss_fn(outputs, labels)

        opt.zero_grad()
        loss.backward()
        opt.step()
        train_loss_sum += loss.item()

    train_loss_avg = train_loss_sum / len(train_loader)

    # ========== 验证阶段 ==========
    model.eval()
    val_loss_sum = 0.0
    correct_sum = 0
    total_num = 0
    with torch.no_grad():
        for imgs, labels in val_loader:
            imgs, labels = imgs.to(device), labels.to(device)
            outputs = model(imgs)
            loss = loss_fn(outputs, labels)
            val_loss_sum += loss.item()

            preds = torch.max(outputs, dim=1)[1]
            correct_sum += torch.sum(preds == labels)
            total_num += labels.size(0)

    val_loss_avg = val_loss_sum / len(val_loader)
    val_acc = correct_sum.item() / total_num

    print(f"【Epoch {epoch+1}/{epoch_num}】")
    print(f"train_loss:{train_loss_avg:.4f} | val_loss:{val_loss_avg:.4f} | val_acc:{val_acc:.4f}\n")

    # 保存最优模型
    if val_acc > best_val_acc:
        best_val_acc = val_acc
        torch.save(model.state_dict(), "mnist_best.pth")
        print(f"✅ 保存最优模型,当前最佳acc:{best_val_acc:.4f}")

五、关键要点拆解

  1. device 迁移:数据、模型都要 .to(device),否则报设备不匹配
  2. model.train() / model.eval()
    • train:BN、Dropout生效,会更新参数统计量
    • eval:BN、Dropout固定,只做推理
  3. with torch.no_grad():验证阶段关闭计算图,不占用显存,不计算梯度
  4. 指标更新:累计loss在每个batch相加,最后除以loader长度得到平均loss
  5. 最优模型保存逻辑:按验证集指标保存,不是按训练loss保存,这是对抗过拟合的关键

六、过拟合判断(看日志)

现象结论
train_loss下降,val_loss同步下降正常收敛
train_loss持续下降,val_loss先降后升过拟合!停止训练、加正则、扩增数据
train_loss很高、val_loss很高欠拟合:网络容量不足、学习率不合适

七、常见踩坑点

  1. 验证集忘记加 torch.no_grad() → 显存暴涨,速度变慢
  2. 验证阶段还写 loss.backward()、opt.step() → 偷偷更新权重,验证集泄露
  3. 准确率计算直接用batch累加,没有按总样本归一化
  4. random_split划分后,transform是共享的;如果训练和验证要不同增强,不能用random_split
  5. 把测试集当成验证集:测试集只能最后一次性评估,训练过程绝对不能碰
深度学习数据集划分:训练集、验证集、测试集的核心原理与工程实践 在机器学习与深度学习项目中,数据集划分是模型开发流程中至关重要的一环,它直接关系到模型评估的可靠性与泛化能力。其核心原理在于通过将数据划分为训练集、验证集和测试集三个互斥的子集,分别承担模型学习、超参数调优与最终性能评估的职责,从而构建一个严谨的模型开发与评估闭环。这项技术的价值在于防止过拟合、提供无偏的性能估计,是确保模型从“实验室”成功走向“生产环境”的基石。其应用场景覆盖了从计算机视觉、自然语言处理到时间序列预测等几乎所有监督学习任务。本文将深入探讨数据划分的常见陷阱,例如测试集信息泄露和未进行分层抽 阅读详情

相关推荐

保姆级教程:用ddddocr+PyTorch训练你自己的验证码识别模型(Windows环境)

本文提供了一份详细的Windows环境下使用ddddocr和PyTorch训练验证码识别模型的保姆级教程。从环境配置、数据集准备到模型训练与优化,逐步指导读者构建高效的验证码识别系统,特别适合需要自动化处理验证码的开发者学习实践。

weixin_33182798的博客 347

PyTorch MNIST数据集划分:三步切出训练集、验证集、测试集

在深度学习中,合理划分数据集是评估模型泛化能力的基础。训练集负责学习参数,验证集用于超参数选择和早停,测试集则用于最终评估。如果验证集切分不当,容易出现验证集泄漏、随机种子不一致、shuffle配置错误等问题,导致实验结果忽高忽低、指标虚高。PyTorch通过torch.utils.data.random_split可以方便地将MNIST数据集按比例切分为训练集和验证集,并通过固定generator种子实现可复现实验。这种划分流程适用于图像分类等多种深度学习任务,在torchvision官方MNIST仅提供

weixin_33937778的博客 619

ConvNeXt-Tiny实战:用PyTorch在自定义花朵数据集上快速达到98%准确率

事实上,ConvNeXt系列模型通过巧妙融合CNN的局部特征提取优势和Transformer的全局建模思想,在保持高效计算的同时,达到了与Swin Transformer媲美的性能。在实际工业应用中,我们经常面临这样的困境:拥有数千张标注图像的小规模数据集,需要快速开发出高精度的分类模型,同时要控制计算成本。ConvNeXt-Tiny的参数量仅约28M,是原版ResNet-50的90%大小,却在ImageNet上达到了82.9%的top-1准确率。

406

MNIST数据集3步分离:训练/验证/测试集划分实操

在机器学习与深度学习项目中,数据集的质量与划分方式直接影响模型评估的可靠性。训练集用于参数学习,验证集辅助调参,测试集作为最终评估基准,三者分离能有效避免过拟合测试集带来的虚假高分。PyTorch作为主流深度学习框架,提供了灵活的Dataset和DataLoader机制,结合random_split可高效完成数据子集切分。本文以MNIST手写数字识别为例,讲解如何通过3步实现训练/验证/测试集分离:加载数据、随机划分、构建数据加载器,并给出完整代码与常见坑点,帮助读者建立规范的数据管线。

weixin_34302798的博客 1717

Pytorch利用CNN识别计算题验证码

其实识别计算题验证码和识四六位定长验证码原理是一样的,利用深度学习识别的话方法有很多,可以利用RNN,可以利用目标检测,但是这里我就拿最简单的CNN来举例,这种简单的方式希望能引导大家,去实现更多的方式,先来看下数据集 准备数据集,我的数据集是这样的,数据集总数有300多张,但是有200多张是重复的,真正能提供特征的话只有100多张,不过需要识别的只需要前三位就够了,数据集的分布分别为, 1-9的数字 ,3位运算符(没有除法),1-9的数字,即使全部排列组合,也没有多少数据集,当然,我没有采样到全部的数据

码王吴彦祖的博客 3234

AI驱动的数据完整性:ECC到S/4HANA迁移

在SAP ECC到S/4HANA的迁移过程中,数据完整性验证是最复杂且关键的挑战之一。本文介绍了一个全面的AI驱动的端到端数据完整性框架,用于对账事务数据并验证数百万条主数据记录和事务记录的完整性。该框架结合了模式映射、自然语言提示到SQL生成、基于LLM的解决方案、大规模数据对账的数据完整性工具、基于云的测试数据管理以及实时Power BI仪表板,为开发者提供了一个可重复、可扩展的工作流程,确保ERP迁移过程中的数据质量。

简简单单Onlinezuozuo 1173

【保姆级教程】使用 PyTorch 自定义卷积神经网络(CNN) 实现图像分类、训练验证、预测全流程【附数据集与源码】

【保姆级教程】使用 PyTorch 自定义卷积神经网络(CNN) 实现图像分类、训练验证、预测全流程【附数据集与源码】

阿旭的博客 4538

iTunes登录协议全解析:从抓包到加密参数生成(含HTTPDebugger避坑指南)

本文深度解析iTunes登录协议,提供从环境搭建、绕过反调试机制到捕获网络流量的完整实战指南。重点剖析了如何利用HTTPDebugger等工具进行抓包,并详细解读了核心加密参数X-Apple-ActionSignature的生成逻辑,为网络安全研究员和协议分析工程师提供了一份详尽的逆向分析与协议复现教程。

weixin_28314575的博客 869

卷积神经网络(LeNet)识别Fashion-MNIST数据集(Pytorch版)

卷积神经网络(LeNet)识别Fashion-MNIST数据集(Pytorch版)1. 前言1.1 案例介绍1.2 环境配置1.3 模块导入2. 图像数据准备2.1 训练验证集的准备2.2 测试集的准备3. 卷积神经网络的搭建4. 卷积神经网络训练与预测5. 运行程序 1. 前言 1.1 案例介绍 本案例使用Pytorch搭建一个类似LeNet-5的网络结构,用于Fashion-MNIST数据集的图像分类。针对该问题的分析可以分为数据准备、模型建立以及使用训练集进行训练和使用测试集测试模型的效果。 1.2

Rome was not built in a day. 7480

VUE3 实战手记(一)集成 EasyUI for Vue 组件库

本文详细介绍了如何在VUE3项目中集成EasyUI for Vue组件库,包括环境准备、基础安装、配置与集成、TypeScript类型问题解决以及组件实战等内容。EasyUI以其轻量级和开箱即用的特性,特别适合快速开发后台管理系统,提升开发效率。

weixin_30628801的博客 530

ArcGIS-裁剪遥感影像及dem图像

6、选择【工具箱】-【数据管理工具】-【栅格】-【裁剪】。在【输入栅格】里选择要裁剪的dem,在【输出范围】里选择刚创建的裁剪范围。选择一个输出路径,其他参数保存默认。2、起一个名称,要素类型选择【面】。点击【编辑】选择与要裁剪的dem一致的地理坐标系。1、创建需要裁剪区域的面层shp,右击选择【新建】-【shapefile】3、点击编辑器,选择开始编辑。4、选择【裁剪范围】,点击确定。5、画出想要裁剪的范围并保存。

siwenaiyou的博客 1万+

SAN 模型实战:ImageNet 数据集训练与测试完整流程(附代码)

探索自注意力机制在图像识别领域的终极指南!本文将详细介绍如何在 ImageNet 数据集上训练和测试 SAN(Self-attention Network)模型的完整流程。无论你是深度学习初学者还是希望掌握最新计算机视觉技术的开发者,这篇教程都将为你提供简单易懂的实战指导。😊 ## 📋 什么是 SAN 模型? SAN(Self-attention Network)是一种创新的自注意力网络,

gitblog_00289的博客 875

【100分】【等和子数组最小和】

逆序排序,这样能够使得在分组时优先选取较大的元素,以便将元素分配到较小的子集中,从而使得每个子集的和相对均衡。给定一个数组nums,将元素分为若干个组,使得每组和相等,求出满足条件的所有分组中,组内元素和的最小值。分成若干个组,使得每组的和相等,并求出满足条件的所有分组中,组内元素和的最小值。在递归的过程中,我们需要注意一个优化点,即避免将相同和的桶重复计算。4 个子集(5),(1,4),(2,3),(2,3)2 个子集(5, 1, 4),(2,3, 2,3)个子集,则返回子集和的最小值,如果不能,则将。

weixin_54707168的博客 1168

Python案例实战《水果识别模型训练及调用》

如题。

程序员大佬超的博客 1201

2021-10-29【微生物】丨基于qiime2工具16S/ITS分析全套流程(上)

目录摘要工具与方法使用命令结果展示总结二级目录三级目录 摘要 前两个月项目特别多,最近终于有机会闲下来写点文章,把之前搭建的流程梳理一遍。前同事分析16S/ITS使用的qiime1,我接手后感觉不太适应,希望能够使用新版本来搭建,于是花了几天时间重新搭了这个流程, 工具与方法 使用工具:qiime2 使用版本:qiime2-2021.4 参考文档:https://docs.qiime2.org/2021.4/(最新版本2021.8) 使用命令 在这里插入代码片 结果展示 总结 二级目录 三级目录 ...

1万+

Python跨年烟花(完整代码)

Python语言实现跨年烟花动画的完整代码。

AIGC 3万+

[Pytorch系列-46]:卷积神经网络 - 用GPU训练ResNet+CIFAR100数据集

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_优快云博客 本文网址:https://blog.youkuaiyun.com/HiWangWenBing/article/details/121072835 前言:ResNet网络详解 (1)LeNet网络详解 [人工智能-深度学习-38]:卷积神经网络CNN - 常见分类网络- ResNet网络架构分析与详解_文火冰糖(王文兵)的博客-优快云博客https://blog.youkuaiyun.com/HiWangWenBing/arti

文火冰糖(王文兵)的博客 2万+

AD(Altium Designer)器件封装——立创商城导出原理图和PCB完成器件封装操作指南

官网:www.SZLCSC.COM以芯片为例器件类——>芯片类——>对应芯片确定芯片——>数据手册1:原理图2:PCB3:打开操作流程选中原理图——>文件——>导出——>AD1: ✔2:导出AD文件操作流程选中PCB图——>文件——>导出——>AD1: ✔2:导出AD文件1:PCB图2:原理图操作流程文件——>打开操作流程选中文件——>打开操作流程项目文件——>添加新的...到工程——>Schematic Library新原理图库操作流程项目文件——>添加新的...到工程——>PCB Library新的PC

XU157303764的博客 5437

DeeplabV3 for PyTorch实战教程:5步完成Cityscapes数据集语义分割训练

🚀 **深度学习语义分割**是计算机视觉领域的重要任务,而**DeeplabV3**作为经典的语义分割网络,在**Cityscapes数据集**上表现出色。本教程将带你快速上手**DeeplabV3 for PyTorch**项目,只需5个简单步骤即可完成完整的语义分割训练流程!无论你是深度学习新手还是经验丰富的开发者,这篇指南都能帮助你快速掌握**PyTorch语义分割**的核心技能。 ##

gitblog_00352的博客 1012

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

如何快速复现MobileNetV3:从零开始训练达到75.9%准确率的完整流程

想要在移动端部署高效的深度学习模型?🤔 MobileNetV3是Google专为移动设备设计的轻量级神经网络,在ImageNet数据集上能达到惊人的75.9%准确率!🎯 本文为您提供完整的MobileNetV3复现指南,从环境搭建到模型训练,一步步教您如何快速复现这个优秀的轻量级模型。 ## 📦 项目环境搭建与准备 ### 一键安装依赖环境 首先克隆项目仓库并安装必要的依赖: ```b

gitblog_00146的博客 422

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

PyTorch 1.9+ 处理 CK+ 数据集:10折交叉验证与 94.64% 准确率复现指南

本文详细介绍了如何使用PyTorch 1.9+处理CK+数据集,通过10折交叉验证实现94.64%的高准确率表情识别模型。内容涵盖数据预处理、模型架构选择(VGG19/ResNet18)、训练策略优化以及高级技巧如知识蒸馏和混合精度训练,为计算机视觉研究者提供完整复现指南。

weixin_29050513的博客 276

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

365天深度学习训练营-第P3周:Pytorch实现天气识别

可视化准确率:

m0_73067538的博客 984

PyTorch标准化训练流程实战:从数据划分到模型保存的完整指南

深度学习模型训练的核心在于构建一个健壮、可复现的标准化流程。这一流程基于监督学习的基本原理,通过合理的数据划分、训练循环设计和性能监控,确保模型能够从数据中有效学习并泛化到新样本。其技术价值在于将实验性代码转化为可维护的工程实践,提升模型开发效率和可靠性。在应用场景上,无论是计算机视觉中的目标检测(如YOLO系列)或图像分割(如UNet),还是自然语言处理中的Transformer模型,标准化的训练流程都是项目成功的通用骨架。本文聚焦于PyTorch框架下的工程实践,详细解析如何避免数据泄露、实现训练验证循

weixin_30378623的博客 404

PyTorch实战:MNIST手写数字识别完整训练与验证流程

深度学习图像分类任务中,卷积神经网络通过局部感知和参数共享高效提取视觉特征,而交叉熵损失与反向传播机制则驱动模型参数迭代优化,最终实现精准分类。这一技术广泛应用于手写数字识别、OCR及工业质检等场景。作为经典基准数据集,MNIST为验证模型训练与泛化能力提供了理想测试场。以PyTorch框架为核心,从数据加载、CNN搭建、训练循环到验证评估,完整梳理一套可复制的流程,帮助开发者掌握设备管理、损失监控、模型持久化等关键工程细节,为迁移到更复杂视觉任务打下坚实基础。

weixin_30558697的博客 143

PyTorch入门实战:从MNIST数据集到线性分类器完整训练指南

深度学习框架的核心在于张量计算与自动求导机制,而图像分类是理解这一机制的最佳切入点。通过数据加载、前向传播、损失计算、反向传播和参数更新的完整流程,可以直观掌握神经网络训练的基本原理。MNIST手写数字数据集作为经典基准,涵盖了图像分类任务的全部关键环节,是验证代码逻辑正确性的理想试金石。在PyTorch中,利用torchvision和DataLoader可以高效完成数据准备,通过nn.Module定义线性分类器,配合CrossEntropyLoss和Adam优化器实现端到端训练。这一过程不仅帮助开发者理解

weixin_29038155的博客 80

PyTorch图像分类实战:CNN模型搭建与训练全流程

卷积神经网络(CNN)是深度学习处理图像任务的核心技术之一,通过卷积层与池化层的组合自动提取图像特征,并借助全连接层完成分类决策。相比传统手工特征,CNN在图像分类、目标检测等视觉任务中表现出更强的泛化能力与端到端学习优势。PyTorch作为主流深度学习框架,提供了灵活的张量操作与自动求导机制,适合快速搭建和训练图像分类模型。本文基于PyTorch实现一个完整的CNN图像分类实战流程,涵盖数据加载、模型结构设计、训练验证、模型保存与推理等关键环节,帮助初学者掌握从理论到工程实践的完整链路。

weixin_34252686的博客 393
上一篇: Pytorch【8】模型保存与加载(断点续训、GPU/CPU兼容踩坑)
下一篇: Pytorch【10】卷积神经网络CNN实战|卷积、池化、padding、stride,CNN训练MNIST
Be for thing
博客等级 码龄7年 131粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Be for thing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值