【问题标题】:How to multiply Tensors in Theano如何在 Theano 中乘以张量
【发布时间】:2016-04-08 11:26:05
【问题描述】:

我在 Theano 中有两个张量和一个权重矩阵。 张量 A 具有维度 (k, 5, 40)。张量 B 具有维度 (k, 5, 40)。权重矩阵 W 具有维度 (40,40)。我想计算 AWB.实现此目的的 Theano 张量操作的正确顺序是什么?请注意,k 在运行期间可能会发生变化,但其他维度是固定的。 我们希望 AWB 的语义如下:

将 A 视为 k (5,40) 个矩阵的集合。称他们为 A_1, ..., A_k 将 B 视为 k (5,40) 个矩阵的集合。称它们为 B_1,...,B_k。 我们想为从 1 到 k 的所有 i 找到 A_{i} * W * B_{i}^{T}。我尝试使用 theano.tensor.dot,但似乎很混乱。

请注意,执行此操作的一种非有效方法是使用扫描功能。但这会使固有的并行代码顺序化。

【问题讨论】:

    标签: theano deep-learning dot-product


    【解决方案1】:

    对不起,我不知道你说的“令人困惑”是什么意思?

    我尝试过使用小案例,希望它能代表您的情况。在三维张量和二维矩阵之间使用theano.tensor.dot的点积:

    import numpy as np
    import theano
    import theano.tensor as T
    
    a = T.tensor3('a', dtype='int64')
    c = T.matrix('c',dtype='int64')
    d = T.dot(a,c)
    
    g = theano.function([a,c],d)
    
    x = np.array([[[1,2],[1,3]],[[2,2],[1,1]]], dtype=int)
    y = np.array([[1,2],[1,3]], dtype=int)
    print g(x,y)
    

    输出:

    [[[ 3  8]
      [ 4 11]]
    
     [[ 4 10]
      [ 2  5]]]
    

    它像你的逻辑一样工作,矩阵c 只在第二维和第三维做点积。

    更新

    上面的第一个代码,您可以在您的情况下用于第一个操作 (A*W)。对不起,我没有仔细计算,当然在那个操作之后输出变成了三维张量。因此,要执行 (AW)*B,您必须使用不同的方法。为了在两个三维张量之间执行乘法,我通常使用扫描:

    import numpy as np
    import theano
    import theano.tensor as T
    
    a = T.tensor3('a', dtype='int64')
    c = T.tensor3('c',dtype='int64')
    d, b = theano.scan(lambda i: T.dot(a[i,:], c[i,:]),sequences=T.arange(2))
    g = theano.function([a,c],d)
    
    x = np.array([[[1,2],[1,3]],[[2,2],[1,1]]], dtype=int)
    y = np.array([[[1,2],[1,3]],[[2,2],[1,1]]], dtype=int)
    print g(x,y)
    

    但是我知道还有另一种使用theano.tensor.batched_dot 的方法(theano.tensor.dot 我认为只适用于二维和一维数组)。在您的情况下,这样编写代码很简单:

    e = T.batched_dot(a,c)
    g = theano.function([a,c],e)
    

    上面的代码给出了相同的结果。希望对您有所帮助。

    【讨论】:

    • 嗨马里奥波罗!我也能做到!问题出现在第二个乘法上。该问题要求进行三向乘法,而不是二乘法。我们需要将 A 和 W 相乘,然后将 (AW) 和 (B) 相乘以得到 (AWB)。这是我没有得到的 AWB 步骤。我们如何从您在 (A*W)*B 的答案中生成的 AW 开始。谢谢!
    • 哦,对不起@Sahil,我计算错了尺寸,我已经更新了我的答案
    • 嗨 Malioboro,在您上面的示例中,我想将 3D 张量与矩阵点积相乘。喜欢c = T.matrix('c'), y = np.array([[1,2], [3,4]])。使用扫描功能循环很好。但是使用 T.batched_dot(a,c) 会给出正确的值,但会出现 ValueError: get_scalar_constant_value detected deterministic IndexError: 这样的错误。你能帮忙吗?
    猜你喜欢
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2018-02-23
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多