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=3
和 N=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]]))
我有一个形状为 (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=3
和 N=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]]))