我試圖用python從零開始實現一個簡單的神經網絡。這個神經網絡只有兩個神經元,任務是將輸入與輸出進行匹配。 (即x = 0→輸出= 0,x = 1→輸出= 1)具有兩個神經元的神經網絡
我已經使用了偏導數並嘗試使用梯度上升來最大化負損失。 (完整代碼如下所示)即使經過超過10000次迭代的訓練,輸出也不夠好。 (我想也許這種損失可能會停留在本地的最大值)。誰能幫我弄清楚我的實現有什麼問題嗎?
import random
import numpy as np
import math
def sigmoid(x):
return 1/(1 + np.exp(-x))
def error(d,z):
return -0.5 * np.sum(np.power(d-z, 2))
# x = input
##x = np.random.choice((0,1),10000)
x = np.array([0, 1])
# y = desired output
d = np.copy(x)
# weights of two neurons
w = np.random.rand(2)
# now training using backprop
gradient = np.random.rand(2)
iterations = 800
rate = 5
k = 1
for i in xrange(1, iterations + 1):
y = sigmoid(w[0] * x)
z = sigmoid(w[1] * y)
gradient[0] = np.sum(z * w[1] * y * x * (d-z) * (1-y) * (1-z))
gradient[1] = np.sum(y * z * (d-z) * (1-z))
w[0] += gradient[0] * rate
w[1] += gradient[1] * rate
print "Iteration %d, Error %f, Change %f" % (i, error(d,z), ((gradient[0] * rate) ** 2 + (gradient[1] * rate) ** 2)**0.5)
change = ((gradient[0] * rate) ** 2 + (gradient[1] * rate) ** 2)**0.5
if change < 0.00001:
break
## now test
print "1",
x = 1
y = sigmoid(w[0]*x)
z = sigmoid(w[1]*y)
print z
print "0",
x = 0
y = sigmoid(w[0]*x)
z = sigmoid(w[1]*y)
print z
謝謝!非常好的解釋。 – smb564