用python寫一個簡單的BP神經網絡


1.神經元模型

神經網絡能模擬生物神經系統對真實世界的反應,最基本的成分時神經元模型,如圖。

神經元接收來自其他n個神經元的輸入,通過帶權重的連接傳入,將接收到的總輸入與閾值比較,然后通過激活函數處理產生輸出。

理想激活函數是階躍函數,將輸入映射為輸出值0和1。1對應於神經元興奮,0對應不興奮。

由於階躍函數不連續、不光滑,實際常用sigmoid函數,sigmoid將輸入值擠壓在(0,1)范圍內。

2.多層前饋神經網絡

多層前饋神經網絡,每層神經元與下一層神經元互聯,不存在同層連接和跨層連接。

輸入層神經元接收外界輸入,隱層與輸出層進行處理,最后由輸出層輸出。

3.誤差逆傳播算法

要訓練神經網絡,可以使用誤差逆傳播(BP)算法。

4.例子

用神經網絡實現異或運算

代碼

 1 import numpy as np
 2 
 3 #sigmoid函數
 4 def sigmoid1(x):
 5     a=1/(1+np.exp(-x))
 6     return a
 7 
 8 #訓練集
 9 xunlianji=np.array([[1,1,0],[1,0,1],[0,1,1],[0,0,0]])
10 yy=np.zeros((4,1))
11 eta=0.1
12 #定義連接權、閾值
13 vih=np.random.rand(2,2)  #輸入層與隱層連接權
14 delt_vih=np.zeros((2,2))
15 r=np.random.rand(1,2)    #隱層閾值
16 delt_r=np.zeros((1,2))
17 whj=np.random.rand(2,1)  #隱層與輸出層連接權
18 delt_whj=np.zeros((2,1))
19 o=np.random.rand(1,1)     #輸出層閾值
20 delt_o=np.zeros((1,1))
21 #創建隱層
22 alph=np.zeros((1,2))
23 b=np.zeros((1,2))
24 e=np.zeros((1,2))        #隱層梯度項
25 #創建輸出層
26 beita=np.zeros((1,1))
27 y=np.zeros((1,1))
28 g=np.zeros((1,1))        #輸出層梯度項
29 #主循環
30 for daishu in range(0,1000000):
31     for xunlian in range(0,4):
32         #計算隱層的輸入
33         alph[0,0]=vih[0,0]*xunlianji[xunlian,0]+vih[1,0]*xunlianji[xunlian,1]
34         alph[0,1]=vih[0,1]*xunlianji[xunlian,0]+vih[1,1]*xunlianji[xunlian,1]
35         #計算隱層輸出
36         b[0,0]=sigmoid1(alph[0,0]-r[0,0])
37         b[0,1]=sigmoid1(alph[0,1]-r[0,1])
38         #計算輸出層的輸入
39         beita[0,0]=whj[0,0]*b[0,0]+whj[1,0]*b[0,1]
40         #輸出層輸出
41         y[0,0]=sigmoid1(beita[0,0]-o[0,0])
42         yy[xunlian,0]=y[0,0]
43         #輸出層梯度項
44         g[0,0]=y[0,0]*(1-y[0,0])*(xunlianji[xunlian,2]-y[0,0])
45         #隱層梯度項
46         e[0,0]=b[0,0]*(1-b[0,0])*(whj[0,0]*g[0,0])
47         e[0,1]=b[0,1]*(1-b[0,1])*(whj[1,0]*g[0,0])
48         #更新連接權和閾值
49         delt_whj[0,0]=eta*g[0,0]*b[0,0]
50         delt_whj[1,0]=eta*g[0,0]*b[0,1]
51         whj[0,0]=delt_whj[0,0]+whj[0,0]
52         whj[1,0]=delt_whj[1,0]+whj[1,0]
53         delt_o[0,0]=-(eta*g[0,0])
54         o[0,0]=delt_o[0,0]+o[0,0]
55         delt_vih[0,0]=eta*e[0,0]*xunlianji[xunlian,0]
56         delt_vih[1,0]=eta*e[0,0]*xunlianji[xunlian,1]
57         delt_vih[0,1]=eta*e[0,1]*xunlianji[xunlian,0]
58         delt_vih[1,1]=eta*e[0,1]*xunlianji[xunlian,1]
59         vih[0,0]=vih[0,0]+delt_vih[0,0]
60         vih[1,0]=vih[1,0]+delt_vih[1,0]
61         vih[0,1]=vih[0,1]+delt_vih[0,1]
62         vih[1,1]=vih[1,1]+delt_vih[1,1]
63         delt_r[0,0]=-(eta*e[0,0])
64         delt_r[0,1]=-(eta*e[0,1])
65         r[0,0]=delt_r[0,0]+r[0,0]
66         r[0,1]=delt_r[0,1]+r[0,1]
67 xunlianji=xunlianji.astype(np.float64)
68 xunlianji[:,2]=yy[:,0]
69 print(xunlianji)

結果

可以發現訓練結果越來越接近0 1 1 0.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM