首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解Python中的einsum

理解Python中的einsum
EN

Stack Overflow用户
提问于 2014-06-17 09:11:17
回答 2查看 489关注 0票数 2

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

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

给定一个矩阵W (line ij是下一层中从神经元i到神经元j的连接的权重),以及神经元S的输出向量(希望底部的可视化示例将有所帮助),我需要做以下工作:

S[i]*W[i,:]是新矩阵中的一条线。

我想出了下面的代码来完成它:

代码语言:javascript
复制
 einsum('ji,kj->ij',W,S)

现在这对我来说是有意义的,但我花了很长时间才把它做好。大量的尝试和许多错误(有些事情成功了,但错了,有些在试图运行时给了我错误)。

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

代码语言:javascript
复制
einsum('ji,kj->ij',W,S[:,b])

所有的b=0BatchSize-1。为了节省时间(并理解einsum),我想一次完成所有的工作,并得到一个矩阵(Neurons in layer l-1, Neurons in layer l, BatchSize)的结果。

我好像搞错了。所以我很感谢你阅读了这些,我希望你能帮助我理解这个函数。

视觉示例:

i第四神经元发送一些值,衡量其与目标连接的强度。我们对每一个i都这样做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-17 11:59:42

只需在嵌套的for -循环中写出它,就好像您不知道numpy可以做到这一点,而不是保留numpy einsum的索引。这样你就能写出确切的配方。

就你而言:

代码语言:javascript
复制
R = einsum('ki,jk->kij',W,S)

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

代码语言:javascript
复制
R[:,:,b] = einsum('ki,k->ki',W,S[:,b])
票数 2
EN

Stack Overflow用户

发布于 2014-06-17 11:13:21

多亏了usethedeathstar,我找到了解决方案:

代码语言:javascript
复制
einsum('ki,jk->kij',W,S)

将给我一个3d数组,其中的结果R满足:

代码语言:javascript
复制
R[:,:,b]=einsum('ji,kj->ij',W,S[:,b])

他的建议是:在循环中编写代码,删除循环,你就会得到索引!

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

https://stackoverflow.com/questions/24259825

复制
相关文章

相似问题

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