Mxnet-Python API 学习——Module API

一些说明
本文中总结的内容来自mxnet 的官方网站:https://mxnet.incubator.apache.org/api/python/index.html
这里不是通篇翻译,而是自己在学习过程中的总结,主要方便自己以后经常查阅。

Mxnet-Python API中包含了什么?

包含了两个主要的高层库:Gluon API和Module API。这两个高层包的基础是NDArray(命令式)和Symbol(声明式)。当然,还有一些其他的API,如Autograd API,IO API等。
本文主要对Module API的用法做了总结:
Module 中提供了基于Symbol进行计算的中层和高层的接口,模块化了training和inference过程中经常需要用到的代码。例如,在训练一个神经网络时,我们需要输入训练数据,初始化模型参数,接着进行前向和反向传播,更新参数,保存和恢复模型参数等。Module则把所有这些过程都封装在一起了。下面通过一个具体的例子来体会这个过程。

1.准备数据

import mxnet as mx
import numpy as np
import logging
logging.getLogger().setLevel(logging.INFO)
mx.random.seed(1234)
fname = mx.test_utils.download('https://s3.us-east-2.amazonaws.com/mxnet-public/letter_recognition/letter-recognition.data')
data = np.genfromtxt(fname, delimiter=',')[:,1:]
label = np.array([ord(l.split(',')[0])-ord('A') for l in open(fname, 'r')])#ord()函数返回ASCII码值
batch_size=32
ntrain=int(data.shape[0]*0.8)
train_iter=mx.io.NDArrayIter(data[:ntrain,:],label[:ntrain],batch_size,shuffle=True)
val_iter=mx.io.NDArrayIter(data[ntrain:,:],label[ntrain:],batch_size)

2.使用Symbol定义网络

net=mx.symbol.Variable('data')
net=mx.symbol.FullyConnected(net,name='fc1',num_hidden=64)
net=mx.symbol.Activation(net,name='relu1',act_type="relu")
net=mx.symbol.FullyConnected(net,name='fc2',num_hidden=26)
net=mx.symbol.SoftmaxOutput(net,name='softmax')
mx.viz.plot_network(net).view()#可视化我们创建的网络

3.创建Module

我们可以通过指定下面的参数来创建Module:
(1)symbol——定义的网络(也就是我们使用symbol定义的net网络)
(2)context——执行计算过程使用的设备或者设备列表
(3)data_names——输入数据变量名称列表(网络中的’data’)
(4)label_names——输入标签变量名称列表 (网络中的softmax_label)

mod=mx.mod.Module(symbol=net,context=mx.cpu(),data_names=['data'],label_names=['softmax_label'])

4.1 使用中层的接口来运行Module

要想训练Module,通常需要完成以下的步骤:
(1)bind——根据数据和标签的形状,系统为执行计算过程中所需要的环境分配内存;
(2)init_params——参数初始化
(3)init_optimizer——设置优化器,默认是SGD
(4)metric.create——设置用于评估的度量方式
(5)forward——前向传播
(6)update_metric——评估并累积上一次前向计算的输出的评估度量。
(7)backward——反向传播
(8)update——更新网络参数

#根据输入数据和标签的形状来分配内存
mod.bind(data_shapes=train_iter.provide_data,label_shapes=train_iter.provide_label)
#参数初始化
mod.init_params(initializer=mx.init.Uniform(scale=0.1))
#设置优化器
mod.init_optimizer(optimizer='sgd',optimizer_params=(('learning_rate',0.1),))
#使用准确率作为测量准则
metric=mx.metric.create('acc')
#开始训练
for epoch in range(5):
    train_iter.reset()
    metric.reset()
    for batch in train_iter:
        mod.forward(batch,is_train=True)#前向传播
        mod.update_metric(metric,batch.label)#更新度量
        mod.backward()#后向传播
        mod.update()#更新参数
    print('Epoch %d ,training %s' %(epoch,metric.get()))

4.2 使用高层的接口运行Module

4.1中列出的全部操作都可以使用一次fit函数来完成,而不用自己写多个繁琐的步骤

train_iter.reset()#重置训练数据迭代器 train_iter
mod.fit(train_iter,eval_data=val_iter,optimizer='sgd',optimizer_params={'learning_rate':0.1}, eval_metric='acc',num_epoch=8)

5 使用Module进行预测

y=mod.predict(val_iter)#生成预测的输出值
assert y.shape==(4000,26)
score=mod.score(val_iter,['acc'])#直接获得评估的准确率
print("Accuracy score is %f" %(score[0][1]))
assert score[0][1]>0.77, "Achieved accuracy (%f) is less than 0.77" %(score[0][1])

6保存和加载Module的参数

使用checkpoint callback 我们可以让Module在每一次训练epoch之后都保存一次参数

model_prefix='mx_mlp'
checkpoint=mx.callback.do_checkpoint(model_prefix)
mod.fit(train_iter,num_epoch=5,epoch_end_callback=checkpoint)

使用load_checkpoint函数来加载symbol和参数,然后把加载的参数灌入到Module中

#arg_param: 模型参数,以及网络权重字典。
#aux_params: 模型参数,以及一些附加状态的字典
sym, arg_params, aux_params = mx.model.load_checkpoint(model_prefix, 3)
assert sym.tojson() == net.tojson()
mod.set_params(arg_params, aux_params)

如果想从恢复的断点处继续训练模型,可以调用fit函数把加载出的参数灌入到Module中,并在此基础上继续训练模型


mod.fit(train_iter,num_epoch=21,arg_params=arg_params,aux_params=aux_params,begin_epoch=3)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值