Pytorch张量维数乘法

时间:2020-12-28 16:09:30

标签: computer-vision pytorch

我正在尝试实现 grad-camm 算法:

https://arxiv.org/pdf/1610.02391.pdf

我的论点是:

激活:形状为 torch.Size([1, 512, 14, 14]) 的张量

alpha 值:形状为 torch.Size([512])

的张量

我想将每个对应的 alpha 值中的每个激活(在维度索引 1(大小为 512)中)相乘:例如,如果激活中 512 中的第 i 个索引是 4 并且第 i 个 alpha 值是5,那么我新的第 i 次激活将是 20。

输出的形状应该是 torch.Size([1, 512, 14, 14])

1 个答案:

答案 0 :(得分:1)

假设所需输出的形状为 (1, 512, 14, 14)

您可以通过 torch.einsum 实现这一目标:

torch.einsum('nchw,c->nchw', x, y)

或者使用简单的点积,但您首先需要在 y 上添加几个额外的维度:

x*y[None, :, None, None]

以下是 x.shape = (1, 4, 2, 2)y = (4,) 的示例:

>>> x = torch.arange(16).reshape(1, 4, 2, 2)
tensor([[[[ 0,  1],
          [ 2,  3]],

         [[ 4,  5],
          [ 6,  7]],

         [[ 8,  9],
          [10, 11]],

         [[12, 13],
          [14, 15]]]])

>>> y = torch.arange(1, 5)
tensor([1, 2, 3, 4])

>>> x*y[None, :, None, None]
tensor([[[[ 0,  1],
          [ 2,  3]],

         [[ 8, 10],
          [12, 14]],

         [[24, 27],
          [30, 33]],

         [[48, 52],
          [56, 60]]]])