在迈克尔·尼尔森的神经网络教程中,他有以下代码:
def update_mini_batch(self, mini_batch, eta):
"""The ``mini_batch`` is a list of tuples ``(x, y)``, and ``eta``
is the learning rate."""
nabla_b = [np.zeros(b.shape) for b in self.biases]
nabla_w = [np.zeros(w.shape) for w in self.weights]
for x, y in mini_batch:
delta_nabla_b, delta_nabla_w = self.backprop(x, y)
nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
self.weights = [w-(eta/len(mini_batch))*nw
for w, nw in zip(self.weights, nabla_w)]
self.biases = [b-(eta/len(mini_batch))*nb
for b, nb in zip(self.biases, nabla_b)]
我了解什么是元组和列表,我了解zip函数在做什么,但我不了解变量nb、dnb、nw和dnw是如何在这两行代码上更新的:
nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
有谁能帮我解释一下这两行字的魔力吗?你知道吗
zip
函数将这两个列表按元素粘在一起,因此如果给定了它:zip(a, b)
将返回:(每个元素都是
tuple
)可以使用元素
tuple
中每个变量之间的逗号来解压list
的tuple
元素(或list
):这将打印:
在您的例子中,它添加了两个列表
nabla_b
和delta_nabla_b
元素,这样您就得到了一个列表,每个元素是压缩列表中相应元素的总和。你知道吗这看起来可能有点奇怪,因为
for
循环都在一行上,但这称为“列表理解”。简单的列表理解读起来像英语。你知道吗这两行是Pythonlist comprehensions的典型示例。你知道吗
本质上,对于您的第一个列表:
这意味着:
zip(nabla_b, delta_nabla_b)
取第一对,命名为nb
和dnb
nb+dnb
)nabla_b
nabla_b
,直到zip(nabla_b, delta_nabla_b)
中的所有对都用完为止举个简单的例子,下面的列表:
等价于以下
for
循环:有关更多示例和快速介绍,请参见here。你知道吗
相关问题 更多 >
编程相关推荐