【问题标题】:Numpy tensor: Tensordot over frontal slices of tensorNumpy张量:张量正面切片上的张量点
【发布时间】:2016-07-04 11:30:22
【问题描述】:

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

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

我试图将自己限制在np.tensordot,而不是np.einsum,因为我想稍后将此解决方案翻译成Theano。不幸的是,Theano 还没有实现np.einsum

改编自this paper 关于张量乘法的图形。 非张量点答案等价于以下

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

【问题讨论】:

    标签: python numpy matrix-multiplication


    【解决方案1】:

    对于Xaxis=0 对于tensor 的减少是沿着axis=1 减少的,因此基于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)和沿第一个轴(即tensor[:, :, 0]axis=0)减少,这也恰好是整个数组tensor 的第一个轴。现在,这将在所有迭代中继续。因此,即使在大局中,我们也需要这样做:在张量中减少/丢失 axis=1 和张量中的 axis=1,就像我们所做的一样!


    整合@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
    

    【讨论】:

    • 这给了我与上面完全相同的答案。谢谢!
    • 最后一个问题,@Divakar。现在我想使用横向切片完成上述操作,使用(n, m, m) 张量。 (output[0, :, :] = X.dot(Tensor[0, :, :])等。我试过np.tensor(X, Tensor, axes=([1], [1]),但这并没有给我想要的结果。在这种情况下axes参数应该是什么?
    • @hlin117 由于您存储输出的方式,此后需要转置:np.tensordot(X,tensor, axes=([1],[1])).transpose(1,0,2)
    • 谢谢。我永远不会想到需要执行这样的转置。您能解释一下为什么必须进行这种转变吗?
    • @hlin117 好吧,假设X : (m1,n1)tensor : (m2,n2,r2)np.tensordot(X,tensor, axes=([1],[1])),我们将其缩减为(m1,m2,r2)。但是,由于输出是通过沿m2 迭代tensor 来收集的,因此我们需要将其作为输出中的第一个轴,因此我们需要交换m1m2,即交换前两个轴那个转置。希望这是有道理的!
    【解决方案2】:

    看起来上面的内容等价于以下内容:

    np.tensordot(X, tensor, axes=1)
    

    axes=1,因为(如果 axes 参数是标量)N 应该是第一个参数的最后一个轴,N 应该是第二个参数的第一个轴。

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 2017-11-05
      • 2019-05-30
      • 2019-11-05
      • 1970-01-01
      相关资源
      最近更新 更多