我正在尝试用Python实现一个简单的中性网络。我的问题是,当我们进行反向传播时,为什么我们不反向传播来自偏见单位的增量?在下面的教程中,它是这样说的,但我没有得到它。
我还粘贴了下面的代码。我的问题是1)代码中有任何错误吗? 2)如果我将“W0 = W0 - alpha np.dot(X_bias.T,L1_delta [:, - 1])”更改为“W0 = W0 - alpha np.dot(X_bias.T) ,L1_delta“)”,它会抛出一个错误。“操作数不能与形状一起广播(3,4)(3,5)”所以我的问题是为什么我必须省略这个矩阵中的最后一列? / p>
http://outlace.com/Beginner-Tutorial-Backpropagation/
import numpy as np
def sigmoid(num):
return 1/(1+np.exp(-num))
def sigmoid_derivative(num):
return num*(1-num)
def add_bias(matrix):
newcol=np.ones((matrix.shape[0], 1))
return np.hstack([matrix, newcol])
print("Initializing parameters")
alpha = 0.09
X = np.array([[1,1],
[1,0],
[1,1],
[0,1]])
y=np.array([[1],
[0],
[0],
[1]])
W0 = np.random.rand(3,4)
W1 = np.random.rand(5,1)
print("Start iterating")
for i in range(60000):
X_bias = add_bias(X)
L1 = sigmoid(np.dot(X_bias,W0))
L1_bias = add_bias(L1)
L2 = sigmoid(np.dot(L1_bias,W1))
L2_error = L2 - y
L2_delta = L2_error*sigmoid_derivative(L2)
L1_error = np.dot(L2_delta,W1.T)
L1_delta = L1_error*sigmoid_derivative(L1_bias)
W1 = W1 - alpha*np.dot(L1_bias.T,L2_delta)
W0 = W0 - alpha*np.dot(X_bias.T,L1_delta[:,:-1)
if i%1000==0:
print("Error after {0} iterations is: {1}".format(str(i),str(np.mean(np.abs(L2_error)))))