Neural network Can';我的神经网络中的反向传播算法没有发现错误
我已经花了好几个小时,但我就是看不到。 我知道错误在backprop部分,因为当我用Andrew Ng的代码替换它时,它可以工作。但我无法将他的代码(从)与我从3blue1brown(从)中遵循的数学联系起来(这对我来说很有意义) 问题是我得到的权重矩阵导数(dLdW1,dLdW2)的形状没有意义。W1的形状是(4,2),因此dLdW1也应该是(而是2,1)。W2的形状是(1,4),因此dLdW2也应该是(而不是4400)。所以我得到了一个正确的维度,但另一个没有,我不知道为什么 注:在我写eg dW2的地方,我指的是W2对前一项的导数,在这里是Z2。在我写dLdW2时,我指的是对成本函数的最终导数(即通过整个网络的完全反向支持)Neural network Can';我的神经网络中的反向传播算法没有发现错误,neural-network,deep-learning,backpropagation,Neural Network,Deep Learning,Backpropagation,我已经花了好几个小时,但我就是看不到。 我知道错误在backprop部分,因为当我用Andrew Ng的代码替换它时,它可以工作。但我无法将他的代码(从)与我从3blue1brown(从)中遵循的数学联系起来(这对我来说很有意义) 问题是我得到的权重矩阵导数(dLdW1,dLdW2)的形状没有意义。W1的形状是(4,2),因此dLdW1也应该是(而是2,1)。W2的形状是(1,4),因此dLdW2也应该是(而不是4400)。所以我得到了一个正确的维度,但另一个没有,我不知道为什么 注:在我写eg
再过一段时间,我就明白了。下面是backprop的正确方程组:
m = Y.shape[1]
dA2 = 1/m * 2*(A2 - Y) #1,400
dZ2 = sigmoid_prime(Z2) #1,400
dW2 = A1 #4,400
dB2 = np.ones((1,A1.shape[1]))#1,400
dA1 = W2 #1,4
dZ1 = sigmoid_prime(Z1) #4,400
dW1 = X #2,400
dB1 = np.ones((1,X.shape[1])) #1,400
delta2 = dA2 * dZ2 #1,400
dLdW2 = delta2 @ dW2.T #1,4
dLdB2 = delta2 @ dB2.T #1,1
delta1 = delta2.T @ dA1 * dZ1.T #400,4
dLdW1 = delta1.T @ dW1.T #4,2
dLdB1 = delta1.T @ dB1.T #4,1
在我最初的方法中有两件事是错误的:
1.有些术语需要元素相乘,而不是矩阵相乘(特别是dZ
术语)
2.条款的顺序是错误的。我相信你可以通过足够的换位来保持原来的顺序,但一旦我明白了该怎么做,这感觉就最简单了
非常有帮助。很高兴你发现了这个问题。
m = Y.shape[1]
dA2 = 1/m * 2*(A2 - Y) #1,400
dZ2 = sigmoid_prime(Z2) #1,400
dW2 = A1 #4,400
dB2 = np.ones((1,A1.shape[1]))#1,400
dA1 = W2 #1,4
dZ1 = sigmoid_prime(Z1) #4,400
dW1 = X #2,400
dB1 = np.ones((1,X.shape[1])) #1,400
delta2 = dA2 * dZ2 #1,400
dLdW2 = delta2 @ dW2.T #1,4
dLdB2 = delta2 @ dB2.T #1,1
delta1 = delta2.T @ dA1 * dZ1.T #400,4
dLdW1 = delta1.T @ dW1.T #4,2
dLdB1 = delta1.T @ dB1.T #4,1