#!/usr/bin/env python2# -*- coding: utf-8 -*-"""Created on Fri Aug 10 16:13:29 2018@author: myhaspl"""import mxnet as mximport mxnet.ndarray as ndfrom mxnet import nd, autograd, gluonfrom mxnet.gluon.data.vision import datasets, transformsfrom time import timedef build_lenet(net): ???????with net.name_scope(): ???????net.add(gluon.nn.Conv2D(channels=6,kernel_size=5,activation="relu"), ???????????gluon.nn.MaxPool2D(pool_size=2, strides=2), ???????????gluon.nn.Conv2D(channels=16, kernel_size=3, activation="relu"), ???????????gluon.nn.MaxPool2D(pool_size=2, strides=2), ???????????gluon.nn.Flatten(), ???????????gluon.nn.Dense(120, activation="relu"), ???????????gluon.nn.Dense(84, activation="relu"), ???????????gluon.nn.Dense(10)) ???????return netmnist_train = datasets.FashionMNIST(train=True)X, y = mnist_train[0]print (‘X shape: ‘, X.shape, ‘X dtype‘, X.dtype, ‘y:‘, y,‘Y dtype‘, y.dtype)#x:(height, width, channel)#y:numpy.scalar,标签text_labels = [ ???????????‘t-shirt‘, ‘trouser‘, ‘pullover‘, ‘dress‘, ‘coat‘, ???????????‘sandal‘, ‘shirt‘, ‘sneaker‘, ‘bag‘, ‘ankle boot‘]#转换图像为(channel, height, weight)格式,并且为floating数据类型,通过transforms.ToTensor。#另外,normalize所有像素值 使用 transforms.Normalize平均值0.13和标准差0.31. transformer = transforms.Compose([ ???????????transforms.ToTensor(), ???????????transforms.Normalize(0.13, 0.31)])#只转换第一个元素,图像部分。第二个元素为标签。mnist_train = mnist_train.transform_first(transformer)#加载批次数据batch_size = 200train_data = gluon.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True)#读取本批数据i=1for data, label in train_data: ???print i ???print data,label ???break#没有这一行,会以每批次200个数据来读取。mnist_valid = gluon.data.vision.FashionMNIST(train=False)valid_data = gluon.data.DataLoader(mnist_valid.transform_first(transformer),batch_size=batch_size)#定义网络net = build_lenet(gluon.nn.Sequential())net.initialize(init=mx.init.Xavier())print net#输出softmax与误差softmax_cross_entropy = gluon.loss.SoftmaxCrossEntropyLoss()#定义训练器trainer = gluon.Trainer(net.collect_params(), ‘sgd‘, {‘learning_rate‘: 0.1})def acc(output, label): ???# output: (batch, num_output) float32 ndarray ???# label: (batch, ) int32 ndarray ???return (output.argmax(axis=1) == label.astype(‘float32‘)).mean().asscalar()for epoch in range(10): ???train_loss, train_acc, valid_acc = 0., 0., 0. ???tic = time() ???for data, label in train_data: ???????# 前向与反馈 ???????with autograd.record(): ???????????output = net(data) ???????????loss = softmax_cross_entropy(output, label) ???????loss.backward() ???# 换一批样本数据,更新参数 ???trainer.step(batch_size) ???# 计算训练误差和正确率 ???train_loss += loss.mean().asscalar() ???train_acc += acc(output, label) ???print "." ???#测试正确率 ???for data, label in valid_data: ????????predict_data=net(data) ???????valid_acc += acc(predict_data, label) ???????print("Epoch %d: Loss: %.3f, Train acc %.3f, Test acc %.3f, \ Time %.1f sec" % ( ????????????????????epoch, train_loss/len(train_data), ????????????????????train_acc/len(train_data), ????????????????????valid_acc/len(valid_data), time()-tic))#保存模型参数,非模型结构file_name = "net.params"net.save_parameters(file_name)
mxnet-保存模型参数
原文地址:http://blog.51cto.com/13959448/2316666