У меня есть 4-мерный тензор карт активации, то есть X
размера (bs, channels, dim, dim)
; например,
import torch
bs = 3
channels = 512
dim = 64
X = torch.rand(bs, channels, dim, dim)
Я хочу вычислить (x, y) -градиенты карт активации (которые грубо рассматриваются как «изображения»). Я думаю, что это можно сделать с помощью двумерной свертки с фиксированными весами. Для x-градиента, например,
import numpy as np
import torch.nn as nn
grad_x_weights = np.array([[1, 0, -1],
[2, 0, -2],
[1, 0, -1]])
conv_x = nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1, bias=False)
conv_x.weight = nn.Parameter(torch.from_numpy(grad_x_weights).float().expand(1, 512, 3,3))
grad_x = conv_x(X)
Это (как и ожидалось) даст результат размером (3, 1, 64, 64)
, но я хотел бы иметь градиент карт активации для каждой карты активации, поэтому что-то размером (3, 512, 64, 64)
таким образом, что grad_x[i, j, :, :]
будет иметь x-градиент j-й карты активации i-го входа.
Наконец, я хотел бы установить grad_x_weights
как необучаемый, чтобы conv_x
всегда вычислял градиенты карт активации.
Спасибо!