深度學習基礎--卷積--反捲積(deconvolution)
反捲積(deconvolution)
這個概念很混亂,沒有統一的定義,在不同的地方出現,意義卻不一樣。
上取樣的卷積層有很多名字:
全卷積(full convolution),
網路內上取樣( in-network upsampling),
微步幅卷積(fractionally-strided convolution),
反向卷積(backwards convolution),
去卷積(deconvolution),
上卷積(upconvolution),
轉置卷積(transposed convolution)。
用「去卷積」這個術語是非常不推薦的,因為這是一個過載的術語:在數學運算或計算機視覺中的其他應用有著完全不同的含義。
Deconvolution的應用
1)unsupervised learning,其實就是covolutional sparse coding
這裡的deconv只是觀念上和傳統的conv反向,傳統的conv是從圖片生成feature map,而deconv是用unsupervised的方法找到一組kernel和feature map,讓它們重建圖片。
2)CNN視覺化
通過deconv將CNN中conv得到的feature map還原到畫素空間,以觀察特定的feature map對哪些pattern的圖片敏感,這裡的deconv其實不是conv的可逆運算,只是conv的transpose,所以tensorflow裡一般取名叫transpose_conv。
3)upsampling
在pixel-wise prediction比如image segmentation以及image generation中,由於需要做原始圖片尺寸空間的預測,而卷積由於stride往往會降低圖片size, 所以往往需要通過upsampling的方法來還原到原始圖片尺寸,deconv就充當了一個upsampling的角色。
例如:FCN網路(編碼-解碼模型)中的upsampling,GAN中的Generative圖片生成。
具體的運算
和卷積過程完全相反。通俗的說,先處理input(擴大),再做正常卷積。
反捲積相當於卷積的輸入與輸出層進行交換,
i,o表示卷積過程的輸入輸出大小,s,p,k分別表示卷積核的步進,pad的大小,卷積核的大小
i’,o’表示反捲積過程的輸入輸出大小,s’,p’,k’分別表示卷積核的步進,pad的大小,卷積核的大小(反捲積過程的卷積核是卷積過程卷積核的轉置)
反捲積過程即為將s,p,k變成s’,p’,k’再進行卷積
反捲積的具體過程
1)將k,s,p的值轉換為k’,s’,p’。
K,s,p→K’=k,s’=1,p’=k-p-1(另外每個點之間pad s-1個0)
2)利用轉置後的卷積核進行卷積
參考資料:https://github.com/vdumoulin/conv_arithmetic
例子
對3* 3的圖片進行反捲積,k=3,s=2,p=1
相當於對3*3的圖片進行k’=3,s’=1,p’=1(另外每個點之間pad s-1個0)的卷積,
如下圖所示,下面的藍色是輸入,上面的綠色是輸出,在輸入上移動的灰色的是卷積核。
O’=s(i’-1)+k-2p