使用MindSpore实现简单的深度学习模型
环境配置
第一步当然是装包:
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14
import mindspore
from mindspore import nn
from mindspore.dataset import vision, transforms
from mindspore.dataset import MnistDataset
数据集处理
提供基于Pipeline的数据引擎。
使用Dataset和Transforms处理数据。
使用的数据集是Mnist数据集,这是一个图片及其标签的数据集。
Dataset使用Pipeline,因此需要定义map、batch、shuffle等操作。首先对图像数据及标签使用map进行变换处理,再打包为大小为64的batch。
def datapipe(dataset, batch_size):
image_transforms = [
vision.Rescale(1.0 / 255.0, 0),
vision.Normalize(mean=(0.1307,), std=(0.3081,)),
vision.HWC2CHW()
]
label_transform = transforms.TypeCast(mindspore.int32)
dataset = dataset.map(image_transforms, 'image')
dataset = dataset.map(label_transform, 'label')
dataset = dataset.batch(batch_size)
return dataset
解释一下这里的三个操作
- 首先进行rescale,由之前的0-255除以255转化为0-1
- 再进行归一化,使图像的每个通道具有特定的均值和标准差。这里的操作会减去均值0.1307,再除以0.3081,得到0均值,标准方差的数据。
- 最后转换图像的通道顺序,即改变图像的形状,从 (height, width, channels) 转换为 (channels, height, width)。大多数的深度学习框架都要求图像的通道数据放在最前面。
随后就是进行map和batch了。
网络构建
使用mindspore.nn构建所有网络的基类,这也是网络的基本单元。
自定义网络时,继承nn.Cell并重写 init 方法(定义网络层)和construct方法(数据的变换)。
模型训练
正常的模型训练要包括三步
- 正向计算:预测并计算损失
- 反向传播:利用自动微分,求模型参数对于损失的梯度
- 参数优化:将梯度更新到参数上
在使用MindSpore时,需要的几步是
- 定义损失函数,定义正向计算函数
- 使用value_and_grad获得梯度计算函数
- 使用optimizer和梯度计算函数定义训练函数
- 设为训练模式
- 执行上述的三个步骤
一次完整的迭代称为一轮epoch,一般情况下随着epoch次数增多,loss下降,accuracy增加。
模型训练完成后,需要将模型参数进行保存。
模型加载
需要以下几步
- 创建空模型
- 加载模型训练后保存的checkpoint
- 把模型载入到空模型中
总结
今天学习了搭建一个简单深度学习网络的基本步骤,由环境搭建、数据集处理、模型搭建、模型训练到模型加载。串通了整个模型在MindSpore的运作逻辑。