反卷積又稱轉秩卷積(transposed convolution),上取樣(upsampled )。
其作用舉例如下:
1.當我們用神經網路生成的時候,經常需要將一些低解析度的轉換為高解析度的。
2.在語義分割中,會使用卷積層在編碼器中進行特徵提取,然後在解碼層中進行恢復為原先的尺寸,這樣才可以對原來影象的每個畫素都進行分類。這個過程同樣需要用到轉置卷積。
讓我們回顧下卷積操作是怎麼工作的,並且我們將會從乙個小例子中直觀的感受卷積操作。假設我們有乙個4×4的矩陣,我們將在這個矩陣上應用3×3的卷積核,並且不新增任何填充(padding),步進引數(stride)設定為1,就像下圖所示,輸出為乙個2×2的矩陣。
這個卷積操作在輸入矩陣和卷積核中,對每個元素的乘積進行相加。因為我們沒有任何填充和使用1為步進,因此我們只能對這個操作進行4次,因此我們的輸出矩陣尺寸為2×2。
這種卷積操作使得輸入值和輸出值之間存在有位置上的連線關係,舉例來說,輸入矩陣左上方的值將會影響到輸出矩陣的左上方的值。更具體而言,3×3的卷積核是用來連線輸入矩陣中的9個值,並且將其轉變為輸出矩陣的乙個值的。乙個卷積操作是乙個多對一(many-to-one)的對映關係。讓我們記住這個,我們接下來將會用得著。
現在,假設我們想要反過來操作。我們想要將輸入矩陣中的乙個值對映到輸出矩陣的9個值,這將是乙個一對多(one-to-many)的對映關係。這個就像是卷積操作的反操作,其核心觀點就是用轉置卷積。舉個例子,我們對乙個2×2的矩陣進行上取樣為4×4的矩陣。這個操作將會維護乙個1對應9的對映關係。
但是我們將如何具體操作呢?為了接下來的討論,我們需要定義乙個卷積矩陣(convolution matrix)和相應的轉置卷積矩陣(transposed convolution matrix)。
我們可以將乙個卷積操作用乙個矩陣表示。這個表示很簡單,無非就是將卷積核重新排列到我們可以用普通的矩陣乘法進行矩陣卷積操作。如下圖就是原始的卷積核:
我們對這個3×3的卷積核進行重新排列,得到了下面這個4×16的卷積矩陣:
這個便是卷積矩陣了,這個矩陣的每一行都定義了乙個卷積操作。下圖將會更加直觀地告訴你這個重排列是怎麼進行的。每乙個卷積矩陣的行都是通過重新排列卷積核的元素,並且新增0補充(zero padding)進行的。
為了將卷積操作表示為卷積矩陣和輸入矩陣的向量乘法,我們將輸入矩陣4×4攤平(flatten)為乙個列向量,形狀為16×1,如下圖所示。
我們可以將這個4×16的卷積矩陣和1×16的輸入列向量進行矩陣乘法,這樣我們就得到了輸出列向量。
這個輸出的4×1的矩陣可以重新塑性為乙個2×2的矩陣,而這個矩陣正是和我們一開始通過傳統的卷積操作得到的一模一樣。
簡單來說,這個卷積矩陣除了重新排列卷積核的權重之外就沒有啥了,然後卷積操作可以通過表示為卷積矩陣和輸入矩陣的列向量形式的矩陣乘積形式進行表達。
我們想要從4(2×2)到16(4×4),因此我們使用了乙個16×4的矩陣,但是還有一件事情需要注意,我們是想要維護乙個1到9的對映關係。
假設我們轉置這個卷積矩陣c (4×16)變為ct (16×4)。我們可以對ct和列向量(4×1)進行矩陣乘法,從而生成乙個16×1的輸出矩陣。這個轉置矩陣正是將乙個元素對映到了9個元素。
這個輸出可以塑形為(4×4)的矩陣:
我們只是對小矩陣(2×2)進行上取樣為乙個更大尺寸的矩陣(4×4)。這個轉置卷積矩陣維護了乙個1個元素到9個元素的對映關係,因為這個關係正表現在了其轉置卷積元素上。
需要注意的是:這裡的轉置卷積矩陣的引數,不一定從原始的卷積矩陣中簡單轉置得到的,轉置這個操作只是提供了轉置卷積矩陣的形狀而已。
轉置卷積操作構建了和普通的卷積操作一樣的連線關係,只不過這個是從反向方向開始連線的。我們可以用它進行上取樣。另外,這個轉置卷積矩陣的引數是可以學習的,因此我們不需要一些人為預先定義的方法。即使它被稱為轉置卷積,它並不是意味著我們將一些現存的卷積矩陣簡單轉置並且使用其轉置後的值。
從本質來說,轉置卷積不是乙個卷積,但是我們可以將其看成卷積,並且當成卷積這樣去用。我們通過在輸入矩陣中的元素之間插入0進行補充,從而實現尺寸上取樣,然後通過普通的卷積操作就可以產生和轉置卷積相同的效果了。你在一些文章中將會發現他們都是這樣解釋轉置卷積的,但是這個因為在卷積操作之前需要通過新增0進行上取樣,因此是比較低效率的。
注意:轉置卷積會導致生成影象**現棋盤效應(checkerboard artifacts),這篇文章《deconvolution and checkerboard artifacts》推薦了一種上取樣的操作(也就是插值操作),這個操作接在乙個卷積操作後面以減少這種現象。如果你的主要目的是生成盡可能少棋盤效應的影象,那麼這篇文章就值得你去閱讀。
卷積和反卷積
n image h 2 pad h kernel h stride h 1 image w 2 pad w kernel w stride w 1 image h 輸入影象的高度 image w 輸入影象的寬度 pad h 在輸入影象的高度方向兩邊各增加pad h個單位長度 因為有兩邊,所以乘以2 ...
反卷積 轉置卷積
搞明白了卷積網路中所謂deconv到底是個什麼東西後,不寫下來怕又忘記,根據參考資料,加上我自己的理解,記錄在這篇部落格裡。第一次看到deconv這個詞,以為deconv的結果就是卷積的逆,覺得神奇,不禁產生了 哦?轉置的卷積就可以求逆了嗎?這樣的想法,然後在matlab裡面實驗求證,我還記得當時以...
轉置卷積 反卷積
借鑑於此個部落格,寫的非常好 轉置卷積 transposed convolution 也叫做反卷積 deconvolution pytorch中可以使用torch.nn.convtranspose2d 來呼叫,caffe中對應的轉置卷積層為deconv layer 作用 在 中用於對影象上取樣。操作...