如何在列表中更新Python for循环?

2024-04-25 14:00:09 发布

您现在位置:Python中文网/ 问答频道 /正文

在迈克尔·尼尔森的神经网络教程中,他有以下代码:

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)]

有谁能帮我解释一下这两行字的魔力吗?你知道吗


Tags: inselfforbatchzipetadeltamini
2条回答

zip函数将这两个列表按元素粘在一起,因此如果给定了它:

a = [1, 2, 3, 4]
b = ["a", "b", "c", "d"]

zip(a, b)将返回:

[(1, "a"), (2, "b"), ...]

(每个元素都是tuple

可以使用元素tuple中每个变量之间的逗号来解压listtuple元素(或list):

for elem_a, elem_b in zip(a, b):
    print(elem_a, elem_b)

这将打印:

1 a
2 b
3 c
4 d

在您的例子中,它添加了两个列表nabla_bdelta_nabla_b元素,这样您就得到了一个列表,每个元素是压缩列表中相应元素的总和。你知道吗

这看起来可能有点奇怪,因为for循环都在一行上,但这称为“列表理解”。简单的列表理解读起来像英语。你知道吗

这两行是Pythonlist comprehensions的典型示例。你知道吗

本质上,对于您的第一个列表:

nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]

这意味着:

  1. zip(nabla_b, delta_nabla_b)取第一对,命名为nbdnb
  2. 添加它们(nb+dnb
  3. 使结果成为新列表的第一个元素nabla_b
  4. 对于第二对etc,转到步骤1,将结果附加到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]

有关更多示例和快速介绍,请参见here。你知道吗

相关问题 更多 >