【发布时间】:2021-09-23 23:52:58
【问题描述】:
我目前正在研究如何从头开始实现神经网络以了解其工作原理,我偶然发现了这篇文章:https://www.samsonzhang.com/2020/11/24/understanding-the-math-behind-neural-networks-by-building-one-from-scratch-no-tf-keras-just-numpy.html,他在其中使用 MNIST 数据集实现了一个工作数字分类器,准确率几乎达到 83% 以上每次我运行他的实现...
我在他的实现中没有遇到任何问题,但是当我自己实现时,我对这部分代码感到好奇。
下面是他在获取将用于更新权重和偏差的导数的实现...
def backward_prop(Z1, A1, Z2, A2, W1, W2, X, Y):
one_hot_Y = one_hot(Y)
dZ2 = A2 - one_hot_Y
dW2 = 1 / m * dZ2.dot(A1.T)
db2 = 1 / m * np.sum(dZ2) # <-- my question is about this lines
dZ1 = W2.T.dot(dZ2) * ReLU_deriv(Z1)
dW1 = 1 / m * dZ1.dot(X.T)
db1 = 1 / m * np.sum(dZ1) # <-- my question is about this lines
return dW1, db1, dW2, db2
他在这里所做的是他将得到的偏置矩阵的所有总和作为一个标量值,所以我很好奇更新偏置项的正确方法是什么?只为一层中的偏置矩阵的所有元素减去一个标量值?
我问这个问题的原因是因为当我将代码行设置为 db1 = 1 / m * np.sum(dZ1,axis=0) 和 db2 = 1 / m * np.sum(dZ2,axis=0) 时,它不是返回一个标量值而是返回一个矩阵,此时当我运行模型时它仍然是工作并且仍然有83%+的相当高的准确度,所以我现在真的不知道哪个是正确的......
编辑:使用 '''axis=1,keepdims=True''' 而不是 '''axis=0''' 似乎更正确,但我仍然不确定
谁能告诉我这部分?
【问题讨论】:
标签: python numpy machine-learning neural-network