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.