Функция conv2d
Функция conv2d из модуля torch.nn.functional применяет двумерную свертку к входному тензору. Эта операция является ключевой в обработке изображений и анализе пространственных данных. В отличие от слоя nn.Conv2d, функциональная версия не хранит параметры внутри себя, что делает её удобной для динамических вычислений.
Первым параметром функция принимает входной тензор, вторым - тензор весов свертки, третьим - тензор смещения. Также можно указать шаг свертки, отступы, коэффициент расширения и количество групп.
Синтаксис
torch.nn.functional.conv2d(
input,
weight,
bias=None,
stride=1,
padding=0,
dilation=1,
groups=1
)
Пример
Выполним простую свертку одноканального изображения размером 5x5 с ядром 3x3:
import torch
import torch.nn.functional as F
t = torch.tensor([
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 0],
[1, 3, 5, 7, 9],
[2, 4, 6, 8, 0],
[5, 6, 7, 8, 9],
]).float().reshape(1, 1, 5, 5)
w = torch.tensor([
[1, 0, -1],
[1, 0, -1],
[1, 0, -1],
]).float().reshape(1, 1, 3, 3)
res = F.conv2d(t, w)
print(res)
Результат выполнения кода:
tensor([[[[-12., -12., -12.],
[-12., -15., -12.],
[-12., -15., -12.]]]])
Пример
Применим свертку с параметром padding для сохранения пространственной размерности:
import torch
import torch.nn.functional as F
t = torch.tensor([
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 0],
[1, 3, 5, 7, 9],
]).float().reshape(1, 1, 3, 5)
w = torch.tensor([
[1, 0, -1],
[1, 0, -1],
]).float().reshape(1, 1, 2, 3)
res = F.conv2d(t, w, padding=1)
print(res)
Результат выполнения кода:
tensor([[[[ -8., -10., -12., -8., 0.],
[-11., -13., -11., -13., 0.],
[ 6., 1., -7., -9., 0.]]]])
Пример
Используем параметр stride для пропуска пикселей и уменьшения размерности:
import torch
import torch.nn.functional as F
t = torch.tensor([
[1, 2, 3, 4, 5, 6],
[6, 7, 8, 9, 0, 1],
[1, 3, 5, 7, 9, 2],
[2, 4, 6, 8, 0, 3],
[5, 6, 7, 8, 9, 4],
]).float().reshape(1, 1, 5, 6)
w = torch.tensor([
[1, 0, -1],
[1, 0, -1],
]).float().reshape(1, 1, 2, 3)
res = F.conv2d(t, w, stride=2)
print(res)
Результат выполнения кода:
tensor([[[[-14., -16., -12.],
[-14., -18., -12.]]]])
Пример
Применим свертку к многоканальному изображению с несколькими ядрами:
import torch
import torch.nn.functional as F
torch.manual_seed(0)
t = torch.randn(1, 3, 4, 4)
w = torch.randn(2, 3, 2, 2)
b = torch.randn(2)
res = F.conv2d(t, w, b, padding=1)
print(res.shape)
Результат выполнения кода:
torch.Size([1, 2, 4, 4])
Смотрите также
-
функцию
conv1d,
которая выполняет одномерную свертку -
функцию
conv3d,
которая выполняет трехмерную свертку -
функцию
conv_transpose2d,
которая выполняет двумерную транспонированную свертку -
функцию
unfold,
которая извлекает скользящие локальные блоки из тензора