一文搞懂 deconvolution、transposed convolution、sub-pixel or fractional convolution

博客:blog.shinelee.me | 博客園 | CSDNgithub

寫在前面

deconvolution in segmentation

開篇先上圖,圖爲deconvolution在像素級語義分割中的一種應用,直觀感受deconvolution是一個upsampling的過程,像是convolution的對稱過程。網絡

本文將深刻deconvolution的細節,並經過以下方式展開:ide

  • 先回答 什麼是deconvolution?爲何會有transposed convolutiononsubpixel or fractional convolution這樣的名字?
  • 再介紹 各類情形下 transposed convolution是如何進行的,並提供一種統一的計算方法

什麼是deconvolution

首先要明確的是,deconvolution並非個好名字,由於它存在歧義:學習

  1. deconvolution最初被定義爲「inverse of convolution」或者「inverse filter」或者「解卷積」,是指消除先前濾波做用的方法。好比,咱們認爲原始圖像是清晰的,可是經過透鏡觀測到的圖像卻變得模糊,若是假設透鏡的做用至關於以某個kernel做用在原始圖像上,由此致使圖像變得模糊,那麼根據模糊的圖像估計這個kernel或者根據模糊圖像恢復原始清晰圖像的過程就叫deconvolution
  2. 後來論文Adaptive Deconvolutional Networks for Mid and High Level Feature LearningVisualizing and Understanding Convolutional Networks又從新定義了deconvolution,實際上與transposed convolution、sub-pixel or fractional convolution指代相同。transposed convolution是一個更好的名字,sub-pixel or fractional convolution能夠當作是transposed convolution的一個特例。對一個常規的卷積層而言,前向傳播時是convolution,將input feature map映射爲output feature map,反向傳播時則是transposed convolution,根據output feature map的梯度計算出input feature map的梯度,梯度圖的尺寸與feature map的尺寸相同。

本文談論的是deconvolution的第2個含義,後面統一使用transposed convolution這個名字。ui

什麼是transposed convolution?A guide to convolution arithmetic for deep learning中有這樣一段話:spa

transposed convolution definition

看無缺像仍不是很直觀,transposed convolution到底對應的是什麼操做?等到文章的後面,這個問題的答案會逐漸清晰起來。.net

下面先以1個例子來對比convolution過程和transposed convolution過程,採用與A guide to convolution arithmetic for deep learning相同的設置:code

  • 2-D transposed convolutions (\(N=2\))
  • square inputs (\(i_1=i_2=i\))
  • square kernel size (\(k_1=k_2=k\))
  • same strides along both axes (\(s_1=s_2=s\))
  • same zero padding along both axes (\(p_1=p_2=p\))
  • square outputs (\(o_1=o_2=o\))

若令\(i=4\)\(s=1\)\(p=0\)\(k=3\),輸出尺寸\(o=2\),則convolution過程是將\(4\times 4\)的map映射爲\(2\times 2\)的map,而transposed convolution過程則是將\(2\times 2\)的map映射爲\(4\times 4\)的map,二者的kernel size均爲3,以下圖所示:blog

convolution vs transposed convolution

能夠看到,convolution過程zero padding的數量與超參數\(p\)一致,可是transposed convolution實際的zero padding的數量爲2,爲何會這樣?是爲了保持鏈接方式相同,下面具體看一下。

convolution過程

先看convolution過程,鏈接方式 以下圖所示,綠色表示輸出,藍色表示輸入,每一個綠色塊具與9個藍色塊鏈接。

direct convolution

令卷積核\(\mathbf{w} = \left(\begin{array}{ccc} {w_{0,0}} & {w_{0,1}} & {w_{0,2}} \\ {w_{1,0}} & {w_{1,2}} & {w_{1,2}} \\ {w_{2,0}} & {w_{2,1}} & {w_{2,2}} \end{array}\right)\),爲了便於理解,將卷積寫成矩陣乘法形式,令\(\mathbf{x}\)\(4\times 4\)輸入矩陣以行優先方式拉成的長度爲16的向量,\(\mathbf{y}\)\(2\times 2\)輸出矩陣以一樣方式拉成的長度爲4的向量,同時將\(\mathbf{w}\)表示成\(4\times 16\)的稀疏矩陣\(\mathbf{C}\)

