theano - 如何有效地复制和添加张量?

theano - how to efficiently replicate and add tensors?

我有一个形状为 (2, G) 的张量和另一个形状为 (N, 2) 的张量。

我需要以输出为 (N, 2, G) 的方式添加它们,这意味着第一个张量被复制到 (N, 2, G),然后第二个张量被添加到每个沿三维的矩阵。 (反之亦然:第二个张量被复制到 (N, 2, G) 并且第一个张量被添加到沿第一维的每个子张量)。

如何在 Theano 中高效地完成这项工作? 谢谢。

为了理解问题,假定以下示例具有代表性。

如果

A = [[1, 2, 3],
     [4, 5, 6]]

B = [[1, 2],
     [3, 4],
     [5, 6],
     [7, 8]]

那么结果应该是

C = [[[  2.   3.   4.]
      [  6.   7.   8.]]
     [[  4.   5.   6.]
      [  8.   9.  10.]]
     [[  6.   7.   8.]
      [ 10.  11.  12.]]
     [[  8.   9.  10.]
      [ 12.  13.  14.]]]

此处 G=3N=4

要在 Theano 中实现这一点,只需添加新的可广播维度并依靠广播来获得所需的结果。

import numpy
import theano
import theano.tensor as tt

x = tt.matrix()
y = tt.matrix()
z = x.dimshuffle('x', 0, 1) + y.dimshuffle(0, 1, 'x')
f = theano.function([x, y], outputs=z)
print f(numpy.array([[1, 2, 3], [4, 5, 6]]), numpy.array([[1, 2], [3, 4], [5, 6], [7, 8]]))