Python實現——二層BP神經網絡
阿新 • • 發佈:2019-04-20
直線 python erro 隱藏 運用 每次 能夠 維度 turn
2019/4/20
二層BP神經網絡
但是仍有部分在公式上的不明了,但是其運作方式還是很簡單的,先簡單解析我的代碼
from createData import generate_data
是本次所解題目的訓練集生成軟件,generate_data(N)會返回兩個數組,一個為N100的訓練集及其對應的N1的結果,十分方便
L0=2*np.random.random((100,5))-1
L1=2*np.random.random((5,1))-1
由於本次想構建的是二層神經網絡,因此需要兩層的計算層,其中我將中間的隱藏層設置為5個神經元,而輸出層的表示方法為0.1~0.6的離散數,而不是6個0或1元素的數組,因此輸出層為1個神經元(而不是6個),這樣經過矩陣運算後矩陣維度能夠與結果相同。
def sigmoid(x):
return 1/(1+np.exp(-x))
本次使用的激活函數:sigmoid函數,特點為非線性(並不是條直線),區間在[0,1]上,且沒有任何點導數為0(趨近於0的有),同時他的導數也非常簡潔:
def dsigmoid(x):
return x*(1-x)
因此這一次選擇使用這個激活函數。
生成數據:
X,Y=generate_data(50) X=np.array(X) Y=np.array(Y) #shape of parameters #X(50*100) Y(50*1) #L0(100*5) L1(5*1) L0=2*np.random.random((100,5))-1 L1=2*np.random.random((5,1))-1
要謹記轉換兩數據的形式(List/Array)
並且標記出來了X,Y,L0,L1,分別的維數方便查看,其中L0,L1的生成方式是產生了填滿位於[-1,1]的元素的數組(應該是吧...)
主題訓練過程:
for i in range(50000): #forward temp0=X temp1=sigmoid(np.dot(temp0,L0)) temp2=sigmoid(np.dot(temp1,L1)) error2=Y-temp2 if (i%5000)==0: print(np.mean(error2)) #backward d2=error2*dsigmoid(temp2) error1=d2.dot(L1.T) d1=error1*dsigmoid(temp1) L1+=temp1.T.dot(d2) L0+=temp0.T.dot(d1)
整體而言得益於矩陣使得過程十分流暢,內容主要涉及到了不斷的求偏導並運用鏈式法則不斷"接近"結果與目標變量的偏導,先不贅述算法了。
最後的檢驗部分...應該也不用再講什麽了吧...
同時由於開始的層元素為隨機生成所以每次運行不一定相同,可以用seed()函數解決這個問題
Test1:
-0.19711045500123067
-5.796510982417874e-05
-2.6806406495373803e-05
-1.2019265739013352e-05
-5.227927664957222e-06
-2.2248997057949804e-06
-9.364114896748266e-07
-3.9213879621080584e-07
-1.6385924452994028e-07
-6.84074828341541e-08
[[0.40000002]
[0.50000153]]
[[0.4]
[0.5]]
Test2:
0.16291901475086618
-0.0035140803158310225
1.9674898472920034e-05
2.840084784809016e-05
1.790320520679012e-05
1.059859397264329e-05
5.907123617054088e-06
3.147002414242428e-06
1.6152543191538805e-06
3.5777556424282377e-07
[[0.40004171]
[0.50000385]]
[[0.4]
[0.5]]
不過倒是可以看出來挺準確的就是了...
完整代碼如下:
import numpy as np
from createData import generate_data
def sigmoid(x):
return 1/(1+np.exp(-x))
def dsigmoid(x):
return x*(1-x)
X,Y=generate_data(50)
X=np.array(X)
Y=np.array(Y)
#shape of parameters
#X(50*100) Y(50*1)
#L0(100*5) L1(5*1)
L0=2*np.random.random((100,5))-1
L1=2*np.random.random((5,1))-1
for i in range(50000):
#forward
temp0=X
temp1=sigmoid(np.dot(temp0,L0))
temp2=sigmoid(np.dot(temp1,L1))
error2=Y-temp2
if (i%5000)==0:
print(np.mean(error2))
#backward
d2=error2*dsigmoid(temp2)
error1=d2.dot(L1.T)
d1=error1*dsigmoid(temp1)
L1+=temp1.T.dot(d2)
L0+=temp0.T.dot(d1)
X1,Y1=generate_data(2)
X1=np.array(X1)
Y1=np.array(Y1)
t1=sigmoid(np.dot(X1,L0))
t2=sigmoid(np.dot(t1,L1))
print(t2)
print(Y1)
Python實現——二層BP神經網絡