技术背景

在前面一篇博客中,我们介绍了MindSpore在机器学习过程中保存和加载模型的方法。这种将模型存储为静态文件的做法,使得我们可以更灵活的使用训练出来的模型,比如用于各种数据集的验证,或者是迁移学习等场景。

前言

这里使用的数据集和加载的模型,都来自于这篇博客。关于MindSpore的环境部署,可以参考这两篇博客:CPU版本安装GPU版本安装,当然,这两个方案都使用了Docker容器化部署的策略,这跟个人编程习惯有关。需要说明的是,在GPU版本中可以使用CPU版本的context,但是CPU版本中不能使用GPU版本的context。但是CPU版本的部署相比于GPU版本要容易很多,GPU版本的部署方案对本地Docker环境之外还有一些依赖,可以看个人需求来进行选取。关于性能问题,其实不好说GPU版本的一定就比CPU版本的更快,比如本文中所使用到的案例在CPU上运行的速度就比GPU上运行的速度要快。GPU由于其硬件架构的特殊性,需要在数据量达到一定程度之后,才能够发挥出并行的优势,小规模数据集使用CPU就足够了。有个坑点需要说明的是,MindSpore在CPU和GPU两者之间的算子和操作等兼容性做的不是很好,很多可以在GPU上面跑的代码,仅仅切换到CPU版本去运行的话就会报错。

同范围数据集验证

在这个案例中我们假定已经按照这篇博客中的步骤训练好了模型,并保存成了ckpt文件。前面使用的训练集是一个如下形式的方程:

\[f(x)=ax^2+b+noise,x\in[-1,1]
\]

那么我们首先测试一个相同自变量范围的函数,作为测试集:

\[f(x)=ax^2+b,x\in[-1,1]
\]

因为是测试集,所以这里我们暂时先去掉了\(noise\)这一项,对应的代码如下:

# load_model.py

from mindspore import context
context.set_context(mode=context.GRAPH_MODE, device_target="CPU")
import mindspore.dataset as ds
from mindspore import load_checkpoint, load_param_into_net
from mindspore import nn, Tensor, Model
from mindspore.train.callback import Callback, LossMonitor
import numpy as np class LinearNet(nn.Cell): # 与训练模型相同
def __init__(self):
super(LinearNet, self).__init__()
self.fc = nn.Dense(1,1,0.02,0.02) def construct(self, x):
x = self.fc(x)
return x net = LinearNet()
net.set_train(False)
param_dict = load_checkpoint("CKP-1_200.ckpt") # 模型加载
load_param_into_net(net, param_dict) # 将模型参数加载到网络中 net_loss = nn.loss.MSELoss()
model = Model(net, net_loss, metrics={"loss"}) def get_data(num, a=2.0, b=3.0): # 与训练模型相同格式
for _ in range(num):
x = np.random.uniform(-1.0, 1.0)
z = a * x ** 2 + b
yield np.array([x**2]).astype(np.float32), np.array([z]).astype(np.float32) def create_dataset(num_data, batch_size=16, repeat_size=1):
input_data = ds.GeneratorDataset(list(get_data(num_data)), column_names=['x','z'])
input_data = input_data.batch(batch_size)
input_data = input_data.repeat(repeat_size)
return input_data data_number = 160 # 测试集规模一般小于训练集
batch_number = 1
repeat_number = 1 ds_valid = create_dataset(data_number, batch_size=batch_number, repeat_size=repeat_number) # 生成测试集 acc = model.eval(ds_valid, dataset_sink_mode=False) # 模型验证
print (acc)

需要注意的一点是,这里我们为了验证模型的准确性,model的metrics选用了loss这一方法,还有很多其他方法比如accuracy等可以应用于其他场景。相对应的docker容器启动指令如下:

sudo docker run --rm -v /dev/shm:/dev/shm -v /home/dechin/projects/gitlab/dechin/src/mindspore/:/home/ --runtime=nvidia --privileged=true swr.cn-south-1.myhuaweicloud.com/mindspore/mindspore-gpu:1.2.0 /bin/bash -c "cd /home && python load_model.py"
[WARNING] DEBUG(1,python):2021-05-18-03:25:53.600.802 [mindspore/ccsrc/debug/debugger/debugger.cc:80] Debugger] Not enabling debugger. Debugger does not support CPU.
{'loss': 0.0029351555945297037}

打印出来的是一个字典格式的loss值,这个值的计算方法为:

