使用MindSpore训练手写数字识别模型笔记分享(下)
1.3MindSpore构建训练模型
网络开发、数据处理、构建模型、模型训练、模型保存、模型推理
Tensor-基础数据结构
MindSpore中最基础的数据结构是张量(Tensor),是计算的基础:
• 是Parameter(权重和偏置)的载体,Feature Map的载体;
• 可与numpy.ndarray无缝转换
1. Tensor声明和使用
t1 = Tensor(np.zeros([1,2,3]),
ms.float32)
assert isinstance(t1,Tensor)
assert t1.shape ==(1,2,3)
assert t1.dtype == ms.float32
2.Tensor常见的操作
//转换成Numpy数组asnumpy0
获取Tensor的大小size()
/获取Tensor的维数dim()
获取Tensor的数据类型dtype
//设置Tensor的数据类型set_dtype(
获取Tensor的形状.shape
Initializer -权重初始化模块
MindSpore当前支持的Initializer:
- TruncatedNormal
- Normal
- Uniform
-HeUniform
- HeNormal
- XavierUniform
- One
- Zero
- Constant
如何配置权重初始化方法:
MindSpore 二维卷积Conv2d中weight_init 默认值为'normal'采用均值为0,方差为0.01的normal随机初始化方法
Conv2d( ...weight_init='normal,bias_init='zeros")
修改卷积的权重初始化方法
1. weight_init = 'zeros’,全零初始化
2. weight_init = Normal(0.02),均值为0,方差为0.02的Normal随机初始化
3.用户自定义权重初始化方法:
np_init = np.zeros([out_channels, in_channels, kernel_size, kernel_size])
weight_init= Tensor(np_init,mstype.float32)
MindSpore网络权重一般使用单精度float32
Operation - MindSpore基础计算单元
常用Operations
- array: Array相关的算子
Squeeze
Expand DlimsConcat
OnesLikeSellect
StridedSliceScatterNd
……
- math:数学计算相关的算子
Sub
AddN
Sin
Cos
Mul
ReailDiv
MaEMul
LogicalNot
LogicalAnd
ReduceMean
Greater
LeSs
- nn:网络类算子
Flatten
Conw2D
-Avg Pool
MaxPool
Softmax
ReLU
TopK
SoftmaoCrossEintropy
Sigmold
SmoothL1LossPooling
SGD
BatchNorm
SigmoidCrossEntropy
control:控制类算子
- ControlDepend
- random:随机数相关算子
- other:其他
Cell-可复用的基础网络单元
Cell是MindSpore核心编程结构,是基础的网络单元。Cell的对象可以直接执行。
• _init_初始化参数 (Parameter),子模块(Cell),算子(Primitive)等组件,进行初始化的校验.
• construct定义执行的过程。图模式时,会被编译成图来执行。有一些语法限制
• bprop (可选)自定义模块的反向。没有定义这个函数时,会采用自动微分,计算construct部分的反向
预定义Cell
nn.layer常用网络基础单元Conv2d
BatchNorm
loss 常用loss
SoftmaxCrossEntropyWithLogits
MSELoss
optim 常用优化器
Momentum
SGD
Adam
wrap 常用网络包装函数
TrainOneStepCell网络梯度计算及权重更新
WithLossCell连接网络与损失函数
withGradCell求梯度
定义前向网络
定义损失函数
数据处理Pipeline
数据是深度学习的基础,高质量的数据输入会在整个深度神经网络中起到积极作用。
在训练开始之前,由于数据量有限,或者为了得到更好的结果,通常需要进行数据处理与数据增强,以获得能使网络受益的数据输入。
加载、shuffle、map、batch、repeat
数据经过处理和增强,像流经管道的水一样源源不断地流向训练系统。
数据集导入与预处理
定义数据集增强操作
调用map方法在图片上执行增强操作
Model-用于模型训练与推理的高阶API
Model API提供了高阶模型训练和评估等接口。
• ·传入前向网络net、损失函数loss和优化器optimizer,完成Model的初始化
• 调用train、eval和predict进行训练、评估和推理
• 调用train接口进行模型训练时,包含两层循环,外层循环为数据集多代(epoch)循环,内层循环为epoch内多步(step)迭代。
例如:训练集样本总数为320,每次网络输入的数据样本数为32,则每个epoch的循环包含了10个step(样本总数/每次输入样本数)。
Model接口通过回调模块Callback可以获取训练过程中的模型参数。
·在训练过程中触发Callback执行的时机有begin、end、epoch_begin、epoch_end、step_begin、step_end
构建训练模型
模型训练、评估与保存
模型训练:调用Model train接口进行模型训练。
模型保存∶在模型训练的过程中,使用callback机制传入回调函数ModelCheckpoint对象,可以保存模型参数,生成CheckPoint文件。通过CheckpointConfig对象可以设置CheckPoint的保存策略,每个epoch会自动保存最后一个step的CheckPoint文件。
模型评估:调用Model eval接口,返回值为用户指定评估指标的评估结果。
模型加载与推理
模型加载: serialization模块load_checkpoint、load_param_into_net等接口提供了模型加载功能,模型加载可用于Fine-tuning、推理等场景。
推理:调用Model predict接口,返回值为模型对输入数据的预测值。
CKPT = 'ckpt/lenet_1-2_1875.ckpt'
def infer(data_dir):
ds = create_dataset(data_dir,training=False).create_dict_iterator()
data = ds.get_next()
images = data['image']
labels = data['label']
net = LeNet5()
load_checkpoint(CKPT, net=net)
model = Model(net)
output = model.predict(Tensor(data["image']))
preds = np.argmax(output.asnumpy(. axis=1)
1.4ModelArts实践手写数字模型训练
准备数据、准备执行脚本、上传至OBS、创建作业、运行作业、运行成功查看结果
实践准备:准备实验数据和脚本,并上传至公有云对象存储服务OBS.·数据准备:MNIST
• 数据集 http://yann.lecun.com/exdb/mnist/
• 执行脚本准备:LeNet-5分类网络训练脚本
在ModelArts平台创建训练作业
实践结果:
1.验证精度约为95%
2.导出模型文件
MindSpore的技术竞争力包括:开发态友好、运行态高效和端云协同。
数据处理Pipeline提供的功能:数据加载、shuffle、map
MNIST训练集共有60000张图片,在使用MNIST数据集训练LeNet-5网络时,如果数据批处理数batch_size设置为32,整个数据集训练一轮(1个epoch)大约需要1875步(step)?
卷积层、池化层、全连接层、输入层属于LeNet网络的基本结构
动态图更灵活,便于开发调试,静态图更高效,能高效执行训练任务,通过context设置可以在动态图模式和静态图模式之间切换
mindspore 高效执行的关键技术包括:pipeline并行,深度图优化,on-device 执行
- 点赞
- 收藏
- 关注作者
评论(0)