1

假设我们有两个具有相同维数的张量 (A和)。B我们可以将它们与 相乘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中最好的方法是什么?

4

1 回答 1

0

解决所描述问题的方法是使用成对乘法*。成对乘法将第一个张量的所有轴与第二个张量的相应轴“配对”(第一个与第一个,第二个与第二个,...,最后一个与最后一个)。因此我们需要解决两个问题:(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)
于 2017-02-10T16:14:17.270 回答