我希望使用Theano计算两个多维数组中一个维度上的乘积和。首先,我会用
现在我知道
我寻求改变我的方法的原因是性能;我怀疑使用内置(CUDA)点积将比依赖广播、逐元素乘积和求和更快。
numpy
描述我想做的事情。 numpy.tensordot
和numpy.dot
似乎总是执行矩阵乘积,而我实际上正在寻找批量等效的向量乘积。给定x
和y
,我想这样计算z
:x = np.random.normal(size=(200, 2, 2, 1000))
y = np.random.normal(size=(200, 2, 2))
# this is how I now approach it:
z = np.sum(y[:,:,:,np.newaxis] * x, axis=1)
# z is of shape (200, 2, 1000)
现在我知道
numpy.einsum
可能能帮助我,但是我想在Theano中进行这个特定的计算,它没有einsum
等效函数。我将需要使用dot
,tensordot
或Theano的专用einsum子集函数batched_dot
或batched_tensordot
。我寻求改变我的方法的原因是性能;我怀疑使用内置(CUDA)点积将比依赖广播、逐元素乘积和求和更快。
z2 = numpy.einsum('ijkl,ijk->ikl', x, y); numpy.allclose(z, z2); # True
。请注意输出索引中没有j
(轴1),这是einsum
隐式求和的结果。 - Nils Werner