首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python奇异合合

Python奇异合合
EN

Stack Overflow用户
提问于 2015-10-12 18:55:13
回答 4查看 267关注 0票数 3

我一直在学习安,但我正在读的书中有Python的例子。问题是,我从未用Python编写过这些代码,这些代码行太难理解了:

代码语言:javascript
运行
复制
sizes = [3,2,4]
self.weights = [np.random.randn(y, x) 
                    for x, y in zip(sizes[:-1], sizes[1:])]

我阅读了一些关于它的内容,发现randn()函数返回一个数组,其中包含y元素,x维数在0到1之间填充。zip()将两个数组连接成一个数组。sizes[:-1]返回最后一个元素,sizes[1:]返回没有第一个元素的数组。

但有了这一切,我还是无法向自己解释这会产生什么。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-10-12 19:02:35

sizes[:-1]将返回子列表[3,2] (即除最后一个元素外的所有元素)。

sizes[1:]将返回子列表[2,4] (即除第一个元素外的所有元素)。

zip([a,b], [c,d])给了[(a,c), (b,d)]

因此,压缩上面的两个列表将为您提供[(3,2), (2,4)]

权重的构造是一个列表理解。因此,此代码等效于

代码语言:javascript
运行
复制
weights = []

for x,y in [(3,2), (2,4)]:
       weights.append(np.random.randn(y, x))

因此,最终结果将与

代码语言:javascript
运行
复制
[ np.random.randn(2,3), 
  np.random.randn(4,2) ]
票数 5
EN

Stack Overflow用户

发布于 2015-10-12 19:09:47

这里发生了很多事。

让我们分解这个表达式:正如您所说的,zip将创建一个包含sizes的每个元素及其后继元素的元组列表(除了最后一个)

理解列表[ ... for x, y in zip(..)]的工作方式如下:元组在变量xy中爆炸,这些变量被传递到np.random.randn中,以创建一个随机矩阵列表。

这些矩阵的特征是,第一维(行)由sizes的每个元素指定,第二维空间(列)长为以下元素。

有趣的是,矩阵具有相容的维数,在这个序列中彼此相乘,但我想这不是目的。weights列表中每个矩阵的目的是指定完全连接的神经元层之间的权重。祝好运!似乎是个有趣的项目!

后斯克里姆

因为您是初学者:您可以在代码中的任何地方添加import pdb; pdb.set_trace()语句以获得断点。然后,您只需复制和粘贴任何表达式的不同部分,看看会出现什么。例如:ipdb> print sizes [3, 2, 4] ipdb> print sizes[:-1] [3, 2] ipdb> print sizes[1:] [2, 4] ipdb> print zip(sizes[:-1], sizes[1:]) [(3, 2), (2, 4)] ipdb> print [np.random.randn(y, x) for x, y in zip(sizes[:-1], sizes[1:])] [array([[ 0.25933943, 0.59855688, 0.49055744], [ 0.94602292, -0.8012292 , 0.56352986]]), array([[ 0.81328847, -0.53234407], [-0.272656 , -1.24978881], [-1.2306653 , 0.56038948], [ 1.15837792, 1.19408038]])]

票数 2
EN

Stack Overflow用户

发布于 2015-10-12 19:11:21

让我们把它分成几块:

代码语言:javascript
运行
复制
self.weights = [some junk]

将是一种列表理解。这意味着,执行some junk内容,您将得到一个元素列表。通常这些看起来是这样的:

代码语言:javascript
运行
复制
self.weights = [some_func(x) for x in a_list]

这相当于:

代码语言:javascript
运行
复制
self.weights = []
for x in a_list:
    self.weights.append(some_func(x))
代码语言:javascript
运行
复制
zip(a, b)

ab的元素分段组合成元组对:

代码语言:javascript
运行
复制
(a1, b1), (a2, b2), (a3, b3), ...
代码语言:javascript
运行
复制
for x, y in zip(a, b):

这会迭代上面提到的元组对。

代码语言:javascript
运行
复制
sizes[:-1]

这是为了获取list sizes的所有元素,除了最后一个项(-1)。

代码语言:javascript
运行
复制
sizes[1:]

这是为了获取list sizes的所有元素,除了第一个项。

所以,最后把所有这些拼凑在一起,你会得到:

代码语言:javascript
运行
复制
self.weights = [np.random.randn(y, x) for x, y in zip(sizes[:-1], sizes[1:])] 

这是一种列表理解,它通过从第2项到最后和第2次大小的元组对从第1项到最后一项,根据这两个参数创建一个随机数,然后附加到存储为self.weights的列表中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33088268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档