空洞卷積(dilated convolution)

如何理解空洞卷積(dilated convolution)

 

論文:Multi-scale context aggregation with dilated convolutionshtml

簡單討論下dilated conv,中文能夠叫作空洞卷積或者擴張卷積。首先介紹一下dilated conv誕生背景[4],再解釋dilated conv操做自己,以及應用。express

首先是誕生背景,在圖像分割領域,圖像輸入到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]中的示意圖:數據結構

<img src="https://pic2.zhimg.com/50/v2-b448e1e8b5bbf7ace5f14c6c4d44c44e_hd.jpg" data-rawwidth="1269" data-rawheight="453" class="origin_image zh-lightbox-thumb" width="1269" data-original="https://pic2.zhimg.com/v2-b448e1e8b5bbf7ace5f14c6c4d44c44e_r.jpg">

(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的感覺野是指數級的增加。ide

dilated的好處是不作pooling損失信息的狀況下,加大了感覺野,讓每一個卷積輸出都包含較大範圍的信息。在圖像須要全局信息或者語音文本須要較長的sequence信息依賴的問題中,都能很好的應用dilated conv,好比圖像分割[3]、語音合成WaveNet[2]、機器翻譯ByteNet[1]中。簡單貼下ByteNet和WaveNet用到的dilated conv結構,能夠更形象的瞭解dilated conv自己。post

ByteNet學習

<img src="https://pic3.zhimg.com/50/v2-036913d7176af92daffcd60698751397_hd.jpg" data-rawwidth="869" data-rawheight="720" class="origin_image zh-lightbox-thumb" width="869" data-original="https://pic3.zhimg.com/v2-036913d7176af92daffcd60698751397_r.jpg">

WaveNetspa

<img src="https://pic3.zhimg.com/50/v2-e366fd287082211f1ac4a0fbbf35e3a1_hd.jpg" data-rawwidth="1065" data-rawheight="359" class="origin_image zh-lightbox-thumb" width="1065" data-original="https://pic3.zhimg.com/v2-e366fd287082211f1ac4a0fbbf35e3a1_r.jpg">

下面再闡述下deconv和dilated conv的區別:翻譯

deconv的具體解釋可參見如何理解深度學習中的deconvolution networks?,deconv的其中一個用途是作upsampling,即增大圖像尺寸。而dilated conv並非作upsampling,而是增大感覺野。設計

能夠形象的作個解釋:

對於標準的k*k卷積操做,stride爲s,分三種狀況:

(1) s>1,即卷積的同時作了downsampling,卷積後圖像尺寸減少;

(2) s=1,普通的步長爲1的卷積,好比在tensorflow中設置padding=SAME的話,卷積的圖像輸入和輸出有相同的尺寸大小;

(3) 0<s<1,fractionally strided convolution,至關於對圖像作upsampling。好比s=0.5時,意味着在圖像每一個像素之間padding一個空白的像素後,stride改成1作卷積,獲得的feature map尺寸增大一倍。

而dilated conv不是在像素之間padding空白的像素,而是在已有的像素上,skip掉一些像素,或者輸入不變,對conv的kernel參數中插一些0的weight,達到一次卷積看到的空間範圍變大的目的。

固然將普通的卷積stride步長設爲大於1,也會達到增長感覺野的效果,可是stride大於1就會致使downsampling,圖像尺寸變小。你們能夠從以上理解到deconv,dilated conv,pooling/downsampling,upsampling之間的聯繫與區別,歡迎留言溝通交流。


[1] Kalchbrenner, Nal, et al. "Neural machine translation in linear time." arXiv preprint arXiv:1610.10099 (2016).

[2] Oord, Aaron van den, et al. "Wavenet: A generative model for raw audio." arXiv preprint arXiv:1609.03499 (2016).

[3] Long J, Shelhamer E, Darrell T, et al. Fully convolutional networks for semantic segmentation[C]. Computer Vision and Pattern Recognition, 2015.

[4] Yu, Fisher, and Vladlen Koltun. "Multi-scale context aggregation by dilated convolutions." arXiv preprint arXiv:1511.07122 (2015).

做者:譚旭

連接:https://www.zhihu.com/question/54149221/answer/192025860

 

####################################################################################

Dilated/Atrous Convolution 或者是 Convolution with holes 從字面上就很好理解,是在標準的 convolution map 裏注入空洞,以此來增長 reception field。相比原來的正常convolution,dilated convolution 多了一個 hyper-parameter 稱之爲 dilation rate 指的是kernel的間隔數量(e.g. 正常的 convolution 是 dilatation rate 1)。

一個簡單的例子:

&amp;lt;img data-rawheight=&quot;381&quot; src=&quot;https://pic3.zhimg.com/50/v2-d552433faa8363df84c53b905443a556_hd.gif&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;395&quot; data-thumbnail=&quot;https://pic3.zhimg.com/50/v2-d552433faa8363df84c53b905443a556_hd.jpg&quot; class=&quot;content_image&quot; width=&quot;395&quot;&amp;gt;
Standard Convolution with a 3 x 3 kernel (and padding)
&amp;lt;img data-rawheight=&quot;381&quot; src=&quot;https://pic1.zhimg.com/50/v2-4959201e816888c6648f2e78cccfd253_hd.gif&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;395&quot; data-thumbnail=&quot;https://pic1.zhimg.com/50/v2-4959201e816888c6648f2e78cccfd253_hd.jpg&quot; class=&quot;content_image&quot; width=&quot;395&quot;&amp;gt;
Dilated Convolution with a 3 x 3 kernel and dilation rate 2

不過光理解他的工做原理仍是遠遠不夠的,要充分理解這個概念咱們得從新審視卷積自己,並去了解他背後的設計直覺。如下主要討論 dilated convolution 在語義分割 (semantic segmentation) 的應用。

從新思考卷積: Rethinking Convolution

在贏得其中一屆ImageNet比賽裏VGG網絡的文章中,他最大的貢獻並非VGG網絡自己,而是他對於卷積疊加的一個巧妙觀察。

This (stack of three 3 × 3 conv layers) can be seen as imposing a regularisation on the 7 × 7 conv. filters, forcing them to have a decomposition through the 3 × 3 filters (with non-linearity injected in between).

這裏意思是 7 x 7 的卷積層能夠看作 3 個 3 x 3 的卷積層的疊加後的正則。而這樣的設計不只能夠大幅度的減小參數,其自己帶有正則性質的 convolution map 可以更容易學一個 generlisable, expressive feature space。這也是如今絕大部分基於卷積的深層網絡都在用小卷積核的緣由。

&amp;lt;img data-rawheight=&quot;618&quot; src=&quot;https://pic1.zhimg.com/50/v2-ee6f0084ca22aa8dc3138462ee4c24df_hd.jpg&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1422&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1422&quot; data-original=&quot;https://pic1.zhimg.com/v2-ee6f0084ca22aa8dc3138462ee4c24df_r.jpg&quot;&amp;gt;

然而 Deep CNN 對於其餘任務還有一些致命性的缺陷。較爲著名的是 up-sampling 和 pooling layer 的設計。這個在 Hinton 的演講裏也一直提到過。

主要問題有:

  1. Up-sampling / pooling layer (e.g. bilinear interpolation) is deterministic. (a.k.a. not learnable)
  2. 內部數據結構丟失;空間層級化信息丟失。
  3. 小物體信息沒法重建 (假設有四個pooling layer 則 任何小於 2^4 = 16 pixel 的物體信息將理論上沒法重建。)

在這樣問題的存在下,語義分割問題一直處在瓶頸期沒法再明顯提升精度, 而 dilated convolution 的設計就良好的避免了這些問題。

空洞卷積的拯救之路:Dilated Convolution to the Rescue

題主提到的這篇文章 MULTI-SCALE CONTEXT AGGREGATION BY DILATED CONVOLUTIONS 可能(?) 是第一篇嘗試用 dilated convolution 作語義分割的文章。後續圖森組和 Google Brain 都對於 dilated convolution 有着更細節的討論,推薦閱讀:Understanding Convolution for Semantic Segmentation Rethinking Atrous Convolution for Semantic Image Segmentation 。

對於 dilated convolution, 咱們已經能夠發現他的優勢,即內部數據結構的保留和避免使用 down-sampling 這樣的特性。可是徹底基於 dilated convolution 的結構如何設計則是一個新的問題。

潛在問題 1:The Gridding Effect

假設咱們僅僅屢次疊加 dilation rate 2 的 3 x 3 kernel 的話,則會出現這個問題:

&amp;lt;img data-rawheight=&quot;370&quot; src=&quot;https://pic1.zhimg.com/50/v2-478a6b82e1508a147712af63d6472d9a_hd.jpg&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1154&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1154&quot; data-original=&quot;https://pic1.zhimg.com/v2-478a6b82e1508a147712af63d6472d9a_r.jpg&quot;&amp;gt;

咱們發現咱們的 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] 循環結構。

第三個特性是,咱們須要知足一下這個式子: M_i=\max[M_{i+1}-2r_i,M_{i+1}-2(M_{i+1}-r_i),r_i]

其中 r_i 是 i 層的 dilation rate 而 M_i 是指在 i 層的最大dilation rate,那麼假設總共有n層的話,默認 M_n=r_n 。假設咱們應用於 kernel 爲 k x k 的話,咱們的目標則是 M_2 \leq k ,這樣咱們至少能夠用 dilation rate 1 即 standard convolution 的方式來覆蓋掉全部洞。

一個簡單的例子: dilation rate [1, 2, 5] with 3 x 3 kernel (可行的方案)

&amp;lt;img data-rawheight=&quot;612&quot; src=&quot;https://pic1.zhimg.com/50/v2-3e1055241ad089fd5da18463903616cc_hd.jpg&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1766&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1766&quot; data-original=&quot;https://pic1.zhimg.com/v2-3e1055241ad089fd5da18463903616cc_r.jpg&quot;&amp;gt;

而這樣的鋸齒狀自己的性質就比較好的來同時知足小物體大物體的分割要求(小 dilation rate 來關心近距離信息,大 dilation rate 來關心遠距離信息)。

這樣咱們的卷積依然是連續的也就依然能知足VGG組觀察的結論,大卷積是由小卷積的 regularisation 的 疊加。