\[ \left(\begin{array}{cccccccccccccccc}{w_{0,0}} & {w_{0,1}} & {w_{0,2}} & {0} & {w_{1,0}} & {w_{1,1}} & {w_{1,2}} & {0} & {w_{2,0}} & {w_{2,1}} & {w_{2,2}} & {0} & {0} & {0} & {0} & {0} \\ {0} & {w_{0,0}} & {w_{0,1}} & {w_{0,2}} & {0} & {w_{1,0}} & {w_{1,1}} & {w_{1,2}} & {0} & {w_{2,0}} & {w_{2,1}} & {w_{2,2}} & {0} & {0} & {0} & {0} \\ {0} & {0} & {0} & {0} & {w_{0,0}} & {w_{0,1}} & {w_{0,2}} & {0} & {w_{1,0}} & {w_{1,1}} & {w_{1,2}} & {0} & {w_{2,0}} & {w_{2,1}} & {w_{2,2}} & {0} \\ {0} & {0} & {0} & {0} & {0} & {w_{0,0}} & {w_{0,1}} & {w_{0,2}} & {0} & {w_{1,0}} & {w_{1,1}} & {w_{1,2}} & {0} & {w_{2,0}} & {w_{2,1}} & {w_{2,2}}\end{array}\right) \]

則convolution過程能夠描述爲\(\mathbf{C} \mathbf{x} = \mathbf{y}\),若\(\mathbf{C}_{i,j}=0\)表示\(\mathbf{x}_j\)\(\mathbf{y}_i\)間沒有鏈接

transposed convolution過程

再看transposed convolution過程,如何將長度爲4的向量\(\mathbf{y}\)映射爲長度爲16的向量且保持鏈接方式相同?只需將\(\mathbf{C}\)轉置,令\(\mathbf{C}^T \mathbf{y} = \mathbf{x}'\),一樣地,\(\mathbf{C}^T_{j,i}=0\)表示\(\mathbf{x}'_j\)\(\mathbf{y}_i\)間沒有鏈接

此時,\(\mathbf{C}^T\)對應的卷積操做剛好至關於將kernel中心對稱,FULL zero padding,而後卷積,此時,1個藍色塊與9個綠色塊鏈接,且權重與Convolution過程相同

transposed convolution

須要注意的是,transposed convolution的kernel與convolution的kernel能夠有關,也能夠無關,須要看應用在什麼場景,

  • 特徵可視化訓練階段的反向傳播中應用的transposed convolution,並非做爲一個真正的layer存在於網絡中,其kernel與convolution共享(但要通過中心對稱後再卷積,至關於上面的 $ \mathbf{C} ^T $)。
  • 圖像分割生成模型decoder中使用的transposed convolution,是網絡中真實的layer,其kernel經初始化後須要經過學習得到(因此卷積核也就無所謂中心對稱不對稱了)。
  • 前向傳播爲convolution/transposed convolution,則反向傳播爲transposed convolution/convolution。

在上面舉的簡化的例子中,咱們能夠經過分析得知transposed convolution該如何進行,可是,對於更通常狀況應該怎麼作?

transposed convolution的計算

對於通常狀況,只需把握一個宗旨:transposed convolution將output size恢復爲input size且保持鏈接方式相同

對於convolution過程,咱們知道其output map與input map的尺寸關係以下:

\[o=\left\lfloor \frac{i+2p-k}{s} \right\rfloor + 1\]

若要將\(o\)恢復爲\(i\),需考慮2種狀況,\(\frac{i+2p-k}{s}\)整除以及不整除,先看整除的狀況。

整除的狀況

若是\(\frac{i+2p-k}{s}\)能夠整除,則由上式可得

\[i = so-s+k-2p = [o+(s-1)(o-1)]+(k-2p-1)\]

由於transposed convolution也是卷積,爲了符合上面卷積操做尺寸關係的數學形式,可進一步整理成

