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 (int 或 tuple) – 輸出空間維度的形狀 (即,
output.sizes()[2:]
)kernel_size (int 或 tuple) – 滑動區塊的大小
dilation (int 或 tuple, optional) – 控制鄰域內元素步幅的參數。預設值:1
padding (int 或 tuple, optional) – 要添加到輸入兩側的隱式零填充。預設值:0
stride (int 或 tuple) – 輸入空間維度中滑動區塊的步幅。預設值:1
如果
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])