一文讓你看懂轉置卷積(反捲積,分數卷積),非常詳細的圖解描述

編譯:ronghuaiyang

導讀

如果你聽說過轉置卷積並對它的實際含義感到困惑,這篇文章就是為你寫的。

上採樣的需求

當我們使用神經網絡來生成圖像的時候,通常需要從低分辨率的圖像上採樣成高分辨率的圖像。

一文讓你看懂轉置卷積(反捲積,分數卷積),非常詳細的圖解描述

有很多的方法來實現上採樣的操作:

  • 最近鄰插值
  • 雙線性插值
  • 雙三次插值

這些方法都涉及插值,需要在確定網絡結構時進行選擇。它就像一個手工的特徵工程,網絡對此一無所知。

為什麼用轉置卷積?

如果我們想要我們的網絡學習到如何最優化的進行上採樣,我們可以使用轉置卷積。它沒有使用預先定義好的插值方法,具有可學習的參數。

理解轉置卷積的概念非常有用,因為在一些重要的論文和工程都都會用到,比如:

  • 在DCGAN中,生成器使用隨機採樣的值來生成全尺寸的圖像。
  • 在語義分割中,在編碼階段使用卷積層來抽取特徵,然後在解碼階段,恢復原始的圖像尺寸,對原始圖像的每一個像素進行分類。

轉置卷積也稱為:

  • 分數步長的卷積
  • 反捲積

在文中,我們只會使用反捲積,但是你需要在其他的文章中注意一下其他的名字。

卷積操作

我們用一個簡單的例子來解釋一下卷積是怎麼工作的。假設我們有一個4x4的矩陣,需要在上面使用一個3x3的卷積核進行卷積操作,不做padding,步長為1。如下面所示,輸出為2x2的矩陣。

一文讓你看懂轉置卷積(反捲積,分數卷積),非常詳細的圖解描述

卷積操作

卷積運算計算輸入矩陣和核矩陣之間的元素乘積的和。因為我們沒有padding,步長為1,我們只能做4次。因此,輸出矩陣是2x2的 。

一文讓你看懂轉置卷積(反捲積,分數卷積),非常詳細的圖解描述

對應元素相乘再求和

這種卷積運算的一個重要特點是輸入值和輸出值之間存在位置連通性。

例如,輸入矩陣的左上角值影響輸出矩陣的左上角值。

更具體地說,3x3卷積核用於連接輸入矩陣中的9個值和輸出矩陣中的1個值。卷積運算形成多對一關係。讓我們記住這一點,因為我們以後需要它。

反過來

現在,假設我們想要反過來操作。我們想把一個矩陣中的1個值和另一個矩陣中的9個值聯繫起來。這是一對多的關係。這就像是卷積運算的反運算,它是轉置卷積的核心思想。

例如,我們上採樣一個2x2矩陣到一個4x4矩陣。這個操作維護了一個1到9的關係。

一文讓你看懂轉置卷積(反捲積,分數卷積),非常詳細的圖解描述

卷積運算反過來

但是我們怎麼來進行這樣的操作呢?

為了討論如何進行這個操作,我們需要定義卷積矩陣轉置卷積矩陣

卷積矩陣

我們可以用矩陣來表示卷積運算。它只是一個重新排列的卷積核矩陣,這樣我們就可以用矩陣乘法來進行卷積運算了。

一文讓你看懂轉置卷積(反捲積,分數卷積),非常詳細的圖解描述

我們將3x3卷積核重新排列為4x16的矩陣如下:

一文讓你看懂轉置卷積(反捲積,分數卷積),非常詳細的圖解描述

這就是卷積矩陣。每一行定義一個卷積運算。如果你看不懂上面的圖的話,下面的圖表可能會有所幫助。卷積矩陣的每一行只是一個重新排列的卷積核矩陣,在不同的地方用零來填充。

一文讓你看懂轉置卷積(反捲積,分數卷積),非常詳細的圖解描述

為了使用這個矩陣,我們把輸入矩陣 (4x4)拉平成一個列向量 (16x1)。

一文讓你看懂轉置卷積(反捲積,分數卷積),非常詳細的圖解描述

拉平了的輸入矩陣

我們可以將4x16卷積矩陣與16x1輸入矩陣(16維列向量)相乘。

一文讓你看懂轉置卷積(反捲積,分數卷積),非常詳細的圖解描述

輸出的4x1矩陣可以被reshape成2x2的矩陣,得到與之前相同的結果。

一文讓你看懂轉置卷積(反捲積,分數卷積),非常詳細的圖解描述

總之,卷積矩陣就是對卷積核權值重新排列的矩陣,卷積運算可以通過使用卷積矩陣表示。

那又怎樣呢?

重點是使用卷積矩陣,你可以從16 (4x4)到4 (2x2)因為卷積矩陣是4x16。然後,如果你有一個16x4的矩陣,你可以從4 (2x2)到16 (4x4)。

是不是有點懵逼?

請繼續讀下去。

轉置卷積矩陣

我們想要從4 (2x2)到16 (4x4),所以,我們使用一個16x4的矩陣。但是,還有一樣,我們要得到一個1到9的關係。

假設我們將卷積矩陣C (4x16)轉置到C.T (16x4)。我們可以對C用一個列向量(4x1)使用矩陣乘法,生成一個輸出矩陣(16x1)。轉置矩陣將1個值與輸出中的9個值連接起來。

一文讓你看懂轉置卷積(反捲積,分數卷積),非常詳細的圖解描述

使用矩陣乘法來做卷積

將輸出reshape成4x4。

一文讓你看懂轉置卷積(反捲積,分數卷積),非常詳細的圖解描述

我們剛剛將一個較小的矩陣(2x2)上採樣到一個較大的矩陣(4x4)。由於轉置卷積重新排列權值的方式,它保持了1到9的關係。

注意:矩陣中的實際權值不一定來自原始卷積矩陣。重要的是權重的排布是由卷積矩陣的轉置得來的。

總結

轉置卷積運算與普通卷積形成相同的連通性,但方向是反向的。

我們可以用它來進行上採樣。此外,轉置卷積的權值是可以學習的。所以我們不需要一個預定義的插值方法。

儘管它被稱為轉置卷積,但這並不意味著我們取某個已有的卷積矩陣並使用轉置後的版本。重點是,與標準卷積矩陣(一對多關聯而不是多對一關聯)相比,輸入和輸出之間的關聯是以反向的方式處理的。

因此,轉置卷積不是卷積。但是我們可以用卷積來模擬轉置卷積。我們通過在輸入矩陣的值之間加零來對輸入進行上採樣,這樣直接卷積就會產生與轉置卷積相同的效果。你可能會發現一些文章用這種方式解釋了轉置卷積。但是,由於需要在卷積之前對輸入進行上採樣,所以效率較低。

注意事項:轉置卷積是生成圖像中棋盤偽影的原因。本文推薦上採樣操作(即插值的方法),然後進行卷積運算來減少這些問題。如果你的主要目標是生成沒有這些偽影的圖像,那麼閱讀本文以瞭解更多信息是值得的。

英文原文:https://towardsdatascience.com/up-sampling-with-transposed-convolution-9ae4f2df52d0

更多文章,請關注微信公眾號:AI公園


分享到:


相關文章: