我一直在学习安,但我正在读的书中有Python的例子。问题是,我从未用Python编写过这些代码,这些代码行太难理解了:
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:]返回没有第一个元素的数组。
但有了这一切,我还是无法向自己解释这会产生什么。
发布于 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)]
权重的构造是一个列表理解。因此,此代码等效于
weights = []
for x,y in [(3,2), (2,4)]:
weights.append(np.random.randn(y, x))因此,最终结果将与
[ np.random.randn(2,3),
np.random.randn(4,2) ]发布于 2015-10-12 19:09:47
这里发生了很多事。
让我们分解这个表达式:正如您所说的,zip将创建一个包含sizes的每个元素及其后继元素的元组列表(除了最后一个)
理解列表[ ... for x, y in zip(..)]的工作方式如下:元组在变量x和y中爆炸,这些变量被传递到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]])]
发布于 2015-10-12 19:11:21
让我们把它分成几块:
self.weights = [some junk]将是一种列表理解。这意味着,执行some junk内容,您将得到一个元素列表。通常这些看起来是这样的:
self.weights = [some_func(x) for x in a_list]这相当于:
self.weights = []
for x in a_list:
self.weights.append(some_func(x))zip(a, b)将a和b的元素分段组合成元组对:
(a1, b1), (a2, b2), (a3, b3), ...for x, y in zip(a, b):这会迭代上面提到的元组对。
sizes[:-1]这是为了获取list sizes的所有元素,除了最后一个项(-1)。
sizes[1:]这是为了获取list sizes的所有元素,除了第一个项。
所以,最后把所有这些拼凑在一起,你会得到:
self.weights = [np.random.randn(y, x) for x, y in zip(sizes[:-1], sizes[1:])] 这是一种列表理解,它通过从第2项到最后和第2次大小的元组对从第1项到最后一项,根据这两个参数创建一个随机数,然后附加到存储为self.weights的列表中。
https://stackoverflow.com/questions/33088268
复制相似问题