\[loss=\frac{\sum_n\left(f(x_i)-net(x_i)\right)^2}{n}
\]

计算的结果是误差平方的平均值,这里在相同范围内的测试集的损失值为0.0029,还是一个相对比较好的结果。

扩大范围数据集验证

如果我们想推广这个范围,因为我们知道一个原始的模型一般都是具有比较好的普适性的,但是训练出来的神经网络很大程度上会收到训练集的影响。让我们直接看这样的一个例子:

\[f(x)=ax^2+b,x\in[-10,10]
\]

在这个新的测试集生成模型中,我们只是把原本的\([-1,1]\)的范围改成了\([-10,10]\)的范围。对应的代码如下所示:

# load_model.py

from mindspore import context
context.set_context(mode=context.GRAPH_MODE, device_target="CPU")
import mindspore.dataset as ds
from mindspore import load_checkpoint, load_param_into_net
from mindspore import nn, Tensor, Model
from mindspore.train.callback import Callback, LossMonitor
import numpy as np class LinearNet(nn.Cell):
def __init__(self):
super(LinearNet, self).__init__()
self.fc = nn.Dense(1,1,0.02,0.02) def construct(self, x):
x = self.fc(x)
return x net = LinearNet()
net.set_train(False)
param_dict = load_checkpoint("CKP-1_200.ckpt")
load_param_into_net(net, param_dict) net_loss = nn.loss.MSELoss()
model = Model(net, net_loss, metrics={"loss"}) def get_data(num, a=2.0, b=3.0):
for _ in range(num):
x = np.random.uniform(-10.0, 10.0)
z = a * x ** 2 + b
yield np.array([x**2]).astype(np.float32), np.array([z]).astype(np.float32) def create_dataset(num_data, batch_size=16, repeat_size=1):
input_data = ds.GeneratorDataset(list(get_data(num_data)), column_names=['x','z'])
input_data = input_data.batch(batch_size)
input_data = input_data.repeat(repeat_size)
return input_data data_number = 160
batch_number = 1
repeat_number = 1 ds_valid = create_dataset(data_number, batch_size=batch_number, repeat_size=repeat_number) acc = model.eval(ds_valid, dataset_sink_mode=False)
print (acc)

同样的,用docker的方式拉起运行:

sudo docker run --rm -v /dev/shm:/dev/shm -v /home/dechin/projects/gitlab/dechin/src/mindspore/:/home/ --runtime=nvidia --privileged=true swr.cn-south-1.myhuaweicloud.com/mindspore/mindspore-gpu:1.2.0 /bin/bash -c "cd /home && python load_model.py"
[WARNING] DEBUG(1,python):2021-05-18-03:26:29.528.892 [mindspore/ccsrc/debug/debugger/debugger.cc:80] Debugger] Not enabling debugger. Debugger does not support CPU.
{'loss': 52.90038294600496}

此时我们看到平均的误差变成了52.9,这个值就比较大了。

总结概要

在这篇文章中,我们接着前面的博客继续讲MindSpore在训练好机器学习的模型并且保存成文件之后,如何加载并使用测试集加以验证。从测试结果中我们得到的启发是,机器学习的模型的有效性会很大程度上收到训练集的影响,因此最好是能够保障训练集的广泛性。如果测试集的范围大大超出了训练集所能够表示的范围,那么训练的模型误差就会很大。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/valid.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

