APP下载

基于LVQ神经网络的手写数字识别研究与实现*

2018-07-26叶晓波秦海菲吕永林

楚雄师范学院学报 2018年3期
关键词:数据文件手写训练样本

叶晓波,秦海菲,吕永林

(1.楚雄师范学院网络与信息系统研究所,云南 楚雄 675000;2.楚雄师范学院信息科学与技术学院,云南 楚雄 675000;3.楚雄师范学院 经济与管理学院,云南 楚雄 675000)

1.引言

模式识别是一门以应用为基础的学科,目的是将对象进行分类[1]。任何可测量的对象都可进行分类,这些对象可以是图像、音频等;根据待分类数据是否全部都有已知类别标签,模式识别可分为有监督模式识别(分类标签完整)、无监督模式识别(无分类标签)和半监督模式识别(分类标签不完整)[1]。

手写数字识别研究的对象是如何利用计算机自动识别人手写在纸张上的阿拉伯数字[2],也就是将手写数字进行分类。虽然数字的类别只有十种,但由于数字字形相差不大,同一数字的写法变化多样,给手写数字的准确识别带来了诸多挑战[3],本文提出基于LVQ神经网络的手写数字识别方法,神经网络训练和测试样本数据来自MNIST,实验证明,该方法能有效快速地对手写数字进行识别。

2. LVQ神经网络

模式识别的研究过程中经常使用神经网络对数据进行分类,其中,单层感知器是能一致逼近线性连续函数空间最简单的神经网络,但是它对非线性样本空间不可分;BP神经网络应用最为广泛,但BP神经网络的缺点在于采用了基于梯度下降的非线性迭代算法,在求解的过程中有可能陷入局部最小问题,从而不能保证求出全局最小值[4]。LVQ神经网络的优点是不需要将输入向量进行归一化、正交化,只需要直接计算输入向量与竞争层之间的距离,从而实现分类。

LVQ神经网络又称为学习矢量量化神经网络(Learning Vector Quantization),它是在有教师状态(分类标签完整)下对竞争层进行训练的一种学习算法,广泛应用于模式识别和优化领域[5]。LVQ神经网络属于有监督模式识别,其基本构架和其他神经网络基本相同,即LVQ神经网络也是由三层神经元组成,即输入层、隐含层和输出层,LVQ神经网络结构如图1所示。

图1 LVQ神经网络结构图[5]

LVQ神经网络算法步骤如下[5]:

1)网络初始化:对输入层、隐含层权值、学习率η(η>0)进行初始化。

2)输入向量:将X=(x1,x2,x3, ……,xn)T送入到输入层。

4)选择获胜神经元:根据算法步骤3)计算结果选择获胜神经元,即距离最小的神经元作为获胜神经元。

5)更新连接权值:如果分类正确(获胜神经元和已知的分类一致),权值按△wij=wij+η(xi-wij)进行更新;如果分类错误,权值按△wij=wij-η(xi-wij)进行更新。

6)判断是否迭代:如果计算结果达到指定训练目标或迭代次数达到指定最大迭代次数,训练结束,否则返回算法步骤2),进入下一轮学习。

根据以上算法步骤,LVQ神经网络的算法模型如图2所示:

图2 LVQ神经网络算法模型图

其中:

(1)

a1=compet(n1)

(2)

a2=purelin(LW2,1∂1)

(3)

R是输入向量,S1是竞争神经元,S2是线性层(隐含层)神经元。

3.实验研究

本实验软件环境为:Windows Server 2008 R2(64位);硬件环境为:Intel(R) Xeon(R) CPU E5-2660 v2 @2.20GHz(8处理器),8G内存;实验程序设计均在Matlab 2016b下完成,以下是整个实验过程。

3.1实验数据详情

