Fold#
- class torch.nn.Fold(output_size, kernel_size, dilation=1, padding=0, stride=1)[source]#
将一组滑动局部块合并到一个大的包含张量中。
考虑一个包含滑动局部块的批处理
input
张量,例如图像块,形状为 ,其中 是批次维度, 是块内的值数量(一个块包含 个空间位置,每个位置包含一个 通道向量),以及 是块的总数。(这与Unfold
的输出形状完全相同。)该操作通过对重叠值求和,将这些局部块组合成形状为 的大的output
张量中。与Unfold
类似,参数必须满足其中 是所有空间维度。
output_size
描述了滑动局部块的包含张量的空间形状。这有助于解决多个输入形状映射到相同数量的滑动块时的歧义,例如当stride > 0
时。
、padding
和stride
参数指定了滑动块的检索方式。dilation
控制滑动块的步长。stride
控制在重塑之前,每个维度上两侧的隐式零填充点数。padding
控制核点之间的间距;也称为 à trous 算法。这有点难以描述,但这个 链接 有一个很好的可视化来展示dilation
的作用。dilation
- 参数
如果
、output_size
、kernel_size
、dilation
或padding
是一个整数或长度为 1 的元组,则它们的值将复制到所有空间维度。stride
对于有两个输出空间维度的情景,此操作有时被称为
。col2im
注意
Fold
通过对所有包含块的所有值求和来计算结果大张量中的每个组合值。Unfold
通过从大张量中复制来提取局部块中的值。因此,如果块重叠,它们就不是彼此的逆操作。总的来说,折叠和展开操作的关系如下。考虑使用相同参数创建的
Fold
和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
的形状和 dtype 的张量input
>>> input_ones = torch.ones(input.shape, dtype=input.dtype) >>> divisor = fold(unfold(input_ones))
当
张量不包含零元素时,divisor
和fold
操作就是彼此的逆操作(在常量除数方面)。unfold
警告
目前,仅支持非批处理(3D)或批处理(4D)的图像类输出张量。
- 形状
输入: 或
输出: 或 如上所述
示例
>>> 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])