使用MindSpore训练手写数字识别模型笔记分享(下)

举报
Jack20 发表于 2022/12/13 22:45:48 2022/12/13
【摘要】 1.3MindSpore构建训练模型网络开发、数据处理、构建模型、模型训练、模型保存、模型推理Tensor-基础数据结构MindSpore中最基础的数据结构是张量(Tensor),是计算的基础:• 是Parameter(权重和偏置)的载体,Feature Map的载体;• 可与numpy.ndarray无缝转换1. Tensor声明和使用t1 = Tensor(np.zeros([1,2,3...

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 执行

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。