Fold#
- class torch.nn.Fold(output_size, kernel_size, dilation=1, padding=0, stride=1)[source]#
將一組滑動區域性塊組合成一個大的包含 Tensor。
考慮一個包含滑動區域性塊的批次輸入張量,例如影像塊,其形狀為 ,其中 是批次維度, 是塊內的值數(一個塊有 個空間位置,每個位置包含一個 通道向量),而 是塊的總數。 (這與
Unfold的輸出形狀完全相同。)此操作將這些區域性塊合併到一個大的output張量中,其形狀為 ,透過對重疊值求和來實現。與Unfold類似,引數必須滿足其中 遍歷所有空間維度。
output_size描述了滑動區域性塊的包含張量的空間形狀。當多個輸入形狀對映到相同數量的滑動塊時(例如,當stride > 0時),這有助於消除歧義。
引數
padding、stride和dilation指定了如何提取滑動塊。stride控制滑動塊的步幅。padding控制在重塑之前,每個維度上的padding個點兩側的隱式零填充量。dilation控制核點之間的間距;也稱為空洞卷積演算法。這個概念比較難描述,但 這個連結 有一個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的形狀和 dtype 的張量。>>> input_ones = torch.ones(input.shape, dtype=input.dtype) >>> divisor = fold(unfold(input_ones))
當
divisor張量不包含零元素時,則fold和unfold操作是彼此的逆運算( up to constant divisor)。警告
目前,僅支援非批處理(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])