import numpy as np
#非线性sigmoid 函数
def sigmoid(x):
return 1.0/(1.0+np.exp(-x))
#sigmoid 函数的导数
def dsigmoid(y):
return y * (1 - y)
X = np.array([[1,1,0],
[1,0,1],
[0,1,0],
[0,1,1]])
y = np.array([[0],
[1],
[0],
[1]])
# 初始化权重值
np.random.seed(1)
w0 = 2*np.random.random((3,4)) - 1
w1 = 2*np.random.random((4,1)) - 1
print("x.shape=",X.shape)
print("y.shape=",y.shape)
print("w0.shape=",w0.shape)
print("w1.shape=",w1.shape)
print("++++++++++ start +++++++++++")
for i in range(200):
# 三层网络
L0 = X
L1 = sigmoid(np.dot(L0,w0)) # 4行3列 * 3行4列 = 4行4列
L2 = sigmoid(np.dot(L1,w1)) # 4行4列 * 4行1列 = 4行1列
# 反向传播
L2_loss = y - L2
L2_delta = L2_loss * dsigmoid(L2)
L1_loss = L2_delta.dot(w1.T)
L1_delta = L1_loss * dsigmoid(L1)
# 修改权重
w1 += L1.T.dot(L2_delta)
w0 += L0.T.dot(L1_delta)
if (i% 20) == 0:
print('L2=\n',L2)
print("loss:" + str(np.mean(np.abs(L2_loss))))
结果:
x.shape= (4, 3)
y.shape= (4, 1)
w0.shape= (3, 4)
w1.shape= (4, 1)
++++++++++ start +++++++++++
L2=
[[ 0.52285196]
[ 0.54384086]
[ 0.46307467]
[ 0.48895696]]
loss:0.488282204733
L2=
[[ 0.43087433]
[ 0.7261144 ]
[ 0.37317214]
[ 0.5975844 ]]
loss:0.370086916587
L2=
[[ 0.20177665]
[ 0.87495685]
[ 0.20840768]
[ 0.75482148]]
loss:0.195101498689
L2=
[[ 0.11297297]
[ 0.92818356]
[ 0.1413619 ]
[ 0.84438893]]
loss:0.120440593708
L2=
[[ 0.0787109 ]
[ 0.94872581]
[ 0.11005604]
[ 0.88313687]]
loss:0.089226065843
L2=
[[ 0.06128527]
[ 0.95938241]
[ 0.09196822]
[ 0.9042201 ]]
loss:0.0724127449157
L2=
[[ 0.05076403]
[ 0.96593555]
[ 0.080062 ]
[ 0.91759667]]
loss:0.0618234525323
L2=
[[ 0.04369948]
[ 0.97040169]
[ 0.07154877]
[ 0.92693377]]
loss:0.0544781972979
L2=
[[ 0.03860816]
[ 0.97365931]
[ 0.06510925]
[ 0.9338786 ]]
loss:0.0490448764646
L2=
[[ 0.03475039]
[ 0.97615208]
[ 0.06003704]
[ 0.93928146]]
loss:0.044838470162