| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909 |
- # mypy: allow-untyped-defs
- import math
- from typing import Literal, Optional
- from typing_extensions import deprecated
- import torch
- from torch import Tensor
- from torch._torch_docs import reproducibility_notes
- from torch.nn import functional as F, init
- from torch.nn.common_types import _size_1_t, _size_2_t, _size_3_t
- from torch.nn.parameter import Parameter, UninitializedParameter
- from .lazy import LazyModuleMixin
- from .module import Module
- from .utils import _pair, _reverse_repeat_tuple, _single, _triple
- __all__ = [
- "Conv1d",
- "Conv2d",
- "Conv3d",
- "ConvTranspose1d",
- "ConvTranspose2d",
- "ConvTranspose3d",
- "LazyConv1d",
- "LazyConv2d",
- "LazyConv3d",
- "LazyConvTranspose1d",
- "LazyConvTranspose2d",
- "LazyConvTranspose3d",
- ]
- convolution_notes = {
- "groups_note": r"""* :attr:`groups` controls the connections between inputs and outputs.
- :attr:`in_channels` and :attr:`out_channels` must both be divisible by
- :attr:`groups`. For example,
- * At groups=1, all inputs are convolved to all outputs.
- * At groups=2, the operation becomes equivalent to having two conv
- layers side by side, each seeing half the input channels
- and producing half the output channels, and both subsequently
- concatenated.
- * At groups= :attr:`in_channels`, each input channel is convolved with
- its own set of filters (of size
- :math:`\frac{\text{out\_channels}}{\text{in\_channels}}`).""",
- "depthwise_separable_note": r"""When `groups == in_channels` and `out_channels == K * in_channels`,
- where `K` is a positive integer, this operation is also known as a "depthwise convolution".
- In other words, for an input of size :math:`(N, C_{in}, L_{in})`,
- a depthwise convolution with a depthwise multiplier `K` can be performed with the arguments
- :math:`(C_\text{in}=C_\text{in}, C_\text{out}=C_\text{in} \times \text{K}, ..., \text{groups}=C_\text{in})`.""",
- } # noqa: B950
- class _ConvNd(Module):
- __constants__ = [
- "stride",
- "padding",
- "dilation",
- "groups",
- "padding_mode",
- "output_padding",
- "in_channels",
- "out_channels",
- "kernel_size",
- ]
- __annotations__ = {"bias": Optional[torch.Tensor]}
- def _conv_forward( # type: ignore[empty-body]
- self, input: Tensor, weight: Tensor, bias: Tensor | None
- ) -> Tensor: ...
- in_channels: int
- _reversed_padding_repeated_twice: list[int]
- out_channels: int
- kernel_size: tuple[int, ...]
- stride: tuple[int, ...]
- padding: str | tuple[int, ...]
- dilation: tuple[int, ...]
- transposed: bool
- output_padding: tuple[int, ...]
- groups: int
- padding_mode: Literal["zeros", "reflect", "replicate", "circular"]
- weight: Tensor
- bias: Tensor | None
- def __init__(
- self,
- in_channels: int,
- out_channels: int,
- kernel_size: tuple[int, ...],
- stride: tuple[int, ...],
- padding: str | tuple[int, ...],
- dilation: tuple[int, ...],
- transposed: bool,
- output_padding: tuple[int, ...],
- groups: int,
- bias: bool,
- padding_mode: Literal["zeros", "reflect", "replicate", "circular"],
- device=None,
- dtype=None,
- ) -> None:
- factory_kwargs = {"device": device, "dtype": dtype}
- super().__init__()
- if groups <= 0:
- raise ValueError("groups must be a positive integer")
- if in_channels % groups != 0:
- raise ValueError("in_channels must be divisible by groups")
- if out_channels % groups != 0:
- raise ValueError("out_channels must be divisible by groups")
- valid_padding_strings = {"same", "valid"}
- if isinstance(padding, str):
- if padding not in valid_padding_strings:
- raise ValueError(
- f"Invalid padding string {padding!r}, should be one of {valid_padding_strings}"
- )
- if padding == "same" and any(s != 1 for s in stride):
- raise ValueError(
- "padding='same' is not supported for strided convolutions"
- )
- valid_padding_modes = {"zeros", "reflect", "replicate", "circular"}
- if padding_mode not in valid_padding_modes:
- raise ValueError(
- f"padding_mode must be one of {valid_padding_modes}, but got padding_mode='{padding_mode}'"
- )
- self.in_channels = in_channels
- self.out_channels = out_channels
- self.kernel_size = kernel_size
- self.stride = stride
- self.padding = padding
- self.dilation = dilation
- self.transposed = transposed
- self.output_padding = output_padding
- self.groups = groups
- self.padding_mode = padding_mode
- # `_reversed_padding_repeated_twice` is the padding to be passed to
- # `F.pad` if needed (e.g., for non-zero padding types that are
- # implemented as two ops: padding + conv). `F.pad` accepts paddings in
- # reverse order than the dimension.
- if isinstance(self.padding, str):
- self._reversed_padding_repeated_twice = [0, 0] * len(kernel_size)
- if padding == "same":
- for d, k, i in zip(
- dilation,
- kernel_size,
- range(len(kernel_size) - 1, -1, -1),
- strict=False,
- ):
- total_padding = d * (k - 1)
- left_pad = total_padding // 2
- self._reversed_padding_repeated_twice[2 * i] = left_pad
- self._reversed_padding_repeated_twice[2 * i + 1] = (
- total_padding - left_pad
- )
- else:
- self._reversed_padding_repeated_twice = _reverse_repeat_tuple(
- self.padding, 2
- )
- if transposed:
- self.weight = Parameter(
- torch.empty(
- (in_channels, out_channels // groups, *kernel_size),
- **factory_kwargs,
- )
- )
- else:
- self.weight = Parameter(
- torch.empty(
- (out_channels, in_channels // groups, *kernel_size),
- **factory_kwargs,
- )
- )
- if bias:
- self.bias = Parameter(torch.empty(out_channels, **factory_kwargs))
- else:
- self.register_parameter("bias", None)
- self.reset_parameters()
- def reset_parameters(self) -> None:
- # Setting a=sqrt(5) in kaiming_uniform is the same as initializing with
- # uniform(-1/sqrt(k), 1/sqrt(k)), where k = weight.size(1) * prod(*kernel_size)
- # For more details see: https://github.com/pytorch/pytorch/issues/15314#issuecomment-477448573
- init.kaiming_uniform_(self.weight, a=math.sqrt(5))
- if self.bias is not None:
- fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight)
- if fan_in != 0:
- bound = 1 / math.sqrt(fan_in)
- init.uniform_(self.bias, -bound, bound)
- def extra_repr(self):
- s = "{in_channels}, {out_channels}, kernel_size={kernel_size}, stride={stride}"
- if self.padding != (0,) * len(self.padding):
- s += ", padding={padding}"
- if self.dilation != (1,) * len(self.dilation):
- s += ", dilation={dilation}"
- if self.output_padding != (0,) * len(self.output_padding):
- s += ", output_padding={output_padding}"
- if self.groups != 1:
- s += ", groups={groups}"
- if self.bias is None:
- s += ", bias=False"
- if self.padding_mode != "zeros":
- s += ", padding_mode={padding_mode}"
- return s.format(**self.__dict__)
- def __setstate__(self, state):
- super().__setstate__(state)
- if not hasattr(self, "padding_mode"):
- self.padding_mode = "zeros"
- class Conv1d(_ConvNd):
- __doc__ = (
- r"""Applies a 1D convolution over an input signal composed of several input
- planes.
- In the simplest case, the output value of the layer with input size
- :math:`(N, C_{\text{in}}, L)` and output :math:`(N, C_{\text{out}}, L_{\text{out}})` can be
- precisely described as:
- .. math::
- \text{out}(N_i, C_{\text{out}_j}) = \text{bias}(C_{\text{out}_j}) +
- \sum_{k = 0}^{C_{in} - 1} \text{weight}(C_{\text{out}_j}, k)
- \star \text{input}(N_i, k)
- where :math:`\star` is the valid `cross-correlation`_ operator,
- :math:`N` is a batch size, :math:`C` denotes a number of channels,
- :math:`L` is a length of signal sequence.
- """
- + r"""
- This module supports :ref:`TensorFloat32<tf32_on_ampere>`.
- On certain ROCm devices, when using float16 inputs this module will use :ref:`different precision<fp16_on_mi200>` for backward.
- * :attr:`stride` controls the stride for the cross-correlation, a single
- number or a one-element tuple.
- * :attr:`padding` controls the amount of padding applied to the input. It
- can be either a string {{'valid', 'same'}} or a tuple of ints giving the
- amount of implicit padding applied on both sides.
- """
- """
- * :attr:`dilation` controls the spacing between the kernel points; also
- known as the \u00e0 trous algorithm. It is harder to describe, but this `link`_
- has a nice visualization of what :attr:`dilation` does.
- """
- r"""
- {groups_note}
- Note:
- {depthwise_separable_note}
- Note:
- {cudnn_reproducibility_note}
- Note:
- ``padding='valid'`` is the same as no padding. ``padding='same'`` pads
- the input so the output has the shape as the input. However, this mode
- doesn't support any stride values other than 1.
- Note:
- This module supports complex data types i.e. ``complex32, complex64, complex128``.
- Args:
- in_channels (int): Number of channels in the input image
- out_channels (int): Number of channels produced by the convolution
- kernel_size (int or tuple): Size of the convolving kernel
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int, tuple or str, optional): Padding added to both sides of
- the input. Default: 0
- dilation (int or tuple, optional): Spacing between kernel
- elements. Default: 1
- groups (int, optional): Number of blocked connections from input
- channels to output channels. Default: 1
- bias (bool, optional): If ``True``, adds a learnable bias to the
- output. Default: ``True``
- padding_mode (str, optional): ``'zeros'``, ``'reflect'``,
- ``'replicate'`` or ``'circular'``. Default: ``'zeros'``
- """.format(**reproducibility_notes, **convolution_notes)
- + r"""
- Shape:
- - Input: :math:`(N, C_{in}, L_{in})` or :math:`(C_{in}, L_{in})`
- - Output: :math:`(N, C_{out}, L_{out})` or :math:`(C_{out}, L_{out})`, where
- .. math::
- L_{out} = \left\lfloor\frac{L_{in} + 2 \times \text{padding} - \text{dilation}
- \times (\text{kernel\_size} - 1) - 1}{\text{stride}} + 1\right\rfloor
- Attributes:
- weight (Tensor): the learnable weights of the module of shape
- :math:`(\text{out\_channels},
- \frac{\text{in\_channels}}{\text{groups}}, \text{kernel\_size})`.
- The values of these weights are sampled from
- :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})` where
- :math:`k = \frac{groups}{C_\text{in} * \text{kernel\_size}}`
- bias (Tensor): the learnable bias of the module of shape
- (out_channels). If :attr:`bias` is ``True``, then the values of these weights are
- sampled from :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})` where
- :math:`k = \frac{groups}{C_\text{in} * \text{kernel\_size}}`
- Examples::
- >>> m = nn.Conv1d(16, 33, 3, stride=2)
- >>> input = torch.randn(20, 16, 50)
- >>> output = m(input)
- .. _cross-correlation:
- https://en.wikipedia.org/wiki/Cross-correlation
- .. _link:
- https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md
- """
- )
- def __init__(
- self,
- in_channels: int,
- out_channels: int,
- kernel_size: _size_1_t,
- stride: _size_1_t = 1,
- padding: str | _size_1_t = 0,
- dilation: _size_1_t = 1,
- groups: int = 1,
- bias: bool = True,
- padding_mode: Literal["zeros", "reflect", "replicate", "circular"] = "zeros",
- device=None,
- dtype=None,
- ) -> None:
- factory_kwargs = {"device": device, "dtype": dtype}
- # we create new variables below to make mypy happy since kernel_size has
- # type Union[int, Tuple[int]] and kernel_size_ has type Tuple[int]
- kernel_size_ = _single(kernel_size)
- stride_ = _single(stride)
- padding_ = padding if isinstance(padding, str) else _single(padding)
- dilation_ = _single(dilation)
- super().__init__(
- in_channels,
- out_channels,
- kernel_size_,
- stride_,
- padding_,
- dilation_,
- False,
- _single(0),
- groups,
- bias,
- padding_mode,
- **factory_kwargs,
- )
- def _conv_forward(self, input: Tensor, weight: Tensor, bias: Tensor | None):
- if self.padding_mode != "zeros":
- return F.conv1d(
- F.pad(
- input, self._reversed_padding_repeated_twice, mode=self.padding_mode
- ),
- weight,
- bias,
- self.stride,
- _single(0),
- self.dilation,
- self.groups,
- )
- return F.conv1d(
- input, weight, bias, self.stride, self.padding, self.dilation, self.groups
- )
- def forward(self, input: Tensor) -> Tensor:
- return self._conv_forward(input, self.weight, self.bias)
- class Conv2d(_ConvNd):
- __doc__ = (
- r"""Applies a 2D convolution over an input signal composed of several input
- planes.
- In the simplest case, the output value of the layer with input size
- :math:`(N, C_{\text{in}}, H, W)` and output :math:`(N, C_{\text{out}}, H_{\text{out}}, W_{\text{out}})`
- can be precisely described as:
- .. math::
- \text{out}(N_i, C_{\text{out}_j}) = \text{bias}(C_{\text{out}_j}) +
- \sum_{k = 0}^{C_{\text{in}} - 1} \text{weight}(C_{\text{out}_j}, k) \star \text{input}(N_i, k)
- where :math:`\star` is the valid 2D `cross-correlation`_ operator,
- :math:`N` is a batch size, :math:`C` denotes a number of channels,
- :math:`H` is a height of input planes in pixels, and :math:`W` is
- width in pixels.
- """
- + r"""
- This module supports :ref:`TensorFloat32<tf32_on_ampere>`.
- On certain ROCm devices, when using float16 inputs this module will use :ref:`different precision<fp16_on_mi200>` for backward.
- * :attr:`stride` controls the stride for the cross-correlation, a single
- number or a tuple.
- * :attr:`padding` controls the amount of padding applied to the input. It
- can be either a string {{'valid', 'same'}} or an int / a tuple of ints giving the
- amount of implicit padding applied on both sides.
- """
- """
- * :attr:`dilation` controls the spacing between the kernel points; also
- known as the \u00e0 trous algorithm. It is harder to describe, but this `link`_
- has a nice visualization of what :attr:`dilation` does.
- """
- r"""
- {groups_note}
- The parameters :attr:`kernel_size`, :attr:`stride`, :attr:`padding`, :attr:`dilation` can either be:
- - a single ``int`` -- in which case the same value is used for the height and width dimension
- - a ``tuple`` of two ints -- in which case, the first `int` is used for the height dimension,
- and the second `int` for the width dimension
- Note:
- {depthwise_separable_note}
- Note:
- {cudnn_reproducibility_note}
- Note:
- ``padding='valid'`` is the same as no padding. ``padding='same'`` pads
- the input so the output has the shape as the input. However, this mode
- doesn't support any stride values other than 1.
- Note:
- This module supports complex data types i.e. ``complex32, complex64, complex128``.
- Args:
- in_channels (int): Number of channels in the input image
- out_channels (int): Number of channels produced by the convolution
- kernel_size (int or tuple): Size of the convolving kernel
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int, tuple or str, optional): Padding added to all four sides of
- the input. Default: 0
- dilation (int or tuple, optional): Spacing between kernel elements. Default: 1
- groups (int, optional): Number of blocked connections from input
- channels to output channels. Default: 1
- bias (bool, optional): If ``True``, adds a learnable bias to the
- output. Default: ``True``
- padding_mode (str, optional): ``'zeros'``, ``'reflect'``,
- ``'replicate'`` or ``'circular'``. Default: ``'zeros'``
- """.format(**reproducibility_notes, **convolution_notes)
- + r"""
- Shape:
- - Input: :math:`(N, C_{in}, H_{in}, W_{in})` or :math:`(C_{in}, H_{in}, W_{in})`
- - Output: :math:`(N, C_{out}, H_{out}, W_{out})` or :math:`(C_{out}, H_{out}, W_{out})`, where
- .. math::
- H_{out} = \left\lfloor\frac{H_{in} + 2 \times \text{padding}[0] - \text{dilation}[0]
- \times (\text{kernel\_size}[0] - 1) - 1}{\text{stride}[0]} + 1\right\rfloor
- .. math::
- W_{out} = \left\lfloor\frac{W_{in} + 2 \times \text{padding}[1] - \text{dilation}[1]
- \times (\text{kernel\_size}[1] - 1) - 1}{\text{stride}[1]} + 1\right\rfloor
- Attributes:
- weight (Tensor): the learnable weights of the module of shape
- :math:`(\text{out\_channels}, \frac{\text{in\_channels}}{\text{groups}},`
- :math:`\text{kernel\_size[0]}, \text{kernel\_size[1]})`.
- The values of these weights are sampled from
- :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})` where
- :math:`k = \frac{groups}{C_\text{in} * \prod_{i=0}^{1}\text{kernel\_size}[i]}`
- bias (Tensor): the learnable bias of the module of shape
- (out_channels). If :attr:`bias` is ``True``,
- then the values of these weights are
- sampled from :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})` where
- :math:`k = \frac{groups}{C_\text{in} * \prod_{i=0}^{1}\text{kernel\_size}[i]}`
- Examples:
- >>> # With square kernels and equal stride
- >>> m = nn.Conv2d(16, 33, 3, stride=2)
- >>> # non-square kernels and unequal stride and with padding
- >>> m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2))
- >>> # non-square kernels and unequal stride and with padding and dilation
- >>> m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2), dilation=(3, 1))
- >>> input = torch.randn(20, 16, 50, 100)
- >>> output = m(input)
- .. _cross-correlation:
- https://en.wikipedia.org/wiki/Cross-correlation
- .. _link:
- https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md
- """
- )
- def __init__(
- self,
- in_channels: int,
- out_channels: int,
- kernel_size: _size_2_t,
- stride: _size_2_t = 1,
- padding: str | _size_2_t = 0,
- dilation: _size_2_t = 1,
- groups: int = 1,
- bias: bool = True,
- padding_mode: Literal["zeros", "reflect", "replicate", "circular"] = "zeros",
- device=None,
- dtype=None,
- ) -> None:
- factory_kwargs = {"device": device, "dtype": dtype}
- kernel_size_ = _pair(kernel_size)
- stride_ = _pair(stride)
- padding_ = padding if isinstance(padding, str) else _pair(padding)
- dilation_ = _pair(dilation)
- super().__init__(
- in_channels,
- out_channels,
- kernel_size_,
- stride_,
- padding_,
- dilation_,
- False,
- _pair(0),
- groups,
- bias,
- padding_mode,
- **factory_kwargs,
- )
- def _conv_forward(self, input: Tensor, weight: Tensor, bias: Tensor | None):
- if self.padding_mode != "zeros":
- return F.conv2d(
- F.pad(
- input, self._reversed_padding_repeated_twice, mode=self.padding_mode
- ),
- weight,
- bias,
- self.stride,
- _pair(0),
- self.dilation,
- self.groups,
- )
- return F.conv2d(
- input, weight, bias, self.stride, self.padding, self.dilation, self.groups
- )
- def forward(self, input: Tensor) -> Tensor:
- return self._conv_forward(input, self.weight, self.bias)
- class Conv3d(_ConvNd):
- __doc__ = (
- r"""Applies a 3D convolution over an input signal composed of several input
- planes.
- In the simplest case, the output value of the layer with input size :math:`(N, C_{in}, D, H, W)`
- and output :math:`(N, C_{out}, D_{out}, H_{out}, W_{out})` can be precisely described as:
- .. math::
- out(N_i, C_{out_j}) = bias(C_{out_j}) +
- \sum_{k = 0}^{C_{in} - 1} weight(C_{out_j}, k) \star input(N_i, k)
- where :math:`\star` is the valid 3D `cross-correlation`_ operator
- """
- + r"""
- This module supports :ref:`TensorFloat32<tf32_on_ampere>`.
- On certain ROCm devices, when using float16 inputs this module will use :ref:`different precision<fp16_on_mi200>` for backward.
- * :attr:`stride` controls the stride for the cross-correlation.
- * :attr:`padding` controls the amount of padding applied to the input. It
- can be either a string {{'valid', 'same'}} or a tuple of ints giving the
- amount of implicit padding applied on both sides.
- """
- """
- * :attr:`dilation` controls the spacing between the kernel points; also known as the \u00e0 trous algorithm.
- It is harder to describe, but this `link`_ has a nice visualization of what :attr:`dilation` does.
- """
- r"""
- {groups_note}
- The parameters :attr:`kernel_size`, :attr:`stride`, :attr:`padding`, :attr:`dilation` can either be:
- - a single ``int`` -- in which case the same value is used for the depth, height and width dimension
- - a ``tuple`` of three ints -- in which case, the first `int` is used for the depth dimension,
- the second `int` for the height dimension and the third `int` for the width dimension
- Note:
- {depthwise_separable_note}
- Note:
- {cudnn_reproducibility_note}
- Note:
- ``padding='valid'`` is the same as no padding. ``padding='same'`` pads
- the input so the output has the shape as the input. However, this mode
- doesn't support any stride values other than 1.
- Note:
- This module supports complex data types i.e. ``complex32, complex64, complex128``.
- Args:
- in_channels (int): Number of channels in the input image
- out_channels (int): Number of channels produced by the convolution
- kernel_size (int or tuple): Size of the convolving kernel
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int, tuple or str, optional): Padding added to all six sides of
- the input. Default: 0
- dilation (int or tuple, optional): Spacing between kernel elements. Default: 1
- groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
- bias (bool, optional): If ``True``, adds a learnable bias to the output. Default: ``True``
- padding_mode (str, optional): ``'zeros'``, ``'reflect'``, ``'replicate'`` or ``'circular'``. Default: ``'zeros'``
- """.format(**reproducibility_notes, **convolution_notes)
- + r"""
- Shape:
- - Input: :math:`(N, C_{in}, D_{in}, H_{in}, W_{in})` or :math:`(C_{in}, D_{in}, H_{in}, W_{in})`
- - Output: :math:`(N, C_{out}, D_{out}, H_{out}, W_{out})` or :math:`(C_{out}, D_{out}, H_{out}, W_{out})`,
- where
- .. math::
- D_{out} = \left\lfloor\frac{D_{in} + 2 \times \text{padding}[0] - \text{dilation}[0]
- \times (\text{kernel\_size}[0] - 1) - 1}{\text{stride}[0]} + 1\right\rfloor
- .. math::
- H_{out} = \left\lfloor\frac{H_{in} + 2 \times \text{padding}[1] - \text{dilation}[1]
- \times (\text{kernel\_size}[1] - 1) - 1}{\text{stride}[1]} + 1\right\rfloor
- .. math::
- W_{out} = \left\lfloor\frac{W_{in} + 2 \times \text{padding}[2] - \text{dilation}[2]
- \times (\text{kernel\_size}[2] - 1) - 1}{\text{stride}[2]} + 1\right\rfloor
- Attributes:
- weight (Tensor): the learnable weights of the module of shape
- :math:`(\text{out\_channels}, \frac{\text{in\_channels}}{\text{groups}},`
- :math:`\text{kernel\_size[0]}, \text{kernel\_size[1]}, \text{kernel\_size[2]})`.
- The values of these weights are sampled from
- :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})` where
- :math:`k = \frac{groups}{C_\text{in} * \prod_{i=0}^{2}\text{kernel\_size}[i]}`
- bias (Tensor): the learnable bias of the module of shape (out_channels). If :attr:`bias` is ``True``,
- then the values of these weights are
- sampled from :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})` where
- :math:`k = \frac{groups}{C_\text{in} * \prod_{i=0}^{2}\text{kernel\_size}[i]}`
- Examples::
- >>> # With square kernels and equal stride
- >>> m = nn.Conv3d(16, 33, 3, stride=2)
- >>> # non-square kernels and unequal stride and with padding
- >>> m = nn.Conv3d(16, 33, (3, 5, 2), stride=(2, 1, 1), padding=(4, 2, 0))
- >>> input = torch.randn(20, 16, 10, 50, 100)
- >>> output = m(input)
- .. _cross-correlation:
- https://en.wikipedia.org/wiki/Cross-correlation
- .. _link:
- https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md
- """
- )
- def __init__(
- self,
- in_channels: int,
- out_channels: int,
- kernel_size: _size_3_t,
- stride: _size_3_t = 1,
- padding: str | _size_3_t = 0,
- dilation: _size_3_t = 1,
- groups: int = 1,
- bias: bool = True,
- padding_mode: Literal["zeros", "reflect", "replicate", "circular"] = "zeros",
- device=None,
- dtype=None,
- ) -> None:
- factory_kwargs = {"device": device, "dtype": dtype}
- kernel_size_ = _triple(kernel_size)
- stride_ = _triple(stride)
- padding_ = padding if isinstance(padding, str) else _triple(padding)
- dilation_ = _triple(dilation)
- super().__init__(
- in_channels,
- out_channels,
- kernel_size_,
- stride_,
- padding_,
- dilation_,
- False,
- _triple(0),
- groups,
- bias,
- padding_mode,
- **factory_kwargs,
- )
- def _conv_forward(self, input: Tensor, weight: Tensor, bias: Tensor | None):
- if self.padding_mode != "zeros":
- return F.conv3d(
- F.pad(
- input, self._reversed_padding_repeated_twice, mode=self.padding_mode
- ),
- weight,
- bias,
- self.stride,
- _triple(0),
- self.dilation,
- self.groups,
- )
- return F.conv3d(
- input, weight, bias, self.stride, self.padding, self.dilation, self.groups
- )
- def forward(self, input: Tensor) -> Tensor:
- return self._conv_forward(input, self.weight, self.bias)
- class _ConvTransposeNd(_ConvNd):
- def __init__(
- self,
- in_channels,
- out_channels,
- kernel_size,
- stride,
- padding,
- dilation,
- transposed,
- output_padding,
- groups,
- bias,
- padding_mode,
- device=None,
- dtype=None,
- ) -> None:
- if padding_mode != "zeros":
- raise ValueError(
- f'Only "zeros" padding mode is supported for {self.__class__.__name__}'
- )
- factory_kwargs = {"device": device, "dtype": dtype}
- super().__init__(
- in_channels,
- out_channels,
- kernel_size,
- stride,
- padding,
- dilation,
- transposed,
- output_padding,
- groups,
- bias,
- padding_mode,
- **factory_kwargs,
- )
- # dilation being an optional parameter is for backwards
- # compatibility
- def _output_padding(
- self,
- input: Tensor,
- output_size: list[int] | None,
- stride: list[int],
- padding: list[int],
- kernel_size: list[int],
- num_spatial_dims: int,
- dilation: list[int] | None = None,
- ) -> list[int]:
- if output_size is None:
- ret = _single(self.output_padding) # converting to list if was not already
- else:
- has_batch_dim = input.dim() == num_spatial_dims + 2
- num_non_spatial_dims = 2 if has_batch_dim else 1
- if len(output_size) == num_non_spatial_dims + num_spatial_dims:
- output_size = output_size[num_non_spatial_dims:]
- if len(output_size) != num_spatial_dims:
- raise ValueError(
- f"ConvTranspose{num_spatial_dims}D: for {input.dim()}D input, output_size must have {num_spatial_dims} "
- f"or {num_non_spatial_dims + num_spatial_dims} elements (got {len(output_size)})"
- )
- min_sizes = torch.jit.annotate(list[int], [])
- max_sizes = torch.jit.annotate(list[int], [])
- for d in range(num_spatial_dims):
- dim_size = (
- (input.size(d + num_non_spatial_dims) - 1) * stride[d]
- - 2 * padding[d]
- + (dilation[d] if dilation is not None else 1)
- * (kernel_size[d] - 1)
- + 1
- )
- min_sizes.append(dim_size)
- max_sizes.append(min_sizes[d] + stride[d] - 1)
- for i in range(len(output_size)):
- size = output_size[i]
- min_size = min_sizes[i]
- max_size = max_sizes[i]
- if size < min_size or size > max_size:
- raise ValueError(
- f"requested an output size of {output_size}, but valid sizes range "
- f"from {min_sizes} to {max_sizes} (for an input of {input.size()[2:]})"
- )
- res = torch.jit.annotate(list[int], [])
- for d in range(num_spatial_dims):
- res.append(output_size[d] - min_sizes[d])
- ret = res
- return ret
- class ConvTranspose1d(_ConvTransposeNd):
- __doc__ = (
- r"""Applies a 1D transposed convolution operator over an input image
- composed of several input planes.
- This module can be seen as the gradient of Conv1d with respect to its input.
- It is also known as a fractionally-strided convolution or
- a deconvolution (although it is not an actual deconvolution operation as it does
- not compute a true inverse of convolution). For more information, see the visualizations
- `here`_ and the `Deconvolutional Networks`_ paper.
- This module supports :ref:`TensorFloat32<tf32_on_ampere>`.
- On certain ROCm devices, when using float16 inputs this module will use :ref:`different precision<fp16_on_mi200>` for backward.
- * :attr:`stride` controls the stride for the cross-correlation.
- * :attr:`padding` controls the amount of implicit zero padding on both
- sides for ``dilation * (kernel_size - 1) - padding`` number of points. See note
- below for details.
- * :attr:`output_padding` controls the additional size added to one side
- of the output shape. See note below for details.
- """
- """
- * :attr:`dilation` controls the spacing between the kernel points; also known as the \u00e0 trous algorithm.
- It is harder to describe, but the link `here`_ has a nice visualization of what :attr:`dilation` does.
- """
- r"""
- {groups_note}
- Note:
- The :attr:`padding` argument effectively adds ``dilation * (kernel_size - 1) - padding``
- amount of zero padding to both sizes of the input. This is set so that
- when a :class:`~torch.nn.Conv1d` and a :class:`~torch.nn.ConvTranspose1d`
- are initialized with same parameters, they are inverses of each other in
- regard to the input and output shapes. However, when ``stride > 1``,
- :class:`~torch.nn.Conv1d` maps multiple input shapes to the same output
- shape. :attr:`output_padding` is provided to resolve this ambiguity by
- effectively increasing the calculated output shape on one side. Note
- that :attr:`output_padding` is only used to find output shape, but does
- not actually add zero-padding to output.
- Note:
- In some circumstances when using the CUDA backend with CuDNN, this operator
- may select a nondeterministic algorithm to increase performance. If this is
- undesirable, you can try to make the operation deterministic (potentially at
- a performance cost) by setting ``torch.backends.cudnn.deterministic =
- True``.
- Please see the notes on :doc:`/notes/randomness` for background.
- Args:
- in_channels (int): Number of channels in the input image
- out_channels (int): Number of channels produced by the convolution
- kernel_size (int or tuple): Size of the convolving kernel
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int or tuple, optional): ``dilation * (kernel_size - 1) - padding`` zero-padding
- will be added to both sides of the input. Default: 0
- output_padding (int or tuple, optional): Additional size added to one side
- of the output shape. Default: 0
- groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
- bias (bool, optional): If ``True``, adds a learnable bias to the output. Default: ``True``
- dilation (int or tuple, optional): Spacing between kernel elements. Default: 1
- """.format(**reproducibility_notes, **convolution_notes)
- + r"""
- Shape:
- - Input: :math:`(N, C_{in}, L_{in})` or :math:`(C_{in}, L_{in})`
- - Output: :math:`(N, C_{out}, L_{out})` or :math:`(C_{out}, L_{out})`, where
- .. math::
- L_{out} = (L_{in} - 1) \times \text{stride} - 2 \times \text{padding} + \text{dilation}
- \times (\text{kernel\_size} - 1) + \text{output\_padding} + 1
- Attributes:
- weight (Tensor): the learnable weights of the module of shape
- :math:`(\text{in\_channels}, \frac{\text{out\_channels}}{\text{groups}},`
- :math:`\text{kernel\_size})`.
- The values of these weights are sampled from
- :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})` where
- :math:`k = \frac{groups}{C_\text{out} * \text{kernel\_size}}`
- bias (Tensor): the learnable bias of the module of shape (out_channels).
- If :attr:`bias` is ``True``, then the values of these weights are
- sampled from :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})` where
- :math:`k = \frac{groups}{C_\text{out} * \text{kernel\_size}}`
- Examples::
- >>> # With square kernels and equal stride
- >>> m = nn.ConvTranspose1d(16, 33, 3, stride=2)
- >>> input = torch.randn(20, 16, 50)
- >>> output = m(input)
- >>> # exact output size can be also specified as an argument
- >>> input = torch.randn(1, 16, 12)
- >>> downsample = nn.Conv1d(16, 16, 3, stride=2, padding=1)
- >>> upsample = nn.ConvTranspose1d(16, 16, 3, stride=2, padding=1)
- >>> h = downsample(input)
- >>> h.size()
- torch.Size([1, 16, 6])
- >>> output = upsample(h, output_size=input.size())
- >>> output.size()
- torch.Size([1, 16, 12])
- .. _`here`:
- https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md
- .. _`Deconvolutional Networks`:
- https://www.matthewzeiler.com/mattzeiler/deconvolutionalnetworks.pdf
- """
- )
- def __init__(
- self,
- in_channels: int,
- out_channels: int,
- kernel_size: _size_1_t,
- stride: _size_1_t = 1,
- padding: _size_1_t = 0,
- output_padding: _size_1_t = 0,
- groups: int = 1,
- bias: bool = True,
- dilation: _size_1_t = 1,
- padding_mode: Literal["zeros", "reflect", "replicate", "circular"] = "zeros",
- device=None,
- dtype=None,
- ) -> None:
- factory_kwargs = {"device": device, "dtype": dtype}
- kernel_size = _single(kernel_size)
- stride = _single(stride)
- padding = _single(padding)
- dilation = _single(dilation)
- output_padding = _single(output_padding)
- super().__init__(
- in_channels,
- out_channels,
- kernel_size,
- stride,
- padding,
- dilation,
- True,
- output_padding,
- groups,
- bias,
- padding_mode,
- **factory_kwargs,
- )
- def forward(self, input: Tensor, output_size: list[int] | None = None) -> Tensor:
- if self.padding_mode != "zeros":
- raise ValueError(
- "Only `zeros` padding mode is supported for ConvTranspose1d"
- )
- if not isinstance(self.padding, tuple):
- raise AssertionError("self.padding must be a tuple")
- # One cannot replace List by Tuple or Sequence in "_output_padding" because
- # TorchScript does not support `Sequence[T]` or `Tuple[T, ...]`.
- num_spatial_dims = 1
- output_padding = self._output_padding(
- input,
- output_size,
- self.stride, # type: ignore[arg-type]
- self.padding, # type: ignore[arg-type]
- self.kernel_size, # type: ignore[arg-type]
- num_spatial_dims,
- self.dilation, # type: ignore[arg-type]
- )
- return F.conv_transpose1d(
- input,
- self.weight,
- self.bias,
- self.stride,
- self.padding,
- output_padding,
- self.groups,
- self.dilation,
- )
- class ConvTranspose2d(_ConvTransposeNd):
- __doc__ = (
- r"""Applies a 2D transposed convolution operator over an input image
- composed of several input planes.
- This module can be seen as the gradient of Conv2d with respect to its input.
- It is also known as a fractionally-strided convolution or
- a deconvolution (although it is not an actual deconvolution operation as it does
- not compute a true inverse of convolution). For more information, see the visualizations
- `here`_ and the `Deconvolutional Networks`_ paper.
- This module supports :ref:`TensorFloat32<tf32_on_ampere>`.
- On certain ROCm devices, when using float16 inputs this module will use :ref:`different precision<fp16_on_mi200>` for backward.
- * :attr:`stride` controls the stride for the cross-correlation. When stride > 1, ConvTranspose2d inserts zeros between input
- elements along the spatial dimensions before applying the convolution kernel. This zero-insertion operation is the standard
- behavior of transposed convolutions, which can increase the spatial resolution and is equivalent to a learnable
- upsampling operation.
- * :attr:`padding` controls the amount of implicit zero padding on both
- sides for ``dilation * (kernel_size - 1) - padding`` number of points. See note
- below for details.
- * :attr:`output_padding` controls the additional size added to one side
- of the output shape. See note below for details.
- """
- """
- * :attr:`dilation` controls the spacing between the kernel points; also known as the \u00e0 trous algorithm.
- It is harder to describe, but the link `here`_ has a nice visualization of what :attr:`dilation` does.
- """
- r"""
- {groups_note}
- The parameters :attr:`kernel_size`, :attr:`stride`, :attr:`padding`, :attr:`output_padding`
- can either be:
- - a single ``int`` -- in which case the same value is used for the height and width dimensions
- - a ``tuple`` of two ints -- in which case, the first `int` is used for the height dimension,
- and the second `int` for the width dimension
- Note:
- The :attr:`padding` argument effectively adds ``dilation * (kernel_size - 1) - padding``
- amount of zero padding to both sizes of the input. This is set so that
- when a :class:`~torch.nn.Conv2d` and a :class:`~torch.nn.ConvTranspose2d`
- are initialized with same parameters, they are inverses of each other in
- regard to the input and output shapes. However, when ``stride > 1``,
- :class:`~torch.nn.Conv2d` maps multiple input shapes to the same output
- shape. :attr:`output_padding` is provided to resolve this ambiguity by
- effectively increasing the calculated output shape on one side. Note
- that :attr:`output_padding` is only used to find output shape, but does
- not actually add zero-padding to output.
- Note:
- {cudnn_reproducibility_note}
- Args:
- in_channels (int): Number of channels in the input image
- out_channels (int): Number of channels produced by the convolution
- kernel_size (int or tuple): Size of the convolving kernel
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int or tuple, optional): ``dilation * (kernel_size - 1) - padding`` zero-padding
- will be added to both sides of each dimension in the input. Default: 0
- output_padding (int or tuple, optional): Additional size added to one side
- of each dimension in the output shape. Default: 0
- groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
- bias (bool, optional): If ``True``, adds a learnable bias to the output. Default: ``True``
- dilation (int or tuple, optional): Spacing between kernel elements. Default: 1
- """.format(**reproducibility_notes, **convolution_notes)
- + r"""
- Shape:
- - Input: :math:`(N, C_{in}, H_{in}, W_{in})` or :math:`(C_{in}, H_{in}, W_{in})`
- - Output: :math:`(N, C_{out}, H_{out}, W_{out})` or :math:`(C_{out}, H_{out}, W_{out})`, where
- .. math::
- H_{out} = (H_{in} - 1) \times \text{stride}[0] - 2 \times \text{padding}[0] + \text{dilation}[0]
- \times (\text{kernel\_size}[0] - 1) + \text{output\_padding}[0] + 1
- .. math::
- W_{out} = (W_{in} - 1) \times \text{stride}[1] - 2 \times \text{padding}[1] + \text{dilation}[1]
- \times (\text{kernel\_size}[1] - 1) + \text{output\_padding}[1] + 1
- Attributes:
- weight (Tensor): the learnable weights of the module of shape
- :math:`(\text{in\_channels}, \frac{\text{out\_channels}}{\text{groups}},`
- :math:`\text{kernel\_size[0]}, \text{kernel\_size[1]})`.
- The values of these weights are sampled from
- :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})` where
- :math:`k = \frac{groups}{C_\text{out} * \prod_{i=0}^{1}\text{kernel\_size}[i]}`
- bias (Tensor): the learnable bias of the module of shape (out_channels)
- If :attr:`bias` is ``True``, then the values of these weights are
- sampled from :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})` where
- :math:`k = \frac{groups}{C_\text{out} * \prod_{i=0}^{1}\text{kernel\_size}[i]}`
- Examples::
- >>> # With square kernels and equal stride
- >>> m = nn.ConvTranspose2d(16, 33, 3, stride=2)
- >>> # non-square kernels and unequal stride and with padding
- >>> m = nn.ConvTranspose2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2))
- >>> input = torch.randn(20, 16, 50, 100)
- >>> output = m(input)
- >>> # exact output size can be also specified as an argument
- >>> input = torch.randn(1, 16, 12, 12)
- >>> downsample = nn.Conv2d(16, 16, 3, stride=2, padding=1)
- >>> upsample = nn.ConvTranspose2d(16, 16, 3, stride=2, padding=1)
- >>> h = downsample(input)
- >>> h.size()
- torch.Size([1, 16, 6, 6])
- >>> output = upsample(h, output_size=input.size())
- >>> output.size()
- torch.Size([1, 16, 12, 12])
- .. _`here`:
- https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md
- .. _`Deconvolutional Networks`:
- https://www.matthewzeiler.com/mattzeiler/deconvolutionalnetworks.pdf
- """
- )
- def __init__(
- self,
- in_channels: int,
- out_channels: int,
- kernel_size: _size_2_t,
- stride: _size_2_t = 1,
- padding: _size_2_t = 0,
- output_padding: _size_2_t = 0,
- groups: int = 1,
- bias: bool = True,
- dilation: _size_2_t = 1,
- padding_mode: Literal["zeros", "reflect", "replicate", "circular"] = "zeros",
- device=None,
- dtype=None,
- ) -> None:
- factory_kwargs = {"device": device, "dtype": dtype}
- kernel_size = _pair(kernel_size)
- stride = _pair(stride)
- padding = _pair(padding)
- dilation = _pair(dilation)
- output_padding = _pair(output_padding)
- super().__init__(
- in_channels,
- out_channels,
- kernel_size,
- stride,
- padding,
- dilation,
- True,
- output_padding,
- groups,
- bias,
- padding_mode,
- **factory_kwargs,
- )
- def forward(self, input: Tensor, output_size: list[int] | None = None) -> Tensor:
- """
- Performs the forward pass.
- Attributes:
- input (Tensor): The input tensor.
- output_size (list[int], optional): A list of integers representing
- the size of the output tensor. Default is None.
- """
- if self.padding_mode != "zeros":
- raise ValueError(
- "Only `zeros` padding mode is supported for ConvTranspose2d"
- )
- if not isinstance(self.padding, tuple):
- raise AssertionError("self.padding must be a tuple")
- # One cannot replace List by Tuple or Sequence in "_output_padding" because
- # TorchScript does not support `Sequence[T]` or `Tuple[T, ...]`.
- num_spatial_dims = 2
- output_padding = self._output_padding(
- input,
- output_size,
- self.stride, # type: ignore[arg-type]
- self.padding, # type: ignore[arg-type]
- self.kernel_size, # type: ignore[arg-type]
- num_spatial_dims,
- self.dilation, # type: ignore[arg-type]
- )
- return F.conv_transpose2d(
- input,
- self.weight,
- self.bias,
- self.stride,
- self.padding,
- output_padding,
- self.groups,
- self.dilation,
- )
- class ConvTranspose3d(_ConvTransposeNd):
- __doc__ = (
- r"""Applies a 3D transposed convolution operator over an input image composed of several input
- planes.
- The transposed convolution operator multiplies each input value element-wise by a learnable kernel,
- and sums over the outputs from all input feature planes.
- This module can be seen as the gradient of Conv3d with respect to its input.
- It is also known as a fractionally-strided convolution or
- a deconvolution (although it is not an actual deconvolution operation as it does
- not compute a true inverse of convolution). For more information, see the visualizations
- `here`_ and the `Deconvolutional Networks`_ paper.
- This module supports :ref:`TensorFloat32<tf32_on_ampere>`.
- On certain ROCm devices, when using float16 inputs this module will use :ref:`different precision<fp16_on_mi200>` for backward.
- * :attr:`stride` controls the stride for the cross-correlation.
- * :attr:`padding` controls the amount of implicit zero padding on both
- sides for ``dilation * (kernel_size - 1) - padding`` number of points. See note
- below for details.
- * :attr:`output_padding` controls the additional size added to one side
- of the output shape. See note below for details.
- """
- """
- * :attr:`dilation` controls the spacing between the kernel points; also known as the \u00e0 trous algorithm.
- It is harder to describe, but the link `here`_ has a nice visualization of what :attr:`dilation` does.
- """
- r"""
- {groups_note}
- The parameters :attr:`kernel_size`, :attr:`stride`, :attr:`padding`, :attr:`output_padding`
- can either be:
- - a single ``int`` -- in which case the same value is used for the depth, height and width dimensions
- - a ``tuple`` of three ints -- in which case, the first `int` is used for the depth dimension,
- the second `int` for the height dimension and the third `int` for the width dimension
- Note:
- The :attr:`padding` argument effectively adds ``dilation * (kernel_size - 1) - padding``
- amount of zero padding to both sizes of the input. This is set so that
- when a :class:`~torch.nn.Conv3d` and a :class:`~torch.nn.ConvTranspose3d`
- are initialized with same parameters, they are inverses of each other in
- regard to the input and output shapes. However, when ``stride > 1``,
- :class:`~torch.nn.Conv3d` maps multiple input shapes to the same output
- shape. :attr:`output_padding` is provided to resolve this ambiguity by
- effectively increasing the calculated output shape on one side. Note
- that :attr:`output_padding` is only used to find output shape, but does
- not actually add zero-padding to output.
- Note:
- {cudnn_reproducibility_note}
- Args:
- in_channels (int): Number of channels in the input image
- out_channels (int): Number of channels produced by the convolution
- kernel_size (int or tuple): Size of the convolving kernel
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int or tuple, optional): ``dilation * (kernel_size - 1) - padding`` zero-padding
- will be added to both sides of each dimension in the input. Default: 0
- output_padding (int or tuple, optional): Additional size added to one side
- of each dimension in the output shape. Default: 0
- groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
- bias (bool, optional): If ``True``, adds a learnable bias to the output. Default: ``True``
- dilation (int or tuple, optional): Spacing between kernel elements. Default: 1
- """.format(**reproducibility_notes, **convolution_notes)
- + r"""
- Shape:
- - Input: :math:`(N, C_{in}, D_{in}, H_{in}, W_{in})` or :math:`(C_{in}, D_{in}, H_{in}, W_{in})`
- - Output: :math:`(N, C_{out}, D_{out}, H_{out}, W_{out})` or
- :math:`(C_{out}, D_{out}, H_{out}, W_{out})`, where
- .. math::
- D_{out} = (D_{in} - 1) \times \text{stride}[0] - 2 \times \text{padding}[0] + \text{dilation}[0]
- \times (\text{kernel\_size}[0] - 1) + \text{output\_padding}[0] + 1
- .. math::
- H_{out} = (H_{in} - 1) \times \text{stride}[1] - 2 \times \text{padding}[1] + \text{dilation}[1]
- \times (\text{kernel\_size}[1] - 1) + \text{output\_padding}[1] + 1
- .. math::
- W_{out} = (W_{in} - 1) \times \text{stride}[2] - 2 \times \text{padding}[2] + \text{dilation}[2]
- \times (\text{kernel\_size}[2] - 1) + \text{output\_padding}[2] + 1
- Attributes:
- weight (Tensor): the learnable weights of the module of shape
- :math:`(\text{in\_channels}, \frac{\text{out\_channels}}{\text{groups}},`
- :math:`\text{kernel\_size[0]}, \text{kernel\_size[1]}, \text{kernel\_size[2]})`.
- The values of these weights are sampled from
- :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})` where
- :math:`k = \frac{groups}{C_\text{out} * \prod_{i=0}^{2}\text{kernel\_size}[i]}`
- bias (Tensor): the learnable bias of the module of shape (out_channels)
- If :attr:`bias` is ``True``, then the values of these weights are
- sampled from :math:`\mathcal{U}(-\sqrt{k}, \sqrt{k})` where
- :math:`k = \frac{groups}{C_\text{out} * \prod_{i=0}^{2}\text{kernel\_size}[i]}`
- Examples::
- >>> # With square kernels and equal stride
- >>> m = nn.ConvTranspose3d(16, 33, 3, stride=2)
- >>> # non-square kernels and unequal stride and with padding
- >>> m = nn.ConvTranspose3d(16, 33, (3, 5, 2), stride=(2, 1, 1), padding=(0, 4, 2))
- >>> input = torch.randn(20, 16, 10, 50, 100)
- >>> output = m(input)
- .. _`here`:
- https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md
- .. _`Deconvolutional Networks`:
- https://www.matthewzeiler.com/mattzeiler/deconvolutionalnetworks.pdf
- """
- )
- def __init__(
- self,
- in_channels: int,
- out_channels: int,
- kernel_size: _size_3_t,
- stride: _size_3_t = 1,
- padding: _size_3_t = 0,
- output_padding: _size_3_t = 0,
- groups: int = 1,
- bias: bool = True,
- dilation: _size_3_t = 1,
- padding_mode: Literal["zeros", "reflect", "replicate", "circular"] = "zeros",
- device=None,
- dtype=None,
- ) -> None:
- factory_kwargs = {"device": device, "dtype": dtype}
- kernel_size = _triple(kernel_size)
- stride = _triple(stride)
- padding = _triple(padding)
- dilation = _triple(dilation)
- output_padding = _triple(output_padding)
- super().__init__(
- in_channels,
- out_channels,
- kernel_size,
- stride,
- padding,
- dilation,
- True,
- output_padding,
- groups,
- bias,
- padding_mode,
- **factory_kwargs,
- )
- def forward(self, input: Tensor, output_size: list[int] | None = None) -> Tensor:
- if self.padding_mode != "zeros":
- raise ValueError(
- "Only `zeros` padding mode is supported for ConvTranspose3d"
- )
- if not isinstance(self.padding, tuple):
- raise AssertionError("self.padding must be a tuple")
- # One cannot replace List by Tuple or Sequence in "_output_padding" because
- # TorchScript does not support `Sequence[T]` or `Tuple[T, ...]`.
- num_spatial_dims = 3
- output_padding = self._output_padding(
- input,
- output_size,
- self.stride, # type: ignore[arg-type]
- self.padding, # type: ignore[arg-type]
- self.kernel_size, # type: ignore[arg-type]
- num_spatial_dims,
- self.dilation, # type: ignore[arg-type]
- )
- return F.conv_transpose3d(
- input,
- self.weight,
- self.bias,
- self.stride,
- self.padding,
- output_padding,
- self.groups,
- self.dilation,
- )
- # TODO: Deprecate and remove the following alias `_ConvTransposeMixin`.
- #
- # `_ConvTransposeMixin` was a mixin that was removed. It is meant to be used
- # with `_ConvNd` to construct actual module classes that implements conv
- # transpose ops:
- #
- # class MyConvTranspose(_ConvNd, _ConvTransposeMixin):
- # ...
- #
- # In PyTorch, it has been replaced by `_ConvTransposeNd`, which is a proper
- # subclass of `_ConvNd`. However, some user code in the wild still (incorrectly)
- # use the internal class `_ConvTransposeMixin`. Hence, we provide this alias
- # for BC, because it is cheap and easy for us to do so, even though that
- # `_ConvTransposeNd` is really not a mixin anymore (but multiple inheritance as
- # above would still work).
- class _ConvTransposeMixin(_ConvTransposeNd):
- @deprecated(
- "`_ConvTransposeMixin` is a deprecated internal class. "
- "Please consider using public APIs.",
- category=FutureWarning,
- )
- def __init__(self, *args, **kwargs) -> None:
- super().__init__(*args, **kwargs)
- # TODO: Conv2dLocal
- # TODO: Conv2dMap
- # TODO: ConvTranspose2dMap
- class _LazyConvXdMixin(LazyModuleMixin):
- groups: int
- transposed: bool
- in_channels: int
- out_channels: int
- kernel_size: tuple[int, ...]
- weight: UninitializedParameter
- bias: UninitializedParameter
- def reset_parameters(self) -> None:
- # has_uninitialized_params is defined in parent class and it is using a protocol on self
- if not self.has_uninitialized_params() and self.in_channels != 0: # type: ignore[misc]
- # "type:ignore[..]" is required because mypy thinks that "reset_parameters" is undefined
- # in super class. Turns out that it is defined in _ConvND which is inherited by any class
- # that also inherits _LazyConvXdMixin
- super().reset_parameters() # type: ignore[misc]
- # Signature of "initialize_parameters" is incompatible with the definition in supertype LazyModuleMixin
- def initialize_parameters(self, input: Tensor, *args, **kwargs) -> None: # type: ignore[override]
- # defined by parent class but using a protocol
- if self.has_uninitialized_params(): # type: ignore[misc]
- self.in_channels = self._get_in_channels(input)
- if self.in_channels % self.groups != 0:
- raise ValueError("in_channels must be divisible by groups")
- if not isinstance(self.weight, UninitializedParameter):
- raise AssertionError("self.weight must be an UninitializedParameter")
- if self.transposed:
- self.weight.materialize(
- (
- self.in_channels,
- self.out_channels // self.groups,
- *self.kernel_size,
- )
- )
- else:
- self.weight.materialize(
- (
- self.out_channels,
- self.in_channels // self.groups,
- *self.kernel_size,
- )
- )
- if self.bias is not None:
- if not isinstance(self.bias, UninitializedParameter):
- raise AssertionError("self.bias must be an UninitializedParameter")
- self.bias.materialize((self.out_channels,))
- self.reset_parameters()
- # Function to extract in_channels from first input.
- def _get_in_channels(self, input: Tensor) -> int:
- num_spatial_dims = self._get_num_spatial_dims()
- num_dims_no_batch = num_spatial_dims + 1 # +1 for channels dim
- num_dims_batch = num_dims_no_batch + 1
- if input.dim() not in (num_dims_no_batch, num_dims_batch):
- raise RuntimeError(
- f"Expected {num_dims_no_batch}D (unbatched) or {num_dims_batch}D (batched) input "
- f"to {self.__class__.__name__}, but "
- f"got input of size: {input.shape}"
- )
- return input.shape[1] if input.dim() == num_dims_batch else input.shape[0]
- # Function to return the number of spatial dims expected for inputs to the module.
- # This is expected to be implemented by subclasses.
- def _get_num_spatial_dims(self) -> int:
- raise NotImplementedError
- # LazyConv1d defines weight as a Tensor but derived class defines it as UninitializeParameter
- class LazyConv1d(_LazyConvXdMixin, Conv1d): # type: ignore[misc]
- r"""A :class:`torch.nn.Conv1d` module with lazy initialization of the ``in_channels`` argument.
- The ``in_channels`` argument of the :class:`Conv1d` is inferred from the ``input.size(1)``.
- The attributes that will be lazily initialized are `weight` and `bias`.
- Check the :class:`torch.nn.modules.lazy.LazyModuleMixin` for further documentation
- on lazy modules and their limitations.
- Args:
- out_channels (int): Number of channels produced by the convolution
- kernel_size (int or tuple): Size of the convolving kernel
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int or tuple, optional): Zero-padding added to both sides of
- the input. Default: 0
- dilation (int or tuple, optional): Spacing between kernel
- elements. Default: 1
- groups (int, optional): Number of blocked connections from input
- channels to output channels. Default: 1
- bias (bool, optional): If ``True``, adds a learnable bias to the
- output. Default: ``True``
- padding_mode (str, optional): ``'zeros'``, ``'reflect'``,
- ``'replicate'`` or ``'circular'``. Default: ``'zeros'``
- .. seealso:: :class:`torch.nn.Conv1d` and :class:`torch.nn.modules.lazy.LazyModuleMixin`
- """
- # super class define this variable as None. "type: ignore[..] is required
- # since we are redefining the variable.
- cls_to_become = Conv1d # type: ignore[assignment]
- def __init__(
- self,
- out_channels: int,
- kernel_size: _size_1_t,
- stride: _size_1_t = 1,
- padding: _size_1_t = 0,
- dilation: _size_1_t = 1,
- groups: int = 1,
- bias: bool = True,
- padding_mode: Literal["zeros", "reflect", "replicate", "circular"] = "zeros",
- device=None,
- dtype=None,
- ) -> None:
- factory_kwargs = {"device": device, "dtype": dtype}
- # pyrefly: ignore [bad-argument-type]
- super().__init__(
- 0,
- 0,
- kernel_size,
- stride,
- padding,
- dilation,
- groups,
- # bias is hardcoded to False to avoid creating tensor
- # that will soon be overwritten.
- False,
- padding_mode,
- **factory_kwargs,
- )
- # pyrefly: ignore [bad-argument-type, bad-override, unexpected-keyword]
- self.weight = UninitializedParameter(**factory_kwargs)
- self.out_channels = out_channels
- if bias:
- # pyrefly: ignore [bad-argument-type, bad-override, unexpected-keyword]
- self.bias = UninitializedParameter(**factory_kwargs)
- def _get_num_spatial_dims(self) -> int:
- return 1
- # LazyConv2d defines weight as a Tensor but derived class defines it as UninitializeParameter
- class LazyConv2d(_LazyConvXdMixin, Conv2d): # type: ignore[misc]
- r"""A :class:`torch.nn.Conv2d` module with lazy initialization of the ``in_channels`` argument.
- The ``in_channels`` argument of the :class:`Conv2d` that is inferred from the ``input.size(1)``.
- The attributes that will be lazily initialized are `weight` and `bias`.
- Check the :class:`torch.nn.modules.lazy.LazyModuleMixin` for further documentation
- on lazy modules and their limitations.
- Args:
- out_channels (int): Number of channels produced by the convolution
- kernel_size (int or tuple): Size of the convolving kernel
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int or tuple, optional): Zero-padding added to both sides of
- the input. Default: 0
- dilation (int or tuple, optional): Spacing between kernel
- elements. Default: 1
- groups (int, optional): Number of blocked connections from input
- channels to output channels. Default: 1
- bias (bool, optional): If ``True``, adds a learnable bias to the
- output. Default: ``True``
- padding_mode (str, optional): ``'zeros'``, ``'reflect'``,
- ``'replicate'`` or ``'circular'``. Default: ``'zeros'``
- .. seealso:: :class:`torch.nn.Conv2d` and :class:`torch.nn.modules.lazy.LazyModuleMixin`
- """
- # super class define this variable as None. "type: ignore[..] is required
- # since we are redefining the variable.
- cls_to_become = Conv2d # type: ignore[assignment]
- def __init__(
- self,
- out_channels: int,
- kernel_size: _size_2_t,
- stride: _size_2_t = 1,
- padding: _size_2_t = 0,
- dilation: _size_2_t = 1,
- groups: int = 1,
- bias: bool = True,
- padding_mode: Literal["zeros", "reflect", "replicate", "circular"] = "zeros",
- device=None,
- dtype=None,
- ) -> None:
- factory_kwargs = {"device": device, "dtype": dtype}
- # pyrefly: ignore [bad-argument-type]
- super().__init__(
- 0,
- 0,
- kernel_size,
- stride,
- padding,
- dilation,
- groups,
- # bias is hardcoded to False to avoid creating tensor
- # that will soon be overwritten.
- False,
- padding_mode,
- **factory_kwargs,
- )
- # pyrefly: ignore [bad-argument-type, bad-override, unexpected-keyword]
- self.weight = UninitializedParameter(**factory_kwargs)
- self.out_channels = out_channels
- if bias:
- # pyrefly: ignore [bad-argument-type, bad-override, unexpected-keyword]
- self.bias = UninitializedParameter(**factory_kwargs)
- def _get_num_spatial_dims(self) -> int:
- return 2
- # LazyConv3d defines weight as a Tensor but derived class defines it as UninitializeParameter
- class LazyConv3d(_LazyConvXdMixin, Conv3d): # type: ignore[misc]
- r"""A :class:`torch.nn.Conv3d` module with lazy initialization of the ``in_channels`` argument.
- The ``in_channels`` argument of the :class:`Conv3d` that is inferred from
- the ``input.size(1)``.
- The attributes that will be lazily initialized are `weight` and `bias`.
- Check the :class:`torch.nn.modules.lazy.LazyModuleMixin` for further documentation
- on lazy modules and their limitations.
- Args:
- out_channels (int): Number of channels produced by the convolution
- kernel_size (int or tuple): Size of the convolving kernel
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int or tuple, optional): Zero-padding added to both sides of
- the input. Default: 0
- dilation (int or tuple, optional): Spacing between kernel
- elements. Default: 1
- groups (int, optional): Number of blocked connections from input
- channels to output channels. Default: 1
- bias (bool, optional): If ``True``, adds a learnable bias to the
- output. Default: ``True``
- padding_mode (str, optional): ``'zeros'``, ``'reflect'``,
- ``'replicate'`` or ``'circular'``. Default: ``'zeros'``
- .. seealso:: :class:`torch.nn.Conv3d` and :class:`torch.nn.modules.lazy.LazyModuleMixin`
- """
- # super class define this variable as None. "type: ignore[..] is required
- # since we are redefining the variable.
- cls_to_become = Conv3d # type: ignore[assignment]
- def __init__(
- self,
- out_channels: int,
- kernel_size: _size_3_t,
- stride: _size_3_t = 1,
- padding: _size_3_t = 0,
- dilation: _size_3_t = 1,
- groups: int = 1,
- bias: bool = True,
- padding_mode: Literal["zeros", "reflect", "replicate", "circular"] = "zeros",
- device=None,
- dtype=None,
- ) -> None:
- factory_kwargs = {"device": device, "dtype": dtype}
- # pyrefly: ignore [bad-argument-type]
- super().__init__(
- 0,
- 0,
- kernel_size,
- stride,
- padding,
- dilation,
- groups,
- # bias is hardcoded to False to avoid creating tensor
- # that will soon be overwritten.
- False,
- padding_mode,
- **factory_kwargs,
- )
- # pyrefly: ignore [bad-argument-type, bad-override, unexpected-keyword]
- self.weight = UninitializedParameter(**factory_kwargs)
- self.out_channels = out_channels
- if bias:
- # pyrefly: ignore [bad-argument-type, bad-override, unexpected-keyword]
- self.bias = UninitializedParameter(**factory_kwargs)
- def _get_num_spatial_dims(self) -> int:
- return 3
- # LazyConvTranspose1d defines weight as a Tensor but derived class defines it as UninitializeParameter
- class LazyConvTranspose1d(_LazyConvXdMixin, ConvTranspose1d): # type: ignore[misc]
- r"""A :class:`torch.nn.ConvTranspose1d` module with lazy initialization of the ``in_channels`` argument.
- The ``in_channels`` argument of the :class:`ConvTranspose1d` that is inferred from
- the ``input.size(1)``.
- The attributes that will be lazily initialized are `weight` and `bias`.
- Check the :class:`torch.nn.modules.lazy.LazyModuleMixin` for further documentation
- on lazy modules and their limitations.
- Args:
- out_channels (int): Number of channels produced by the convolution
- kernel_size (int or tuple): Size of the convolving kernel
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int or tuple, optional): ``dilation * (kernel_size - 1) - padding`` zero-padding
- will be added to both sides of the input. Default: 0
- output_padding (int or tuple, optional): Additional size added to one side
- of the output shape. Default: 0
- groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
- bias (bool, optional): If ``True``, adds a learnable bias to the output. Default: ``True``
- dilation (int or tuple, optional): Spacing between kernel elements. Default: 1
- .. seealso:: :class:`torch.nn.ConvTranspose1d` and :class:`torch.nn.modules.lazy.LazyModuleMixin`
- """
- # super class define this variable as None. "type: ignore[..] is required
- # since we are redefining the variable.
- cls_to_become = ConvTranspose1d # type: ignore[assignment]
- def __init__(
- self,
- out_channels: int,
- kernel_size: _size_1_t,
- stride: _size_1_t = 1,
- padding: _size_1_t = 0,
- output_padding: _size_1_t = 0,
- groups: int = 1,
- bias: bool = True,
- dilation: _size_1_t = 1,
- padding_mode: Literal["zeros", "reflect", "replicate", "circular"] = "zeros",
- device=None,
- dtype=None,
- ) -> None:
- factory_kwargs = {"device": device, "dtype": dtype}
- # pyrefly: ignore [bad-argument-type]
- super().__init__(
- 0,
- 0,
- kernel_size,
- stride,
- padding,
- output_padding,
- groups,
- # bias is hardcoded to False to avoid creating tensor
- # that will soon be overwritten.
- False,
- dilation,
- padding_mode,
- **factory_kwargs,
- )
- # pyrefly: ignore [bad-argument-type, bad-override, unexpected-keyword]
- self.weight = UninitializedParameter(**factory_kwargs)
- self.out_channels = out_channels
- if bias:
- # pyrefly: ignore [bad-argument-type, bad-override, unexpected-keyword]
- self.bias = UninitializedParameter(**factory_kwargs)
- def _get_num_spatial_dims(self) -> int:
- return 1
- # LazyConvTranspose2d defines weight as a Tensor but derived class defines it as UninitializeParameter
- class LazyConvTranspose2d(_LazyConvXdMixin, ConvTranspose2d): # type: ignore[misc]
- r"""A :class:`torch.nn.ConvTranspose2d` module with lazy initialization of the ``in_channels`` argument.
- The ``in_channels`` argument of the :class:`ConvTranspose2d` is inferred from
- the ``input.size(1)``.
- The attributes that will be lazily initialized are `weight` and `bias`.
- Check the :class:`torch.nn.modules.lazy.LazyModuleMixin` for further documentation
- on lazy modules and their limitations.
- Args:
- out_channels (int): Number of channels produced by the convolution
- kernel_size (int or tuple): Size of the convolving kernel
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int or tuple, optional): ``dilation * (kernel_size - 1) - padding`` zero-padding
- will be added to both sides of each dimension in the input. Default: 0
- output_padding (int or tuple, optional): Additional size added to one side
- of each dimension in the output shape. Default: 0
- groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
- bias (bool, optional): If ``True``, adds a learnable bias to the output. Default: ``True``
- dilation (int or tuple, optional): Spacing between kernel elements. Default: 1
- .. seealso:: :class:`torch.nn.ConvTranspose2d` and :class:`torch.nn.modules.lazy.LazyModuleMixin`
- """
- # super class define this variable as None. "type: ignore[..] is required
- # since we are redefining the variable.
- cls_to_become = ConvTranspose2d # type: ignore[assignment]
- def __init__(
- self,
- out_channels: int,
- kernel_size: _size_2_t,
- stride: _size_2_t = 1,
- padding: _size_2_t = 0,
- output_padding: _size_2_t = 0,
- groups: int = 1,
- bias: bool = True,
- dilation: int = 1,
- padding_mode: Literal["zeros", "reflect", "replicate", "circular"] = "zeros",
- device=None,
- dtype=None,
- ) -> None:
- factory_kwargs = {"device": device, "dtype": dtype}
- # pyrefly: ignore [bad-argument-type]
- super().__init__(
- 0,
- 0,
- kernel_size,
- stride,
- padding,
- output_padding,
- groups,
- # bias is hardcoded to False to avoid creating tensor
- # that will soon be overwritten.
- False,
- dilation,
- padding_mode,
- **factory_kwargs,
- )
- # pyrefly: ignore [bad-argument-type, bad-override, unexpected-keyword]
- self.weight = UninitializedParameter(**factory_kwargs)
- self.out_channels = out_channels
- if bias:
- # pyrefly: ignore [bad-argument-type, bad-override, unexpected-keyword]
- self.bias = UninitializedParameter(**factory_kwargs)
- def _get_num_spatial_dims(self) -> int:
- return 2
- # LazyConvTranspose3d defines weight as a Tensor but derived class defines it as UninitializeParameter
- class LazyConvTranspose3d(_LazyConvXdMixin, ConvTranspose3d): # type: ignore[misc]
- r"""A :class:`torch.nn.ConvTranspose3d` module with lazy initialization of the ``in_channels`` argument.
- The ``in_channels`` argument of the :class:`ConvTranspose3d` is inferred from
- the ``input.size(1)``.
- The attributes that will be lazily initialized are `weight` and `bias`.
- Check the :class:`torch.nn.modules.lazy.LazyModuleMixin` for further documentation
- on lazy modules and their limitations.
- Args:
- out_channels (int): Number of channels produced by the convolution
- kernel_size (int or tuple): Size of the convolving kernel
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int or tuple, optional): ``dilation * (kernel_size - 1) - padding`` zero-padding
- will be added to both sides of each dimension in the input. Default: 0
- output_padding (int or tuple, optional): Additional size added to one side
- of each dimension in the output shape. Default: 0
- groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
- bias (bool, optional): If ``True``, adds a learnable bias to the output. Default: ``True``
- dilation (int or tuple, optional): Spacing between kernel elements. Default: 1
- .. seealso:: :class:`torch.nn.ConvTranspose3d` and :class:`torch.nn.modules.lazy.LazyModuleMixin`
- """
- # super class define this variable as None. "type: ignore[..] is required
- # since we are redefining the variable.
- cls_to_become = ConvTranspose3d # type: ignore[assignment]
- def __init__(
- self,
- out_channels: int,
- kernel_size: _size_3_t,
- stride: _size_3_t = 1,
- padding: _size_3_t = 0,
- output_padding: _size_3_t = 0,
- groups: int = 1,
- bias: bool = True,
- dilation: _size_3_t = 1,
- padding_mode: Literal["zeros", "reflect", "replicate", "circular"] = "zeros",
- device=None,
- dtype=None,
- ) -> None:
- factory_kwargs = {"device": device, "dtype": dtype}
- # pyrefly: ignore [bad-argument-type]
- super().__init__(
- 0,
- 0,
- kernel_size,
- stride,
- padding,
- output_padding,
- groups,
- # bias is hardcoded to False to avoid creating tensor
- # that will soon be overwritten.
- False,
- dilation,
- padding_mode,
- **factory_kwargs,
- )
- # pyrefly: ignore [bad-argument-type, bad-override, unexpected-keyword]
- self.weight = UninitializedParameter(**factory_kwargs)
- self.out_channels = out_channels
- if bias:
- # pyrefly: ignore [bad-argument-type, bad-override, unexpected-keyword]
- self.bias = UninitializedParameter(**factory_kwargs)
- def _get_num_spatial_dims(self) -> int:
- return 3
|