本实验采用MNIST手写数字数据库(http://yann.lecun.com/exdb/mnist/)。MNIST手写数字数据库共包含60000个训练样本数据,10000个测试样本数据,每一个样本数据(图片)都是标准化的,即图片大小相同,图片上的手写数字居中,MNIST手写数字数据库被研究者广泛用作测试模式识别方法的基准,也被学生用于模式识别、机器学习和统计方面的课堂项目。

MNIST手写数字数据库包含4个数据文件,每一个文件的名称及文件包含内容如表1所示。

表1 MNIST手写数字数据库文件名及文件内容

MNIST手写数字数据库的训练样本数据文件和测试样本数据文件的数据结构完全相同,图3是训练样本数据文件的数据结构图。

图3 训练样本数据文件的数据结构图

分析训练样本数据文件的数据结构可知:文件的第二个32位整数指明文件所包含的手写数字图片数量(训练样本数据文件包含60000个样本数据,测试样本数据文件包含10000个样本数据),第三、四个32位整数指明了每一张手写数字图片的行和列的像素大小,即手写数字图片大小是28*28像素。

MNIST手写数字数据库的训练样本标签数据文件和测试样本标签数据文件的数据结构完全相同,图4是训练样本标签数据文件的数据结构图。

图4 训练样本标签数据文件的数据结构图

分析训练样本标签数据文件的数据结构可知:文件的第二个32位整数指明文件所包含的标签数量(训练样本标签数据文件包含60000个标签,测试样本标签数据文件包含10000个标签),标签数据的值是0―9之间的数字,与样本数据文件中的图片一一对应,即样本数据文件中的第一幅图片(手写数字)对应的正确数字是标签数据文件中的第一个标签值。

图5是部分训练样本数据中的手写数字图片。

图5 部分训练样本数据中的手写数字图片

3.2实验思路及方法

3.2.1实验数据读取方法

根据MNIST手写数字数据库文件的数据结构,在Matlab中使用fopen函数打开数据库文件,使用fread函数读取数据。以下语句是打开并读取MNIST手写数字数据库训练样本数据文件的代码:

f_train_img = fopen('database rain-images.idx3-ubyte','r','b');

magic_num = fread(f_train_img,1,'int32'); %Magic num,32位整数

train_img_num = fread(f_train_img,1,'int32'); %图片数量,32位整数

row_size = fread(f_train_img,1,'int32'); %图片的行像素值,32位整数

col_size = fread(f_train_img,1,'int32'); %图片的列像素值,32位整数

train_img=zeros(784,train_img_num); %初始化训练样本矩阵,

图片大小:row_size* col_size=784

for i=1: train_img_num %循环读取训练样本数据文件中手写数字图片数据

train_img(:,i)=uint8(fread(f_train_img,784,'uchar'));

end

与训练样本数据相对应的是训练样本标签数据,标签(类别)共有十类,分别从0―9,但LVQ神经网络确认获胜神经元是提取每一列中值为1的行号,而行号最小的是1,因此,在读取样本数据标签时应该把类别标签由0―9依次更改为1―10,也就是把类别标签全部都加1。以下语句是读取MNIST手写数字数据库训练样本标签数据的代码:

for i=1:train_index_num %循环读取训练样本数据对应的真实数字值

train_index(:,i)=uint8(fread(f_train_index,1,'uchar'))+1;

end

3.2.2 PCA降维

MNIST手写数字数据库共有训练用的手写数字图片60000幅,测试用的手写数字图片10000幅,每一幅图片大小都是28*28=784像素,用于神经网络训练的样本矩阵大小是784*600000,用于测试的样本矩阵大小是784*10000;这样大小的矩阵在神经网络的训练、测试过程中会增加运算的复杂度和运行时间,在这种情况下,一般需要进行数据降维处理。

所谓数据降维是指通过线性或非线性映射将样本从高维空间映射到低维空间,从而获得高维数据的一个有意义的低维表示的过程[6]。降维后的数据容易处理、更容易使用,还可去除数据噪声,进而降低算法开销。常见的降维算法有主成分分析(也称PCA降维,principal component analysis)、因子分析(Factor Analysis)和独立成分分析ICA(Independent Component Analysis),其中PCA降维是目前应用最为广泛的降维方法。

PCA降维是通过对原始变量的相关矩阵或协方差矩阵内部结构的研究,将多个变量转换为少数几个综合变量(即主成分),从而达到降维目的的一种线性降维方法[6]。这些主成分能够反映原始变量的绝大部分信息,它们通常表示为原始变量的线性组合,通过PCA降维可实现用较少的数据维度代替较多的原数据点。在本实验中使用Matlab提供的pca函数对训练样本数据进行降维,测试样本数据使用训练样本的降维矩阵进行降维处理;用pca函数生成的降维数据中,根据特征值的累积贡献率不同可生成不同的降维矩阵,累积贡献率是指降维后能保持原有数据的真实率,因此,贡献率越大(越接近100%),则降维后的数据越能更真实的反映原始数据,但贡献率越大,则数据维度减少的就越少,从而带来降维效果不明显的问题;贡献率越小,则数据维度减少的就越多,降维效果非常明显,但降维后的数据与原始数据偏离会明显加大。

本实验依次选择PCA降维贡献率大于等于0.95、0.96、0.97、0.98所对应的降维矩阵对训练样本和测试样本数据进行降维处理。

3.2.3 LVQ神经网络参数的选择

Matlab使用lvqnet 函数创建LVQ神经网络,语法:net = lvqnet(S1,LR,LF),参数S1是指隐含层神经元数量,参数LR是指神经网络学习速率,默认值是0.01,参数LF是指神经网络学习函数,默认学习函数是learnlv1。

(1)隐含层单元数的确定

在神经网络应用过程中,神经元数目太少,神经网络权值无法获取更多有用的信息,从而无法实现较高的分类正确率;若神经元数目太多,则会增加训练时间,且分类正确率未必会随神经元数目的增加而增加,因此合理选择神经元数目非常重要。

对于神经网络训练过程中神经元数目的选择,许多研究人员进行了广泛研究,提出了多种确定神经元数目的参考公式,根据Kolmogorov[7]定理可知,针对只有3层神经元的人工神经网络,给出了输入层神经元数目Nin与隐层神经元数目Nhid之间的等量关系[8]:

Nhid=2Nin+1

(4)

其中Nin为输入单元数,Nhid为隐含层单元数。本实验选择不同的PCA降维贡献率,将得到不同的输入单元数,因此,具体的隐含层神经元数目要根据PCA降维结果进行计算确定。

(2)学习速率的确定

在神经网络学习过程中,较大的学习速率可让神经网络学习快速接近训练目标,但随后会造成神经网络学习在训练目标附近振荡而不会收敛;较小的学习速率会带来神经网络学习速度慢的问题;在本实验中,考虑到学习数据庞大,不宜选择较小的学习速率,经过反复研究,本实验选择0.05作为学习速率。

(3)学习函数的确定

神经网络可选择不同的函数来逼近最优解,LVQ神经网络提供了两个学习函数,分别是learnlv1和learnlv2,如果在初始化神经网络时不指定学习函数,则默认使用learnlv1作为学习函数,本实验选择learnlv1作为LVQ神经网络学习函数。

3.2.4实验程序设计

本实验程序设计步骤描述如下:

%=====读取训练样本数据=====%

1)f_train_img = fopen('database rain-images.idx3-ubyte','r','b'); %打开训练样本数据集文件

