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