评价此页

Fold#

class torch.nn.Fold(output_size, kernel_size, dilation=1, padding=0, stride=1)[source]#

将一组滑动局部块组合成一个大的包含 Tensor。

考虑一个包含滑动局部块的批次输入张量,例如图像块,其形状为 (N,C×(kernel_size),L)(N, C \times \prod(\text{kernel\_size}), L),其中 NN 是批次维度,C×(kernel_size)C \times \prod(\text{kernel\_size}) 是块内的值数(一个块有 (kernel_size)\prod(\text{kernel\_size}) 个空间位置,每个位置包含一个 CC 通道向量),而 LL 是块的总数。 (这与 Unfold 的输出形状完全相同。)此操作将这些局部块合并到一个大的 output 张量中,其形状为 (N,C,output_size[0],output_size[1],)(N, C, \text{output\_size}[0], \text{output\_size}[1], \dots),通过对重叠值求和来实现。与 Unfold 类似,参数必须满足

L=doutput_size[d]+2×padding[d]dilation[d]×(kernel_size[d]1)1stride[d]+1,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,

其中 dd 遍历所有空间维度。

  • output_size 描述了滑动局部块的包含张量的空间形状。当多个输入形状映射到相同数量的滑动块时(例如,当 stride > 0 时),这有助于消除歧义。

参数 paddingstridedilation 指定了如何提取滑动块。

  • stride 控制滑动块的步幅。

  • padding 控制在重塑之前,每个维度上的 padding 个点两侧的隐式零填充量。

  • dilation 控制核点之间的间距;也称为空洞卷积算法。这个概念比较难描述,但 这个链接 有一个 dilation 作用的可视化。

参数
  • output_size (inttuple) – 输出的空间维度形状(即 output.sizes()[2:]

  • kernel_size (inttuple) – 滑动块的大小

  • dilation (inttuple, 可选) – 一个控制邻域内元素步幅的参数。默认值:1

  • padding (inttuple, 可选) – 要添加到输入两侧的隐式零填充。默认值:0

  • stride (inttuple) – 输入空间维度中滑动块的步长。默认值:1

  • 如果 output_sizekernel_sizedilationpaddingstride 是一个整数或长度为 1 的元组,则它们的值将跨所有空间维度复制。

  • 对于两个输出空间维度的场景,此操作有时称为 col2im

注意

Fold 通过对所有包含块的值求和来计算结果大张量中的每个组合值。Unfold 通过从大张量复制来提取局部块中的值。因此,如果块重叠,它们就不是彼此的逆运算。

总的来说,折叠和展开操作的关系如下。考虑使用相同参数创建的 FoldUnfold 实例

>>> 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 的形状和 dtype 的张量。

>>> input_ones = torch.ones(input.shape, dtype=input.dtype)
>>> divisor = fold(unfold(input_ones))

divisor 张量不包含零元素时,则 foldunfold 操作是彼此的逆运算( up to constant divisor)。

警告

目前,仅支持非批处理(3D)或批处理(4D)的图像式输出张量。

形状
  • 输入: (N,C×(kernel_size),L)(N, C \times \prod(\text{kernel\_size}), L)(C×(kernel_size),L)(C \times \prod(\text{kernel\_size}), L)

  • 输出: (N,C,output_size[0],output_size[1],)(N, C, \text{output\_size}[0], \text{output\_size}[1], \dots)(C,output_size[0],output_size[1],)(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])
extra_repr()[source]#

返回模块的额外表示。

返回类型

str

forward(input)[source]#

执行前向传播。

返回类型

张量