快捷方式

Fold

class torch.nn.Fold(output_size, kernel_size, dilation=1, padding=0, stride=1)[原始碼][原始碼]

將滑動局部區塊的陣列組合成一個大的包含張量。

考慮一個批次的 input 張量,其中包含滑動局部區塊,例如,形狀為 (N,C×(kernel_size),L)(N, C \times \prod(\text{kernel\_size}), L) 的影像區塊,其中 NN 是批次維度,C×(kernel_size)C \times \prod(\text{kernel\_size}) 是一個區塊內值的數量(一個區塊有 (kernel_size)\prod(\text{kernel\_size}) 個空間位置,每個位置包含一個 CC 通道的向量),而 LL 是區塊的總數。(這與 Unfold 的輸出形狀完全相同。) 此操作通過對重疊值求和,將這些局部區塊組合成 output 張量,形狀為 (N,C,output_size[0],output_size[1],)(N, C, \text{output\_size}[0], \text{output\_size}[1], \dots)。 與 Unfold 類似,參數必須滿足以下條件:

L=doutput_size[d]+2×padding[d]dilation[d]×(kernel_size[d]1)1stride[d]+1,L = \prod_d \left\lfloor\frac{\text{output\_size}[d] + 2 \times \text{padding}[d] % - \text{dilation}[d] \times (\text{kernel\_size}[d] - 1) - 1}{\text{stride}[d]} + 1\right\rfloor,

其中 dd 是遍歷所有空間維度。

  • output_size 描述滑動局部區塊所組成的大型包含張量的空間形狀。當多個輸入形狀對應到相同數量的滑動區塊時,此參數有助於解決歧義,例如當 stride > 0 時。

paddingstridedilation 參數指定如何檢索滑動區塊。

  • stride 控制滑動區塊的步幅。

  • padding 控制在重塑形狀之前,在每個維度的 padding 數量的點的兩側添加的隱式零填充量。

  • dilation 控制核心點之間的間距;也稱為 à trous 演算法。它比較難描述,但是這個 連結dilation 的作用方式有很好的視覺化呈現。

參數
  • output_size (inttuple) – 輸出空間維度的形狀 (即,output.sizes()[2:])

  • kernel_size (inttuple) – 滑動區塊的大小

  • dilation (inttuple, optional) – 控制鄰域內元素步幅的參數。預設值:1

  • padding (inttuple, optional) – 要添加到輸入兩側的隱式零填充。預設值:0

  • stride (inttuple) – 輸入空間維度中滑動區塊的步幅。預設值:1

  • 如果 output_sizekernel_sizedilationpaddingstride 是一個 int 或長度為 1 的 tuple,那麼它們的值將在所有空間維度上複製。

  • 對於兩個輸出空間維度的情況,此操作有時稱為 col2im

注意

Fold 通過對所有包含區塊中的所有值求和來計算結果大型張量中的每個組合值。Unfold 通過從大型張量複製來提取局部區塊中的值。因此,如果區塊重疊,則它們不是彼此的反向操作。

一般來說,摺疊 (folding) 和展開 (unfolding) 操作的關係如下。考慮使用相同參數建立的 FoldUnfold 實例。

>>> 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 張量不包含任何零元素時,則 foldunfold 操作互為反運算(最多相差一個常數除數)。

警告

目前,僅支援未批次處理 (3D) 或已批次處理 (4D) 的類圖像輸出張量。

形狀
  • 輸入: (N,C×(kernel_size),L)(N, C \times \prod(\text{kernel\_size}), L)(C×(kernel_size),L)(C \times \prod(\text{kernel\_size}), L)

  • 輸出: (N,C,output_size[0],output_size[1],)(N, C, \text{output\_size}[0], \text{output\_size}[1], \dots)(C,output_size[0],output_size[1],)(C, \text{output\_size}[0], \text{output\_size}[1], \dots) 如上所述

範例

>>> 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])

文件

取得 PyTorch 的完整開發者文件

檢視文件

教學

取得適合初學者和進階開發人員的深入教學

檢視教學

資源

尋找開發資源並獲得您問題的解答

檢視資源