1. 程式人生 > >轉置卷積的理解

轉置卷積的理解

sam ont 原來 ron 取出 http toe 輸入a inpu

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

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

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

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。(待考證~) 然後,我們來稍微理解一下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個,加上多個稀疏值0,來構成一個Toeplitz matrix和輸入進行矩陣乘積操作。這裏為什麽B的shape會是16×4呢,因為其實輸入是[4,4],其實是有16個值。

轉置卷積的理解