【发布时间】:2018-04-17 23:27:05
【问题描述】:
我正在尝试理解/运行 Michael Neilsen 的神经网络和深度学习第 2 章中关于反向传播的代码:http://neuralnetworksanddeeplearning.com/chap2.html#the_code_for_backpropagation。
在反向传播的开始,它有:
delta = self.cost_derivative(activations[-1], y) * \
sigmoid_prime(zs[-1])
nabla_b[-1] = delta
nabla_w[-1] = np.dot(delta, activations[-2].transpose())
前向传递创建activations 列表,其中activations[i] 包含i 层中神经元的激活向量。所以activations[-1] 是最后一层。 y 是所需的输出。
cost_derivative 定义为:
def cost_derivative(self, output_activations, y):
"""Return the vector of partial derivatives \partial C_x /
\partial a for the output activations."""
return (output_activations-y)
所以第一行输出一个与我们的输出层形状相同的向量。所以我的问题是第四行的np.dot 应该如何工作?我的理解是activations[-2] 是倒数第二层神经元激活的向量,它可以有任意数量的神经元,所以我不确定我们如何点积它(或它的转置)使用具有输出层形状的增量。
我运行代码 (https://github.com/mnielsen/neural-networks-and-deep-learning/blob/master/src/network.py) 并添加了一些调试行来尝试理解这一点,但它似乎不起作用:
>>> from network import *; net = Network([2,1,2])
>>> net.backprop([1,2], [3,4])
Activations[0]
[1, 2]
Activations[1]
[[ 0.33579893]]
Activations[2]
[[ 0.37944698]
[ 0.45005939]]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<snip>/neural-networks-and-deep-learning/src/network.py", line 117, in backprop
nabla_w[-1] = np.dot(delta, activations[-2].transpose())
ValueError: shapes (2,2) and (1,1) not aligned: 2 (dim 1) != 1 (dim 0)
activations 看起来完全符合我的预期 - 2 次激活,然后是 1 次,然后是 2 次。失败就在我不清楚的线上,并且正如我预期的那样失败。但是,大概这本书中的代码已经过测试(这本书很棒),我一定是做错了什么。我正在编写一个独立的实现并遇到了同样的问题,所以我希望能够把这段代码拆开来弄清楚——但我不知道这应该如何工作,或者为什么它对作者有用.
如果能对我在这里遗漏的内容提供任何见解,我将不胜感激。谢谢! :)
【问题讨论】:
标签: python numpy machine-learning neural-network backpropagation