Я пытаюсь использовать функцию torch.conv2d из Pytorch, но не могу получить результат, который я понимаю ...
Вот простой пример, где ядро (filt
) имеет тот же размер, что и вход (im
), чтобы объяснить, что я ищу.
import pytorch
filt = torch.rand(3, 3)
im = torch.rand(3, 3)
Я хочу вычислить простую свертку без заполнения ,поэтому результатом должен быть скаляр (т. е. тензор 1x1).
Я пробовал это с conv2d
:
# I have to convert image and kernel to 4 dimensions tensors to use conv2d
im_torch = im.reshape((im_height, filt_height, 1, 1))
filt_torch = filt.reshape((filt_height, im_height, 1, 1))
out = torch.nn.functional.conv2d(im_torch, filt_torch, stride=1, padding=0)
print(out)
Но результат не тот, который я ожидал:
tensor([[[[0.6067]], [[0.3564]], [[0.5397]]],
[[[0.2557]], [[0.0493]], [[0.2562]]],
[[[0.6067]], [[0.3564]], [[0.5397]]]])
Чтобы дать представление о том, что я хотел бы, я хочу воспроизвести поведение scipy convolve2d
:
import scipy.signal
out_scipy = scipy.signal.convolve2d(im.detach().numpy(), filt.detach().numpy(), 'valid')
print(out_scipy)
, которое печатает:
array([[1.195723]], dtype=float32)