Класс ConvTranspose3d
Класс ConvTranspose3d применяет трехмерную транспонированную свертку
к входному тензору. Также этот слой называют деконволюцией или обратной
сверткой. Он используется для увеличения пространственного разрешения
данных, например, в генеративных моделях и сегментации изображений.
Первым параметром передается количество входных каналов, вторым -
количество выходных каналов, третьим - размер ядра свертки.
Синтаксис
torch.nn.ConvTranspose3d(
in_channels,
out_channels,
kernel_size,
stride=1,
padding=0,
output_padding=0,
dilation=1,
groups=1,
bias=True,
padding_mode='zeros',
)
Пример
Давайте создадим слой ConvTranspose3d с одним входным каналом,
одним выходным каналом и ядром размера 3 и применим его к тензору
размером 1x1x1x1x1:
import torch
t = torch.randn(1, 1, 1, 1, 1)
layer = torch.nn.ConvTranspose3d(1, 1, 3)
res = layer(t)
print(res.shape)
Результат выполнения кода:
torch.Size([1, 1, 3, 3, 3])
Выходной тензор имеет размеры: 1 образец, 1 канал и пространственные размеры 3x3x3. Это произошло потому, что ядро размера 3 увеличило пространственные размеры до 3.
Пример
Теперь давайте рассмотрим пример с шагом 2 и выходным дополнением. Создадим слой с ядром 3 и шагом 2, а затем применим его к тензору размера 1x1x2x2x2:
import torch
t = torch.randn(1, 1, 2, 2, 2)
layer = torch.nn.ConvTranspose3d(
in_channels=1,
out_channels=1,
kernel_size=3,
stride=2,
output_padding=1,
)
res = layer(t)
print(res.shape)
Результат выполнения кода:
torch.Size([1, 1, 5, 5, 5])
Выходной размер вычисляется по формуле: (output - 1) * stride - 2 * padding + kernel_size + output_padding. При входном размере 2, шаге 2, ядре 3 и выходном дополнении 1 получается размер 5.
Пример
Рассмотрим пример с несколькими входными и выходными каналами. Создадим слой с 3 входными каналами и 5 выходными каналами, применим его к тензору размером 1x3x4x4x4:
import torch
t = torch.randn(1, 3, 4, 4, 4)
layer = torch.nn.ConvTranspose3d(
in_channels=3,
out_channels=5,
kernel_size=2,
stride=2,
padding=0,
)
res = layer(t)
print(res.shape)
Результат выполнения кода:
torch.Size([1, 5, 8, 8, 8])
Выходной тензор имеет 5 каналов (количество выходных каналов) и увеличенные пространственные размеры с 4 до 8.
Пример
Давайте посмотрим на параметры слоя ConvTranspose3d.
Создадим слой и выведем его веса и смещения:
import torch
layer = torch.nn.ConvTranspose3d(2, 4, 3, bias=True)
print(layer.weight.shape)
print(layer.bias.shape)
Результат выполнения кода:
torch.Size([2, 4, 3, 3, 3])
torch.Size([4])
Вес имеет форму (входные_каналы, выходные_каналы, глубина, высота, ширина), а смещение - это одномерный тензор размером, равным количеству выходных каналов.
Смотрите также
-
класс
Conv3d,
который выполняет обычную трехмерную свертку -
класс
ConvTranspose2d,
который выполняет двумерную транспонированную свертку -
класс
Upsample,
который выполняет апсэмплинг (увеличение разрешения) данных -
класс
PixelShuffle,
который изменяет размерность тензора, переставляя элементы из каналов в пространство