折叠 ¶
- 将一系列滑动局部块组合成一个大的包含张量。torch.nn.Fold(output_size, kernel_size, dilation=1, padding=0, stride=1)[source][source] ¶
将一个滑动局部块的数组组合成一个大的包含张量。
考虑一个包含滑动局部块的批处理
input
张量,例如图像的块,形状为 ,其中 是批处理维度, 是块内的值数量(一个块有 个空间位置,每个位置包含一个 通道的向量), 是块的总数。(这正是Unfold
的输出形状规格。)此操作通过求和重叠值将这些局部块组合成形状为 的大output
张量。与Unfold
类似,必须满足以下条件其中 遍历所有空间维度。
output_size
描述了包含滑动局部块的大张量的空间形状。当多个输入形状映射到相同的滑动块数量时,例如stride > 0
,这很有用,以解决歧义。
padding
、stride
和dilation
参数指定了如何检索滑动块。stride
控制滑动块的步长。padding
控制在重塑之前,每个维度上的点数两侧的隐式零填充的数量。dilation
控制内核点之间的间距;也称为à trou 算法。描述起来比较困难,但这个链接有一个很好的可视化说明dilation
的作用。
- 参数:
output_size (int 或元组) – 输出空间维度的形状(即,
output.sizes()[2:]
)kernel_size (int 或元组) – 滑动块的大小
扩展 (int 或元组,可选) – 控制邻域内元素步长的参数。默认:1
填充 (int 或元组,可选) – 在输入两侧添加的隐式零填充。默认:0
步长 (int 或元组) – 输入空间维度中滑动块的步长。默认:1
如果
output_size
,kernel_size
,dilation
,padding
或stride
是 int 或长度为 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_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])