【发布时间】:2014-08-07 05:31:55
【问题描述】:
我正在使用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)。
我似乎无法正确理解。因此,我感谢您阅读所有这些内容,如果我能获得理解此功能的任何帮助,我将不胜感激
视觉示例:
ith 神经元发送一些值,根据它与目标的连接强度来衡量。我们对每个i 都这样做。
【问题讨论】:
-
对于神经网络算法,
np.dot优先于np.einsum。如果 NumPy 有良好的 BLAS 支持,dot将把einsum从水中吹出来进行矩阵乘法。 -
我需要做的一些事情不能用
dot完成(除非我对矩阵进行一些更改然后将它们改回来,我宁愿不这样做 - 因为大多数的代码是由其他人编写的,我宁愿不要更改太多)。另外,无论如何我想了解einsum。另外,我想了解我的问题有什么问题,以至于有人认为它应该被否决。 -
如果你像通常在 for 循环中那样写出来(如果你不知道 numpy 等中存在点积,那就太天真了),它是什么样子的?当我尝试使用 einsum 时,我就是这样做的。一旦你把它写出来,它只是删除所有的for循环结构,只保留最后的 C[i,j,k,l]+=A[m,n,o,p]*B[p,q, r](但在 c 的正确位置有正确的索引)。
-
@usethedeathstar 听起来很简单。没有这么想。谢谢!如果您想将其写为答案,我会投票并将其标记为答案:) 谢谢!
-
你能解释一下这些东西的所有形状吗?我了解 einsum,但不是您使用的问题:-)
标签: python numpy neural-network matrix-multiplication