gpt4 book ai didi

python - Numpy 张量 : Tensordot over frontal slices of tensor

转载 作者:行者123 更新时间:2023-12-01 04:03:37 29 4
gpt4 key购买 nike

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

实现此目的的正确 np.tensordot 语法是什么?

我试图将自己限制为 np.tensordot,而不是 np.einsum,因为我想稍后将此解决方案转换为 Theano。不幸的是,Theano 尚未实现 np.einsum

enter image description here

图形改编自this paper关于张量乘法。非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对于 Xaxis=0对于 tensor ,因此 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 的第二个轴减少。 ,即axis=1并沿着第一个轴,即 axis=0tensor[:, :, 0] ,它也恰好是整个数组的第一个轴 tensor 。现在,这在所有迭代中都继续进行。因此,即使在大局中,我们也需要做同样的事情:减少/损失axis=1Xaxis=0在张量中,就像我们一样!

<小时/>

整合@hlin117的答案

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

时间安排:

>>> 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

关于python - Numpy 张量 : Tensordot over frontal slices of tensor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36072042/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com