使用MXNet训练神经网络模型的一般步骤

一、读取数据集

from mxnet.gluon import data
创建DataLoader实例,该实例Loads data from a dataset and returns mini-batches of data.(每次读取一个样本数为batch_size的小批量数据)
在这里插入图片描述
几个常用的参数:
1、dataset (Dataset) – Source dataset. Note that numpy and mxnet arrays can be directly used as a Dataset.
2、batch_size (int) – Size of mini-batch.
小批量随机梯度下降优化算法:先选取一组模型参数的初始值,接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini_batch),然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数(学习率)的乘积作为模型参数在本次迭代的减小量。
3、shuffle (bool) – Whether to shuffle the samples.

对于图像数据的处理常使用ToTensor实例
transformer = data.vision.transforms.ToTensor()
该实例Converts an image NDArray of shape (H x W x C) in the range [0, 255] to a float32 tensor NDArray of shape (C x H x W) in the range [0, 1).(将图像数据从uint8格式变换成32位浮点数格式,并除以255使得所有像素的数值均在0-1之间,还将图像通道从最后一维移到最前一维)

对于每一个图像数据样本来说,都包含图像和标签两部分,将ToTensor实例应用在每一个样本的第一个元素(图像)上可以使用数据集实例的transform_first函数
数据集实例:An mxnet or numpy array can be directly used as a dataset.
用法:data.Dataset.transform_first(transformer)

二、定义模型

from mxnet.gluon import nn
第一步:定义一个Sequential实例,它可以串联各个层(Stacks Blocks sequentially.)
net=nn.Sequential()
第二步:使用Sequential实例的add函数(Adds block on top of the stack.)添加神经网络的一层,如创建一个单层神经网络,输出层与输入层各个输入完全连接,该输出层又叫作全连接层,全连接层是一个Dense实例。每一个层或者模型都是一个Block实例(Base class for all neural network layers and models.)。
net.add(nn.Dense(1))

三、初始化模型参数

使用Block实例的initialize函数初始化参数,如权重w和偏差b
在这里插入图片描述
init使用initializer进行初始化
from mxnet import initializer(或者from mxnet import init)二者是一样的
如通过init.Normal(sigma=0.01)指定权重参数每个元素将在初始化时随机采样于均值为0,标准差为0.01的正态分布。

四、定义损失函数

from mxnet.gluon import loss
用于线性回归的平方损失函数:loss.L2Loss()
用于softmax回归的交叉熵损失函数:loss.SoftmaxCrossEntropyLoss()

五、定义优化算法

from mxnet import gluon
创建一个Trainer实例
在这里插入图片描述
主要用到前三个参数:
1、params (ParameterDict) – The set of parameters to optimize.(要优化的参数)
2、optimizer (str or Optimizer) – The optimizer to use. See help on Optimizer for a list of available optimizers.(优化算法)下表列出了可使用的优化算法:
使用MXNet训练神经网络模型的一般步骤_第1张图片
3、optimizer_params (dict) – Key-word arguments to be passed to optimizer constructor. For example, {‘learning_rate’: 0.1}. (优化算法的参数)
例如:指定一个学习率为0.03的小批量随机梯度下降优化算法,该优化算法将用来迭代net实例所有通过add函数嵌套的层所包含的全部参数,这些参数可以通过Block实例的collect_params函数获取。
在这里插入图片描述
trainer=gluon.Trainer(net.collect_params(),‘sgd’,{‘learning_rate’:0.03})

六、训练模型

from mxnet import autograd
for epoch in range(1,num_epochs+1):
    for X,y in data_iter:
        with autograd.record():
            l=loss(net(X),y)
        l.backward()
        trainer.step(batch_size)
    l=loss(net(features),labels)

epoch是迭代周期;
data_iter是一个DataLoader实例,每次对一个batch_size大小的小批量数据进行训练;
net(X)用来对输入数据X进行一次前向计算;
默认情况下,MXNet不会记录用于求梯度的计算。需要调用record函数来要求MXNet记录与梯度有关的计算。通过损失函数loss计算得到的l是长度为batch_size的一维NDArray;
执行l.backward()等价于执行l.sum().backward(),即先对l中元素求和得到新的变量,再求该变量有关参数的梯度;
Trainer实例的step函数用于迭代模型参数(调整参数)
在这里插入图片描述

你可能感兴趣的:(人工智能,深度学习,神经网络,MXNet,机器学习,深度学习)