快捷键

折叠 ¶

将一系列滑动局部块组合成一个大的包含张量。torch.nn.Fold(output_size, kernel_size, dilation=1, padding=0, stride=1)[source][source] ¶

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

考虑一个包含滑动局部块的批处理 input 张量,例如图像的块,形状为 (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 的输出形状规格。)此操作通过求和重叠值将这些局部块组合成形状为 (N,C,output_size[0],output_size[1],)(N, C, \text{output\_size}[0], \text{output\_size}[1], \dots) 的大 output 张量。与 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 控制在重塑之前,每个维度上的点数两侧的隐式零填充的数量。

  • dilation 控制内核点之间的间距;也称为à trou 算法。描述起来比较困难,但这个链接有一个很好的可视化说明 dilation 的作用。

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

  • kernel_size (int 或元组) – 滑动块的大小

  • 扩展 (int 或元组,可选) – 控制邻域内元素步长的参数。默认:1

  • 填充 (int 或元组,可选) – 在输入两侧添加的隐式零填充。默认:0

  • 步长 (int 或元组) – 输入空间维度中滑动块的步长。默认:1

  • 如果 output_sizekernel_sizedilationpaddingstride 是 int 或长度为 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_ones = torch.ones(input.shape, dtype=input.dtype)
>>> divisor = fold(unfold(input_ones))

divisor 张量不包含零元素时, foldunfold 操作互为逆运算(除以常数因子)。

警告

目前,仅支持未批处理的(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])

© 版权所有 PyTorch 贡献者。

使用 Sphinx 构建,并使用 Read the Docs 提供的主题。

文档

PyTorch 的全面开发者文档

查看文档

教程

深入了解初学者和高级开发者的教程

查看教程

资源

查找开发资源并获得您的疑问解答

查看资源