賈書瑞山東省臨沂第一中學(xué)
基于BP神經(jīng)網(wǎng)絡(luò)的手寫數(shù)字識別
賈書瑞
山東省臨沂第一中學(xué)
隨著計算機硬件的不斷發(fā)展,以前需要大計算量的BP神經(jīng)網(wǎng)絡(luò)算法所需時間已經(jīng)變得可以接受。本文就BP神經(jīng)網(wǎng)絡(luò)算法最富代表性的應(yīng)用之一——手寫數(shù)字識別進行了一些探究。
手寫數(shù)字識別;bp算法;神經(jīng)網(wǎng)絡(luò)
1.字符識別概述
光學(xué)字符識別是一種模式識別技術(shù)。它能將通過光學(xué)采集設(shè)備采集的圖像上的字符等信息“摳”出來轉(zhuǎn)換為計算機能識別的編碼,從而方便計算機進行管理和維護等操作。這種方法一方面可以有效縮減存儲這些信息所需的空間,另一方面還能省下大量人力物力。
2.研究現(xiàn)狀概述
光學(xué)字符識別有一個分支研究方向——手寫數(shù)字識別。它的任務(wù)是在非鍵盤輸入的情況(比如圖像輸入)下,對手寫數(shù)字(從0到9)進行預(yù)處理,并存儲到計算機中。以往只有人眼才能分辨的手寫字符,現(xiàn)在可以由計算機高效地“代勞”。20世紀50年代,隨著計算機的問世和發(fā)展,真正意義上的字符識別技術(shù)才緩緩進入科學(xué)家們的視野。漸漸地,越來越多的研究人員開始涉足于此。在字符識別大發(fā)展時期(1990年后),研究者們對字符識別進行了探索和研究,并發(fā)展出了許多至今仍是科研熱點的識別工具(如BP神經(jīng)網(wǎng)絡(luò),支持向量機)。
1.簡介
BP(Back Propagation)神經(jīng)網(wǎng)絡(luò)是一種在1986年由以Rumelhart和McCelland為首的科學(xué)家小組提出的按誤差逆?zhèn)鞑ニ惴ㄓ?xùn)練的多層前饋網(wǎng)絡(luò)。同時它也是目前應(yīng)用最廣泛的神經(jīng)網(wǎng)絡(luò)模型之一。它的神奇之處在于可以通過反向傳播不斷地調(diào)整網(wǎng)絡(luò)的權(quán)值和閥值來降低網(wǎng)絡(luò)的誤差平方和,從而無需事前揭示映射關(guān)系的數(shù)學(xué)方程便可學(xué)習(xí)和存儲大量的輸入輸出模式映射關(guān)系。
2.BP神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu)
BP神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu)是神經(jīng)元。一個神經(jīng)元有三個屬性:輸入值I,輸出值O和自身的偏置值θ。一定數(shù)目的神經(jīng)元組成了BP神經(jīng)網(wǎng)絡(luò)的三層:輸入層、隱藏層和輸出層。層與層之間有大量的神經(jīng)元連接,每個連接都被賦予了一個可改變的權(quán)值。
3.BP神經(jīng)網(wǎng)絡(luò)工作的基本原理
BP神經(jīng)網(wǎng)絡(luò)的運行分為兩個階段:向前傳播和反向傳播。(1)向前傳播
向前傳播,可以感性地理解為每一層神經(jīng)元接受了上一層的訊號然后作非線性變換(常用Sigmoid函數(shù))然后得到輸出。代碼實現(xiàn)如下:
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神經(jīng)網(wǎng)絡(luò)最精彩的部分。由于向前傳播的訊號到達了輸出層,現(xiàn)在輸出層同時擁有實際結(jié)果和計算結(jié)果(我們是在對網(wǎng)絡(luò)進行訓(xùn)練)。我們的目的,就是使實際結(jié)果和計算結(jié)果盡量接近。而計算結(jié)果,其實就是一個多元函數(shù),外加多層嵌套。問題轉(zhuǎn)化為求這個函數(shù)的最小值。我們知道,函數(shù)導(dǎo)數(shù)(偏導(dǎo))值為0是在該處取極值的必要條件。于是經(jīng)過數(shù)學(xué)推導(dǎo),以下代碼可以調(diào)整變量(就是神經(jīng)元之間的連接的權(quán)值和它本身的偏置值)從而使得我們的學(xué)習(xí)效果越好(離期望輸出越近)。
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.實驗過程及結(jié)果
(1)輸入數(shù)據(jù)處理
該程序的訓(xùn)練集是42000個784維向量,每個向量就是一個28*28灰度點陣圖像的展開。我們將每個像素看做是該圖片的一個特征,則每張圖片就有784個特征。將其全部輸入該程序。另外還要進行歸一化處理,本問題中,因輸入是0到255的整數(shù),所以輸入時要除以255。
(2)輸出數(shù)據(jù)處理
由于該程序輸出層有十個神經(jīng)元(代表0到9),每個神經(jīng)元的輸出是一個在(0,1)中的實數(shù)。進行投票,輸出實數(shù)最高的那個將其標(biāo)號作為輸出。這里選用十個神經(jīng)元,是為了增強網(wǎng)絡(luò)的容錯性和擴展性。
(3)參數(shù)對訓(xùn)練集正確率的影響
本程序中,有兩個常量對學(xué)習(xí)效果有影響:隱藏層神經(jīng)元數(shù)目B和學(xué)習(xí)率λ。以下是二者對識別訓(xùn)練集準(zhǔn)確度的影響:
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%
該程序經(jīng)訓(xùn)練集訓(xùn)練后,在隱藏層神經(jīng)元數(shù)目為40,lambda(學(xué)習(xí)率)為0.2時,識別訓(xùn)練集的準(zhǔn)確率可達80.02%,識別測試集的準(zhǔn)確率可達78.35%。
BP神經(jīng)網(wǎng)絡(luò)識別正確率主要取決于隱藏層神經(jīng)元個數(shù)和學(xué)習(xí)率。和ANN(人工神經(jīng)網(wǎng)絡(luò))優(yōu)化可達91%相比,BP神經(jīng)網(wǎng)絡(luò)還需要在這兩個參數(shù)的優(yōu)化上進一步嘗試。
[1]訓(xùn)練集來自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神經(jīng)網(wǎng)絡(luò)算法http://blog.csdn.net/hp910315/article/details/50550923
[5]光學(xué)字符識別http://baike.baidu.com/link?url=pmpKkr-FfjAibMfXFSrg4F9im4VC9m3JcyZXab0UTgvZIFzb1jI9CwSE-jGuK6TpYhbQRG0fGfiZ8bq-hBXJCra
[6]BP神經(jīng)網(wǎng)絡(luò)http://blog.csdn.net/acdreamers/article/details/ 44657439
[7]BP神經(jīng)網(wǎng)絡(luò)優(yōu)化方程式的推導(dǎo)https://zhuanlan.zhihu.com/ p/22399223
[8]BP神經(jīng)網(wǎng)絡(luò)原理詳解http://blog.sina.com.cn/s/blog_ 88f0497e0102v79c.html
本人自幼對計算機感興趣,高中時曾連續(xù)兩次獲得全國青少年信息學(xué)奧林匹克聯(lián)賽(NOIP)一等獎,學(xué)習(xí)成績始終位于年級前列。