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