反卷積 轉置卷積的理解


看了很多反卷積和轉置卷積的文章,似乎還是一頭霧水,記錄下自己理解的過程~

有人一句話總結:逆卷積相對於卷積在神經網絡結構的正向和反向傳播中做相反的運算。其實還是不是很理解。

反卷積(轉置卷積)通常用來兩個方面:

1. CNN可視化,通過反卷積將卷積得到的feature map還原到像素空間,來觀察feature map對哪些pattern相應最大,即可視化哪些特征是卷積操作提取出來的;

2. FCN全卷積網絡中,由於要對圖像進行像素級的分割,需要將圖像尺寸還原到原來的大小,類似upsampling的操作,所以需要采用反卷積;

3. GAN對抗式生成網絡中,由於需要從輸入圖像到生成圖像,自然需要將提取的特征圖還原到和原圖同樣尺寸的大小,即也需要反卷積操作。

我們先來看看卷積和反卷積的圖,簡直不要太形象。
卷積(convolution):
卷積核為 3x3;no padding , strides=1
 
"反卷積"(the transpose of conv) 可以理解為upsample conv.
卷積核為:3x3; no padding , strides=1

那看下strides=2的時候。
卷積:

反卷積:

在實際計算過程中,我們要轉化為矩陣的乘積的形式,一個轉化為Toeplitz matrix,一個reshape為列矩陣。
舉個簡單的例子
比如 input= [3,3],Reshape之后,為A=[1,9]
B(可以理解為濾波器)=[9,4](Toeplitz matrix)
那么A*B=C=[1,4]。Reshape C=[2,2]
所以,通過B 卷積,我們從shape=[3,3]變成了shape=[2,2]

反過來。
輸入A=[2,2],reshape之后為[1,4]
B的轉置為[4,9]
那么A*B=C=[1,9],reshape為[3,3]
所以,通過B的轉置 - "反卷積",我們從shape=[2,2]得到了shape=[3,3]

也就是輸入feature map A=[3,3]經過了卷積濾波B=[2,2] 輸出為 [2,2] ,所以padding=0,stride=1
反卷積則是
輸入feature map A=[2,2],經過了反卷積濾波B=[2,2].輸出為[3,3].padding=0,stride=1

那么[2,2]的卷積核(濾波器)是怎么轉化為[4,9]或者[9,4]的呢?
通過Toeplitz matrix,不清楚自己百度下~
 
重點來了:對於卷積操作很了解,這里不多說。我們梳理一下反卷積的操作:
首先看stride=1時候的反卷積:這里寫的是no padding,但是其實這對應的是正常卷積操作的no padding,然而實際意義上卷積操作是no padding,那么反卷積就是full padding;同時帶來一個新的問題,那么padding到底是多少呢?這里我目前理解的是添加的padding值等於(kernel_size - stride),像此處就是padding = kernel_size - stride = 3 - 1 = 2,那么padding添加為2。同樣對於下面stride=2的時候,padding = 3 - 2 = 1。(待考證~)
但是當stride>1的時候,需要在原輸入中插入0像素值,如上圖stride=2的時候,填充padding其實是進行了兩個步驟:其一是根據步長stride來填充,即在原輸入矩陣中間插入(stride-1)= 2 - 1 = 1個像素值為0的值;其二再根據padding來填充,padding = kernel_size - stride = 3 - 2 = 1,所以需要在輸入外圍填充1個像素值為0的值。
然后,我們來稍微理解一下 Toeplitz matrix這個東西,假設我們的輸入input = [4,4],reshape之后是[1,16],B(可以理解為濾波器)=[16,4](Toeplitz matrix),那么A*B=C=[1,4]。Reshape C=[2,2]
所以,通過B 卷積,我們從shape=[4,4]變成了shape=[2,2]。
這里,我們的B濾波器為:(其實我們的B濾波器中的權重值也就是9個值,即kernel是3×3的卷積核。)

其實這里卷積核B的參數仍然只有9個,加上多個稀疏值0,來構成一個Toeplitz matrix和輸入進行矩陣乘積操作。這里為什么B的shape會是16×4呢,因為其實輸入是[4,4],其實是有16個值,所以第一維是16,然后因為kernel_size為3,4×4大小的輸入需要計算四次,所以第二維是4。

如果你不理解Toeplitz matrix是怎么來的,你可以在草稿紙上筆划一下,即一個4×4的輸入矩陣和一個3×3的卷積核進行卷積操作,然后對照[1,16]*[16,4]矩陣相乘,你會發現其實計算的結果是一樣的。

 

另外要說明一點反卷積和轉置卷積的真正區別:

反卷積在數學含義上是可以還原輸入信號的;但是轉置卷積只能還原到原來輸入的shape,其value值是不一樣的。

 借用一個反池化的圖簡單說明一下轉置卷積是可以恢復到原來輸入的shape,但是其value值是不一樣的。

我們知道,池化是不可逆的過程,然而我們可以通過記錄池化過程中,最大激活值得坐標位置。然后在反池化的時候,只把池化過程中最大激活值所在的位置坐標的值激活,其它的值置為0,當然這個過程只是一種近似,因為我們在池化的過程中,除了最大值所在的位置,其它的值也是不為0的。

 

2018.09.03

這里說一下什么是上采樣。

實際上,上采樣(upsampling)一般包括2種方式:

  1. Resize,如雙線性插值直接縮放,類似於圖像縮放(這種方法在原文中提到)
  2. Deconvolution,也叫Transposed Convolution

傳統的網絡是subsampling的,對應的輸出尺寸會降低;upsampling的意義在於將小尺寸的高維度feature map恢復回去,以便做pixelwise prediction,獲得每個點的分類信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM