空洞卷积,
空洞卷積,擴張卷積,膨脹卷積,多孔卷積,帶孔卷積,dilated convolution
?
Dilation 卷積,也被稱為:空洞卷積、膨脹卷積。
一、一般的卷積操作:
首先,可以通過動態圖,理解正常卷積的過程:
如上圖,可以看到卷積操作。
對于CNN結構,通常包括如下部分:
輸入層 (input layer)---? 卷積計算層 (CONV)--- 激勵層(RELU) --- 池化層(Pooling) --- 全連接層(FC)
通常利用卷積來實現數據的特征提取。卷積層還有一個權值共享的原則:用一句話表達就是每個神經元只關注一個特征。
當然卷積完經過激勵層做一個非線性映射,輸出后就到Pooling layer了。
池化層的作用:
(1)壓縮數據和參數的量,減小過擬合。
(2)增大感受野。
主要兩種方法:Max Pooling? 和? Average Pooling
對于有些算法,池化完還需要upsampling獲得原始數的尺寸進行后續操作。由于這種通過卷積操作存在內部數據丟失的問題,存在信息損失,有人提出了dilated conv算法,即不通過池化獲得較大的視野,并減小信息損失。
二、膨脹卷積
?
?
如上圖,膨脹卷積的好處是不做pooling損失信息的情況下,加大了感受野,讓每個卷積輸出都包含較大范圍的信息。在圖像需要全局信息或者自然語言處理中需要較長的sequence信息依賴的問題中,都能很好的應用。
?
?在tensorflow中代碼為:
| 1 | tf.nn.atrous_conv2d(value,filters,rate,padding,name=None) |
value:輸入的卷積圖像,[batch, height, width, channels]。
? ? filters:卷積核,[filter_height, filter_width, channels, out_channels],通常NLP相關height設為1。
rate:正常的卷積通常會有stride,即卷積核滑動的步長,而膨脹卷積通過定義卷積和當中穿插的rate-1個0的個數,實現對原始數據采樣間隔變大。
padding:”SAME”:補零? ?; ”VALID”:丟棄多余的
?
?引子:
?
?
原理:
擴張卷積與普通的卷積相比,除了卷積核的大小以外,還有一個擴張率(dilation rate)參數,主要用來表示擴張的大小。擴張卷積與普通卷積的相同點在于,卷積核的大小是一樣的,在神經網絡中即參數數量不變,區別在于擴張卷積具有更大的感受野。感受野是卷積核在圖像上看到的大小,例如3×3卷積核的感受野大小為9。
(a) 普通卷積,1-dilated convolution,卷積核的感受野為3×3=93×3=9。?
(b) 擴張卷積,2-dilated convolution,卷積核的感受野為7×7=497×7=49。?
(c) 擴張卷積,4-dilated convolution,卷積核的感受野為15×15=22515×15=225。
擴展卷積在保持參數個數不變的情況下增大了卷積核的感受野,同時它可以保證輸出的特征映射(feature map)的大小保持不變。一個擴張率為2的3×3卷積核,感受野與5×5的卷積核相同,但參數數量僅為9個,是5×5卷積參數數量的36%。
dilated的好處是不做pooling損失信息的情況下,加大了感受野,讓每個卷積輸出都包含較大范圍的信息。在圖像需要全局信息或者語音文本需要較長的sequence信息依賴的問題中,都能很好的應用dilated conv
?
?
傳統卷積:?空洞卷積
增加感受野:
Deep CNN 對于其他任務還有一些致命性的缺陷。較為著名的是 up-sampling 和 pooling layer 的設計。
主要問題有:
- Up-sampling / pooling layer (e.g. bilinear interpolation) is deterministic. (參數不可學習)
- 內部數據結構丟失;空間層級化信息丟失。
- 小物體信息無法重建 (假設有四個pooling layer 則 任何小于 2^4 = 16 pixel 的物體信息將理論上無法重建。)
在這樣問題的存在下,語義分割問題一直處在瓶頸期無法再明顯提高精度, 而 dilated convolution 的設計就良好的避免了這些問題。
在圖像分割領域,圖像輸入到CNN(典型的網絡比如FCN[3])中,FCN先像傳統的CNN那樣對圖像做卷積再pooling,降低圖像尺寸的同時增大感受野,但是由于圖像分割預測是pixel-wise的輸出,所以要將pooling后較小的圖像尺寸upsampling到原始的圖像尺寸進行預測(upsampling一般采用deconv反卷積操作,deconv可參見知乎答案如何理解深度學習中的deconvolution networks?),之前的pooling操作使得每個pixel預測都能看到較大感受野信息。因此圖像分割FCN中有兩個關鍵,一個是pooling減小圖像尺寸增大感受野,另一個是upsampling擴大圖像尺寸。在先減小再增大尺寸的過程中,肯定有一些信息損失掉了,那么能不能設計一種新的操作,不通過pooling也能有較大的感受野看到更多的信息呢?答案就是dilated conv。
下面看一下dilated conv原始論文[4]中的示意圖:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?dilated conv
(a)圖對應3x3的1-dilated conv,和普通的卷積操作一樣,(b)圖對應3x3的2-dilated conv,實際的卷積kernel size還是3x3,但是空洞為1,也就是對于一個7x7的圖像patch,只有9個紅色的點和3x3的kernel發生卷積操作,其余的點略過。也可以理解為kernel的size為7x7,但是只有圖中的9個點的權重不為0,其余都為0。 可以看到雖然kernel size只有3x3,但是這個卷積的感受野已經增大到了7x7(如果考慮到這個2-dilated conv的前一層是一個1-dilated conv的話,那么每個紅點就是1-dilated的卷積輸出,所以感受野為3x3,所以1-dilated和2-dilated合起來就能達到7x7的conv),(c)圖是4-dilated conv操作,同理跟在兩個1-dilated和2-dilated conv的后面,能達到15x15的感受野。對比傳統的conv操作,3層3x3的卷積加起來,stride為1的話,只能達到(kernel-1)*layer+1=7的感受野,也就是和層數layer成線性關系,而dilated conv的感受野是指數級的增長。
dilated的好處是不做pooling損失信息的情況下,加大了感受野,讓每個卷積輸出都包含較大范圍的信息。
空洞卷積存在的問題
潛在問題 1:The Gridding Effect
假設我們僅僅多次疊加 dilation rate 2 的 3 x 3 kernel 的話,則會出現這個問題:
我們發現我們的 kernel 并不連續,也就是并不是所有的 pixel 都用來計算了,因此這里將信息看做 checker-board 的方式會損失信息的連續性。這對 pixel-level dense prediction 的任務來說是致命的。
潛在問題 2:Long-ranged information might be not relevant.
我們從 dilated convolution 的設計背景來看就能推測出這樣的設計是用來獲取 long-ranged information。然而光采用大 dilation rate 的信息或許只對一些大物體分割有效果,而對小物體來說可能則有弊無利了。如何同時處理不同大小的物體的關系,則是設計好 dilated convolution 網絡的關鍵。
通向標準化設計:Hybrid Dilated Convolution (HDC)
對于上個 section 里提到的幾個問題,圖森組的文章對其提出了較好的解決的方法。他們設計了一個稱之為 HDC 的設計結構。
-
第一個特性是,疊加卷積的 dilation rate 不能有大于1的公約數。比如 [2, 4, 6] 則不是一個好的三層卷積,依然會出現 gridding effect。
-
第二個特性是,我們將 dilation rate 設計成鋸齒狀結構,例如 [1, 2, 5, 1, 2, 5] 循環結構。
- 第三個特性是,我們需要滿足一下這個式子:
一個簡單的例子: dilation rate [1, 2, 5] with 3 x 3 kernel (可行的方案)
?
而這樣的鋸齒狀本身的性質就比較好的來同時滿足小物體大物體的分割要求(小 dilation rate 來關心近距離信息,大 dilation rate 來關心遠距離信息)。
這樣我們的卷積依然是連續的也就依然能滿足VGG組觀察的結論,大卷積是由小卷積的 regularisation 的 疊加。
以下的對比實驗可以明顯看出,一個良好設計的 dilated convolution 網絡能夠有效避免 gridding effect.
?
?視頻講解鏈接:
https://www.bilibili.com/video/av46153615/
https://www.bilibili.com/video/av45124983?from=search&seid=1719663045591184147
總結
- 上一篇: WGAN-GP与GAN及WGAN的比较
- 下一篇: tf.summary.scalar()和