我使用的是einsum,因为它非常快,每次使用它都可以节省2-3行代码。但我很难理解它。
我举个例子:我想训练一个神经网络。为了计算与梯度相关的内容,我需要做以下工作:
给定一个矩阵W (line 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都这样做。
发布于 2014-06-17 11:59:42
只需在嵌套的for -循环中写出它,就好像您不知道numpy可以做到这一点,而不是保留numpy einsum的索引。这样你就能写出确切的配方。
就你而言:
R = einsum('ki,jk->kij',W,S)将为您提供一个3d数组,其中的结果R满足:
R[:,:,b] = einsum('ki,k->ki',W,S[:,b])发布于 2014-06-17 11:13:21
多亏了usethedeathstar,我找到了解决方案:
einsum('ki,jk->kij',W,S)将给我一个3d数组,其中的结果R满足:
R[:,:,b]=einsum('ji,kj->ij',W,S[:,b])他的建议是:在循环中编写代码,删除循环,你就会得到索引!
https://stackoverflow.com/questions/24259825
复制相似问题