From 06fc000e59711708e6f4914cf89c7c045d5743cb Mon Sep 17 00:00:00 2001 From: lvmingfu <630944715@qq.com> Date: Fri, 11 Sep 2020 16:41:16 +0800 Subject: [PATCH] add new file for en advance_use in tutodials --- ...ynchronization_training_and_evaluation.png | Bin 0 -> 12868 bytes ...synchronization_training_and_evaluation.md | 174 ++++++++++++++++++ tutorials/source_en/index.rst | 1 + 3 files changed, 175 insertions(+) create mode 100644 tutorials/source_en/advanced_use/images/synchronization_training_and_evaluation.png create mode 100644 tutorials/source_en/advanced_use/synchronization_training_and_evaluation.md diff --git a/tutorials/source_en/advanced_use/images/synchronization_training_and_evaluation.png b/tutorials/source_en/advanced_use/images/synchronization_training_and_evaluation.png new file mode 100644 index 0000000000000000000000000000000000000000..cbecb6c9739eaf047c89ea79f9d596a2793e6283 GIT binary patch literal 12868 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 + +- [Synchronizing Model Training and Validation](#synchronizing-model-training-and-validation) + - [Overview](#overview) + - [Defining the Callback Function EvalCallBack](#defining-the-callback-function-evalcallback) + - [Defining and Executing the Training Network](#defining-and-executing-the-training-network) + - [Defining the Function to Obtain the Model Accuracy in Different Epochs](#defining-the-function-to-obtain-the-model-accuracy-in-different-epochs) + - [Summary](#summary) + + + + + +## Overview + +For a complex network, epoch training usually needs to be performed for dozens or even hundreds of times. Before training, it is difficult to know when a model can achieve required accuracy in epoch training. Therefore, the accuracy of the model is usually validated at a fixed epoch interval in training and the corresponding model is saved. After the training is completed, you can quickly select the optimal model by viewing the change of the corresponding model accuracy. This section uses this method and takes the LeNet network as an example. + +The procedure is as follows: +1. Define the callback function EvalCallBack to implement synchronous training and validation. +2. Define a training network and execute it. +3. Draw a line chart based on the model accuracy under different epochs and select the optimal model. + +For a complete example, see [notebook](https://gitee.com/mindspore/docs/blob/master/tutorials/notebook/synchronization_training_and_evaluation.ipynb). + +## Defining the Callback Function EvalCallBack + +Implementation idea: The model accuracy is validated every n epochs. The model accuracy is implemented in the user-defined function. For details about the usage, see [API Description](https://www.mindspore.cn/api/en/master/api/python/mindspore/mindspore.train.html#mindspore.train.callback.Callback). + +Core implementation: Validation points are set in `epoch_end` of the callback function as follows: + +`cur_epoch % eval_per_epoch == 0`: indicates that the model accuracy is validated every `eval_per_epoch` epochs. + +- `cur_epoch`: indicates epoch value in the current training process. +- `eval_per_epoch`: indicates user-defined value, that is, the validation frequency. + +Other parameters are described as follows: + +- `model`: indicates `Model` function in MindSpore. +- `eval_dataset`: indicates validation dataset. +- `epoch_per_eval`: records the accuracy of the validation model and the corresponding number of epochs. The data format is `{"epoch": [], "acc": []}`. + +```python +from mindspore.train.callback import Callback + +class EvalCallBack(Callback): + def __init__(self, model, eval_dataset, eval_per_epoch, epoch_per_eval): + self.model = model + self.eval_dataset = eval_dataset + self.eval_per_epoch = eval_per_epoch + self.epoch_per_eval = epoch_per_eval + + 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) + self.epoch_per_eval["epoch"].append(cur_epoch) + self.epoch_per_eval["acc"].append(acc["Accuracy"]) + print(acc) + +``` + +## Defining and Executing the Training Network + +In the `CheckpointConfig` parameter for saving the model, you need to calculate the number of steps in a single epoch and then determine the frequency of model accuracy validation as needed. In this example, there are 1875 steps per epoch. Based on the principle of validating once every two epochs, set `save_checkpoint_steps=eval_per_epoch*1875`. The variable `eval_per_epoch` is equal to 2. + +The parameters are described as follows: + +- `config_ck`: defines and saves model information. + - `save_checkpoint_steps`: indicates the number of steps for saving a model. + - `keep_checkpoint_max`: indicates the maximum number of models that can be saved. +- `ckpoint_cb`: defines the name and path for saving the model. +- `model`: defines a model. +- `model.train`: indicates model training function. +- `epoch_per_eval`: defines the number for collecting `epoch` and the dictionary of corresponding model accuracy information. + +```python +from mindspore.train.callback import ModelCheckpoint, CheckpointConfig, LossMonitor +from mindspore.train import Model +from mindspore import context +from mindspore.nn.metrics import Accuracy + +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, epoch_per_eval) + + model.train(epoch_size, train_data, callbacks=[ckpoint_cb, LossMonitor(375), eval_cb], + dataset_sink_mode=True) +``` + +The output is as follows: + + 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} + + +Find the `lenet_ckpt` folder in the same directory. The folder contains five models and data related to a calculation graph. The structure is as follows: + +``` +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 +``` + +## Defining the Function to Obtain the Model Accuracy in Different Epochs + +Define the drawing function `eval_show`, load `epoch_per_eval` to `eval_show`, and draw the model accuracy variation chart based on different `epoch`. + + +```python +import matplotlib.pyplot as plt + +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) +``` + +The output is as follows: + +![png](./images/synchronization_training_and_evaluation.png) + + +You can easily select the optimal model based on the preceding figure. + +## Summary + +The MNIST dataset is used for training through the convolutional neural network LeNet5. This section describes how to validate a model during model training, save the model corresponding to `epoch`, and select the optimal model. diff --git a/tutorials/source_en/index.rst b/tutorials/source_en/index.rst index 402105ab2f..5a0ae0f6df 100644 --- a/tutorials/source_en/index.rst +++ b/tutorials/source_en/index.rst @@ -31,6 +31,7 @@ MindSpore Tutorials advanced_use/computer_vision_application advanced_use/nlp_application + advanced_use/synchronization_training_and_evaluation.md .. toctree:: :glob: -- Gitee