1. 程式人生 > >BP神經網絡(手寫數字識別)

BP神經網絡(手寫數字識別)

根據 公式 輸入 廣泛 不可變 理想 變化 n) 放大

1實驗環境

實驗環境:CPU [email protected],內存8G,windows10 64位操作系統

實現語言:python

實驗數據:Mnist數據集

程序使用的數據庫是mnist手寫數字數據庫,數據庫有兩個版本,一個是別人做好的.mat格式,訓練數據有60000條,每條是一個784維的向量,是一張28*28圖片按從上到下從左到右向量化後的結果,60000條數據是隨機的。測試數據有10000條。另一個版本是圖片版的,按0~9把訓練集和測試集分為10個文件夾。這裏選取.mat格式的數據源。

2 BP(back propagation)神經網絡

是一種按照誤差逆向傳播算法訓練的多層前饋神經網絡,是目前應用最廣泛的神經網絡。從結構上講,BP網絡具有輸入層、隱藏層和輸出層。

3圖像轉換成數據

圖像是由像素組成,每個像素點由紅(Red)、綠(Green)、藍(Blue)三原色組成的,可用RGB表示。例如一個28*28的圖片

技術分享

放大後

技術分享

圖像可以存儲成3個28*28的矩陣,第一個表示R的取值(0~255)、第二個表示G的取值(0~255)、第三個表示B的取值(0~255)。

而本例只表示黑白顏色即可,可以將上圖轉換為1個28*28的矩陣,白~黑由0~255表示,例如顏色越淺數字越小,0表示白,255表示黑。而mnist的mat格式數據源已經將60000條訓練集和10000條測試集做了上述處理。

4感知機

感知機接收一些二元變量,然後輸出一個二元變量。

技術分享

上圖的感知機模型有三個輸入,一個輸出。 怎樣計算輸出值呢? Rosenblatt提出了一個簡單的算法。他引入了新的實數值變量:。用於表示相對於輸出變量每個輸入變量的重要性(權重)。

技術分享

通過變化w和 threshold我們就得到了不同的感知機模型。

5 Sigmoid神經元

對於一個神經網絡而言,什麽是學習?我們可以認為學習就是給定輸入,不斷的調整各個權重和偏置,以使得神經網絡的輸出就是我們想要的結果。這就要求神經網絡具有一種性質:改變某一個權重或偏置很小的值,整個神經網絡的輸出也應該改變很小(數學上,函數連續且可導)。否則這種學習就會非常困難。

不幸的是,感知機組成的神經網絡就不具有這種性質。很可能你只是靴微改變某一個權重的值,整個神經網絡的輸出卻會發生質變:原來輸出0,現在輸出1.

碰到這個問題怎麽辦呢?前人因此引入了一種新的神經元類型:Sigmoid神經元。

不同於感知機的是,輸入變量不僅可以取值0或1,還可以取值0和1之間的任何實數!輸出值也不局限於0或1,而是sigmoid函數

技術分享

sigmoid神經元其實可以看作感知機的平滑化

技術分享

技術分享

6神經網絡結構

三層結構,輸入層有28*28=784個節點,隱藏層節點數可以變化,輸出層有10個節點,表示0~9,若識別數字為1,則輸出結果為0100000000,若識別數字為9,則輸出結果為0000000001.

技術分享

下面說明一下各層的表示和各層的關系:(以15個隱藏層節點為例)

輸入層:X=(x1,x2,x3…x784)

隱藏層:Y=(y1,y2,y3…y15)

輸出層:O=(o1,o2,o3…o10)

兩個權重:

輸入層到隱藏層的權重:V=(V1,V2,V3…V784),Vj是一個列向量,表示輸入層所有神經元通過Vj加權,得到隱藏層的第j個神經元

隱藏層到輸出層的權重:W=(W1,W2,W3…W15),Wk是一個列向量,表示隱藏層的所有神經元通過Wk加權,得到輸出層的第k個神經元

根據我們上面說到的單個神經元的刺激傳入和刺激傳出,相信到這裏很多人應該已經得出下面的各層之間的關系了:

技術分享

註意:上述公式還要加上偏移量

7誤差反向傳播算法

如何求得W和V呢,這裏要用到一種算法,就是誤差反向傳播算法(Error Back Propagation Algorithm) ,簡稱BP 算法。

