""" BP誤差反向傳播算法-異或問題 """
import numpy as np
# 輸入數(shù)據(jù)
X = np.array([[1,0,0],
? ? ? ? ? ? ? [1,0,1],
? ? ? ? ? ? ? [1,1,0],
? ? ? ? ? ? ? [1,1,1]])
# 標(biāo)簽
Y = np.array([[0,1,1,0]])
V = (np.random.random((3,4))-0.5)*2? # 初始化輸入層權(quán)值,取值范圍-1到1
W = (np.random.random((4,1))-0.5)*2? # 初始化輸出層權(quán)值,取值范圍-1到1
print(W)
print(V)
lr = 0.11
def sigmoid(x):? ? ? # 激活函數(shù)(從0~1)
? ? x = 1/(1+np.exp(-x))
? ? return x
def dsigmoid(x):? ? # 激活函數(shù)的導(dǎo)數(shù)
? ? x = x*(1-x)
? ? return x
def update():? ? ? ? # 更新權(quán)值(2個(gè)權(quán)值)
? ? global X,Y,W,V,lr
? ? L1 = sigmoid(np.dot(X,V))? # 隱藏層輸出(4*3)×(3*4)=(4,4)
? ? L2 = sigmoid(np.dot(L1,W))? # 輸出層輸出(4,4)×(4*1)=(4,1)? 4個(gè)預(yù)測(cè)值
? ? L2_delta = (Y.T - L2)*dsigmoid(L2)? ? ? ? # 輸出層的Delta
? ? L1_delta = L2_delta.dot(W.T)*dsigmoid(L1)? # 輸出層的前一層的Delta
? ? W_C = lr*L1.T.dot(L2_delta)
? ? V_C = lr*X.T.dot(L1_delta)
? ? W = W + W_C
? ? V = V + V_C
for i in range(20000):?
? ? update()? #更新權(quán)值
? ? if i%500==0:? # 輸出40個(gè)誤差
? ? ? ? L1 = sigmoid(np.dot(X,V))? # 隱藏層輸出(4*3)×(3*4)=(4,4)
? ? ? ? L2 = sigmoid(np.dot(L1,W))? # 輸出層輸出(4,4)×(4*1)=(4,1)
? ? ? ? print('Error:',np.mean(np.abs(Y.T - L2)))? # 輸出40個(gè)誤差
L1 = sigmoid(np.dot(X,V))? # 隱藏層輸出(4*3)×(3*4)=(4,4)
L2 = sigmoid(np.dot(L1,W))? # 輸出層輸出(4,4)×(4*1)=(4,1)
print(L2)
def judge(x):
? ? if x > 0.5:
? ? ? ? return 1
? ? else:
? ? ? ? return 0
for i in map(judge,L2):? # L2一共四個(gè)數(shù)
? ? print(i)