通过MLP网络结构进行手写数字识别的系统设计

2019-08-13 08:49路明玉
科技资讯 2019年14期

路明玉

摘  要:数字识别是近年来发展起来的一项新科技,具有广泛的应用前景。该文主要利用MLP网络结构实现手写体数字的识别。首先,设计网络模型对识别精度进行测试。然后提取结构特征并输入网络模型验证其正确性。

关键词:数字识别  多层感知机  网络模型

中图分类号:TP391   文献标识码:A            文章编号:1672-3791(2019)05(b)-0017-02

1  课题背景意义

数字识别是近年来发展起来的一项新科技,应用十分广泛,在选票统计、牌照识别、信件分拣、银行数据等分析中都具有重要的应用价值。现有大量的数据、报告和账户记录是通过手动输入电脑系统,导致错误多、效率低。机器识别会避免这些缺点,让机器学会像人类一样识别手写数字,像人类一样学习和分类。只要保障硬件条件的满足,机器识别不会因长时间工作产生疲劳,出现识别错误,所以,一个好的数字识别技术会解决这些问题。该文研究的正是一种手写数字识别系统。

2  手写数字识别

2.1 手写数字识别一般方法

手写数字识别方法很多,比如多层感知机、循环神经网络、卷积神经网络等。对于手写的数字,笔画简单并且书写方便,而且分类不多,大体上可以归纳成一个分类问题。

2.2 手写数字识别难点

(1)手写数字的笔画简单且差别不大,书写方便,只有10个种类,在识别的过程中可以提取出来的信息太少,识别难度很大。

(2)对同一个数字,不同人去写,差别很大,每个人每次的写法也都不一样,找不到任何规律。

(3)很多人在较忙碌时书写的数字存在连笔的状况。

(4)由于书写纸张的材质或书写笔的原因,很多时候手写的数字显示不清晰,存在模糊不清或者断笔的情况,可利用的信息减少。

(5)有一些手写数字外形上很相似,比如“7”和“1”、“8”和“3”。很难被清晰识别并分类。

3  MLP网络结构系统设计

针对多层感知机的网络结构(MLP),采取输入层(Input Layer)、隐含层(HiddenLayer)、输出层(Output Layer)的三层网络结构设计模式,每一层之间都是全连接的。输入层是调用MNIST的数据集。隐含层又分为两层,第一层有128个神经节点,第二层有64个神经节点,每一层都有一个非线性的激活函数relu。对于输出层,是输出为10个类别的分类器。最后,输出给softmax交叉熵损失函数进行。

3.1 体系结构设计

手写数字识别软件设计主要分为训练模块和测试模块,其中训练模块主要包括:图像预处理,接下来就是将处理后的28×28的矩阵转化为一维数组,方便数据的特征提取和计算,再设置一个1×10的向量表示标签,然后用softmax函数预测。而正向传播通过softmax得到的预测值和标注之间的差距定义为交叉熵,然后通过梯度下降法优化一个step大小的梯度,并且利用链式法则求偏导。

测试主要就是建立一个画图板,在画图板上手写一个数字,进行识别的过程,测试主要是为了验证训练模型的准确率,并且显示结果要求显示识别成每一个类别的概率分布。

3.2 界面设计

MLP识别显示结果界面主要包括:左侧为手写后预处理的图像,大小为28×28,右侧显示该图片被识别为0~9各个类别的概率,识别结果取各个类别的最大值,最后一行显示识别结果。

3.3 详细设计

MLP就是我们常说的多层感知机,过去很多领域都有用到,但随着深度学习的发展,产生了更好的学习方法,它逐渐地被淡化。近些年来,随着机器学习的流行,MLP成为了大家学习入门和研究的基础。MLP是一种最基本的神经网络。网络结构相对简单,该课题使用三层结构,最开始的输入层,输入的是28×28大小的图片,也就是一维向量,中间有两层,分别有128和64个神经元。其中的每个节点都带有一个非线性的激活函数relu。输出层就是大小为10的向量。上一层的输出作为下一层的输入,是全连接的。关键部分如下。

import mxnetasmx#导入mxnet模块

mnist=mx.test_utils.get_mnist()#导入mnist数据集

Epoch=10#全部处理数据10次

batch_size=100#批处理大小为100

train_iter=mx.io.NDArrayIter(mnist['train_data'], mnist['train_label'],batch_size,shuffle=True)#训练数据的变量

val_iter=mx.io.NDArrayIter(mnist['test_data'], mnist['test_label'],batch_size)#测试数据的变量

fc1=mx.sym.FullyConnected(data=data,num_hidden=128)#第一层全连接层,包含128个神经元

act1=mx.sym.Activation(data=fc1,act_type="relu")#激活函数

fc2=mx.sym.FullyConnected(data=act1,num_hidden=64)#第二層全连接层,包含64个神经元

act2=mx.sym.Activation(data=fc2,act_type="relu")#激活函数

fc3=mx.sym.FullyConnected(data=act2,num_hidden=10)#大小为10的最终全连接层

mlp=mx.sym.SoftmaxOutput(data=fc3,name='softmax')#交叉熵损失函数

mlp_model.fit(train_iter,#训练数据

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=Epoch)#进行10次全部数据处理

test_iter=mx.io.NDArrayIter(mnist['test_data'],None,batch_size)#测试数据

prob = mlp_model.predict(test_iter)

assert prob.shape=(10000,10)#对图像进行预测并分类

4  系统运行结果

运行程序,我们在输入界面写一个数字1,查看是否实现手写功能。测试结果正确,说明书写一个一笔可以完成的数字是可以的。接下来我们写一个有断笔的数字,比如“4”和“5”这样的,测试是否可以写。通过结果可以看到,书写界面基本完成功能要求,可以手写任何的数字。接下来就是识别按钮,测试功能是否实现,并且查看识别准确率如何。根据结果,系统给出了从1到9的各个概率,其中“5”的书写概率为0.97,也是系统推荐的结果,跟预设结果相符,基本可以识别手写数字,识别准确率较高,功能基本实现。

参考文献

[1] 李连胜.基于神经网络的手写数字识别技术研究[D].中南大学,2015.

[2] 张婷,王卓英.手写体数字计算机识别系统的应用研究[J].微型电脑应用,2016(1):30-40.