到目前為止我們看到的 CNN 層,例如卷積層(第 7.2 節(jié))和池化層(第 7.5 節(jié)),通常會減少(下采樣)輸入的空間維度(高度和寬度),或保持它們不變。在像素級分類的語義分割中,如果輸入和輸出的空間維度相同,將會很方便。例如,一個輸出像素的通道維度可以保存同一空間位置輸入像素的分類結(jié)果。
為了實現(xiàn)這一點,特別是在空間維度被 CNN 層減少之后,我們可以使用另一種類型的 CNN 層來增加(上采樣)中間特征圖的空間維度。在本節(jié)中,我們將介紹轉(zhuǎn)置卷積,也稱為分數(shù)步卷積 (Dumoulin 和 Visin,2016),用于通過卷積反轉(zhuǎn)下采樣操作。
14.10.1。基本操作
現(xiàn)在忽略通道,讓我們從步幅為 1 且無填充的基本轉(zhuǎn)置卷積運算開始。假設(shè)我們有一個nh×nw輸入張量和 kh×kw核心。以 1 的步幅滑動內(nèi)核窗口nw每行的次數(shù)和nh每列中的次數(shù)總共產(chǎn)生nhnw中間結(jié)果。每個中間結(jié)果是一個(nh+kh?1)×(nw+kw?1) 初始化為零的張量。為了計算每個中間張量,輸入張量中的每個元素都乘以內(nèi)核,從而得到kh×kw張量替換每個中間張量中的一部分。請注意,每個中間張量中替換部分的位置對應(yīng)于用于計算的輸入張量中元素的位置。最后,將所有中間結(jié)果相加以產(chǎn)生輸出。
例如,圖 14.10.1說明了轉(zhuǎn)置卷積如何與2×2內(nèi)核是為a計算的 2×2輸入張量。
圖 14.10.1轉(zhuǎn)置卷積2×2核心。陰影部分是中間張量的一部分以及用于計算的輸入和內(nèi)核張量元素。
trans_conv
我們可以為輸入矩陣X
和核矩陣實現(xiàn)這種基本的轉(zhuǎn)置卷積運算 K
。
與通過內(nèi)核 減少輸入元素的常規(guī)卷積(在第 7.2 節(jié)中)相反,轉(zhuǎn)置卷積通過內(nèi)核廣播輸入元素,從而產(chǎn)生大于輸入的輸出。我們可以從圖 14.10.1構(gòu)造輸入張量 和核張量來驗證上述基本二維轉(zhuǎn)置卷積運算的實現(xiàn)的輸出。X
K
X = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
K = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
trans_conv(X, K)
tensor([[ 0., 0., 1.],
[ 0., 4., 6.],
[ 4., 12., 9.]])
或者,當輸入X
和內(nèi)核K
都是四維張量時,我們可以使用高級 API 來獲得相同的結(jié)果。
14.10.2。填充、步幅和多通道
與填充應(yīng)用于輸入的常規(guī)卷積不同,它應(yīng)用于轉(zhuǎn)置卷積中的輸出。例如,當指定高度和寬度任一側(cè)的填充數(shù)為 1 時,第一行和最后一行和列將從轉(zhuǎn)置卷積輸出中移除。
tensor([[[[4.]]]], grad_fn=<ConvolutionBackward0>)
在轉(zhuǎn)置卷積中,步長是為中間結(jié)果(即輸出)指定的,而不是為輸入指定的。
評論