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