class
LazyConv2d
extends
Conv2dLazyConv2d(out_channels: int, kernel_size: _Size2d, stride: _Size2d = 1, padding: _Size2d | str = 0, dilation: _Size2d = 1, groups: int = 1, bias: bool = True, padding_mode: PaddingMode = 'zeros', device: DeviceLike = None, dtype: DTypeLike = None)A Conv2d that infers in_channels from the first input.
Lazy initialization allows building 2D convolutional networks without
knowing the input channel count in advance. The module registers
weight and bias as None parameters and allocates them on
the first forward call, reading C_in from
x.shape[1].
Parameters
out_channelsintNumber of output channels.
kernel_sizeint or tuple[int, int]Size of the 2D convolving kernel.
strideint or tuple[int, int]= 1Stride of the convolution. Default:
1.paddingint, tuple[int, int], or str= 0Zero-padding or
"same" / "valid" string specifier.
Default: 0.dilationint or tuple[int, int]= 1Spacing between kernel elements. Default:
1.groupsint= 1Number of blocked connections. Default:
1.biasbool= TrueIf
True, a learnable bias is added after materialization.
Default: True.padding_modestr= 'zeros'"zeros", "reflect", "replicate", or "circular".
Default: "zeros".deviceDeviceLike= NoneDevice used when allocating weights. Default:
None.dtypeDTypeLike= NoneData type used when allocating weights. Default:
None.Attributes
weightParameter or NoneNone before materialization; shape
(out_channels, in_channels // groups, K_H, K_W) afterwards.biasParameter or NoneNone before materialization; shape (out_channels,) if
bias=True, else remains None.in_channelsint or NoneNone before the first forward pass; inferred channel count
afterwards.Notes
Input:
— is
inferred automatically.
Output:
—
same formula as Conv2d.
State-dict materialization. Loading a state_dict with a
4-D weight tensor triggers materialization before parameter
copying, enabling round-trip checkpoint compatibility.
Examples
Dynamic channel inference in a feature extractor:
>>> import lucid
>>> import lucid.nn as nn
>>> model = nn.Sequential(
... nn.LazyConv2d(out_channels=64, kernel_size=3, padding=1),
... nn.ReLU(),
... nn.LazyConv2d(out_channels=128, kernel_size=3, padding=1),
... )
>>> x = lucid.zeros(2, 3, 32, 32) # in_channels=3 inferred here
>>> y = model(x)
>>> y.shape
(2, 128, 32, 32)
Verify inferred in_channels after forward:
>>> import lucid
>>> import lucid.nn as nn
>>> lazy = nn.LazyConv2d(out_channels=16, kernel_size=3, padding=1)
>>> _ = lazy(lucid.zeros(1, 8, 16, 16))
>>> print(lazy.in_channels)
8Used by 1
Constructors
1dunder
__init__
→None__init__(out_channels: int, kernel_size: _Size2d, stride: _Size2d = 1, padding: _Size2d | str = 0, dilation: _Size2d = 1, groups: int = 1, bias: bool = True, padding_mode: PaddingMode = 'zeros', device: DeviceLike = None, dtype: DTypeLike = None)Initialise the LazyConv2d module. See the class docstring for parameter semantics.
Instance methods
2Return a string representation of the layer's configuration.