Класс LazyConv2d
Класс LazyConv2d из модуля torch.nn применяется для выполнения
двумерной свертки (2D convolution) с отложенным определением размерности
входных данных. В отличие от обычного Conv2d, этот слой не требует
явного указания количества входных каналов при инициализации. Первым
параметром передаётся количество выходных каналов, вторым - размер ядра
свертки. Остальные параметры (шаг, дополнение, dilation, groups, bias)
являются необязательными.
Синтаксис
torch.nn.LazyConv2d(out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
Пример
Давайте создадим ленивый сверточный слой и применим его к случайному тензору:
import torch
import torch.nn as nn
torch.manual_seed(0)
# Создаем ленивый слой с 16 выходными каналами и ядром 3x3
layer = nn.LazyConv2d(out_channels=16, kernel_size=3)
# Входной тензор имеет форму [batch, channels, height, width]
x = torch.randn(2, 3, 32, 32)
# При первом проходе определяется размер входных каналов
res = layer(x)
print(res.shape)
Результат выполнения кода:
torch.Size([2, 16, 30, 30])
Пример
Давайте создадим ленивый слой с пользовательскими параметрами:
import torch
import torch.nn as nn
torch.manual_seed(0)
# Слой с шагом 2, дополнением 1 и без смещения
layer = nn.LazyConv2d(
out_channels=8,
kernel_size=5,
stride=2,
padding=1,
bias=False
)
# Входной тензор с 12 каналами
x = torch.randn(1, 12, 64, 64)
res = layer(x)
print(res.shape)
Результат выполнения кода:
torch.Size([1, 8, 31, 31])
Пример
Давайте посмотрим, как меняются веса слоя после инициализации:
import torch
import torch.nn as nn
torch.manual_seed(0)
layer = nn.LazyConv2d(out_channels=4, kernel_size=3)
# До первого прохода веса не определены
print(hasattr(layer, 'weight'))
x = torch.randn(1, 5, 10, 10)
res = layer(x)
# После прохода веса инициализируются
print(hasattr(layer, 'weight'))
print(layer.weight.shape)
Результат выполнения кода:
False
True
torch.Size([4, 5, 3, 3])
Смотрите также
-
класс
Conv2d,
который требует явного указания входных каналов -
класс
LazyLinear,
который реализует ленивый линейный слой -
класс
Conv1d,
который выполняет одномерную свертку -
класс
Conv3d,
который выполняет трехмерную свертку