MindSpore模型验证的更多相关文章

  1. MindSpore模型精度调优实战:如何更快定位精度问题

    摘要:为大家梳理了针对常见精度问题的调试调优指南,将以"MindSpore模型精度调优实战"系列文章的形式分享出来,帮助大家轻松定位精度问题,快速优化模型精度. 本文分享自华为云社 ...

  2. MindSpore模型精度调优实战:常用的定位精度调试调优思路

    摘要:在模型的开发过程中,精度达不到预期常常让人头疼.为了帮助用户解决模型调试调优的问题,我们为MindSpore量身定做了可视化调试调优组件:MindInsight. 本文分享自华为云社区<技 ...

  3. webapi - 模型验证

    本次要和大家分享的是webapi的模型验证,讲解的内容可能不单单是做验证,但都是围绕模型来说明的:首先来吐槽下,今天下午老板为自己买了套新办公家具,看起来挺好说明老板有钱,不好的是我们干技术的又成了搬 ...

  4. ASP.NET Core 中文文档 第四章 MVC(2.2)模型验证

    原文:Model Validation 作者:Rachel Appel 翻译:娄宇(Lyrics) 校对:孟帅洋(书缘) 在这篇文章中: 章节: 介绍模型验证 验证 Attribute 模型状态 处理 ...

  5. MVC遇上bootstrap后的ajax表单模型验证

    MVC遇上bootstrap后的ajax表单验证 使用bootstrap后他由他自带的样式has-error,想要使用它就会比较麻烦,往常使用jqueyr.validate的话只有使用他自己的样式了, ...

  6. EMF学习,为了实现可扩展可自定义的模型验证 - 各种实现方法学习

    自: http://blog.csdn.net/javaman_chen/article/details/6057033 http://www.ibm.com/developerworks/cn/op ...

  7. asp.net mvc 模型验证注解,表单提交

    一.添加模型 public class Account { public int ID { get; set; } [Display(Name = "姓名")] //设置要显示的字 ...

  8. 在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)

    一.Forms认证 1.在webapi项目中启用Forms认证 Why:为什么要在WebAPI中使用Forms认证?因为其它项目使用的是Forms认证. What:什么是Forms认证?它在WebAP ...

  9. 爱上MVC~MVC4模型验证可以放在前端

    回到目录 MVC4.0推出后,在模型验证上有了一个新的改近,它支持前端验证,即在用户POST之前,如果验证失败,则Action(POST方式的)不会被执行,而直接停留在原视图,这对于用户体验是好的,它 ...

随机推荐

  1. 运维小姐姐说这篇Consul集群和ACL配置超给力(保姆级)

    前言 上一篇简单介绍了Consul,并使用开发模式(dev)进行流程演示,但在实际开发中需要考虑Consul的高可用和操作安全性,所以接着来聊聊集群和ACL的相关配置,涉及到的命令会在环境搭建过程中详 ...

  2. UML和设计模式原则总结

    UML总结: uml就是统一建模语言,包括语义概念 标记符号和指南 具有静态 动态 环境上的和组织性的部分 .它不是编程语言.uml预览它涉及的主要领域有结构性(静态视图,用例视图,构件图,实现视图, ...

  3. SDK音频测试流程

    概述 在上篇文章中,给小伙伴们讲述了sdk模板在渲染中的流程,我们简单来回顾一下,主要讲述了数据创建.素材替换.音频.文字等四部分,在上次讲述中也因为时间于原因没有特别仔细的去讲述他们.上次我们说到最 ...

  4. 【LiteOS】LiteOS消息队列

    目录 前言 链接 参考 笔录草稿 基本概念 队列运作机制 队列运作原理 消息队列传输方式 消息队列的阻塞机制 出队阻塞 入队阻塞 任务相关函数 任务开发流程 注意事项 * 实战 前言 链接 LiteO ...

  5. 如何使用Topshelf与.NET泛型主机建立Windows服务

    1 前置阅读 在阅读本文章之前,你可以先阅读: Topshelf一个用于使用.NET构建Windows服务框架 2 使用 2.1 创建应用程序 首先,创建一个新的控制台应用程序并从nuget获取Top ...

  6. Kubernetes声明式API与编程范式

    声明式API vs 命令时API 计算机系统是分层的,也就是下层做一些支持的工作,暴露接口给上层用.注意:语言的本质是一种接口. 计算机的最下层是CPU指令,其本质就是用"变量定义+顺序执行 ...

  7. Golang 基于Prometheus Node_Exporter 开发自定义脚本监控

    Golang 基于Prometheus Node_Exporter 开发自定义脚本监控 公司是今年决定将一些传统应用从虚拟机上迁移到Kubernetes上的,项目多而乱,所以迁移工作进展缓慢,为了建立 ...

  8. 扩展中国剩余定理(EXCRT)学习笔记

    扩展中国剩余定理(EXCRT)学习笔记 用途 求解同余方程组 \(\begin{cases}x\equiv c_{1}\left( mod\ m_{1}\right) \\ x\equiv c_{2} ...

  9. 如何快速编写一个微信Api?

    概述 Magicodes.Wx.Sdk致力于打造最简洁最易于使用的微信Sdk,逐步包括公众号Sdk.小程序Sdk.企业微信Sdk等,以及Abp VNext集成. 本篇将侧重于讲述如何向Magicode ...

  10. Re:从零开始的Git保姆级使用教程

    观前提示: 本文主要介绍了用命令的方式对Git进行操作(全程用的win10系统),而对于TortoiseGit和github desktop等图形化操作知识,只进行简单介绍或提及,详细使用会在提到的地 ...