如何像numpy.einsum一样在theano中使用batch_tensordot
how to use batch_tensordot in theano like numpy.einsum
我有一个形状为 (3, 4, 5) 的张量 3 和另一个形状为 (3, 4, 7, 5) 的张量 4。
在 numpy 中,
result = np.einsum("ijk, ijmk->ijm", tensor3, tensor4)
print result.shape
(3, 4, 7)
但是在theano中,如何实现。
第一步是转置和重塑张量,以便仅保留第一个维度。在那种情况下它很简单,你只需要结合前两个维度:
x = tensor.tensor3()
y = tensor.tensor4()
i, j, m, k = y.shape
x_ = x.reshape((i * j, k))
y_ = y.reshape((i * j, m, k))
然后,您向 batched_tensordot
指定要将 x_
的轴 1 与 y_
的轴 2 求和:
z_ = tensor.batched_tensordot(x_, y_, (1, 2)) # shape (i * j, m)
最后,重塑z_
以获得前两个维度:
z = z_.reshape((i, j, m))
print(z.eval({x: np.zeros((3, 4, 5)), y: np.zeros((3, 4, 7, 5))}).shape)
# (3, 4, 7)
我有一个形状为 (3, 4, 5) 的张量 3 和另一个形状为 (3, 4, 7, 5) 的张量 4。 在 numpy 中,
result = np.einsum("ijk, ijmk->ijm", tensor3, tensor4)
print result.shape
(3, 4, 7)
但是在theano中,如何实现。
第一步是转置和重塑张量,以便仅保留第一个维度。在那种情况下它很简单,你只需要结合前两个维度:
x = tensor.tensor3()
y = tensor.tensor4()
i, j, m, k = y.shape
x_ = x.reshape((i * j, k))
y_ = y.reshape((i * j, m, k))
然后,您向 batched_tensordot
指定要将 x_
的轴 1 与 y_
的轴 2 求和:
z_ = tensor.batched_tensordot(x_, y_, (1, 2)) # shape (i * j, m)
最后,重塑z_
以获得前两个维度:
z = z_.reshape((i, j, m))
print(z.eval({x: np.zeros((3, 4, 5)), y: np.zeros((3, 4, 7, 5))}).shape)
# (3, 4, 7)