MXNet初次尝试 ---- MNIST

参考资料:

1.MXNet官方文档

2.MXNet的Model API

3.MXNet设计和实现简介

根据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)
 

猜你喜欢

转载自lps-683.iteye.com/blog/2334808