BP神經網絡(手寫數字識別)
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神經網絡(手寫數字識別)