0
我有一个形状(3,4,5)的张量3和另一个形状为(3,4,7,5)的张量4。 在numpy的,如何在theano中使用batch_tensordot,比如numpy.einsum
result = np.einsum("ijk, ijmk->ijm", tensor3, tensor4)
print result.shape
(3, 4, 7)
但在theano,如何做到这一点。
我有一个形状(3,4,5)的张量3和另一个形状为(3,4,7,5)的张量4。 在numpy的,如何在theano中使用batch_tensordot,比如numpy.einsum
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轴2 y_
的:
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)
非常感谢你@帕斯卡尔Lamblin。你已经解决了我的问题。但是我只是想知道为什么我试图tensor.batched_tensordot(x,y,(2,3))并且获得了除(i,j,i,j)之外的形状(i,j,j,m) ,m)??? –
对于batched_tensordot,第一个轴被保存(共同迭代),所以第一个形状是i。然后,k被消除(因为它被求和)。剩下的维数是j代表x,而(j,m)代表y,它们被连接在一起。因此最后形状是(i,)+(j,)+(j,m)或(i,j,j,m)。 (没有批次)将给你(i,j,i,j,m)( tensordot(x,y,(2,3)) –