Numpy 张量:张量正面切片上的 Tensordot

2023-12-06

我正在尝试使用 3D 张量的正面切片执行矩阵乘法,如下所示。如果X.shape == (N, N), and Y.shape == (N, N, Y),所得张量的形状应为(N, N, Y).

什么才是正确的np.tensordot语法来实现这个?

我试图限制自己np.tensordot, 并不是np.einsum,因为我想稍后将此解决方案翻译为 Theano。不幸的是,Theano 没有np.einsum尚未实施。

enter image description here

图形改编自这张纸关于张量乘法。 非tensordot答案相当于以下内容

tensor = np.random.rand(3, 3, 2)
X = np.random.rand(3, 3)

output = np.zeros((3, 3, 2))
output[:, :, 0] = X.dot(tensor[:, :, 0])
output[:, :, 1] = X.dot(tensor[:, :, 1])

减少幅度是随着axis=1 for X and axis=0 for tensor, thus np.tensordot基于的解决方案是 -

np.tensordot(X,tensor, axes=([1],[0]))

解释 :

让我们以您的迭代解决方案进行解释,并在其中进行第一次迭代:

output[:, :, 0] = X.dot(tensor[:, :, 0])

在点积中,第一个输入是X,其形状为(N x N)第二个输入是tensor[:, :, 0],这是沿最后一个轴的第一个切片,其形状为(N x N)。该点积导致沿第二轴的减少X, i.e. axis=1并沿着第一轴,即axis=0 of tensor[:, :, 0],它也恰好是整个数组的第一个轴tensor。现在,这在所有迭代中都继续进行。因此,即使在大局中,我们也需要做同样的事情:减少/损失axis=1 in X and axis=0在张量中,就像我们一样!


整合@hlin117的答案

np.tensordot(X,tensor, axes=([1],[0]))

Timing:

>>> N = 200
>>> tensor = np.random.rand(N, N, 30)
>>> X = np.random.rand(N, N)
>>> 
>>> %timeit np.tensordot(X, tensor, axes=([1], [0]))
100 loops, best of 3: 14.7 ms per loop
>>> %timeit np.tensordot(X, tensor, axes=1)
100 loops, best of 3: 15.2 ms per loop
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Numpy 张量:张量正面切片上的 Tensordot 的相关文章

随机推荐