如下的對比實驗能夠明顯看出,一個良好設計的 dilated convolution 網絡可以有效避免 gridding effect.

&amp;lt;img data-rawheight=&quot;688&quot; src=&quot;https://pic4.zhimg.com/50/v2-b2b6f12a4c3d244c4bc7eb33814a1f0d_hd.jpg&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1448&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1448&quot; data-original=&quot;https://pic4.zhimg.com/v2-b2b6f12a4c3d244c4bc7eb33814a1f0d_r.jpg&quot;&amp;gt;

多尺度分割的另類解:Atrous Spatial Pyramid Pooling (ASPP)

在處理多尺度物體分割時,咱們一般會有如下幾種方式來操做:

&amp;lt;img data-rawheight=&quot;440&quot; src=&quot;https://pic4.zhimg.com/50/v2-0510889deee92f6290b5a43b6058346d_hd.jpg&quot; data-size=&quot;normal&quot; data-rawwidth=&quot;1664&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1664&quot; data-original=&quot;https://pic4.zhimg.com/v2-0510889deee92f6290b5a43b6058346d_r.jpg&quot;&amp;gt;

然僅僅(在一個卷積分支網絡下)使用 dilated convolution 去抓取多尺度物體是一個不正統的方法。比方說,咱們用一個 HDC 的方法來獲取一個大(近)車輛的信息,然而對於一個小(遠)車輛的信息都再也不受用。假設咱們再去用小 dilated convolution 的方法從新獲取小車輛的信息,則這麼作很是的冗餘。

基於港中文和商湯組的 PSPNet 裏的 Pooling module (其網絡一樣得到當年的SOTA結果),ASPP 則在網絡 decoder 上對於不一樣尺度上用不一樣大小的 dilation rate 來抓去多尺度信息,每一個尺度則爲一個獨立的分支,在網絡最後把他合併起來再接一個卷積層輸出預測 label。這樣的設計則有效避免了在 encoder 上冗餘的信息的獲取,直接關注與物體之間以內的相關性。

總結

Dilated Convolution 我的認爲想法簡單,直接且優雅,並取得了至關不錯的效果提高。他起源於語義分割,大部分文章也用於語義分割,具體可否對其餘應用有價值姑且還不知道,但確實是一個不錯的探究方向。有另外的答主提到WaveNet, ByteNet 也用到了 dilated convolution 確實是一個頗有趣的發現,由於自己 sequence-to-sequence learning 也是一個須要關注多尺度關係的問題。則在 sequence-to-sequence learning 如何實現,如何設計,跟分割或其餘應用的關聯是咱們能夠從新須要考慮的問題。

做者:劉詩昆

連接:https://www.zhihu.com/question/54149221/answer/323880412

相關文章
相關標籤/搜索