首先隨機地初始化W和V的值,然後代入一些圖片進行計算,得到一個輸出,當然由於W和V參數不會剛好很完美,輸出自然不會是像上文說的,剛好就是{1 0 0 0 0 0 0 0 0 0}這一類,例如{0.7 0 0 0.1 0.2 0 0 0 0 0.1}.所以存在誤差,根據這個誤差就可以反過來修正W和V的值,修正後的W和V可以使輸出更加的靠近於理想的輸出,這就是所謂的“誤差反向傳播”的意思,修正一次之後,再代入其他一些圖片,輸出離理想輸出又靠近了一點,我們又繼續計算誤差,然後修正W和V的值,就這樣經過很多次的叠代計算,最終多次修正得到了比較完美的W和V矩陣,它可以使得輸出非常靠近於理想的輸出,至此我們的工作完成度才是100%了。

逆向傳播算法的數學推導.....(No figures are omitted below)

推導結果:

技術分享

技術分享

d表示正確標簽,o表示訓練輸出,y表示隱藏層的值。另外為了使權值調整更加靈活加入一個放縮倍數η(權值學習率)使得,

技術分享

改變η的大小即可改變每一次調節的幅度,η大的話調節更快,小則調節慢,但是過大容易導致振蕩。

8手寫體數字識別算法實現步驟

1) 讀入訓練數據:訓練樣本、訓練樣本標簽

2) 神經網絡配置:參數的初始化(各層節點數、各層權值學習率、各層偏移量等)

3) 激活函數實現:sigmoid函數

4) 訓練:60000個數據量的訓練集;前向過程,後向過程(反饋調整各層權重和偏移量)

5) 測試:10000個數據量的測試集,獲取正確率

9程序結果分析

主要參數:

輸入層節點數,隱藏層節點數,輸出層節點數,輸入層權矩陣,隱藏層權矩陣,輸入層偏置向量,隱藏層偏置向量,輸入層權值學習率,隱藏層學權值習率

不可變參數:

輸入層節點數(784),輸出層節點數(10)

隨機參數(隨機數生成):

輸入層權矩陣,隱藏層權矩陣,輸入層偏置向量,隱藏層偏置向量

可控參數:

隱藏層節點數,輸入層權值學習率,隱藏層學權值習率

隱藏層節點數對算法的影響:

參數表1

隱藏層節點數

10

輸入層權值學習率

0.3

隱藏層學權值習率

0.3

結果1(20s)

0

1

2

3

4

5

6

7

8

9

測試集

980

1135

1032

1010

982

892

958

1028

974

1009

正確數

946

1111

860

906

915

754

887

896

800

903

正確率

96.5%

97.9%

83.3%

89.7%

93.2%

84.5%

92.6%

87.2%

82.1%

89.5%

89.78%

參數表2

隱藏層節點數

15

輸入層權值學習率

0.3

隱藏層學權值習率

0.3

結果2(27s)

0

1

2

3

4

5

6

7

8

9

測試集

980

1135

1032

1010

982

892

958

1028

974

1009

正確數

948

1117

873

909

872

751

929

898

867

950

正確率

96.7%

98.4%

84.6%

90.0%

88.8%

84.2%

97.0%

87.4%

89.0%

94.2%

91.14%

參數表3

隱藏層節點數

30

輸入層權值學習率

0.3

隱藏層學權值習率

0.3

結果3(46s)

0

1

2

3

4

5

6

7

8

9

測試集

980

1135

1032

1010

982

892

958

1028

974

1009

正確數

953

1124

913

963

931

796

919

919

892

952

正確率

97.2%

99.0%

88.5%

95.3%

94.8%

89.2%

95.9%

89.4%

91.6%

94.4%

93.62%

當隱藏層節點數增到100時,算法跑了137s,總正確率為94.94%

算法正確率收斂於95%……算法遇到了瓶頸......

權值學習率對算法的影響:

輸入節點784,隱藏層節點10,輸出層節點10

技術分享

令輸入層和隱藏層權值學習率共用一個參數的條件下,權值學習率n取值範圍為[0.1,1]算法正確率最高。

算法手寫體數字識別

正確率較高的數字是1、0

正確率較低的數字是2、5

謝 謝! 未 完 待 續 ...

BP神經網絡(手寫數字識別)