2)读取图片数量(train_img_num)等数据,初始化训练样本矩阵train_img

3)for i=1: train_img_num %循环读取训练样本数据文件中手写数字图片数据

4)train_img (:,i)=uint8(fread(f_train_img,784,'uchar'));

5)End

%=====根据训练样本数据生成降维矩阵=====%

6)[pc,score,latent,tsquare] = pca(train_img); %获取PCA降维数据

7)根据PCA函数运行结果,计算累计贡献率,选择贡献率大于等于95%、96%、97%、98%、99%的特征值对应的特征向量,生成降维矩阵pca_matrix

8)用降维矩阵为训练样本数据进行降维处理,得到降维结果after_pca_train

%=====读取训练样本数据标签值=====%

9)f_train_index=fopen('database rain-labels.idx1-ubyte','r','b'); %打开训练样本标签数据文件

10)读取标签数量(train_index_num)等数据,初始化训练样本标签矩阵train_index

11)for i=1: train_index_num %循环读取训练样本数据对应的真实数字值

12)train_index(1,i)=uint8(fread(f_train_index,1,'uchar'))+1;

13)end

%=====读取测试样本数据=====%

14)f_test_img=fopen('database 10k-images.idx3-ubyte','r','b'); %打开测试样本数据集文件

15)读取图片数量(test_img_num)等数据,初始化测试样本矩阵test_img

