反捲積(Deconvolution)、上採樣(UNSampling)與上池化(UnPooling)差異

Ryan Lu
AI反斗城
Published in
10 min readJun 10, 2020

前言
在看圖像語義分割方面的論文時,發現在網絡解碼器結構中有的時候使用反捲積、而有的時候使用unpooling或或者unsampling,查了下資料,發現三者還是有不同的。這裡記錄一下。

圖示理解
使用三張圖進行說明:

圖(a)表示UnPooling的過程,特點是在Maxpooling的時候保留最大值的位置信息,之後在unPooling階段使用該信息擴充Feature Map,除最大值位置以外,其餘補0。與之相對的是圖(b),兩者的區別在於UnSampling階段沒有使用MaxPooling時的位置信息,而是直接將內容複製來擴充Feature Map。從圖中即可看到兩者結果的不同。圖(c)為反捲積的過程,反捲積是卷積的逆過程,又稱作轉置卷積。最大的區別在於反捲積過程是有參數要進行學習的(類似卷積過程),理論是反捲積可以實現UnPooling和unSampling,只要卷積核的參數設置的合理。

反捲積與UnPooling的可視化

對網絡層進行可視化的結果:

圖(a)是輸入層;圖(b)是14*14反捲積的結果;圖(c)是28*28的UnPooling結果;圖(d)是28*28的反捲積結果;圖( e)是56*56的Unpooling結果;圖(f)是56*56反捲積的結果;圖(g)是112*112 UnPooling的結果;圖(h)是112*112的反捲積的結果;圖(i)和圖(j)分別是224*224的UnPooling和反捲積的結果。兩者各有特點。

反捲積基礎

一句話解釋:逆卷積相對於卷積在神經網絡結構的正向和反向傳播中做相反的運算。

逆卷積(Deconvolution)比較容易引起誤會,轉置卷積(Transposed Convolution)是一個更為合適的叫法.

舉個栗子:

4x4的輸入,卷積Kernel為3x3, 沒有Padding / Stride, 則輸出為2x2。

普通的conv層:

輸入矩陣可展開為16維向量,記作x
輸出矩陣可展開為4維向量,記作y
卷積運算可表示為y=Cx

不難想像其實就是如下的稀疏陣:我們再把4×4的輸入特徵展成[16,1]的矩陣XX,那麼Y=CXY=CX則是一個[4,1]的輸出特徵矩陣,把它重新排列2×2的輸出特徵就得到最終的結果,

平時神經網絡中的正向傳播就是轉換成瞭如上矩陣運算。

那麼當反向傳播時又會如何呢?首先我們已經有從更深層的網絡中得到的

逆卷積的一個很有趣的應用是GAN(Generative Adversarial Network)裡用來生成圖片:Generative Models

[1603.07285] A guide to convolution arithmetic for deep learning
GitHub — vdumoulin/conv_arithmetic: A technical report on convolution arithmetic in the context of deep learning

用法:

visualization/pixel-wise prediction/unsupervised learning/image generation都會用到deconv的結構。比如Deconvolutional Network [1][2]做圖片的unsupervised feature learning,ZF-Net論文中的捲積網絡可視化[3],FCN網絡中的upsampling[4],GAN中的Generative圖片生成[5]。

Deconvolution大致可以分為以下幾個方面:

(1)unsupervised learning,其實就是covolutional sparse coding[1][2]:這裡的deconv只是觀念上和傳統的conv反向,傳統的conv是從圖片生成feature map,而deconv是用unsupervised的方法找到一組kernel和feature map,讓它們重建圖片。

(2)CNN可視化[3]:通過deconv將CNN中conv得到的feature map還原到像素空間,以觀察特定的feature map對哪些pattern的圖片敏感,這裡的deconv其實不是conv的可逆運算,只是conv的transpose,所以tensorflow裡一般取名叫transpose_conv。

(3)upsampling[4][5]:在pixel-wise prediction比如image segmentation[4]以及image generation[5]中,由於需要做原始圖片尺寸空間的預測,而卷積由於stride往往會降低圖片size ,所以往往需要通過upsampling的方法來還原到原始圖片尺寸,deconv就充當了一個upsampling的角色

