【问题标题】:Are there something in between tensordot and element-wise multiplication in Theano?Theano 中的张量点乘法和逐元素乘法之间有什么关系吗?
【发布时间】:2017-02-08 10:07:07
【问题描述】:

假设我们有两个具有相同维度的张量(AB)。我们可以将它们与tensordot 相乘。例如:

T.tensordot(A, B, axes = [[0,3], [0,3]])

在这种情况下,我们将第一个张量的轴与第二张量的一些轴“配对”,然后将这些“配对”轴相加:

C[j, k, a, b ] = sum_{i, l} A[i, j, k, l] * A[i, a, b, l]

在上面的例子中,第一个张量的第一个和最后一个轴分别与第二个张量的第一个和最后一个轴配对。

或者,我们可以将两个张量逐元素相乘:

C[i, j, k, l] = A[i, j, k, l] * B[i, j, k, l]

在这种情况下,我们将第一个张量的所有轴与第二个张量的所有对应轴“配对”(第一个与第一个,第二个与第二个等等)。

现在,我想做一些介于上述两个操作之间的事情。更详细的:

  1. 我想将第一个张量的某个轴​​与第二个张量的某个轴​​配对(就像 w 在 tensordot 中做的那样)。所以,我不想将 A 的所有轴与 B 的所有轴配对。
  2. 我不想对所有成对的轴求和(就像我们在成对乘法中所做的那样,对成对的轴没有求和)。

这是我想用“数学”形式写的:

C[a, b, c, i] = sum_d A[a, b, c, d] * B[i, b, c, d]

在 theano 中最好的方法是什么?

【问题讨论】:

    标签: python theano elementwise-operations


    【解决方案1】:

    解决上述问题的方法是使用成对乘法*。成对乘法将第一个张量的所有轴与第二个张量的相应轴“配对”(第一个与第一个,第二个与第二个,...,最后一个与最后一个)。因此我们需要解决两个问题:(1)打乱两个张量的轴,使正确的轴相互配对,(2)添加“虚拟”轴以防止在不需要的地方配对。最后,我们对我们想要的 exes 进行求和。

    问题中提到的特定问题

    C[a, b, c, i] = sum_d A[a, b, c, d] * B[i, b, c, d]
    

    通过以下方式解决:

    T.sum(A.dimshuffle(0, 1, 2, 3, 'x') * B.dimshuffle('x', 1, 2, 3, 0), axis=4)
    

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 2019-04-11
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 2021-12-28
      • 2016-06-04
      相关资源
      最近更新 更多