为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕妹3146593 2021-11-09 10:37:51
在迈克尔尼尔森的神经网络教程中,他有以下代码: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)]任何人都可以帮助解释这两行中发生的魔力吗?
查看完整描述

2 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

这两行是 Python列表推导式的典型示例。

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

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. 转到第 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]

有关更多示例和快速介绍,请参见此处。


查看完整回答
反对 回复 2021-11-09
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

该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 a

2 b

3 c

4 d

因此,在您的情况下,它将两个列表nabla_b和delta_nabla_b元素相加,因此您会得到一个列表,其中每个元素都是压缩列表中相应元素的总和。


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


查看完整回答
反对 回复 2021-11-09
  • 2 回答
  • 0 关注
  • 389 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号