\[i = \frac{[o+(s-1)(o-1)] + [(k-1)+(k-2p-1)] - k}{1} + 1\]

\(i'=o+(s-1)(o-1)\)、$p'=\frac{(k-1)+(k-2p-1)}{2} = k-p-1 \(、\)s'=1\(、\)k'=k$,即transposed convolution實際卷積時使用的超參數,能夠這樣理解:

  • \(i'=o+(s-1)(o-1)\):convolution的輸出爲\(o\times o\),每行每列都是\(o\)個元素,有\(o-1\)個間隔,transposed convolution時在每一個間隔處插入\(s-1\)個0,總體構成transposed convolution的input map;

  • $p'=\frac{(k-1)+(k-2p-1)}{2} = k-p-1 $:在上一步input map的基礎上再進行padding,考慮convolution經常使用的幾種padding狀況:

    • VALID\(p=0\),transposed convolution則需padding \(p'=k-1\),即FULL padding
    • SAME\(p=\frac{k-1}{2}=r\),這裏考慮\(k=2r+1\)爲奇數的通常狀況,此時\(p'=r\),即SAME padding
    • FULL\(p=k-1\),則\(p'=0\),即VALID padding

    可見,convolution和transposed convolution的padding也具備某種對稱性\(p'+p=k-1\)

  • \(k'=k\):transposed convolution的kernel size與convolution相同;

  • \(s'=1\)transposed convolution的stride均爲1,但也能夠換個角度理解,若是認爲\(o\times o\)相鄰元素間的距離爲1個像素,那麼在間隔處插入\(s-1\)個0後(\(s > 1\)),獲得的input map相鄰元素間的距離就是亞像素的(sub-pixel),因此此時也能夠稱之爲 sub-pixel or fractional convolution
  • \(o'=i=\frac{i'+2p'-k'}{s'}+1\):transposed convolution的輸出與convolution的輸入具備相同尺寸。

不整除的狀況

接下來再看\(\frac{i+2p-k}{s}\)不整除的狀況,此時再按上面的方式計算獲得的\(o'=\frac{i'+2p'-k'}{s'}+1\)將小於\(i\),小多少呢?不可貴出少\(a = [(i+2p-k) \mod s]\),即

\[o'=\frac{i'+2p'-k'}{s'}+1=i-a\]

爲了讓\(o'=i\),可寫成

\[o'= \frac{i'+2p'+a-k'}{s'}+1\]

只需在padding後,在下邊和右邊再擴展\(a\)行和列0,而後進行卷積便可注意,由於\(s'=1\),咱們能夠將\(a\)放在分母也能夠放在外面,之因此放在分母,是由於convolution過程當中input map下邊和右邊的\(a\)行或列中的元素可能參與了運算,即與output map間存在鏈接,因此在transposed convolution時,爲了保持一樣的鏈接,最後擴展的\(a\)行和列也要參與卷積,因此放在分母。

至此,再看transposed convolution的各類狀況,就很容易推算了,更多例子可參見A guide to convolution arithmetic for deep learning

transposed convolution

總結

最後,總結一下,

  • convolution和transposed convolution互爲對稱過程,存在一個convolution,就存在一個與之對應的transposed convolution,反之亦然;
  • convolution是將input size的map映射爲output size的map,transposed convolution是將output size的map映射爲input size的map——旨在將尺寸恢復
  • 二者均使用卷積操做,爲了方便,二者使用一樣的stride、padding、kernel size超參數,但實際執行時的操做不一樣,通常狀況下,transposed convolution與convolution實際超參數關係爲:\(i'=o+(s-1)(o-1)\)、$p'=\frac{(k-1)+(k-2p-1)}{2} = k-p-1 \(、\)s'=1\(、\)k'=k$。
  • 之因此作這樣的操做,是爲了保證map間的鏈接方式相同(權重不必定相同),權重的設置需根據應用的場景,可能經過學習獲得,也可能與convolution共享(但須要中心對稱後再使用)。

參考

相關文章
相關標籤/搜索