Fold¶
- 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控制在重塑之前,每個維度在兩側新增padding數量的隱式零填充。dilation控制核點之間的間距;也稱為 à trous 演算法。這很難描述,但這個 連結 有一個很好的視覺化展示了dilation的作用。
- 引數
如果
output_size、kernel_size、dilation、padding或stride是 int 或長度為 1 的 tuple,則其值將應用於所有空間維度。對於兩個輸出空間維度的情況,此操作有時稱為
col2im。
注意
Fold透過對所有包含塊中的所有值求和來計算結果大張量中的每個組合值。Unfold透過從大張量複製來提取區域性塊中的值。因此,如果塊重疊,它們不是彼此的逆運算。通常,摺疊 (folding) 和展開 (unfolding) 操作之間的關係如下。考慮使用相同引數建立的
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操作互為逆運算(常數因子除外)。警告
目前,僅支援非批次 (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])