当前位置: 首页 > 知识库问答 >
问题:

理解Michael Nielsen的反向传播代码

岳飞航
2023-03-14

我正在尝试理解/运行迈克尔·尼尔森(Michael Neilsen)的《神经网络与深度学习》(Neural Networks and Deep Learning)第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())

前向传递创建激活列表,其中激活[i]包含层i中神经元激活的向量。因此激活[-1]是最后一层。y是所需的输出。

成本衍生产品定义如下:

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。第四行的点应该有效吗?我的理解是,激活[-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)

<代码>激活看起来和我预期的完全一样-2次激活,然后1次,然后2次。失败就在眼前,我不清楚,正如我所料,失败了。但是,大概这本书中的代码已经过测试(这本书很好),我一定是做错了什么。我当时正在编写一个独立的实现,遇到了同一个问题,所以我希望能够将此代码分解以找出答案,但我不知道这应该如何工作,也不知道它为什么适合作者。

如果你能了解我在这里遗漏了什么,我将不胜感激。谢谢!:)

共有1个答案

壤驷承
2023-03-14

假设网络架构为,[…,N,M][/code>,即最后一层输出大小向量,之前的一层输出大小向量(让我们关注最后两层,忽略其余部分)N和M可以是任意的。另外,让我们忽略批处理,就像您的问题一样:我们只提供一个输入和一个标签。

在这种情况下,最后的权重矩阵,即<代码>自我。权重[-1]将具有形状,因此必须是nabla\u w[-1]才能正确执行更新。现在:

  • 增量将具有形状(与输出相对应)

因为在numpy中,形状(2,)[1,2][2,1]不同:

>>> np.array([1, 2]).shape
(2,)

网络架构区分了xy的行和列,您必须提供两者的正确形状才能使其工作。否则,您将获得意外的广播和形状不匹配。试试这个例子看看它的作用:

net = Network([2,1,2])
x = np.array([1, 2]).reshape([2, 1])  # one example of size 2
y = np.array([3, 4]).reshape([2, 1])  # one example of size 2
net.backprop(x, y)
 类似资料:
  • 卷积神经网络其实是神经网络特征学习的一个典型例子。传统的机器学习算法其实需要人工的提取特征,比如很厉害的SVM。而卷积神经网络利用模板算子的参数也用以学习这个特点,把特征也学习出来了。其实不同的模板算子本质上就是抽象了图像的不同方面的特征。比如提取边缘,提取梯度的算子。用很多卷积核去提取,那就是 提取了很多的特征。一旦把参数w,b训练出来,意味着特征和目标之间的函数就被确定。今天分享下CNN的关键

  • 训练发散 理想的分类器应当是除了真实标签的概率为1,其余标签概率均为 0,这样计算得到其损失函数为 -ln(1) = 0 损失函数越大,说明该分类器在真实标签上分类概率越小,性能也就越差。一个非常差的分类器,可能在真实标签上的匪类概率接近于0,那么损失函数就接近于正无穷,我们成为训练发散,需要调小学习速率。 6.9 高原反应 在 ImageNet-1000 分类问题中,初始状态为均匀分布,每个类别

  • 1 正向传播(Forward propagation) 回忆一下,给出一个输入特征$x$的时候,我们定义了$a^{[0]}=x$。然后对于层(layer)$l=1,2,3,\dots,N$,其中的$N$是网络中的层数,则有: $z^{[l]}=W^{[l]}a^{[l-1]}+b^{[l]}$ $a^{[l]}=g^{[l]}(z^{[l]})$ 在讲义中都是假设了非线性特征$g^{[l]}$对除

  • 在使用relu激活功能时,我在实现backprop时遇到问题。我的模型有两个隐藏层,两个隐藏层中都有10个节点,输出层中有一个节点(因此有3个权重,3个偏差)。我的模型不适用于这个断开的backward\u prop函数。但是,该函数使用sigmoid激活函数(作为注释包含在函数中)与backprop一起工作。因此,我认为我把relu推导搞砸了。 谁能把我推向正确的方向?

  • 前面几节里我们使用了小批量随机梯度下降的优化算法来训练模型。在实现中,我们只提供了模型的正向传播(forward propagation)的计算,即对输入计算模型输出,然后通过autograd模块来调用系统自动生成的backward函数计算梯度。基于反向传播(back-propagation)算法的自动求梯度极大简化了深度学习模型训练算法的实现。本节我们将使用数学和计算图(computationa

  • 本文向大家介绍nginx正向代理与反向代理详解,包括了nginx正向代理与反向代理详解的使用技巧和注意事项,需要的朋友参考一下 正向代理 就是假设有一个内网 内网有两台机器,这两台机器只有 a 可以上网 b 不能上网,但是 a 和 b 通过网络相连接 这时如果 b 想访问外网,就可以通过 a 来正向代理访问外网 正向代理就是在内网中模拟目标服务器,把内网中其它机器的请求 转发给外网中的真正的目标服