【问题标题】:how to use batch_tensordot in theano like numpy.einsum如何在 theano 中使用 batch_tensordot,如 numpy.einsum
【发布时间】:2017-04-18 22:40:21
【问题描述】:

我有一个形状为 (3, 4, 5) 的 tensor3 和另一个形状为 (3, 4, 7, 5) 的 tensor4。 在 numpy 中,

 result = np.einsum("ijk, ijmk->ijm", tensor3, tensor4)
 print result.shape 
 (3, 4, 7)

但是在 theano 中,该怎么做呢。

【问题讨论】:

    标签: python numpy deep-learning theano numpy-einsum


    【解决方案1】:

    第一步是转置和重塑你的张量,以便只保留第一个维度。在这种情况下,它很简单,您只需将前两个维度结合起来:

    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)
    

    【讨论】:

    • 非常感谢@Pascal Lamblin。你已经解决了我的问题。但我只是想知道为什么我尝试了 tensor.batched_tensordot(x, y, (2, 3)) 并得到了除 (i, j, i, j 之外的形状 (i, j, j, m) , m)???
    • 使用batched_tensordot,第一个轴被保留(联合迭代),所以第一个形状是i。然后,k 被消除(因为它被求和了)。剩余的维度是 x 的 j 和 y 的 (j, m) ,它们被连接起来。所以最后,形状是 (i,) + (j,) + (j, m) 或 (i, j, j, m)。 tensordot(x, y, (2, 3)) (没有批次)会给你 (i, j, i, j, m)
    猜你喜欢
    • 2014-11-21
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    相关资源
    最近更新 更多