Fold¶
- class torch.nn.Fold(output_size, kernel_size, dilation=1, padding=0, stride=1)[源代码]¶
将滑动局部块的数组组合成一个大的包含张量。
考虑一个包含滑动局部块(例如,图像块)的批处理
input
张量,其形状为 , 其中 是批处理维度, 是块内的值的数量(一个块具有( kernel_size ) \prod(\text{kernel\_size}) 个空间位置,每个位置包含一个 -通道向量),以及 是块的总数。(这与Unfold
的输出形状完全相同。)此操作通过对重叠的值求和,将这些局部块组合成形状为0 ] , output_size [ 1 ] , … ) (N, C, \text{output\_size}[0], \text{output\_size}[1], \dots) 的大的output
张量。类似于Unfold
,参数必须满足其中 遍历所有空间维度。
output_size
描述了滑动局部块所包含的大张量的空间形状。当多个输入形状映射到相同数量的滑动块时(例如,当stride > 0
时),它有助于解决歧义。
padding
、stride
和dilation
参数指定如何检索滑动块。stride
控制滑动块的步长。padding
控制在重塑之前,每个维度两侧添加的隐式零填充的数量,填充数量为padding
。dilation
控制内核点之间的间距;也称为 à trous 算法。它难以描述,但此 链接 对dilation
的作用进行了很好的可视化。
- 参数
如果
output_size
、kernel_size
、dilation
、padding
或stride
是一个整数或长度为 1 的元组,则其值将复制到所有空间维度。对于两个输出空间维度的案例,此操作有时称为
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
是一个张量,它仅取决于input
的形状和数据类型>>> input_ones = torch.ones(input.shape, dtype=input.dtype) >>> divisor = fold(unfold(input_ones))
当
divisor
张量不包含零元素时,fold
和unfold
操作是彼此的逆(直到常数除数)。警告
目前,仅支持未批处理(3D)或已批处理(4D)的图像类输出张量。
- 形状
输入: 或
输出: 或
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])