賈書瑞山東省臨沂第一中學
基于BP神經網絡的手寫數字識別
賈書瑞
山東省臨沂第一中學
隨著計算機硬件的不斷發展,以前需要大計算量的BP神經網絡算法所需時間已經變得可以接受。本文就BP神經網絡算法最富代表性的應用之一——手寫數字識別進行了一些探究。
手寫數字識別;bp算法;神經網絡
1.字符識別概述
光學字符識別是一種模式識別技術。它能將通過光學采集設備采集的圖像上的字符等信息“摳”出來轉換為計算機能識別的編碼,從而方便計算機進行管理和維護等操作。這種方法一方面可以有效縮減存儲這些信息所需的空間,另一方面還能省下大量人力物力。
2.研究現狀概述
光學字符識別有一個分支研究方向——手寫數字識別。它的任務是在非鍵盤輸入的情況(比如圖像輸入)下,對手寫數字(從0到9)進行預處理,并存儲到計算機中。以往只有人眼才能分辨的手寫字符,現在可以由計算機高效地“代勞”。20世紀50年代,隨著計算機的問世和發展,真正意義上的字符識別技術才緩緩進入科學家們的視野。漸漸地,越來越多的研究人員開始涉足于此。在字符識別大發展時期(1990年后),研究者們對字符識別進行了探索和研究,并發展出了許多至今仍是科研熱點的識別工具(如BP神經網絡,支持向量機)。
1.簡介
BP(Back Propagation)神經網絡是一種在1986年由以Rumelhart和McCelland為首的科學家小組提出的按誤差逆傳播算法訓練的多層前饋網絡。同時它也是目前應用最廣泛的神經網絡模型之一。它的神奇之處在于可以通過反向傳播不斷地調整網絡的權值和閥值來降低網絡的誤差平方和,從而無需事前揭示映射關系的數學方程便可學習和存儲大量的輸入輸出模式映射關系。
2.BP神經網絡的基本結構
BP神經網絡的基本結構是神經元。一個神經元有三個屬性:輸入值I,輸出值O和自身的偏置值θ。一定數目的神經元組成了BP神經網絡的三層:輸入層、隱藏層和輸出層。層與層之間有大量的神經元連接,每個連接都被賦予了一個可改變的權值。
3.BP神經網絡工作的基本原理
BP神經網絡的運行分為兩個階段:向前傳播和反向傳播。(1)向前傳播
向前傳播,可以感性地理解為每一層神經元接受了上一層的訊號然后作非線性變換(常用Sigmoid函數)然后得到輸出。代碼實現如下:
inline double BP::f(const double&x){
return 1.0/(1+exp(-x)); } inline void BP::FeedForward(){//前向傳輸
int i,j;
for(j=1;j<=HN;++j){
neuron&p=HiddenNeurons[j];
for(i=1,p.I=0;i<=IN;++i)
p.I+=WeightIH[i][j]*InputNeurons[i].O;
p.O=f(p.I+=p.theta);
}
for(j=1;j<=ON;++j){
neuron&p=OutputNeurons[j];
for(i=1,p.I=0;i<=HN;++i)
p.I+=WeightHO[i][j]*HiddenNeurons[i].O;
p.O=f(p.I+=p.theta);
}
}
(2)反向傳播
這是BP神經網絡最精彩的部分。由于向前傳播的訊號到達了輸出層,現在輸出層同時擁有實際結果和計算結果(我們是在對網絡進行訓練)。我們的目的,就是使實際結果和計算結果盡量接近。而計算結果,其實就是一個多元函數,外加多層嵌套。問題轉化為求這個函數的最小值。我們知道,函數導數(偏導)值為0是在該處取極值的必要條件。于是經過數學推導,以下代碼可以調整變量(就是神經元之間的連接的權值和它本身的偏置值)從而使得我們的學習效果越好(離期望輸出越近)。
inline void BP::BackPropagation(const vector<double>&T){//T是期望輸出
int i,j,k;
for(i=1;i<=ON;++i)e[i]=T[i]-OutputNeurons[i].O;
for(k=1;k<=ON;++k)for(j=1;j<=HN;++j){
WeightHO[j][k]+=lambda*e[k]*HiddenNeurons[j].O;
}
for(k=1;k<=ON;++k)OutputNeurons[k].theta+=lambda*e [k];
for(j=1;j<=HN;++j){
double sum;
for(k=1,sum=0;k<=ON;++k)sum+=e[k]*WeightHO[j] [k];
for(i=1;i<=IN;++i){
WeightIH[i][j]+=
lambda*HiddenNeurons[j].O*(1-HiddenNeurons[j].O)*InputNeurons[i].O*sum;
}
HiddenNeurons[j].theta+=lambda*HiddenNeurons[j].O*(1-HiddenNeurons[j].O)*sum;
}
}
4.實驗過程及結果
(1)輸入數據處理
該程序的訓練集是42000個784維向量,每個向量就是一個28*28灰度點陣圖像的展開。我們將每個像素看做是該圖片的一個特征,則每張圖片就有784個特征。將其全部輸入該程序。另外還要進行歸一化處理,本問題中,因輸入是0到255的整數,所以輸入時要除以255。
(2)輸出數據處理
由于該程序輸出層有十個神經元(代表0到9),每個神經元的輸出是一個在(0,1)中的實數。進行投票,輸出實數最高的那個將其標號作為輸出。這里選用十個神經元,是為了增強網絡的容錯性和擴展性。
(3)參數對訓練集正確率的影響
本程序中,有兩個常量對學習效果有影響:隱藏層神經元數目B和學習率λ。以下是二者對識別訓練集準確度的影響:

100,0.2 72.28% B,λ正確率10,0.3 73.00% 50,0.3 69.52% 10,0.5 71.73% 28,0.2 78.20% 40,0.2 80.02%
該程序經訓練集訓練后,在隱藏層神經元數目為40,lambda(學習率)為0.2時,識別訓練集的準確率可達80.02%,識別測試集的準確率可達78.35%。
BP神經網絡識別正確率主要取決于隱藏層神經元個數和學習率。和ANN(人工神經網絡)優化可達91%相比,BP神經網絡還需要在這兩個參數的優化上進一步嘗試。
[1]訓練集來自https://www.kaggle.com/c/digit-recognizer/download/train.csv
[2]測試集來自https://www.kaggle.com/c/digit-recognizer/download/test.csv
[3]獲取全部代碼http://blog.csdn.net/ZMOIYNLP/article/details/ 54743473
[4]BP神經網絡算法http://blog.csdn.net/hp910315/article/details/50550923
[5]光學字符識別http://baike.baidu.com/link?url=pmpKkr-FfjAibMfXFSrg4F9im4VC9m3JcyZXab0UTgvZIFzb1jI9CwSE-jGuK6TpYhbQRG0fGfiZ8bq-hBXJCra
[6]BP神經網絡http://blog.csdn.net/acdreamers/article/details/ 44657439
[7]BP神經網絡優化方程式的推導https://zhuanlan.zhihu.com/ p/22399223
[8]BP神經網絡原理詳解http://blog.sina.com.cn/s/blog_ 88f0497e0102v79c.html
本人自幼對計算機感興趣,高中時曾連續兩次獲得全國青少年信息學奧林匹克聯賽(NOIP)一等獎,學習成績始終位于年級前列。