Класс ConvTranspose2d
Класс ConvTranspose2d реализует операцию двумерной транспонированной свертки (также известной как дробно-шаговая свертка или деконволюция). Этот слой позволяет увеличивать пространственное разрешение входного тензора, выполняя обратную операцию по отношению к обычной свертке. Слой принимает на вход тензор формы (N, C_in, H, W), где N - размер батча, C_in - количество входных каналов, H и W - высота и ширина, и возвращает тензор формы (N, C_out, H_out, W_out). Основные параметры: in_channels - количество входных каналов, out_channels - количество выходных каналов, kernel_size - размер ядра свертки, stride - шаг свертки, padding - отступы, output_padding - дополнительное заполнение на выходе для согласования размерностей, dilation - расширение ядра, bias - флаг использования смещения.
Синтаксис
torch.nn.ConvTranspose2d(
in_channels,
out_channels,
kernel_size,
stride=1,
padding=0,
output_padding=0,
dilation=1,
bias=True
)
Пример
Давайте создадим слой транспонированной свертки, который увеличит размер входного тензора в два раза:
import torch
import torch.nn as nn
layer = nn.ConvTranspose2d(
in_channels=3,
out_channels=6,
kernel_size=3,
stride=2,
padding=1,
output_padding=1
)
x = torch.randn(1, 3, 4, 4)
res = layer(x)
print(res.shape)
Результат выполнения кода:
torch.Size([1, 6, 8, 8])
Размер выходного тензора увеличился с 4x4 до 8x8 благодаря шагу stride=2.
Пример
Рассмотрим работу слоя с различными параметрами отступов и выходного заполнения для точного контроля размера:
import torch
import torch.nn as nn
torch.manual_seed(0)
layer = nn.ConvTranspose2d(
in_channels=2,
out_channels=2,
kernel_size=3,
stride=2,
padding=0,
output_padding=0
)
x = torch.randn(1, 2, 3, 3)
res = layer(x)
print(res.shape)
print(layer.weight.shape)
Результат выполнения кода:
torch.Size([1, 2, 7, 7])
torch.Size([2, 2, 3, 3])
Выходной размер вычисляется по формуле: H_out = (H_in - 1) * stride - 2 * padding + dilation * (kernel_size - 1) + output_padding + 1.
Пример
Используем транспонированную свертку в составе последовательной модели для увеличения разрешения признакового пространства:
import torch
import torch.nn as nn
model = nn.Sequential(
nn.ConvTranspose2d(3, 16, 4, stride=2, padding=1),
nn.ReLU(),
nn.ConvTranspose2d(16, 8, 4, stride=2, padding=1),
nn.ReLU(),
nn.ConvTranspose2d(8, 3, 3, padding=1)
)
x = torch.randn(1, 3, 8, 8)
res = model(x)
print(res.shape)
Результат выполнения кода:
torch.Size([1, 3, 32, 32])
Модель увеличила разрешение входного изображения с 8x8 до 32x32, что полезно в задачах генерации изображений.
Смотрите также
-
класс
Conv2d,
который выполняет обычную двумерную свертку для понижения размерности -
класс
ConvTranspose1d,
который реализует одномерную транспонированную свертку -
класс
ConvTranspose3d,
который реализует трёхмерную транспонированную свертку -
класс
Upsample,
который выполняет простое увеличение разрешения без обучаемых параметров