1、手写数字识别mxnet官网例子手写数字识别简介:通过MNIST数据集建立一个手写数字分类器。(MNIST对于手写数据分类任务是一个广泛使用的数据集)。1.前提:mxnet0.10及以上、python、jupyternotebook(有时间可以jupyter notebook的用法,如:PPT的制作)pip install requests jupyter python下jupyternotebook的安装2.加载数据集:importmxnetasmxmnist = mx.test_utils.get_mnist()此时MXNET数据集已完全加载到内存中(注:此法对于大型数据集不适用)考虑要素:
2、快速高效地从源直接流数据+输入样本的顺序图像通常用4维数组来表示:(batch_size,num_channels,width,height)对于MNIST数据集,因为是28*28灰度图像,所以只有1个颜色通道,width=28,height=28,本例中batch=100(批处理100),即输入形状是(batch_size,1,28,28)数据迭代器通过随机的调整输入来解决连续feed相同样本的问题。测试数据的顺序无关紧要。batch_size = 100train_iter=mx.io.NDArrayIter(mnisttrain_data,mnisttrain_label, batch_
3、size, shuffle=True)val_iter = mx.io.NDArrayIter(mnisttest_data, mnisttest_label, batch_size)初始化MNIST数据集的数据迭代器(2个:训练数据+测试数据)3.训练+预测:(2种方法) (CNN优于MLP) 1)传统深度神经网络结构MLP(多层神经网络)MLPMXNET的符号接口为输入的数据创建一个占位符变量data = mx.sym.var(data)data = mx.sym.flatten(data=data)将数据从4维变成2维(batch_size,num_channel*width*heigh
4、t)fc1 =mx.sym.FullyConnected(data=data, num_hidden=128)act1 = mx.sym.Activation(data=fc1, act_type=relu)第一个全连接层及相应的激活函数fc2 =mx.sym.FullyConnected(data=act1, num_hidden = 64)act2 = mx.sym.Activation(data=fc2, act_type=relu)第二个全连接层及相应的激活函数(声明2个全连接层,每层有128个和64个神经元)fc3 =mx.sym.FullyConnected(data=act2,
5、num_hidden=10)声明大小10的最终完全连接层mlp =mx.sym.SoftmaxOutput(data=fc3, name=softmax)softmax的交叉熵损失MNIST的MLP网络结构以上,已完成了数据迭代器和神经网络的申明,下面可以进行训练。超参数:处理大小、学习速率importlogginglogging.getLogger().setLevel(logging.DEBUG) 记录到标准输出mlp_model = mx.mod.Module(symbol=mlp, context=mx.cpu()在CPU上创建一个可训练的模块mlp_model.fit(train_i
6、ter训练数据eval_data=val_iter, 验证数据 optimizer=sgd, 使用SGD训练optimizer_params=learning_rate:0.1, 使用固定的学习速率eval_metric=acc, 训练过程中报告准确性batch_end_callback=mx.callback.Speedometer(batch_size, 100), 每批次100数据输出的进展num_epoch=10)训练至多通过10个数据预测:test_iter = mx.io.NDArrayIter(mnisttest_data, None, batch_size)prob = mlp
7、_model.predict(test_iter)assertprob.shape = (10000, 10)计算每一个测试图像可能的预测得分(probij第i个测试图像包含j输出类)test_iter = mx.io.NDArrayIter(mnisttest_data, mnisttest_label, batch_size)预测精度的方法acc = mx.metric.Accuracy()mlp_model.score(test_iter, acc)print(acc)assertacc.get()1 0.96如果一切顺利的话,我们将看到一个准确的值大约是0.96,这意味着我们能够准确地
8、预测96%的测试图像中的数字。 2)卷积神经网络(CNN) 卷积层+池化层data = mx.sym.var(data)conv1 = mx.sym.Convolution(data=data, kernel=(5,5), num_filter=20)tanh1 = mx.sym.Activation(data=conv1, act_type=tanh)pool1 = mx.sym.Pooling(data=tanh1, pool_type=max, kernel=(2,2), stride=(2,2)第一个卷积层、池化层conv2 = mx.sym.Convolution(data=pool
9、1, kernel=(5,5), num_filter=50)第二个卷积层tanh2 = mx.sym.Activation(data=conv2, act_type=tanh)pool2 = mx.sym.Pooling(data=tanh2, pool_type=max, kernel=(2,2), stride=(2,2)flatten = mx.sym.flatten(data=pool2)第一个全连接层fc1 = mx.symbol.FullyConnected(data=flatten, num_hidden=500)tanh3 = mx.sym.Activation(data=f
10、c1, act_type=tanh)fc2 = mx.sym.FullyConnected(data=tanh3, num_hidden=10)第二个全连接层lenet = mx.sym.SoftmaxOutput(data=fc2, name=softmax)Softmax损失LeNet第一个卷积层+池化层lenet_model = mx.mod.Module(symbol=lenet, context=mx.cpu()在GPU上创建一个可训练的模块lenet_model.fit(train_iter,eval_data=val_iter, optimizer=sgd,optimizer_p
11、arams=learning_rate:0.1,eval_metric=acc,batch_end_callback = mx.callback.Speedometer(batch_size, 100),num_epoch=10)训练(同MLP)test_iter = mx.io.NDArrayIter(mnisttest_data, None, batch_size)prob = lenet_model.predict(test_iter)test_iter = mx.io.NDArrayIter(mnisttest_data, mnisttest_label, batch_size)acc
12、 = mx.metric.Accuracy()预测LeNet的准确性lenet_model.score(test_iter, acc)print(acc)assertacc.get()1 0.98使用CNN,我们能够正确地预测所有测试图像的98%左右。附:完整代码1)MLPimportmxnetasmxmnist=mx.test_utils.get_mnist()batch_size=100train_iter=mx.io.NDArrayIter(mnisttrain_data,mnisttrain_label,batch_size,shuffle=True)val_iter=mx.io.ND
13、ArrayIter(mnisttest_data,mnisttest_label,batch_size)data=mx.sym.var(data)data=mx.sym.flatten(data=data)fc1=mx.sym.FullyConnected(data=data,num_hidden=128)act1=mx.sym.Activation(data=fc1,act_type=relu)fc2=mx.sym.FullyConnected(data=act1,num_hidden=64)act2=mx.sym.Activation(data=fc2,act_type=relu)fc3=
14、mx.sym.FullyConnected(data=act2,num_hidden=10)mlp=mx.sym.SoftmaxOutput(data=fc3,name=softmax)importlogginglogging.getLogger().setLevel(logging.DEBUG)mlp_model=mx.mod.Module(symbol=mlp,context=mx.cpu()mlp_model.fit(train_iter,eval_data=val_iter,optimizer=sgd,optimizer_params=learning_rate:0.1,eval_me
15、tric=acc,batch_end_callback=mx.callback.Speedometer(batch_size,100),num_epoch=10)test_iter=mx.io.NDArrayIter(mnisttest_data,None,batch_size)prob=mlp_model.predict(test_iter)assertprob.shape=(10000,10)test_iter=mx.io.NDArrayIter(mnisttest_data,mnisttest_label,batch_size)acc=mx.metric.Accuracy()mlp_mo
16、del.score(test_iter,acc)print(acc)assertacc.get()10.962)CNNimportmxnetasmxmnist=mx.test_utils.get_mnist()batch_size=100train_iter=mx.io.NDArrayIter(mnisttrain_data,mnisttrain_label,batch_size,shuffle=True)val_iter=mx.io.NDArrayIter(mnisttest_data,mnisttest_label,batch_size)data=mx.sym.var(data)conv1
17、=mx.sym.Convolution(data=data,kernel=(5,5),num_filter=20)tanh1=mx.sym.Activation(data=conv1,act_type=tanh)pool1=mx.sym.Pooling(data=tanh1,pool_type=max,kernel=(2,2),stride=(2,2)conv2=mx.sym.Convolution(data=pool1,kernel=(5,5),num_filter=50)tanh2=mx.sym.Activation(data=conv2,act_type=tanh)pool2=mx.sy
18、m.Pooling(data=tanh2,pool_type=max,kernel=(2,2),stride=(2,2)flatten=mx.sym.flatten(data=pool2)fc1=mx.symbol.FullyConnected(data=flatten,num_hidden=500)tanh3=mx.sym.Activation(data=fc1,act_type=tanh)fc2=mx.sym.FullyConnected(data=tanh3,num_hidden=10)lenet=mx.sym.SoftmaxOutput(data=fc2,name=softmax)le
19、net_model=mx.mod.Module(symbol=lenet,context=mx.cpu()lenet_model.fit(train_iter,eval_data=val_iter,optimizer=sgd,optimizer_params=learning_rate:0.1,eval_metric=acc,batch_end_callback=mx.callback.Speedometer(batch_size,100),num_epoch=10)test_iter=mx.io.NDArrayIter(mnisttest_data,None,batch_size)prob=lenet_model.predict(test_iter)test_iter=mx.io.NDArrayIter(mnisttest_data,mnisttest_label,batch_size)acc=mx.metric.Accuracy()lenet_model.score(test_iter,acc)print(acc)assertacc.get()10.98
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1