[英]How does updating a Python for loop within a list work?
在Michael Nielsen的神经网络教程中,他具有以下代码:
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
函数将两个列表逐个元素地粘贴在一起,因此,如果给了它:
a = [1, 2, 3, 4]
b = ["a", "b", "c", "d"]
zip(a, b)
将返回:
[(1, "a"), (2, "b"), ...]
(每个元素都是一个tuple
)
您可以使用tuple
元素中每个变量之间的逗号来解压缩tuple
的list
元素(或list
):
for elem_a, elem_b in zip(a, b):
print(elem_a, elem_b)
这将打印:
1 a
2 b
3 c
4 d
因此,在您的情况下,它将在元素上分别添加两个列表nabla_b
和delta_nabla_b
,因此您将获得一个列表,每个元素是压缩列表中相应元素的总和。
因为for
循环全部在一行上,所以它可能看起来有点奇怪,但这被称为“列表理解”。 简单的列表理解就像英语一样。
这两行是Python 列表推导的典型示例。
本质上,对于您的第一个列表:
nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
这意味着:
zip(nabla_b, delta_nabla_b)
取出第一对; 分别命名为nb
和dnb
nb+dnb
) nabla_b
nabla_b
,直到zip(nabla_b, delta_nabla_b)
所有对都用尽 举一个简单的例子,列表理解如下:
squares = [x**2 for x in range(10)]
print(squares)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
与以下for
循环等效:
squares = []
for x in range(10):
squares.append(x**2)
print(squares)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
有关更多示例和快速介绍,请参见此处 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.