47 轉(zhuǎn)置卷積【動手學(xué)深度學(xué)習(xí)v2】

轉(zhuǎn)置卷積
- 卷積層和匯聚層通常會減少下采樣輸入圖像的空間維度(高和寬)
- 卷積通常來說不會增大輸入的高和寬,要么保持高和寬不變,要么會將高寬減半,很少會有卷積將高寬變大的
- 可以通過 padding 來增加高和寬,但是如果 padding 得比較多的話,因為填充的都是 0 ,所以最終的結(jié)果也是 0 ,因此無法有效地利用 padding 來增加高寬
- 如果輸入和輸出圖像的空間維度相同,會便于以像素級分類的語義分割:輸出像素所處的通道維可以保有輸入像素在同一位置上的分類結(jié)果(為實現(xiàn)輸入和輸出的空間維度的一致,在空間維度被卷積神經(jīng)網(wǎng)絡(luò)層縮小后,可以使用轉(zhuǎn)置卷積增加上采樣中間層特征圖的空間維度)
語義分割的問題在于需要對輸入進行像素級別的輸出,但是卷積通過不斷地減小高寬,不利于像素級別的輸出,所以需要另外一種卷積能夠?qū)⒏邔捵兇?/p>
- 轉(zhuǎn)置卷積可以用來增大輸入的高和寬
工作原理
- 轉(zhuǎn)置卷積的工作原理有點類似于卷積

- 假設(shè)有一個 2×2 的輸入和一個 2×2 的核
- 這個核會在輸入上以步幅為 1 進行滑動且沒有填充,對于輸入的每一個元素,它會跟核上的每一個元素按元素做乘法,然后逐次寫回到對應(yīng)的位置(寫回到一個更大的矩陣中,除了寫回的位置,其他元素初始化為 0 )
- 這樣的話,輸入有多少個元素,就會得到多少個乘積的結(jié)果(比輸入更大的矩陣),最后將這些結(jié)果按元素位置進行相加,最終就能夠得到輸出了
- 上圖中的 stride 為 1 (輸入的相鄰元素跟核按元素乘積的結(jié)果寫回到更大的矩陣的對應(yīng)位置時相隔 1 列),stride 如果特別大的話就能夠?qū)⑤敵龅母邔捵兊锰貏e大,達到成倍地增加高寬的目的
轉(zhuǎn)置卷積和卷積的異同
1、工作原理
- 常規(guī)卷積是輸入跟核進行按元素的乘法并相加,最后得到對應(yīng)位置的值,通過核在輸入上進行滑動從而得到輸出
- 轉(zhuǎn)置卷積是輸入的單個元素跟核按元素做乘法但不相加,保持核的大小,然后按元素寫回到一個更大的矩陣的對應(yīng)位置(輸入的每個元素會生成與核大小相同的矩陣寫入到一個更大的矩陣的對應(yīng)位置,所以輸出的高寬相對于輸入來講是變大的)
2、輸入輸出
- 常規(guī)卷積通過卷積核 “減少” 輸入元素
- 轉(zhuǎn)置卷積通過卷積核 “廣播” 輸入元素,從而產(chǎn)生大于輸入的輸出
3、填充
- 常規(guī)卷積中將填充應(yīng)用于輸入(如果將高和寬兩側(cè)的填充數(shù)指定為 1 時,常規(guī)卷積的輸入中將增加第一和最后的行和列)
- 轉(zhuǎn)置卷積中將填充應(yīng)用于輸出(如果將高和寬兩側(cè)的填充數(shù)指定為 1 時,轉(zhuǎn)置卷積的輸出中將刪除第一和最后的行和列)
4、步幅
- 常規(guī)卷積中,步幅所指定的是卷積核在輸入上的滑動距離
- 轉(zhuǎn)置卷積中,步幅所指定的是卷積核每次運算結(jié)果寫回到中間結(jié)果(輸出)矩陣中對應(yīng)位置的滑動距離,以下兩張圖是卷積核為 2 × 2 ,步幅分別為 1 和 2 的轉(zhuǎn)置卷積運算

- 上圖運算中轉(zhuǎn)置卷積的步幅為 1

