看了很多反卷積和轉置卷積的文章,似乎還是一頭霧水,記錄下自己理解的過程~
有人一句話總結:逆卷積相對於卷積在神經網絡結構的正向和反向傳播中做相反的運算。其實還是不是很理解。
反卷積(轉置卷積)通常用來兩個方面:
1. CNN可視化,通過反卷積將卷積得到的feature map還原到像素空間,來觀察feature map對哪些pattern相應最大,即可視化哪些特征是卷積操作提取出來的;
2. FCN全卷積網絡中,由於要對圖像進行像素級的分割,需要將圖像尺寸還原到原來的大小,類似upsampling的操作,所以需要采用反卷積;
3. GAN對抗式生成網絡中,由於需要從輸入圖像到生成圖像,自然需要將提取的特征圖還原到和原圖同樣尺寸的大小,即也需要反卷積操作。
卷積核為 3x3;no padding , strides=1

卷積核為:3x3; no padding , strides=1

卷積:

反卷積:

在實際計算過程中,我們要轉化為矩陣的乘積的形式,一個轉化為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]的呢?
所以,通過B 卷積,我們從shape=[4,4]變成了shape=[2,2]。

其實這里卷積核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值是不一樣的。

我們知道,池化是不可逆的過程,然而我們可以通過記錄池化過程中,最大激活值得坐標位置。然后在反池化的時候,只把池化過程中最大激活值所在的位置坐標的值激活,其它的值置為0,當然這個過程只是一種近似,因為我們在池化的過程中,除了最大值所在的位置,其它的值也是不為0的。
2018.09.03
這里說一下什么是上采樣。
實際上,上采樣(upsampling)一般包括2種方式:
- Resize,如雙線性插值直接縮放,類似於圖像縮放(這種方法在原文中提到)
- Deconvolution,也叫Transposed Convolution。
傳統的網絡是subsampling的,對應的輸出尺寸會降低;upsampling的意義在於將小尺寸的高維度feature map恢復回去,以便做pixelwise prediction,獲得每個點的分類信息。