参考资料:
根据MXNet源码,我们仿照着自己写一个基于MLP的MNIST测试程序
训练部分:
(1)准备训练集和测试集
data_shape = (784, )#输入图像是28*28,由于使用mlp网络,故需要展成一维进行输入
#定义训练集迭代器
train = mx.io.MNISTIter(
image = data_dir + "train-images-idx3-ubyte",
label = data_dir + "train-labels-idx1-ubyte",
input_shape = data_shape,
batch_size = 128,#一次训练集的大小,相当于每次只训练batch_size个
shuffle = True,
flat = True,
num_parts = kv.num_workers,
part_index = kv.rank)
#定义测试集迭代器
val = mx.io.MNISTIter(
image = data_dir + "t10k-images-idx3-ubyte",
label = data_dir + "t10k-labels-idx1-ubyte",
input_shape = data_shape,
batch_size = 128,
flat = True,
num_parts = kv.num_workers,
part_index = kv.rank)
该部分定义了两个mx.io.MNISTIter迭代器,一个作训练集使用,一个作测试集使用。在MXNet中,主要使用迭代器(Iterator)来为神经网络提供数据。这里比较重要的参数包括:
- image (string, optional, default='./train-images-idx3-ubyte') – Dataset Param: Mnist image path.这里输入的是数据图像信息
- label (string, optional, default='./train-labels-idx1-ubyte') – Dataset Param: Mnist label path.
这里输入的是与image相对应的label值
- input_shape — 描述的是输入数据的大小。比如MLP的输入是1维的,故大小应该是(n,);而CNN的输入是2维的,故大小应该是(n,m)
- batch_size — “批尺寸”,实际上表示的是一次处理样本的个数。对于小样本的数据,完全可以进行一批次处理,这样收敛效果更好,即batch_size = n;而另一个极端情况batch_size = 1,即为在线学习方式。参数的影响可参考谈谈深度学习中的 Batch_Size
其余参数非必要,在特殊场合相应使用即可,参考官方文档中的API
(2)配置网络,这里以简单的两层(可以看到只用了两个激励函数)神经网络为例
#这里定义mlp网络
data = mx.symbol.Variable('data')
fc1 = mx.symbol.FullyConnected(data = data, name='fc1', num_hidden=128)
act1 = mx.symbol.Activation(data = fc1, name='relu1', act_type="relu")
fc2 = mx.symbol.FullyConnected(data = act1, name = 'fc2', num_hidden = 64)
act2 = mx.symbol.Activation(data = fc2, name='relu2', act_type="relu")
fc3 = mx.symbol.FullyConnected(data = act2, name='fc3', num_hidden=10)
mlp = mx.symbol.SoftmaxOutput(data = fc3, name = 'softmax')#softmax回归
上面呈现的网络结果非常清晰,这里无需再做解释。全连接神经网络和Softmax回归待后续。
这里要注意的一点是mx.symbol的使用是一种声明式的编程方式,而非命令式计算,也就是说,这里只构建一个网络框架,而不涉及计算。
(3)训练网络
model = mx.model.FeedForward(
symbol = mlp,
num_epoch = 20,
learning_rate = .1)
- symbol — The symbol configuration of computation network.即前面定义的网络
- num_epoch — Training parameter, number of training epochs(epochs).也就是训练的次数
- learning_rate — 学习常数
拟合数据结果:
model.fit(X = train, eval_data = val)
(4)使用网络预测结果
model.predict(X = val)
MXNet的官方文档实在是比较寒酸,所以,作为一款强大的DL框架,更加适合有一定基础的人来上手。所以新手最好还是从caffe或者tensorflow上手比较合适!
# -*- coding: utf-8 -*-
import os, sys
import find_mxnet
import mxnet as mx
import numpy as np
import logging
print('import finish!')
#这是训练模型的主函数
#定义数据迭代器
def get_iterator():
train = mx.io.MNISTIter(
image = "mnist/train-images-idx3-ubyte",
label = "mnist/train-labels-idx1-ubyte",
batch_size = 128,
data_shape = (784, ))
val = mx.io.MNISTIter(
image = "mnist/t10k-images-idx3-ubyte",
label = "mnist/t10k-labels-idx1-ubyte",
batch_size = 128,
data_shape = (784, ))
return train,val
#定义一个两层网络
def get_mlp():
"""
multi-layer perceptron
"""
data = mx.symbol.Variable('data')
fc1 = mx.symbol.FullyConnected(data = data, name='fc1', num_hidden=128)
act1 = mx.symbol.Activation(data = fc1, name='relu1', act_type="relu")
fc2 = mx.symbol.FullyConnected(data = act1, name = 'fc2', num_hidden = 64)
act2 = mx.symbol.Activation(data = fc2, name='relu2', act_type="relu")
fc3 = mx.symbol.FullyConnected(data = act2, name='fc3', num_hidden=10)
mlp = mx.symbol.SoftmaxOutput(data = fc3, name = 'softmax')
return mlp
mlp = get_mlp()
train,val = get_iterator()
model = mx.model.FeedForward(
symbol = mlp,
num_epoch = 10,
learning_rate = .1)
model.fit(X = train, eval_data = val)