From c262a6e388a0da599935c22eb0228863d7860eb4 Mon Sep 17 00:00:00 2001
From: lvmingfu <630944715@qq.com>
Date: Wed, 26 Aug 2020 10:17:45 +0800
Subject: [PATCH] add synchronization_training_and_eval files in tutorials
---
tutorials/notebook/README.md | 1 +
...chronization_training_and_evaluation.ipynb | 510 ++++++++++++++++++
...ynchronization_training_and_evaluation.png | Bin 0 -> 12868 bytes
...synchronization_training_and_evaluation.md | 174 ++++++
tutorials/source_zh_cn/index.rst | 1 +
5 files changed, 686 insertions(+)
create mode 100644 tutorials/notebook/synchronization_training_and_evaluation.ipynb
create mode 100644 tutorials/source_zh_cn/advanced_use/images/synchronization_training_and_evaluation.png
create mode 100644 tutorials/source_zh_cn/advanced_use/synchronization_training_and_evaluation.md
diff --git a/tutorials/notebook/README.md b/tutorials/notebook/README.md
index fb999501..f7eac5dd 100644
--- a/tutorials/notebook/README.md
+++ b/tutorials/notebook/README.md
@@ -57,6 +57,7 @@
| 数据处理与数据增强 | [data_loading_enhancement.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/data_loading_enhance/data_loading_enhancement.ipynb) | 使用指南 | - 学习MindSpore中数据处理和增强的方法
- 展示数据处理、增强方法的实际操作
- 对比展示数据处理前和处理后的效果
- 表述在数据处理、增强后的意义
| 自然语言处理应用 | [nlp_application.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/nlp_application.ipynb) | 应用实践 | - 展示MindSpore在自然语言处理的应用
- 展示自然语言处理中数据集特定的预处理方法
- 展示如何定义基于LSTM的SentimentNet网络
| 计算机视觉应用 | [computer_vision_application.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/computer_vision_application.ipynb) | 应用实践 | - 学习MindSpore卷积神经网络在计算机视觉应用的过程
- 学习下载CIFAR-10数据集,搭建运行环境
- 学习使用ResNet-50构建卷积神经网络
- 学习使用Momentum和SoftmaxCrossEntropyWithLogits构建优化器和损失函数
- 学习调试参数训练模型,判断模型精度
+| 模型的训练及验证同步方法 | [synchronization_training_and_evaluation.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/synchronization_training_and_evaluation.ipynb) | 应用实践 | - 了解模型训练和验证同步进行的方法
- 学习同步训练和验证中参数设置方法
- 利用绘图函数从保存的模型中挑选出最优模型
| 使用PyNative进行神经网络的训练调试体验 | [debugging_in_pynative_mode.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/debugging_in_pynative_mode.ipynb) | 模型调优 | - GPU平台下从数据集获取单个数据进行单个step训练的数据变化全过程解读
- 了解PyNative模式下的调试方法
- 图片数据在训练过程中的变化情况的图形展示
- 了解构建权重梯度计算函数的方法
- 展示1个step过程中权重的变化及数据展示
| 自定义调试信息体验文档 | [customized_debugging_information.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/customized_debugging_information.ipynb) | 模型调优 | - 了解MindSpore的自定义调试算子
- 学习使用自定义调试算子Callback设置定时训练
- 学习设置metrics算子输出相对应的模型精度信息
- 学习设置日志环境变量来控制glog输出日志
| MindInsight的模型溯源和数据溯源体验 | [mindinsight_model_lineage_and_data_lineage.ipynb](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/mindinsight/mindinsight_model_lineage_and_data_lineage.ipynb) | 模型调优 | - 了解MindSpore中训练数据的采集及展示
- 学习使用SummaryRecord记录数据
- 学习使用回调函数SummaryCollector进行数据采集
- 使用MindInsight进行数据可视化
- 了解数据溯源和模型溯源的使用方法
diff --git a/tutorials/notebook/synchronization_training_and_evaluation.ipynb b/tutorials/notebook/synchronization_training_and_evaluation.ipynb
new file mode 100644
index 00000000..486fd4cf
--- /dev/null
+++ b/tutorials/notebook/synchronization_training_and_evaluation.ipynb
@@ -0,0 +1,510 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#
B`zI8kEhL*->s~X^9fa0=b}PxL98mgoF!<#5N;`gpd4dhY
zzheffYB{z-jD{zL^Yd}VyBl4BFd|ey^dyHL98R-`H}7!)z$XFpfoQXbMMq8li7oh4
z;%vu9ec)VM(;uG2f0k0c-D83*8
+
+
+
+## 概述
+
+在面对复杂网络时,往往需要进行几十甚至几百次的epoch训练。在训练之前,很难掌握在训练到第几个epoch时,模型的精度能达到满足要求的程度,所以经常会采用一边训练的同时,在相隔固定epoch的位置对模型进行精度验证,并保存相应的模型,等训练完毕后,通过查看对应模型精度的变化就能迅速地挑选出相对最优的模型,本文将采用这种方法,以LeNet网络为样本,进行示例。
+
+流程如下:
+1. 定义回调函数EvalCallBack,实现同步进行训练和验证。
+2. 定义训练网络并执行。
+3. 将不同epoch下的模型精度绘制出折线图并挑选最优模型。
+
+完整示例请参考[notebook](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/synchronization_training_and_evaluation.ipynb)。
+
+## 定义回调函数EvalCallBack
+
+实现思想:每隔n个epoch验证一次模型精度,由于在自定义函数中实现,如需了解详细用法,请参考[API说明](https://www.mindspore.cn/api/zh-CN/master/api/python/mindspore/mindspore.train.html?highlight=callback#mindspore.train.callback.Callback);
+
+核心实现:回调函数的`epoch_end`内设置验证点,如下:
+
+`cur_epoch % eval_per_epoch == 0`:即每`eval_per_epoch`个epoch结束时,验证一次模型精度。
+
+- `cur_epoch`:当前训练过程的epoch数值。
+- `eval_per_epoch`:用户自定义数值,即验证频次。
+
+其他参数解释:
+
+- `model`:即是MindSpore中的`Model`函数。
+- `eval_dataset`:验证数据集。
+- `epoch_per_eval`:记录验证模型的精度和相应的epoch数,其数据形式为`{"epoch":[],"acc":[]}`。
+
+```python
+import matplotlib.pyplot as plt
+from mindspore.train.callback import Callback
+
+class EvalCallBack(Callback):
+ def __init__(self, model, eval_dataset, eval_per_epoch):
+ self.model = model
+ self.eval_dataset = eval_dataset
+ self.eval_per_epoch = eval_per_epoch
+
+ def epoch_end(self, run_context):
+ cb_param = run_context.original_args()
+ cur_epoch = cb_param.cur_epoch_num
+ if cur_epoch % self.eval_per_epoch == 0:
+ acc = self.model.eval(self.eval_dataset,dataset_sink_mode = True)
+ epoch_per_eval["epoch"].append(cur_epoch)
+ epoch_per_eval["acc"].append(acc["Accuracy"])
+ print(acc)
+
+```
+
+## 定义训练网络并执行
+
+在保存模型的参数`CheckpointConfig`中,需计算好单个epoch中的step数,再根据需要进行验证模型精度的频次对应,本次示例为1875个step/epoch,按照每两个epoch验证一次的思想,这里设置`save_checkpoint_steps=eval_per_epoch*1875`,其中变量`eval_per_epoch`等于2。
+
+参数解释:
+
+- `config_ck`:定义保存模型信息。
+ - `save_checkpoint_steps`:每多少个step保存一次模型。
+ - `keep_checkpoint_max`:设置保存模型数量的上限。
+- `ckpoint_cb`:定义模型保存的名称及路径信息。
+- `model`:定义模型。
+- `model.train`:模型训练函数。
+- `epoch_per_eval`:定义收集`epoch`数和对应模型精度信息的字典。
+
+```python
+from mindspore.train.serialization import load_checkpoint, load_param_into_net
+from mindspore.train.callback import ModelCheckpoint, CheckpointConfig, LossMonitor
+from mindspore.train import Model
+from mindspore import context
+from mindspore.nn.metrics import Accuracy
+from mindspore.nn.loss import SoftmaxCrossEntropyWithLogits
+
+if __name__ == "__main__":
+ context.set_context(mode=context.GRAPH_MODE, device_target="GPU")
+ ckpt_save_dir = "./lenet_ckpt"
+ eval_per_epoch = 2
+
+ ... ...
+
+ # need to calculate how many steps are in each epoch,in this example, 1875 steps per epoch
+ config_ck = CheckpointConfig(save_checkpoint_steps=eval_per_epoch*1875, keep_checkpoint_max=15)
+ ckpoint_cb = ModelCheckpoint(prefix="checkpoint_lenet",directory=ckpt_save_dir, config=config_ck)
+ model = Model(network, net_loss, net_opt, metrics={"Accuracy": Accuracy()})
+
+ epoch_per_eval = {"epoch":[],"acc":[]}
+ eval_cb = EvalCallBack(model,eval_data,eval_per_epoch)
+
+ model.train(epoch_size, train_data, callbacks=[ckpoint_cb, LossMonitor(375),eval_cb],
+ dataset_sink_mode=True)
+```
+
+输出结果:
+
+ epoch: 1 step: 375, loss is 2.298612
+ epoch: 1 step: 750, loss is 2.075152
+ epoch: 1 step: 1125, loss is 0.39205977
+ epoch: 1 step: 1500, loss is 0.12368304
+ epoch: 1 step: 1875, loss is 0.20988345
+ epoch: 2 step: 375, loss is 0.20582482
+ epoch: 2 step: 750, loss is 0.029070046
+ epoch: 2 step: 1125, loss is 0.041760832
+ epoch: 2 step: 1500, loss is 0.067035824
+ epoch: 2 step: 1875, loss is 0.0050643035
+ {'Accuracy': 0.9763621794871795}
+
+ ... ...
+
+ epoch: 9 step: 375, loss is 0.021227183
+ epoch: 9 step: 750, loss is 0.005586236
+ epoch: 9 step: 1125, loss is 0.029125651
+ epoch: 9 step: 1500, loss is 0.00045874066
+ epoch: 9 step: 1875, loss is 0.023556218
+ epoch: 10 step: 375, loss is 0.0005807788
+ epoch: 10 step: 750, loss is 0.02574059
+ epoch: 10 step: 1125, loss is 0.108463734
+ epoch: 10 step: 1500, loss is 0.01950589
+ epoch: 10 step: 1875, loss is 0.10563098
+ {'Accuracy': 0.979667467948718}
+
+
+在同一目录找到`lenet_ckpt`文件夹,文件夹中保存了5个模型,和一个计算图相关数据,其结构如下:
+
+```
+lenet_ckpt
+├── checkpoint_lenet-10_1875.ckpt
+├── checkpoint_lenet-2_1875.ckpt
+├── checkpoint_lenet-4_1875.ckpt
+├── checkpoint_lenet-6_1875.ckpt
+├── checkpoint_lenet-8_1875.ckpt
+└── checkpoint_lenet-graph.meta
+```
+
+## 定义函数绘制不同epoch下模型的精度
+
+定义绘图函数`eval_show`,将`epoch_per_eval`载入到`eval_show`中,绘制出不同`epoch`下模型的验证精度折线图。
+
+
+```python
+def eval_show(epoch_per_eval):
+ plt.xlabel("epoch number")
+ plt.ylabel("Model accuracy")
+ plt.title("Model accuracy variation chart")
+ plt.plot(epoch_per_eval["epoch"],epoch_per_eval["acc"],"red")
+ plt.show()
+
+eval_show(epoch_per_eval)
+```
+
+输出结果:
+
+
+
+
+从上图可以一目了然地挑选出需要的最优模型。
+
+## 总结
+
+本次使用MNIST数据集通过卷积神经网络LeNet5进行训练,着重介绍了在进行模型训练的同时进行模型的验证,保存对应`epoch`的模型,并从中挑选出最优模型的方法。
diff --git a/tutorials/source_zh_cn/index.rst b/tutorials/source_zh_cn/index.rst
index 33171ea1..bb6bdfde 100644
--- a/tutorials/source_zh_cn/index.rst
+++ b/tutorials/source_zh_cn/index.rst
@@ -33,6 +33,7 @@ MindSpore教程
advanced_use/computer_vision_application
advanced_use/nlp_application
advanced_use/second_order_optimizer_for_resnet50_application
+ advanced_use/synchronization_training_and_evaluation
.. toctree::
:glob:
--
GitLab