16)for i=1: test_img_num %循环读取测试样本文件中的相应数据

17)test_img(1,i)=uint8(fread(f_test_img,784,'uchar'));

18)end

19)用降维矩阵为测试样本数据进行降维处理,得到降维结果after_pca_test

%=====读取测试样本数据标签值=====%

20)f_test_index=fopen('database 10k-labels.idx1-ubyte','r','b'); %打开测试样本标签数据文件

21)读取标签数量(test_index_num)等数据,初始化测试样本标签矩阵test_index

22)for i=1: test_index_num %循环读取测试样本数据对应的真实数字值

23)test_index(:,i)=uint8(fread(f_test_index,1,'uchar'))+1;

24)end

25)T=ind2vec(train_index);

%=====创建、初始化、训练网络=====%

26)net=lvqnet(隐含层神经元数量,0.05); %创建LVQ神经网络

27)net=init(net); %初始化LVQ神经网络

28)net.trainparam.epochs=50; % 指定最大训练次数

29)net.trainParam.goal=0.01; % 指定训练目标最小误差

30)net=train(net,after_pca_train,T);%训练网络

%=====网络仿真结果=====%

31)train_result =vec2ind(net(after_pca_train'));%用训练数据进行仿真

32)sum(train_result==train_index)/train_index_num %计算训练样本数据的分类正确率

33)test_result=vec2ind(net(after_pca_test')); %用测试样本数据仿真

34)sum(test_result==test_index)/test_index_num %计算测试样本数据的分类正确率

3.2.5 实验结果及分析

图6是LVQ神经网络训练图,参数指定为:PCA降维累积贡献率>=0.95,神经网络输入单元数154,隐含层神经元数量309,迭代次数:50。

图6 LVQ神经网络训练图

表2 是按PCA降维累积贡献率不同而进行的实验结果统计表:

表2 基于LVQ神经网络的手写数字识别实验结果

其中:LVQ神经网络隐含层神经元数量根据公式(4)计算得出,神经网络学习速率:0.05,迭代次数:50。

图7是PCA降维累积贡献率>=0.95时训练的均方误差图:

图7 神经网络训练结果的均方误差图

分析实验结果可得:(1)LVQ神经网络对MNIST手写数字数据库的识别率在指定相应参数时(见表2),识别准确率大于93%,是一个较理想的识别效果。(2)随着指定的PCA降维累积贡献率的提高,输入单元数也大幅度增多,但训练样本与测试样本数据的识别率并未因输入单元数的增加而明显提高。(3)LVQ神经网络的训练时间随输入单元数的增加而大幅提高。

通过实验结果还可得出PCA降维累积贡献率选择的方法:在进行神经网络训练时,如果原始数据维度较高,应该进行PCA降维处理,选择一个合适的PCA降维累积贡献率非常重要,本实验选择累积贡献率为0.95时效果较好,不但学习训练速度快,而且可取得满意的分类结果。

4.结语

手写数字识别不但在实际生活中有着广泛的应用,也是模式识别重点研究的领域之一,目前研究人员运用多种识别方法对手写数字识别开展了广泛的实验研究,本文提出基于LVQ神经网络手写数字识别的方法,采用最广泛的手写数字识别数据库MNIST进行了实验研究,实验结果对手写数字识别方面的研究有较好的参考价值。

猜你喜欢

数据文件手写训练样本
我手写我心
抓住身边事吾手写吾心
人工智能
基于集成学习的MINIST手写数字识别
数据文件恢复专题问答
数据文件安全管控技术的研究与实现
SQL数据文件恢复工具
宽带光谱成像系统最优训练样本选择方法研究
融合原始样本和虚拟样本的人脸识别算法
基于稀疏重构的机载雷达训练样本挑选方法