Neural network Can';我的神经网络中的反向传播算法没有发现错误

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部分,因为当我用Andrew Ng的代码替换它时,它可以工作。但我无法将他的代码(从)与我从3blue1brown(从)中遵循的数学联系起来(这对我来说很有意义)

问题是我得到的权重矩阵导数(dLdW1,dLdW2)的形状没有意义。W1的形状是(4,2),因此dLdW1也应该是(而是2,1)。W2的形状是(1,4),因此dLdW2也应该是(而不是4400)。所以我得到了一个正确的维度,但另一个没有,我不知道为什么

注:在我写eg dW2的地方,我指的是W2对前一项的导数,在这里是Z2。在我写dLdW2时,我指的是对成本函数的最终导数(即通过整个网络的完全反向支持)


再过一段时间,我就明白了。下面是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