技术背景

在前面一篇博客中,我们介绍了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. Java 多线程 | 并发知识问答总结

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

  2. P1055_ISBN号码(JAVA语言)

    题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符, 其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号), 最后一位是 ...

  3. 真会C#微信小程序的习题数据JSON文件下载链接

    完全没有精力去维护了,所以小程序停掉,集中精力做一件事. 链接: https://pan.baidu.com/s/1xL45KxDzR5oEQM6nwBA5rw 提取码: qv6n

  4. Git 在解决冲突的时候文件覆盖

    更新代码导致被还原或覆盖的场景:1.触发冲突的必要条件是修改同一个文件且修改的位置非常近,否则Git会自动合并其内容避免更新代码导致被还原或覆盖的解决方案1.少修改的地方(生产环境.公网测试环境):推 ...

  5. 洛谷P1290欧几里德游戏

    题目地址 题目大意: 两个人st和ol博弈 有两个整数n,m 每次轮到一个人时候,需要选择用大的那个数减去小的那个数的倍数(不能减为负数) 最后得到0的为胜利者 思路: (以下讨论均在n<m的条 ...

  6. 【JVM进阶之路】十:JVM调优总结

    1.调优原则 JVM调优听起来很高大上,但是要认识到,JVM调优应该是Java性能优化的最后一颗子弹. 比较认可廖雪峰老师的观点,要认识到JVM调优不是常规手段,性能问题一般第一选择是优化程序,最后的 ...

  7. pytorch从入门到放弃(目录)

    目录 前置基础 Pytorch从入门到放弃 推荐阅读 前置基础 Python从入门到放弃(目录) 人工智能(目录) Pytorch从入门到放弃 01_pytorch和tensorflow的区别 02_ ...

  8. kubernetes node SchedulingDisabled

    问题: k8s 集群的节点处于 SchedulingDisabled 解决方案 kubectl patch node NodeName -p "{\"spec\":{\& ...

  9. linux 查看cpu型号、memory

    查看CPU信息(型号) [root@TX-220-60-211 supdev]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 40 In ...

  10. Linux 基础命令 命令进阶

    Linux命令格式:命令 选项 参数 (大部分命令是这个格式) 注意: 1.命令区分大小写 2.短选项可以合并   长选项不能合并 如 : 短选项 -l  -h 可以合并为 -lh 长选项  不能合并 ...