更新列表中的 Python for 循环如何工作?

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


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

任何人都可以帮助解释这两行中发生的魔力吗?


慕妹3146593
浏览 390回答 2
2回答

慕工程0101907

这两行是 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转到第 2 对等的第一步,将结果附加到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]有关更多示例和快速介绍,请参见此处。

犯罪嫌疑人X

该zip函数将两个列表逐个元素地粘在一起,这样如果你给它:a = [1, 2, 3, 4]b = ["a", "b", "c", "d"]zip(a, b) 会返回:[(1, "a"), (2, "b"), ...](每个元素都是一个tuple)您可以使用元素中每个变量之间的逗号来解包lists 的tuples(或lists)元素tuple:for elem_a, elem_b in zip(a, b):    print(elem_a, elem_b)这将打印:1 a2 b3 c4 d因此,在您的情况下,它将两个列表nabla_b和delta_nabla_b元素相加,因此您会得到一个列表,其中每个元素都是压缩列表中相应元素的总和。它可能看起来有点奇怪,因为for循环都在一行上,但这被称为“列表理解”。简单的列表推导读起来像英语。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python