torch.nn.modules.fold 的源代码
from .module import Module
from .. import functional as F
from torch import Tensor
from ..common_types import _size_any_t
__all__ = ['Fold', 'Unfold']
[docs]class Fold(Module):
r"""将一个滑动局部块数组组合成一个大的包含张量。
考虑一个包含滑动局部块的批量 :attr:`input` 张量,
例如,图像的补丁,形状为 :math:`(N, C \times \prod(\text{kernel\_size}), L)`,
其中 :math:`N` 是批次维度,:math:`C \times \prod(\text{kernel\_size})`
是块内的值的数量(一个块有 :math:`\prod(\text{kernel\_size})`
空间位置,每个位置包含一个 :math:`C` 通道的向量),并且
:math:`L` 是块的总数。(这与 :class:`~torch.nn.Unfold` 的输出形状完全相同。)此
操作将这些局部块组合成大的 :attr:`output` 张量
形状为 :math:`(N, C, \text{output\_size}[0], \text{output\_size}[1], \dots)`
通过求和重叠的值。与 :class:`~torch.nn.Unfold` 类似,参数必须满足
.. math::
L = \prod_d \left\lfloor\frac{\text{output\_size}[d] + 2 \times \text{padding}[d] %
- \text{dilation}[d] \times (\text{kernel\_size}[d] - 1) - 1}{\text{stride}[d]} + 1\right\rfloor,
其中 :math:`d` 遍历所有空间维度。
* :attr:`output_size` 描述滑动局部块的大包含张量的空间形状。
当多个输入形状映射到相同数量的滑动块时,它有助于消除歧义,例如,
当 ``stride > 0`` 时。
:attr:`padding`、:attr:`stride` 和 :attr:`dilation` 参数指定
如何检索滑动块。
* :attr:`stride` 控制滑动块的步幅。
* :attr:`padding` 控制重塑前每个维度两侧的隐式零填充量。
* :attr:`dilation` 控制核点之间的间距;也称为 à trous 算法。
这很难描述,但这个 `link`_ 有一个很好的可视化效果,展示了 :attr:`dilation` 的作用。
参数:
output_size (int or tuple): 输出空间维度的形状(即 ``output.sizes()[2:]``)
kernel_size (int or tuple): 滑动块的大小
dilation (int or tuple, optional): 控制邻域内元素步幅的参数。默认值: 1
padding (int or tuple, optional): 输入两侧要添加的隐式零填充。默认值: 0
stride (int or tuple): 输入空间维度中滑动块的步幅。默认值: 1
* 如果 :attr:`output_size`、:attr:`kernel_size`、:attr:`dilation`、
:attr:`padding` 或 :attr:`stride` 是 int 或长度为 1 的元组,则
它们的值将在所有空间维度上复制。
* 对于两个输出空间维度的情况,此操作有时称为 ``col2im``。
.. note::
:class:`~torch.nn.Fold` 通过求和所有包含块的值来计算结果
大张量中的每个组合值。
:class:`~torch.nn.Unfold` 通过从大张量复制来提取局部块中的值。
因此,如果块重叠,它们不是彼此的逆。
通常,折叠和展开操作的关系如下。考虑使用相同
参数创建的 :class:`~torch.nn.Fold` 和
:class:`~torch.nn.Unfold` 实例:
>>> fold_params = dict(kernel_size=..., dilation=..., padding=..., stride=...)
>>> fold = nn.Fold(output_size=..., **fold_params)
>>> unfold = nn.Unfold(**fold_params)
然后对于任何(支持的)``input`` 张量,以下
等式成立:
::
fold(unfold(input)) == divisor * input
其中 ``divisor`` 是一个仅依赖于 ``input`` 的形状
和数据类型的张量:
>>> # xdoctest: +SKIP
>>> input_ones = torch.ones(input.shape, dtype=input.dtype)
>>> divisor = fold(unfold(input_ones))
当 ``divisor`` 张量不包含零元素时,则
``fold`` 和 ``unfold`` 操作是彼此的逆(直到常数除数)。
.. warning::
目前仅支持未批处理的(3D)或批处理的(4D)图像类输出张量。
形状:
- 输入: :math:`(N, C \times \prod(\text{kernel\_size}), L)` 或 :math:`(C \times \prod(\text{kernel\_size}), L)`
- 输出: :math:`(N, C, \text{output\_size}[0], \text{output\_size}[1], \dots)`
或 :math:`(C, \text{output\_size}[0], \text{output\_size}[1], \dots)` 如上所述
示例::
>>> fold = nn.Fold(output_size=(4, 5), kernel_size=(2, 2))
>>> input = torch.randn(1, 3 * 2 * 2, 12)
>>> output = fold(input)
>>> output.size()
torch.Size([1, 3, 4, 5])
.. _link:
https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md
"""
__constants__ = ['output_size', 'kernel_size', 'dilation', 'padding',
'stride']
output_size: _size_any_t
kernel_size: _size_any_t
dilation: _size_any_t
padding: _size_any_t
stride: _size_any_t
def __init__(
self,
output_size: _size_any_t,
kernel_size: _size_any_t,
dilation: _size_any_t = 1,
padding: _size_any_t = 0,
stride: _size_any_t = 1
) -> None:
super().__init__()
self.output_size = output_size
self.kernel_size = kernel_size
self.dilation = dilation
self.padding = padding
self.stride = stride
def forward(self, input: Tensor) -> Tensor:
return F.fold(input, self.output_size, self.kernel_size, self.dilation,
self.padding, self.stride)
def extra_repr(self) -> str:
return 'output_size={output_size}, kernel_size={kernel_size}, ' \
'dilation={dilation}, padding={padding}, stride={stride}'.format(
**self.__dict__
)
[docs]class Unfold(Module</span