【问题标题】:Pytorch tensor dimension multiplicationPytorch 张量维数乘法
【发布时间】:2021-04-05 09:31:51
【问题描述】:

我正在尝试实现 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])

【问题讨论】:

  • 感谢您取消删除此帖子(您现在可以删除新帖子..)。欢迎来到 Stack Overflow John。如果您觉得答案不适合您的问题,您不应该只是删除整个内容来创建完全相同的副本。对于那些花时间回答的人来说,这是相当粗鲁的!如果以下答案不适合您,请编辑您的问题。
  • 我现在尝试编辑它。非常感谢!
  • 你能告诉我从下面使用xy时想要的输出吗(从015的范围)。
  • 我们遍历提取特征的每个特征图(每个通道),并将其乘以计算的 alpha。特征图是索引 1(大小为 512)中的激活张量中包含的数字,因此据我所知,我们应该从算法中获取这些数字,并将它们与 alpha 值上的相应标量相乘。
  • 我开始认为我做错了,而你做对了,但你的代码甚至没有为我编译。我怎样才能让它工作?正如我所说,我有两个张量,x(4 维)和 y(1 维),输出也应该是 4 维。谢谢!

标签: computer-vision pytorch


【解决方案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]]]])

【讨论】:

  • 是的,但如果这是我的输入 (x,y,z,w),如果我没记错的话,应该只乘以 y 维度。
  • 不,所有通道都将乘以 y 张量的 alpha 值。查看结果通道 3[[ 8, 9], [10, 11]] 乘以 3 得到 [[24, 27], [30, 33]]
猜你喜欢
  • 2020-08-26
  • 2021-03-08
  • 2020-04-26
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2017-09-05
相关资源
最近更新 更多