- 上圖運算中轉(zhuǎn)置卷積的步幅為 2
5、多通道
- 對于多輸入和輸出通道,轉(zhuǎn)置卷積與常規(guī)卷積以相同的方式運作
為什么稱之為“轉(zhuǎn)置”
對于卷積 Y = X * W
- " * "代表卷積
- 可以對 W 構(gòu)造一個 V (V 是一個比較大的向量),使得卷積等價于矩陣乘法 Y‘ = VX’
- 這里的 Y‘, X’ 是 Y, X 對應(yīng)的向量版本(將 Y, X 通過逐行連結(jié)拉成向量)
- 如果 X’ 是一個長為 m 的向量,Y‘ 是一個長為 n 的向量,則 V 就是一個 n×m 的矩陣
轉(zhuǎn)置卷積同樣可以對 W 構(gòu)造一個 V ,則等價于 Y‘ = VTX'
- 按照上面的假設(shè) VT 就是一個 m×n ,則 X’ 就是一個長為 n 的向量,Y‘ 就是一個長為 m 的向量,X 和 Y 的向量發(fā)生了交換
- 從 V 變成了 VT 所以叫做轉(zhuǎn)置卷積
所以如果卷積將輸入從(h,w)變成了(h',w'),則同樣超參數(shù)(kernel size, stride, padding)的轉(zhuǎn)置卷積則從(h',w')變成(h,w)

總結(jié)
1、與通過卷積核減少輸入元素的常規(guī)卷積相反,轉(zhuǎn)置卷積通過卷積核廣播輸入元素,從而產(chǎn)生形狀大于輸入的輸出
2、如果我們將 X 輸入卷積層 f 來獲得輸出 Y = f(X) 并創(chuàng)造一個與 f 有相同的超參數(shù)、但輸出通道數(shù)是 X 中通道數(shù)的轉(zhuǎn)置卷積層 g ,那么 g(Y) 的形狀將與 X 相同。
3、可以使用矩陣乘法來實現(xiàn)卷積。轉(zhuǎn)置卷積層能夠交換卷積層的正向傳播函數(shù)和反向傳播函數(shù)
Q&A
- 1、轉(zhuǎn)置卷積得出的結(jié)果含義是什么??QA P3 - 00:00?
- 2、轉(zhuǎn)置卷積和反卷積有啥區(qū)別??QA P3 - 01:22?
- 3、上采樣過程中,還可以使用線性插值,請問這兩種方式哪個更好??QA P3 - 01:57?
- 4、如何理解通道?QA P3 - 02:55?
- 5、很難理解語義分割,一開始用卷積不斷做壓縮提取全局特征,然后用轉(zhuǎn)置卷積恢復(fù)到與輸入一樣大小,轉(zhuǎn)置卷積這樣局部信息恢復(fù)不都丟掉了,語義分割效果不就不好了??QA P3 - 03:07?
- 6、為啥需要把圖片變大?QA P3 - 05:15?
- 7、轉(zhuǎn)置卷積是想把卷積還原,但是數(shù)值都變化了,這塊確實不知道最終是變成了什么??QA P3 - 05:36?
- 8、請問老師,對轉(zhuǎn)置卷積是不是可以這樣理解:一張圖片,通過一個實現(xiàn)模糊的 kernel,做卷積后得到的圖片,再用原來的核的轉(zhuǎn)置,做轉(zhuǎn)置卷積,就可以得到原來的圖片?QA P3 - 06:45?
- 9、轉(zhuǎn)置卷積和 PixShuffle 做上采樣有什么區(qū)別??QA P3 - 07:42?
- 10、卷積+轉(zhuǎn)置卷積是不是有一點 encoder-decoder 的感覺??QA P3 - 08:04?
- 11、小照片放大,或者模糊圖片細化,是用轉(zhuǎn)置卷積做的么??QA P3 - 08:25?
- 12、請問評估一個硬件平臺算力能否實時運行一個分割算法,應(yīng)該從哪些方面評估?比如在 nvidia nx 上想實時跑分割算法,謝謝?QA P3 - 08:59?
----end----
其他參考
1、《動手學(xué)深度學(xué)習(xí)》,課程安排,https://courses.d2l.ai/zh-v2/assets/pdfs/part-2_14.pdf
2、《動手學(xué)深度學(xué)習(xí)》,https://zh-v2.d2l.ai/chapter_computer-vision/transposed-conv.html