反捲積 轉置卷積的理解

看了不少反捲積和轉置卷積的文章,彷佛仍是一頭霧水,記錄下本身理解的過程~網絡

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

反捲積(轉置卷積)一般用來兩個方面:spa

1. CNN可視化,經過反捲積將卷積獲得的feature map還原到像素空間,來觀察feature map對哪些pattern相應最大,便可視化哪些特徵是卷積操做提取出來的;3d

2. FCN全卷積網絡中,因爲要對圖像進行像素級的分割,須要將圖像尺寸還原到原來的大小,相似upsampling的操做,因此須要採用反捲積;blog

3. GAN對抗式生成網絡中,因爲須要從輸入圖像到生成圖像,天然須要將提取的特徵圖還原到和原圖一樣尺寸的大小,即也須要反捲積操做。ip

咱們先來看看卷積和反捲積的圖,簡直不要太形象。
卷積(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。input

若是你不理解Toeplitz matrix是怎麼來的,你能夠在草稿紙上筆劃一下,即一個4×4的輸入矩陣和一個3×3的卷積核進行卷積操做,而後對照[1,16]*[16,4]矩陣相乘,你會發現其實計算的結果是同樣的。數學

 

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

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

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

咱們知道,池化是不可逆的過程,然而咱們能夠經過記錄池化過程當中,最大激活值得座標位置。而後在反池化的時候,只把池化過程當中最大激活值所在的位置座標的值激活,其它的值置爲0,固然這個過程只是一種近似,由於咱們在池化的過程當中,除了最大值所在的位置,其它的值也是不爲0的。

 

2018.09.03

這裏說一下什麼是上採樣。

實際上,上採樣(upsampling)通常包括2種方式:

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

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

相關文章
相關標籤/搜索