注意:如果在你的电脑上想要使用MindInsight光pip install MindInsight是不行的,还要改一个host文件里面的服务端口号改成你电脑的,具体操作流程我忘了,安装教程参考:mindinsight: A visual dashboard for model tuning. (gitee.com)
其他框架比如pytorch可以迁移到minspore通过MindConverter
根据TensorFlow pb/ONNX模型文件生成Mindspore模型定义脚本以及权重文件。
用户只需要传入四个参数,命令示例:
模型之间前端语言的差异是巨大的,但是计算图都是相似的,所以使用模型迁移,而迁移使用的中间转换方式是ONNX。(奥尼克斯)
ONNX定义了开放式模型交互的一种协议,通过ONNX可以统一不同深度学习框架间模型表达,其中有几个关键的概念:
(1)opset:算子集;graph:存储模型的计算图;
用在推理阶段比较多,因为导出ONNX模型时训练阶段算子会丢失(比如,dropout),需要转换后用户手动补回;推荐使用opset11+保存ONNX模型,若ONNX模型版本过低可能导致MindConverter转换失败;MindConverter暂不支持包含控制流节点的模型。
MindSpore调试器是为图(Graph)模式训练提供的调试工具,可以用来查看并分析计算图节点的中间结果。具体操作流程:
我们上一节不是说过,图模式进行训练过程高效的原因是他的计算图是固定下来的,也就是说用户无法从Python层获取计算图中间节点的结果,使得训练调试变得困难。使用MindSpore调试器就饿可以:
(1)在MindInsight调试器界面结合计算图,查看图节点的输出结果;
(2)设置监测点,监测训练异常情况(比如检查张量溢出),在异常发生时追踪错误原因;
(3) 查看权重参数的变化情况。
只能说功能太丰富了。
这视频把我都看晕了,有时间我自己试试吧。
给我整懵逼了,为啥不能直接在for循环里把结果存到数组里然后画出来,有什么区别吗整这个东西。
还是有点用的,能分析每个算子耗能分析哈哈哈
这里要说明一下,训练可视化有两种方法,一种是调用下买你的这些Summary来记录数据,最后使用MindInsight画出来
第二种方法就是自己写回调函数Cellback,可以参考这篇文章我觉得讲的非常好华为云Mindspore实现鸢尾花分类作业_岭南香雪的博客-CSDN博客
一般来说回调函数的代码:
from mindspore.train.callback import Callback
# Callback function(在原有基础上添加收集了loss和accuracy随epoch的变化数据)
class StepLossAccInfo(Callback):
def __init__(self, model, eval_dataset, steps_loss, steps_eval, epoch_loss, epoch_eval): #通过init函数定义self的变量
self.model = model
self.eval_dataset = eval_dataset
self.steps_loss = steps_loss
self.steps_eval = steps_eval
self.epoch_loss = epoch_loss
self.epoch_eval = epoch_eval
def step_end(self, run_context):
cb_params = run_context.original_args() #Mindspore获取参数的方法
cur_epoch = cb_params.cur_epoch_num #获取当前训练周期epoch
cur_step = (cur_epoch - 1) * 1 + cb_params.cur_step_num #计算当前训练步数step
# 每经过一步(step),添加对应的loss和accuracy
self.steps_loss["loss_value"].append(str(cb_params.net_outputs))
self.steps_loss["step"].append(str(cur_step))
acc = self.model.eval(self.eval_dataset, dataset_sink_mode=False)
self.steps_eval["step"].append(cur_step)
self.steps_eval["acc"].append(acc['acc'])
# 在本代码中,每个epoch包含4个steps,下面这一段的意思即是,每经过4个steps(1个epoch),添加对应的loss和accuracy
if cur_step % 3 == 0:
self.epoch_loss["loss_value"].append(str(cb_params.net_outputs))
self.epoch_loss["epoch"].append(str(cur_epoch))
acc = self.model.eval(self.eval_dataset, dataset_sink_mode=False)
self.epoch_eval["epoch"].append(cur_epoch)
self.epoch_eval["acc"].append(acc['acc'])
定义好回调函数后,获得需要保存的参数(训练损失、测试准确率)之后,开始训练步骤,将回调函数带入train方法里面
steps_loss = {"step": [], "loss_value": []}
steps_eval = {"step": [], "acc": []}
epoch_loss = {"epoch": [], "loss_value": []}
epoch_eval = {"epoch": [], "acc": []}
model = ms.train.Model(net, loss, opt, metrics={'acc', 'loss'})
# collect the steps, epoch, loss and accuracy information
step_loss_acc_info = StepLossAccInfo(model, ds_test, steps_loss, steps_eval, epoch_loss, epoch_eval)
model.train(200, ds_train, callbacks=[LossMonitor(per_print_times=ds_train.get_dataset_size()), step_loss_acc_info], dataset_sink_mode=False)
metrics = model.eval(ds_test)
print(metrics)
可视化出来:
#损失值随训练每一步(step)的变化曲线
steps = steps_loss["step"]
loss_value = steps_loss["loss_value"]
steps = list(map(int, steps))
loss_value = list(map(float, loss_value))
plt.plot(steps, loss_value)
plt.xlabel("Steps")
plt.ylabel("Loss_value")
plt.title("Change chart of model loss value")
plt.show()
#损失值随训练周期数epoch的变化曲线
epoch = epoch_loss["epoch"]
loss_value = epoch_loss["loss_value"]
epoch = list(map(int, epoch))
loss_value = list(map(float, loss_value))
plt.plot(epoch, loss_value)
plt.xlabel("Epochs")
plt.ylabel("Loss_value")
plt.title("Change chart of model loss value")
plt.show()
MindSpore模型快速调优攻略-昇腾社区 (hiascend.com)
按照这个步骤来就差不多,先到自己的个人主页获得个人密钥:
搜索OBS,并且创建OPS桶,可以往里面传入一些数据,预训练的模型等等: