Класс ZeroPad2d
Класс ZeroPad2d из модуля torch.nn позволяет добавить нулевые отступы (padding) вокруг двумерных данных, таких как изображения или карты признаков. При инициализации слоя указывается количество пикселей, добавляемых с каждой стороны тензора. Параметр padding может быть задан в виде числа (одинаковое дополнение по всем сторонам), кортежа из двух чисел (дополнение по высоте и ширине соответственно) или кортежа из четырех чисел (отдельные значения для левой, правой, верхней и нижней границ). Слой не имеет обучаемых параметров и работает только во время прямого прохода.
Синтаксис
torch.nn.ZeroPad2d(padding)
Пример
Рассмотрим базовый пример использования слоя с одинаковым дополнением со всех сторон:
import torch
import torch.nn as nn
# Создаем слой с дополнением 2 по всем сторонам
pad = nn.ZeroPad2d(2)
# Входной тензор размером (высота, ширина) = (3, 3)
t = torch.tensor([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]).float()
# Добавляем размерность батча и каналов: (batch, channels, height, width)
t = t.unsqueeze(0).unsqueeze(0)
res = pad(t)
print(res)
Результат выполнения кода:
tensor([[[[0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0.],
[0., 0., 1., 2., 3., 0., 0.],
[0., 0., 4., 5., 6., 0., 0.],
[0., 0., 7., 8., 9., 0., 0.],
[0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0.]]]])
Пример
Дополнение с разными значениями по высоте и ширине (padding=(1, 3)):
import torch
import torch.nn as nn
# Дополнение: 1 по высоте, 3 по ширине
pad = nn.ZeroPad2d((1, 3))
t = torch.tensor([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]).float().unsqueeze(0).unsqueeze(0)
res = pad(t)
print(res.shape)
print(res)
Результат выполнения кода:
torch.Size([1, 1, 5, 9])
tensor([[[[0., 0., 0., 1., 2., 3., 0., 0., 0.],
[0., 0., 0., 4., 5., 6., 0., 0., 0.],
[0., 0., 0., 7., 8., 9., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0.]]]])
Пример
Дополнение с отдельными значениями для каждой стороны (left, right, top, bottom):
import torch
import torch.nn as nn
# padding=(left, right, top, bottom)
pad = nn.ZeroPad2d((1, 2, 3, 1))
t = torch.tensor([
[1, 2],
[3, 4]
]).float().unsqueeze(0).unsqueeze(0)
res = pad(t)
print(res.shape)
print(res)
Результат выполнения кода:
torch.Size([1, 1, 6, 5])
tensor([[[[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 1., 2., 0., 0.],
[0., 3., 4., 0., 0.],
[0., 0., 0., 0., 0.]]]])
Пример
Использование ZeroPad2d в составе последовательной модели:
import torch
import torch.nn as nn
model = nn.Sequential(
nn.ZeroPad2d(1),
nn.Conv2d(1, 3, kernel_size=3)
)
t = torch.randn(1, 1, 5, 5)
res = model(t)
print(res.shape)
Результат выполнения кода:
torch.Size([1, 3, 5, 5])
Смотрите также
-
слой
ConstantPad2d,
который позволяет дополнять тензоры константными значениями вместо нулей -
слой
ReflectionPad2d,
который отражает значения на границах тензора -
слой
ReplicationPad2d,
который копирует крайние значения тензора -
слой
CircularPad2d,
который использует циклическое дополнение