Класс CircularPad2d
Класс CircularPad2d предназначен для добавления циклического дополнения к двумерным данным, таким как изображения или карты признаков. В отличие от других видов дополнения, циклическое дополнение копирует значения с противоположных краёв, создавая эффект периодического продолжения данных. Это часто используется в задачах обработки сигналов, спектрального анализа и в некоторых архитектурах нейронных сетей для сохранения периодических свойств данных.
Первым параметром конструктор класса принимает размер дополнения. Это может быть число (одинаковое дополнение по всем четырём сторонам), кортеж из двух чисел (дополнение по высоте и ширине) или кортеж из четырёх чисел (дополнение для каждой стороны: левая, правая, верхняя, нижняя).
Входной тензор должен иметь форму (N, C, H, W), где N - размер батча, C - количество каналов, H и W - высота и ширина.
Синтаксис
torch.nn.CircularPad2d(padding)
Пример
Давайте создадим двумерный тензор и применим к нему циклическое дополнение с одинаковым размером по всем сторонам:
import torch
from torch import nn
t = torch.tensor([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]).float().unsqueeze(0).unsqueeze(0)
pad = nn.CircularPad2d(1)
res = pad(t)
print(res.squeeze())
Результат выполнения кода:
tensor([
[9., 7., 8., 9., 7.],
[3., 1., 2., 3., 1.],
[6., 4., 5., 6., 4.],
[9., 7., 8., 9., 7.],
[3., 1., 2., 3., 1.]
])
Как видно, исходный тензор размером 3x3 был дополнен до 5x5. Значения на краях являются циклическими копиями с противоположных сторон.
Пример
Теперь применим различное дополнение по высоте и ширине:
import torch
from torch import nn
t = torch.tensor([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]).float().unsqueeze(0).unsqueeze(0)
# Дополнение: (padding_height, padding_width)
pad = nn.CircularPad2d((1, 2))
res = pad(t)
print(res.squeeze())
Результат выполнения кода:
tensor([
[11., 12., 9., 10., 11., 12., 9., 10.],
[ 3., 4., 1., 2., 3., 4., 1., 2.],
[ 7., 8., 5., 6., 7., 8., 5., 6.],
[11., 12., 9., 10., 11., 12., 9., 10.],
[ 3., 4., 1., 2., 3., 4., 1., 2.]
])
В этом примере мы добавили дополнение высоты 1 (по одному элементу сверху и снизу) и ширины 2 (по два элемента слева и справа).
Пример
Можно задать разное дополнение для каждой стороны тензора:
import torch
from torch import nn
t = torch.tensor([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]).float().unsqueeze(0).unsqueeze(0)
# (padding_left, padding_right, padding_top, padding_bottom)
pad = nn.CircularPad2d((1, 2, 3, 0))
res = pad(t)
print(res.squeeze())
Результат выполнения кода:
tensor([
[9., 7., 8., 9., 7., 8.],
[3., 1., 2., 3., 1., 2.],
[6., 4., 5., 6., 4., 5.],
[9., 7., 8., 9., 7., 8.],
[3., 1., 2., 3., 1., 2.],
[6., 4., 5., 6., 4., 5.]
])
Здесь мы добавили по 1 элементу слева, 2 справа, 3 сверху и 0 снизу.
Смотрите также
-
класс
ZeroPad2d,
который добавляет нулевое дополнение к данным -
класс
ConstantPad2d,
который добавляет дополнение с постоянным значением -
класс
ReflectionPad2d,
который отражает данные относительно краёв -
класс
ReplicationPad2d,
который повторяет краевые значения