葉曉波,秦海菲,呂永林
(1.楚雄師范學院網絡與信息系統研究所,云南 楚雄 675000;2.楚雄師范學院信息科學與技術學院,云南 楚雄 675000;3.楚雄師范學院 經濟與管理學院,云南 楚雄 675000)
模式識別是一門以應用為基礎的學科,目的是將對象進行分類[1]。任何可測量的對象都可進行分類,這些對象可以是圖像、音頻等;根據待分類數據是否全部都有已知類別標簽,模式識別可分為有監督模式識別(分類標簽完整)、無監督模式識別(無分類標簽)和半監督模式識別(分類標簽不完整)[1]。
手寫數字識別研究的對象是如何利用計算機自動識別人手寫在紙張上的阿拉伯數字[2],也就是將手寫數字進行分類。雖然數字的類別只有十種,但由于數字字形相差不大,同一數字的寫法變化多樣,給手寫數字的準確識別帶來了諸多挑戰[3],本文提出基于LVQ神經網絡的手寫數字識別方法,神經網絡訓練和測試樣本數據來自MNIST,實驗證明,該方法能有效快速地對手寫數字進行識別。
模式識別的研究過程中經常使用神經網絡對數據進行分類,其中,單層感知器是能一致逼近線性連續函數空間最簡單的神經網絡,但是它對非線性樣本空間不可分;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是線性層(隱含層)神經元。
本實驗軟件環境為:Windows Server 2008 R2(64位);硬件環境為:Intel(R) Xeon(R) CPU E5-2660 v2 @2.20GHz(8處理器),8G內存;實驗程序設計均在Matlab 2016b下完成,以下是整個實驗過程。
本實驗采用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.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); %初始化訓練樣本矩陣,
圖片大?。簉ow_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時效果較好,不但學習訓練速度快,而且可取得滿意的分類結果。
手寫數字識別不但在實際生活中有著廣泛的應用,也是模式識別重點研究的領域之一,目前研究人員運用多種識別方法對手寫數字識別開展了廣泛的實驗研究,本文提出基于LVQ神經網絡手寫數字識別的方法,采用最廣泛的手寫數字識別數據庫MNIST進行了實驗研究,實驗結果對手寫數字識別方面的研究有較好的參考價值。