MindSpore模型验证
技术背景
在前面一篇博客中,我们介绍了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文件。前面使用的训练集是一个如下形式的方程:
\]
那么我们首先测试一个相同自变量范围的函数,作为测试集:
\]
因为是测试集,所以这里我们暂时先去掉了\(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值,这个值的计算方法为:
\]
计算的结果是误差平方的平均值,这里在相同范围内的测试集的损失值为0.0029,还是一个相对比较好的结果。
扩大范围数据集验证
如果我们想推广这个范围,因为我们知道一个原始的模型一般都是具有比较好的普适性的,但是训练出来的神经网络很大程度上会收到训练集的影响。让我们直接看这样的一个例子:
\]
在这个新的测试集生成模型中,我们只是把原本的\([-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模型验证的更多相关文章
- MindSpore模型精度调优实战:如何更快定位精度问题
摘要:为大家梳理了针对常见精度问题的调试调优指南,将以"MindSpore模型精度调优实战"系列文章的形式分享出来,帮助大家轻松定位精度问题,快速优化模型精度. 本文分享自华为云社 ...
- MindSpore模型精度调优实战:常用的定位精度调试调优思路
摘要:在模型的开发过程中,精度达不到预期常常让人头疼.为了帮助用户解决模型调试调优的问题,我们为MindSpore量身定做了可视化调试调优组件:MindInsight. 本文分享自华为云社区<技 ...
- webapi - 模型验证
本次要和大家分享的是webapi的模型验证,讲解的内容可能不单单是做验证,但都是围绕模型来说明的:首先来吐槽下,今天下午老板为自己买了套新办公家具,看起来挺好说明老板有钱,不好的是我们干技术的又成了搬 ...
- ASP.NET Core 中文文档 第四章 MVC(2.2)模型验证
原文:Model Validation 作者:Rachel Appel 翻译:娄宇(Lyrics) 校对:孟帅洋(书缘) 在这篇文章中: 章节: 介绍模型验证 验证 Attribute 模型状态 处理 ...
- MVC遇上bootstrap后的ajax表单模型验证
MVC遇上bootstrap后的ajax表单验证 使用bootstrap后他由他自带的样式has-error,想要使用它就会比较麻烦,往常使用jqueyr.validate的话只有使用他自己的样式了, ...
- EMF学习,为了实现可扩展可自定义的模型验证 - 各种实现方法学习
自: http://blog.csdn.net/javaman_chen/article/details/6057033 http://www.ibm.com/developerworks/cn/op ...
- asp.net mvc 模型验证注解,表单提交
一.添加模型 public class Account { public int ID { get; set; } [Display(Name = "姓名")] //设置要显示的字 ...
- 在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)
一.Forms认证 1.在webapi项目中启用Forms认证 Why:为什么要在WebAPI中使用Forms认证?因为其它项目使用的是Forms认证. What:什么是Forms认证?它在WebAP ...
- 爱上MVC~MVC4模型验证可以放在前端
回到目录 MVC4.0推出后,在模型验证上有了一个新的改近,它支持前端验证,即在用户POST之前,如果验证失败,则Action(POST方式的)不会被执行,而直接停留在原视图,这对于用户体验是好的,它 ...
随机推荐
- 2.pandas常用读取
一.文本读写 名称 接收 代表(含义) 默认 filepath string 文件路径 无 sep string 分割符 ',' header Int/sequence 某行做列名 infer自动寻找 ...
- MyBatis简单的CRUD操作
Dao接口 package com.ttpfx.dao; import com.ttpfx.domain.User; import java.util.List; public interface U ...
- Linux入门视频笔记一(基本命令)
一.简单命令 1.date:当前时间 2.cal:当前日期(日历格式) ①cal 2019:2019年全年日历 ②cal 1 2019:2019年1月份 二.Linux文件结构 1.根目录:root( ...
- 攻防世界 reverse secret-string-400
secret-string-400 school-ctf-winter-2015 解压文件得到html和js文件 Task.html <html> <head> <tit ...
- 配置docker的pdflatex环境
技术背景 Latex在文档撰写方面是不可或缺的工具,尤其是在写文章方面,是必须要用到的文字排版工具.但是latex的环境部署并不是一个特别人性化的操作,尤其是在各种不同的平台上操作是完全不一样的,还经 ...
- java例题_37 有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位。
1 /*37 [程序 37 报数] 2 题目:有 n 个人围成一圈,顺序排号.从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位. 4 */ 5 ...
- 热更新解决方案--xlua学习笔记
一.热更新方案简介 在Unity游戏工程中,C#代码(编译型语言)资源和Resources文件夹下的资源打包后都不可以更改,因此这部分内容不能进行热更新,而lua代码(解释型语言)逻辑不需要进行预编译 ...
- java面试-谈谈你对volatile的理解
一.volatile特性: volatile是Java虚拟机提供的轻量级的同步机制.主要有三大特性: 保证可见性 不保证原子性 禁止指令重排序 1.保证可见性 1)代码演示 AAA线程修改变量numb ...
- 【算法学习笔记】组合数与 Lucas 定理
卢卡斯定理是一个与组合数有关的数论定理,在算法竞赛中用于求组合数对某质数的模. 第一部分是博主的个人理解,第二部分为 Pecco 学长的介绍 第一部分 一般情况下,我们计算大组合数取模问题是用递推公式 ...
- [Skill]从零掌握正则表达式
前言 无论你是出于什么原因需要掌握正则表达式(诸如爬虫.文本检索.后端服务开发或Linux脚本),如果之前从没接触过正则表达式(比如我)很容易在如山般的公式中迷失,以至于你在项目写的正则表达式很可能会 ...