我正在使用einsum
,因为它非常快,每次使用它可以为我节省2-3行代码。但是我很难理解它。
我举一个例子:我想训练一个神经网络。为了计算与梯度有关的内容,我需要执行以下操作:
给定一个矩阵W
(线i
列j
是神经元i
到j
下一层神经元之间的连接的权重)和神经元输出的向量S
(希望底部的可视示例会有所帮助),我需要执行以下操作:
S[i]*W[i,:]
是新矩阵中的一行
我发现以下代码可以完成它:
einsum('ji,kj->ij',W,S)
现在,这对我来说很有意义,但是花了我很长时间才能正确解决。大量的尝试和许多错误(有些事情可以解决,但有误,有些在尝试运行时给了我错误)。
现在,我想一次计算一批-也就是说,它不是S
一个向量,而是一个大小矩阵,(NeuronsNum, BatchSize)
我想计算:
einsum('ji,kj->ij',W,S[:,b])
所有b=0
来BatchSize-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] 删除。
我来说两句