評價此頁

Fold#

class torch.nn.Fold(output_size, kernel_size, dilation=1, padding=0, stride=1)[source]#

將一組滑動區域性塊組合成一個大的包含 Tensor。

考慮一個包含滑動區域性塊的批次輸入張量,例如影像塊,其形狀為 (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 控制核點之間的間距;也稱為空洞卷積演算法。這個概念比較難描述,但 這個連結 有一個 dilation 作用的視覺化。

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

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

  • dilation (inttuple, 可選) – 一個控制鄰域內元素步幅的引數。預設值:1

  • padding (inttuple, 可選) – 要新增到輸入兩側的隱式零填充。預設值:0

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

  • 如果 output_sizekernel_sizedilationpaddingstride 是一個整數或長度為 1 的元組,則它們的值將跨所有空間維度複製。

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

注意

Fold 透過對所有包含塊的值求和來計算結果大張量中的每個組合值。Unfold 透過從大張量複製來提取區域性塊中的值。因此,如果塊重疊,它們就不是彼此的逆運算。

總的來說,摺疊和展開操作的關係如下。考慮使用相同引數建立的 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 操作是彼此的逆運算( up to constant divisor)。

警告

目前,僅支援非批處理(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])
extra_repr()[source]#

返回模組的額外表示。

返回型別

str

forward(input)[source]#

執行前向傳播。

返回型別

張量