折叠¶
- class torch.nn.Fold(output_size, kernel_size, dilation=1, padding=0, stride=1)[源代码]¶
将滑动局部块的数组合并为一个大的包含张量。
考虑一个包含滑动局部块的批处理
input张量,例如图像的补丁,形状为 , 其中 是批次维度, 是块内的值的数量(一个块有 个空间位置,每个位置包含一个 通道的向量),并且 是块的总数。(这与Unfold的输出形状完全相同。)此 操作将这些局部块组合成形状为 的大output张量,通过求和重叠的值。与Unfold类似, 参数必须满足其中 是所有空间维度的总和。
output_size描述了包含滑动局部块的大张量的空间形状。当多个输入形状映射到相同数量的滑动块时,它有助于消除歧义,例如,使用stride > 0时。
参数
padding、stride和dilation指定了如何获取滑动块。stride控制滑动块的步幅。padding控制重塑之前在每个维度的两侧添加的隐式零填充的数量。dilation控制卷积核点之间的间距;也称为à trous算法。 这很难描述,但这个 链接 有一个很好的可视化展示了dilation的作用。
- Parameters
如果
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)
然后对于任何(支持的)
输入张量,以下等式成立: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)的图像类输出张量。
- Shape:
输入: 或
输出: 或 如上所述
示例:
>>> 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])