32.完整的模型验证套路
一、模型验证套路CIFAR数据集如果模型训练好了那么就可以对外提供实际的应用了。下面我们要做一个完整的 ‌PyTorch 模型推理预测流程‌。它的主要目的是加载一张图片使用预先训练好的神经网络模型对该图片进行分类预测并输出预测结果。1. 图像读取与预处理我们的模型是基于CIFAR10数据集去训练的这个数据集有10个类别的图片这个模型结果会输出测试图像的分别属于10个类别概率那么概率最大的类别就是这个模型推测出来我们测试的图片所属的类别。所以首先我们在网上任意挑选一张属于这10个类别的图片来测试这个模型推测的准确性是否能正确识别这个图片属于什么类别的图片。1如何查看CIFAR10的类别如下我们在红框位置打断点然后就可以在变量面板里查看class_to_idx的对应的类别到我们的索引。如上我们看到这个模型有如下10种类别那么我们就任意挑选一张飞机的图片进行测试看我们的模型输出的10个类别中最大概率的类别是否是索引为0的位置的概率。0:airplane1:automobile2:bird3:cat4:deer5:dog6:frog7:horse8:ship9:truck那么我们从网上找了一张飞机图片命名为airplane.png2对输入图像做预处理注意我们之前实现的模型要求的输入图片尺寸如下是3通道的32 X 32的像素图像由于我们的模型是要求输入3通道32 x 32像素的图像的所以我们需要将我们的飞机图片转化为对应要求的图片格式。操作步骤使用Compose组合多个transformResize调整图片尺寸ToTensor转为张量。根据官方文档我们使用Resize,应当传入的参数size 是 (3232)。关于convert(‘RGB’)强制将图片转换为 RGB 模式。png是四个通道除了RGB三个通道之外还有一个透明通道。因为后续的卷积层期望输入是 3 个通道红、绿、蓝如果图片是灰度1通道或带透明通道4通道会导致形状不匹配报错。图像预处理代码总的来说我们的图像预处理代码如下importtorchimporttorchvisionfromPILimportImagefromtorchimportnn image_path../imgs/airplane.pngimageImage.open(image_path)print(image)imageimage.convert(RGB)transformtorchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),torchvision.transforms.ToTensor()])imagetransform(image)print(image.shape)我们执行如上代码控制台打印如下打印出来的图片形状如我们所要求的。是[3,32,32]2.加载训练好的神经网络模型并且拷贝Tudui类代码我们在加载训练好的神经网络模型前需要引入之前训练时定义的Tudui 类的代码。原因如下Tudui 类的代码定义了模型的“骨架”或“结构”而 torch.load加载的是这个骨架里填充的“血肉”权重参数。如果没有这个类定义PyTorch 就不知道如何构建这个模型来容纳加载进来的参数。‌class Tudui(nn.Module): …‌定义了模型长什么样几层卷积、几层线性层等。这是‌蓝图‌。‌torch.load(“tudui_29_gpu.pth”)‌根据蓝图重建模型并填入训练好的权重。这是‌建造过程‌。importtorchimporttorchvisionfromPILimportImagefromtorchimportnn image_path../imgs/airplane.pngimageImage.open(image_path)print(image)imageimage.convert(RGB)transformtorchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),torchvision.transforms.ToTensor()])imagetransform(image)print(image.shape)classTudui(nn.Module):def__init__(self):super(Tudui,self).__init__()self.modelnn.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.model(x)returnx modeltorch.load(tudui_29_gpu.pth,weights_onlyFalse,map_locationtorch.device(cpu))print(model)imagetorch.reshape(image,(1,3,32,32))细说torch.load:代码中没有显式地执行 model Tudui()。这是因为 torch.load ‌内部‌完成了实例化的过程。torch.load 读取文件发现里面存的是一个 Tudui 类的实例。它在内存中重新创建了一个 Tudui 对象。它将文件中保存的权重参数填入这个新创建的对象中。最后将这个填充好参数的对象赋值给变量 model。所以Tudui 类的定义是 torch.load 能够成功工作的‌前提条件‌。关于torch.load中的map_locationtorch.device(‘cpu’)参数当我们没有加上map_locationtorch.device(‘cpu’)参数的时候控制台会报错如下raiseRuntimeError(RuntimeError:Attempting to deserializeobjecton a CUDA device but torch.cuda.is_available()isFalse.If you are running on a CPU-only machine,please use torch.loadwithmap_locationtorch.device(cpu)tomapyour storages to the CPU.进程已结束退出代码为1这个报错的核心含义是‌设备不匹配‌。你尝试加载的模型文件.pth 或 .pt是在 ‌GPU (CUDA)‌ 环境下训练并保存的但你当前运行代码的环境‌没有可用的 GPU‌或者 PyTorch 无法识别到 GPU导致加载失败。解决办法如下强制加载到 CPU最推荐通用性强在 torch.load 中添加 map_location 参数告诉 PyTorch 把原本在 GPU 上的数据全部映射到 CPU 上所以我们需要加上 map_locationtorch.device(‘cpu’)参数关于torch.reshape(image, (1, 3, 32, 32))image torch.reshape(image, (1, 3, 32, 32)) 的核心目的是‌为单张图片添加“批次Batch”维度使其符合模型输入的格式要求‌。在 PyTorch 中卷积神经网络如代码中的 Tudui 模型的第一层是 nn.Conv2d。根据 PyTorch官方文档及最佳实践Conv2d 层期望的输入张量必须是 ‌4维‌ 的见如下红框中的输入格式要求。image torch.reshape(image, (1, 3, 32, 32)) 也便是在告诉模型虽然我只给你一张图但请把它当作一个包含1个样本的‘批次’来处理。3.执行模型预测结果# -*- coding: utf-8 -*-# 作者小土堆# 公众号土堆碎念importtorchimporttorchvisionfromPILimportImagefromtorchimportnn image_path../imgs/airplane.pngimageImage.open(image_path)print(image)imageimage.convert(RGB)transformtorchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),torchvision.transforms.ToTensor()])imagetransform(image)print(image.shape)classTudui(nn.Module):def__init__(self):super(Tudui,self).__init__()self.modelnn.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.model(x)returnx modeltorch.load(tudui_29_gpu.pth,weights_onlyFalse,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))关于model.eval()关于torch.no_grad()关于output model(image)作用‌: 执行模型的前向传播得到原始输出结果。‌结果形态‌:根据我们tudui模型定义最后一层是 nn.Linear(64, 10)即创建一个全连接层它接收长度为 64 的特征向量作为输入并输出长度为 10 的结果向量通常用于将提取到的特征映射到 10 个分类类别上。‌所以 output 是一个形状为 (1, 10) 的张量因为之前 reshape 成了 batch_size1输出结果‌是这个(Batch_Size, Num_Classes)‌格式的。这 10 个数值被称为 ‌Logits‌未归一化的预测分数分别代表图片属于 10 个类别的可能性得分。‌注意这些数值不是概率可能有负数且总和不为 1。‌关于 print(output.argmax(1))作用‌: 找出预测概率最大的类别索引。argmax 意为 “argument of the maximum”即返回最大值所在的‌位置索引‌而不是最大值本身。总结这段代码完整表达了告诉模型现在是测试状态eval为了省内存别算梯度no_grad把图片丢进去跑一遍forward然后看看哪个类别的得分最高argmax打印出这个类别的编号完整模型验证代码# -*- coding: utf-8 -*-# 作者小土堆# 公众号土堆碎念importtorchimporttorchvisionfromPILimportImagefromtorchimportnn image_path../imgs/airplane.pngimageImage.open(image_path)print(image)# 强制将图片转换为 RGB 模式。png是四个通道除了RGB三个通道之外还有一个透明通道。因为后续的卷积层期望输入是 3 个通道红、绿、蓝如果图片是灰度1通道或带透明通道4通道会导致形状不匹配报错。imageimage.convert(RGB)# 操作步骤# 使用Compose组合多个transform# Resize调整图片尺寸# ToTensor转为张量transformtorchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),torchvision.transforms.ToTensor()])imagetransform(image)print(image.shape)classTudui(nn.Module):def__init__(self):super(Tudui,self).__init__()self.modelnn.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.model(x)returnx# CPU加载GPU训练的模型需指定map_locationmodeltorch.load(tudui_29_gpu.pth,weights_onlyFalse,map_locationtorch.device(cpu))# 模型验证打印model结构确认加载成功print(model)# 使用reshape添加batch维度imagetorch.reshape(image,(1,3,32,32))model.eval()withtorch.no_grad():outputmodel(image)print(output)# 使用argmax获取预测类别print(output.argmax(1))我们执行如上代码发现控制台打印的输出推测正确打印出来的十个类别概率中只有索引位置为0的概率6.4093的概率是最大的而类别0对应的就是飞机。

相关新闻

Tomcat 8 启动失败排查指南:JDK兼容、配置陷阱与日志诊断

Tomcat 8 启动失败排查指南:JDK兼容、配置陷阱与日志诊断

简介:本资源为 Apache Tomcat 8 官方二进制发行版(v8.0.32)的完整本地镜像包,面向 Java Web 开发初学者、后端工程师及教学实践者,用于快速搭建本地 Servlet/JSP 运行环境,解决开发调试中依赖官方下载慢、网…

2026/10/18 21:57:18 阅读更多 →
纯OpenCV车牌识别实战:零深度学习的鲁棒LPR方案

纯OpenCV车牌识别实战:零深度学习的鲁棒LPR方案

简介:本资源是一套基于Python与OpenCV实现的完整车牌识别系统源码及配套数据集,面向计算机视觉初学者、图像处理课程实践者及智能交通方向项目开发者,解决从图像预处理、车牌定位、字符分割到OCR识别的全流程技术落地问题。压缩包共30个文件&…

2026/10/18 21:57:18 阅读更多 →
HTML语义化标签与整站结构规划:从基础到实战

HTML语义化标签与整站结构规划:从基础到实战

写前端久了你会发现一个很有意思的现象:很多人觉得HTML太简单,简单到不值得单独拿出一篇文章来讲。但恰恰是这种“简单”,让不少项目在后期付出了成倍的返工代价。HTML网页结构搭建这件事,不是说你用了某种标签就行,而…

2026/10/18 21:57:18 阅读更多 →

最新新闻

Agent Skills深度架构解析与实战:从MCP到TaoToken的智能体能力编排

Agent Skills深度架构解析与实战:从MCP到TaoToken的智能体能力编排

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:25:02 阅读更多 →
如何将 PostgreSQL MCP 服务器与 Cursor 或 Claude 结合使用:TaoToken 统一 Key 接入实战

如何将 PostgreSQL MCP 服务器与 Cursor 或 Claude 结合使用:TaoToken 统一 Key 接入实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:25:02 阅读更多 →
那张被审稿人点赞的图是怎么做出来的?科迅捷AI(官方网站:www.kexunjie.com)有答案

那张被审稿人点赞的图是怎么做出来的?科迅捷AI(官方网站:www.kexunjie.com)有答案

想象这样一个场景:你的博士论文投稿三个月,审稿意见回来了,其中一条写着这张图设计得尤其清晰、信息量大。这是审稿人少见的正面评价,在满是修改意见的意见单里格外显眼。那张被点赞的图,到底是怎么做出来的&#xff1…

2026/10/19 0:25:02 阅读更多 →
论文里的数据分析别硬编,科迅捷AI(官方网站:www.kexunjie.com)把方法讲明白

论文里的数据分析别硬编,科迅捷AI(官方网站:www.kexunjie.com)把方法讲明白

本科论文里最常见的硬伤之一,是数据分析部分。数据是编的、图表是凑的、结论是事先想好再回头找数的。每年答辩季,老师都能听到几个自相矛盾的回答,问题几乎都出在数据不是自己做的。这一段对比一下硬编数据和认真做分析两种路径的差别&#…

2026/10/19 0:25:02 阅读更多 →
第一次听说科迅捷AI(官方网站:www.kexunjie.com),它到底能帮你做什么

第一次听说科迅捷AI(官方网站:www.kexunjie.com),它到底能帮你做什么

开学第一周,专科班的导师被学生问了一圈:老师,听说有个写作辅助平台,到底靠不靠谱?我带过几届学生,对这类工具的态度很明确:它不是替你写论文的捷径,而是帮你少走弯路的脚手架。下面…

2026/10/19 0:25:02 阅读更多 →
artcraft 项目实战:从零搭建创意工具的技术选型与核心模块拆解

artcraft 项目实战:从零搭建创意工具的技术选型与核心模块拆解

1. 从“artcraft”这个名字说起:它到底想解决什么问题第一次看到“artcraft”这个标题,我脑子里蹦出来的第一反应是“艺术”加“手艺”的组合词。直觉告诉我,这不是一个纯技术框架的名字,也不是某个具体产品的品牌名,它…

2026/10/19 0:24:02 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →