了解Python中的einsum

user1999728

我正在使用einsum,因为它非常快,每次使用它可以为我节省2-3行代码。但是我很难理解它。

我举一个例子:我想训练一个神经网络。为了计算与梯度有关的内容,我需要执行以下操作:

给定一个矩阵W(线ij是神经元ij下一层神经元之间的连接的权重)和神经元输出的向量S(希望底部的可视示例会有所帮助),我需要执行以下操作:

S[i]*W[i,:] 是新矩阵中的一行

我发现以下代码可以完成它:

 einsum('ji,kj->ij',W,S)

现在,这对我来说很有意义,但是花了我很长时间才能正确解决。大量的尝试和许多错误(有些事情可以解决,但有误,有些在尝试运行时给了我错误)。

现在,我想一次计算一批-也就是说,它不是S一个向量,而是一个大小矩阵,(NeuronsNum, BatchSize)我想计算:

einsum('ji,kj->ij',W,S[:,b])

所有b=0BatchSize-1为了节省时间(并理解einsum),我想一次全部完成并将结果作为矩阵来获取(Neurons in layer l-1, Neurons in layer l, BatchSize)

我似乎无法正确处理。因此,感谢您阅读所有这些内容,也感谢我可以了解此功能的任何帮助

视觉示例: 在此处输入图片说明

所述i第神经元发送一些值,其连接到目标的强度称重。我们做到每一个i

使用死亡之星

只需将其写在嵌套的for循环中,就好像您不知道numpy可以做到这一点一样,然后保留numpy einsum的索引。这样,您便可以写下确切的公式。

在您的情况下:

R = einsum('ki,jk->kij',W,S)

将为您提供一个3d数组,其结果R满足:

R[:,:,b] = einsum('ki,k->ki',W,S[:,b])

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章