1. CNN可視化
deconv第二個方面是用來做CNN的可視化。ZF-Net[3]中用到了deconv來做可視化,它是將CNN學習到的feature map用得到這些feature map的捲積核,取轉置,將圖片特徵從feature map空間轉化到pixel空間,以發現是哪些pixel激活了特定的feature map,達到分析理解CNN的目的。
2. upsampling
分別簡單介紹兩篇文章,FCN和DCAN。FCN[4]主要用來做pixel-wise的image segmentation預測,先用傳統的CNN結構得到feature map,同時將傳統的full connected轉換成了對應參數的捲積層,比如傳統pool5層的尺寸是7 ×7×512,fc6的尺寸是4096,傳統的full connected weight是7×7×512×4096這樣多的參數,將它轉成捲積核,kernel size為7×7,input channel為512,output channel為4096,則將傳統的分別帶有捲積和全連接的網絡轉成了全卷積網絡(fully convolutional network, FCN)。FCN的一個好處是輸入圖片尺寸大小可以任意,不受傳統網絡全連接層尺寸限制,傳統的方法還要用類似SPP結構來避免這個問題。FCN中為了得到pixel-wise的prediction,也要把feature map通過deconv轉化到像素空間。論文中還有一些具體的feature融合,詳情可參見論文。

DCGAN[5]中使用deconv就更自然了,本身GAN就需要generative model,需要通過deconv從特定分佈的輸入數據中生成圖片。GAN這種模式被Yann LeCun特別看好,認為是unsupervised learning的一個未來。

A.Transposed convolution(轉置卷積)
下面以一維向量進行卷積為例進行說明(stride=2),x為輸入y為輸出,通過1維卷積核/濾波器f來實現這個過程,x的size為8,f為[1 , 2, 3, 4],y為5,x中灰色的方塊表示用0進行padding。在f權重中的灰色方塊代表f中某些值與x中的0進行了相乘。下圖就是1維卷積的過程,從x到y。

容易地,可以發現1維卷積的方式很直觀,那麼什麼是轉置卷積呢?故名思意,就是將捲積倒過來:

如上圖所示,1維卷積核/濾波器被轉過來了,這裡進行一下額外的說明:

B.Sub-pixel convolution

1.1 PixelShuffle中說過,sub-pixel convolution的步長是介於0到1之間的,但是這個操作是如何實現的呢?簡而言之,分為兩步:

① 將stride設為1
②將輸入數據dilation (以stride=1/2為例,sub-pixel是將輸入x的元素之間插入一些元素0,並在前後補上一些元素0),或者說根據分數索引(fractional indices)重新創建數據的排列形式。

C.Deconvolution
這里以2維卷積來進行演示,輸入一個4 x 4的單通道圖像,卷積核取1個4 x 4的,假設這裡取上採樣比例為2,那麼我們的目標就是恢復成一個8 x 8的單通道圖像。

如上圖,我們首先通過fractional indices從原input中創建一個sub-pixel圖像,其中白色的像素點就是原input中的像素(在LR sapce中),灰色像素點則是通過zero padding而來的。

用一個4 x 4的捲積核來和剛才生成的sub-pixel圖像進行stride=1的捲積,首先發現卷積核和sub-pixel圖像中非零的像素進行了第一次有效卷積(圖中紫色像素代表被激活的權重),然後我們將sub-pixels整體向右移動一格,讓卷積核再進行一次卷積操作,會發現卷積核中藍色像素的權重被激活,同理綠色和紅色(注意這裡是中間的那個8×8的sub-pixel圖像中的白色像素點進行移動,而每次卷積的方式都相同)。

最後我們輸出得到8 x 8的高分辨率圖像(HR圖像),HR圖像和sub-pixel圖像的大小是一致的,我們將其塗上顏色,顏色代表卷積核中權重和sub-pixel圖像中哪個像素點進行了卷積(也就是哪個權重對對應的像素進行了貢獻)。

顯然,我們可以看出,紫、藍、綠、紅四部分是相互獨立的,那麼,可以將這個4 x 4的捲積核分成4個2 x 2的捲積核如下:

注意,這個操作是可逆的。因為每個卷積權重在操作過程中都是獨立的。

因此,我們可以直接對原始圖像(未經過sub-pixel處理)直接進行2 x 2的捲積,並對輸出進行週期篩選(periodic shuffling)來得到同樣的8 x 8的高分辨率圖像。

[參考]
1.PyTorch學習筆記(10) — — 上採樣和PixelShuffle
2.反捲積(deconvolution)的理解+上採樣(UNSampling)與上池化(UnPooling)

--

--