从2D张量中的每个向量对3D张量中的每个2D矩阵进行运算

时间:2019-07-25 00:11:58

标签: tensorflow tensordot

我有一个2D张量。我想将2D张量和tf.tensordot(vector, matrix, axes=1)中的每个矢量带入3D张量中的矩阵,该3D张量中的索引与矢量在2D张量中的索引相同。

从本质上讲,我希望得到与for循环相同的结果,但是通过执行tensorflow矩阵运算而不是numpy和循环:

tensor2d = np.array([[1.,1.,1.,0.,0.],
                 [1.,1.,0.,0.,0.]],
                np.float32)

tensor3d = np.array([
    [
        [1., 2., 3.],
        [2., 2., 3.],
        [3., 2., 3.],
        [4., 2., 3.],
        [5., 2., 3.],
    ],
    [
        [1., 2., 3.],
        [2., 2., 3.],
        [3., 2., 3.],
        [4., 2., 3.],
        [5., 2., 3.],
    ]
], np.float32)

results = []

for i in range(len(tensor2d)):
    results.append(np.tensordot(tensor2d[i], tensor3d[i], axes=1))

其输出应该是一个看起来像这样的矩阵(尽管类型会有所不同):

[array([6., 6., 9.], dtype=float32), array([3., 4., 6.], dtype=float32)]

1 个答案:

答案 0 :(得分:0)

好吧,自找到的答案归结为使用tf.math.multiply并弄乱了转置,直到结果是所需的形状。如果有人可以在某个时候提出一个更原则性的答案,那将是很好,但是现在,这可行:

result = tf.transpose(tf.math.multiply(tensor2d, tensor3d.transpose([2,0,1])), [1,2,0])