【问题标题】:theano - use tensordot compute dot product of two tensortheano - 使用 tensordot 计算两个张量的点积
【发布时间】:2016-03-22 16:10:54
【问题描述】:

我想使用 tensordot 来计算两个张量的特定暗度的点积。喜欢:

A 是一个张量,其形状为 (3, 4, 5) B是张量,形状为(3, 5)

我想做一个点,使用 A 的第三个昏暗和 B 的第二个昏暗,并得到一个昏暗为 (3, 4) 的输出

如下:

for i in range(3):
    C[i] = dot(A[i], B[i])

tensordot是怎么做到的?

【问题讨论】:

  • 您似乎想将 B 的第三个轴与 A 的第二个轴相乘,但您似乎不想保留所有组合(即 shape (3, 4 , 3) 和 tensordot 的结果)。所以你可能应该指出你想要结果的对角线。

标签: numpy theano deep-learning


【解决方案1】:

嗯,你想要这个在 numpy 中还是在 Theano 中? 在这种情况下,正如您所说,您希望将 A 的轴 3 与 B 的轴 2 收缩,两者都很简单:

import numpy as np

a = np.arange(3 * 4 * 5).reshape(3, 4, 5).astype('float32')
b = np.arange(3 * 5).reshape(3, 5).astype('float32')

result = a.dot(b.T)

在 Theano 中这样写

import theano.tensor as T

A = T.ftensor3()
B = T.fmatrix()

out = A.dot(B.T)

out.eval({A: a, B: b})

然而,输出的形状是 (3, 4, 3)。由于您似乎想要形状 (3, 4) 的输出,因此 numpy 替代方案使用 einsum,就像这样

einsum_out = np.einsum('ijk, ik -> ij', a, b)

但是,Theano 中不存在 einsum。所以这里的具体情况可以模拟如下

out = (a * b[:, np.newaxis]).sum(2)

也可以用 Theano 编写

out = (A * B.dimshuffle(0, 'x', 1)).sum(2)
out.eval({A: a, B: b})

【讨论】:

    【解决方案2】:

    在这种特定情况下,einsum 可能比tensordot 更容易理解。例如:

    c = np.einsum('ijk,ik->ij', a, b)
    

    我将稍微简化一下解释,以使事情更容易理解。我们有两个输入数组(用逗号分隔),这产生了我们的输出数组(在-> 的右侧)。

    • a 的形状为 3, 4, 5,我们将其称为 ijk
    • b 具有形状 3, 5 (ik)
    • 我们希望输出 c 的形状为 3, 4 (ij)

    看起来有点神奇,对吧?让我们分解一下。

    • 当我们穿过-> 时我们“丢失”的字母是将被求和的轴。这也是dot 正在做的事情。
    • 我们希望输出形状为3, 4,所以我们要消除k
    • 因此,输出c 应该是ij
    • 这意味着我们将b 称为ik。

    作为一个完整的例子:

    import numpy as np
    
    a = np.random.random((3, 4, 5))
    b = np.random.random((3, 5))
    
    # Looping through things
    c1 = []
    for i in range(3):
        c1.append(a[i].dot(b[i]))
    c1 = np.array(c1)
    
    # Using einsum instead
    c2 = np.einsum('ijk,ik->ij', a, b)
    
    assert np.allclose(c1, c2)
    

    您也可以使用tensordot 执行此操作。一旦我有更多时间,我将添加一个示例。 (当然,如果其他人想同时添加一个tensordot 示例作为另一个答案,请随意!)

    【讨论】:

    • 谢谢!期待 tensordot 版本!
    猜你喜欢
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2014-09-08
    • 2017-04-01
    • 2019-11-08
    • 2020-03-21
    相关资源
    最近更新 更多