为什么我们不反向传播神经网络中偏置单位的增量

时间:2016-11-21 03:55:02

标签: python neural-network backpropagation

我正在尝试用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)))))

0 个答案:

没有答案