mxnet(第一天学习笔记)

mxnet是一款很不错的神经网络框架,我平时使用tensorflow会多一些,tensorflow在我看来注释要比代码多,并且算法的灵活性也比较好。当然,mxnet也比较灵活,上手难度和tensorflow差不多,都比较易学易用,所以工作之余也就顺便学习学习mxnet,毕竟这个是国人发起的项目,而且框架比较优秀。官网上面的例子很全面,但是对于入门级的玩家来说,有很多地方难以理解(小编我就是入门级玩家),所以我的想法就是首先截取官网上面例子的一部分,寻寻渐进的进行。
第一个例子当然是多层感知机(MLP)用于手写体识别的小例子。
第一步数据:
官网上面的例子有,直接复制套用即可(如果是自己的数据集也可以参考这种类型的数据表示)

def get_iterator(data_shape):
    def get_iterator_impl(batch_size, kv):
        flat = False if len(data_shape) == 3 else True
        train           = mx.io.MNISTIter(
            image       = "data/train-images-idx3-ubyte",
            label       = "data/train-labels-idx1-ubyte",
            input_shape = data_shape,
            batch_size  = batch_size,
            shuffle     = True,
            flat        = flat,
            num_parts   = kv.num_workers,
            part_index  = kv.rank)
        val = mx.io.MNISTIter(
            image       = "data/t10k-images-idx3-ubyte",
            label       = "data/t10k-labels-idx1-ubyte",
            input_shape = data_shape,
            batch_size  = batch_size,
            flat        = flat,
            num_parts   = kv.num_workers,
            part_index  = kv.rank)
        return (train, val)
    return get_iterator_impl

第二步模型:
mxnet的写法就比较简单了,直接几个参数就可以搞定,要说缺点的话我觉得就是输入代码的时候没有提示。

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')  # 激活函数

第三步模型的训练:
mxnet有一个自己的fit函数,这个用起来比较类似于sklearn,当然也可以不用fit函数,这里就首先用fit函数。

# 模型训练必要的一些参数
batch_size = 128
num_examples = 60000
epoch_size = num_examples / batch_size
lr_factor = 1
lr_factor_epoch = 1
num_epochs = 1000
lr = 0.1

# 与模型相关的一些参数
model_args = {}
model_args['epoch_size'] = epoch_size
model_args['lr_scheduler'] = mx.lr_scheduler.FactorScheduler(step = max(int(epoch_size * lr_factor_epoch), 1),factor = lr_factor)
# 设备使用cpu
devs = mx.cpu()
kv = mx.kvstore.create('local')
data_shape = (784, )
# 获取训练集和测试集
(train, val) = get_iterator(data_shape)(batch_size, kv)
model = mx.model.FeedForward(
    ctx=devs,
    symbol=mlp,
    num_epoch=num_epochs,
    learning_rate=lr,
    momentum=0.9,  # 惯性权重
    wd=0.00001,
    initializer=mx.init.Xavier(factor_type="in", magnitude=2.34),  # 权值初始化方法
    **model_args)  # 模型参数
# mx
# 模型训练
eval_metrics = ['accuracy']
eval_metrics.append(mx.metric.create('accuracy'))
# 添加日志文件 显示内容
head = '%(asctime)-15s Node[' + str(kv.rank) + '] %(message)s'
logging.basicConfig(level=logging.DEBUG, format=head)
model.fit(
    X                  = train,
    eval_data          = val,
    eval_metric        = eval_metrics,
    kvstore            = kv)

这里的日志文件会在model训练的时候实时返回训练数据的一些状态。ok,最后一个用于手写体识别的多层感知机模型就完成了。

你可能感兴趣的:(深度学习,MXnet)