李溦 李天宇 李增辉
OCR(Optical Character Recognition,光学字符识别)是通过检测字符暗、亮的模式确定它的形状,然后利用字符识别将形状翻译成计算机字符的过程。光学字符识别是OCR 的核心,然而对于许多类型的机器学习算法来说,这种图像处理都是一项艰巨的任务。
光学符号识别原理可分为以下三方面:相关匹配识别、概率判定准则、句法模式识别。相关匹配识别:根据字符的直接形象,提取简单特征,利用相关匹配进行分析识别。这种方法的优点是既可以在时间区域和空间区域进行,也可以在频率区域进行,应用广泛;概率判定准则:利用文字统计特性中的概率分布,采用概率识别字符的方法;句法模式识别:根据字符结构,用有限文法结构,形成形式语句,识别字符。在OCR的发展进程中,人工神经网络以及模糊数学理论的发展,推动了OCR技术的进一步发展。
本文通过公开的光学字符数据集来进行统计描述,并通过光学字符数据集判断识别每个字符需要选取哪些恰当的特征,建立数学模型来识别该字符。最后对模型进行评价,用70%的数据来学习训练模型,30%的数据进行验证测试正确率,并提出推广。首先,对26个英文字母进行转化处理,分别转化为相应的26个数字,转化之后,利用SPSS软件对数据进行预处理,剔除了3个无用样本数据;其次,建立数据统计模型,运用神经网络算法处理数据,在利用神经网络运算的过程中,编写MATLAB神经网络算法,将Excel文件中的百分之七十样本数据导入MATLAB程序,对数据进行演算推理,从而得出光学符号数据的规律;最后,在建立模型的过程,可能存在偶然性,所以,还需要利用剩余百分之三十的光学字符数据,对模型进行检验;然后,根据检验结果,对所建立的模型进行评价分析,进一步完善模型。
BP神经网络:一种按误差逆传播算法训练的多层前馈网络,属于目前世界上应用最广泛,前景最好的神经网络模型。BP神经网络能够血液西和存储大量的输入与输出的映射关系,而且不需要提前揭示描述映射关系的数学方程,并且人工的神经网络基本结构来源于人脑,具有并行处理特征,并且在计算机的高速运算之下,可以大大的提高数据处理以及其他各方面的工作速度,普通计算机功能大都取决于程序中给出的知识和能力,在BP神经网络的构建中,编程处理是十分重要的一个环节。
网络结构的确定主要就是隐层神经元个数的确定。如果隐层神经元的个数太多会降低网络的泛化功能,而且还将会使训练的时间加长,使系统的效率降低;而如果隐层神经元个数太少则就不能达到所规定的训练误差。一般可以根据试算决定,当然也可以参考这个公式: ,其中l为隐层神经元的个数,n与m分别为输入神经元的个数和输出神经元的个数。
网络初始化的权值与阈值,可以采用Matlab所提供的初始化函数newff()来建立一个BP神经网络:
函数newff是建立一个可训练的前馈网络。参数说明如下:
PR:Rx2的矩阵用来定义R个输入向量的最大值与最小值;
Si:第i层的神经元个数;
TFi:第i层的传递函数,默认函数是tansig函数;
BTF:训练函数,默认函数是trainlm函數;
BLF:权值/阀值学习函数,默认函数是learngdm函数;
PF:性能函数,默认函数是mse函数;
net为最新生成的BT神经网络。
MATLAB软件提供了很多训练不同的神经网络的函数,这使得对神经网络模型的训练变得十分简单,其中,由动量的梯度下降法为代表,训练函数为traingdx。函数的结构为:
上式的变量表达与6.3.2中的变量表达意义相同,此处不再多说。当网络训练达到了最大的训练次数,或者当网络的误差平方和小于期望的最小误差时,那么网络就会停止训练
在训练好的网络中输入剩余的样本,并判断所给的样本值与输出的样本值是否相等,如果相等的话,那么就说明该神经网络具有很好的泛化功能,就能够应用于此样本整体的预测机选;如果不符的话,就要改动程序,调整网络,或者也可以加大样本的训练数,对该网络再次训练。此过程可以采用Matlab 中的sim()函数来实现。Sire的表达式是:A=sire(net,P),其中,A为输出数据,P为输入的样本数据,其他的参数意义与之前一样。当然,此过程还可以运用传递函数分布来分步实现,不过介于本题运用神经网络来解答,在此就不必多说了。
通过训练好的神经网络和所采用的函数进行模拟训练,输入数据P是要预测的输入数据,输出数据A就是要得到的预测数据,之后与所给结果进行对比,得出结论。最后也可以对网络进行保存,以便以后的运用与对比。
根据题意,我们将所给附件的前14000样本运用MATLAB软件进行运算,在此过程中,可以分为以下几步:
1、由于数据较多,不能直接输入,我们就将数据通过Excel导入到MATLAB中,此文件可在附件中看到,具体代码如下:
num1=xlsread('test 123.xls','Sheet2','A2:Q20001');
input_train=num1(1:14000,2:17)';
output_train=num1(1:14000,1)';
input_test=num1(14000:20000,2:17)';
2、将样本数据进行归一化处理:
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
3、初始化网络结果,设置参数,带入数据对网络进行训练。
epochs是设置的迭代次数;lr是设置的学习率;goal是设置的目标值。
net=newff(inputn,outputn,5);
net,trainParam.epochs=10000;
net.trainParam.lr=0.001;
net.trainParam.goal=0.0000004;
net=train(net,inputn,outputn);
4、设置好参数,将预测数据进行归一化处理,然后将预测结果输出,并将输出结果进行反归一化处理,
inputn_test=mapminmax('apply',input_test,inputps);
an=sim(net,inputn_test);
BPoutput+mapminmax('reverse',an,outputps);
从MATLAB的运行结果可以看出,根据前70%的数据训练出来的神经网络,将剩余30%的数据代入求解,发现与所给数据拟合度相当高,从而可以得出此模型建立的正确性,但其中的某些数据还不能够准确得出,说明该模型还不够完美,还需做更多的数据处理来对模型进行改进。
BP算法理论具有可靠、严谨、精度高、通用性好等优点,但是标准的BP算法存在以下的缺点:收敛的速度慢;很容易陷入局部的极小值;难以确定隐层数和隐层节点的个数。因此出现了很多改进的算法。
本文只对大家介绍利用动量法改进BP算法。标准的BP算法实质上是一种简单的最速下降的静态寻优方法,在修正W(K)时只是按照第K步的负梯度方向进行修正,但没有考虑到以前的积累经验,也就是以前时刻的梯度方向,从而经常使学习过程发生振荡,收敛缓慢。动量法权值调整算法的具体做法是:将上一次权值调整量的一部分迭加到本次误差计算所得的权值调整量上,作为本次的实际权值调整。
(作者单位:1.华北理工大学电气四班;
2.华北理工大学电气三班)