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

論文:Multi-scale context aggregation with dilated convolutions


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

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

(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損失信息的情況下,加大了感受野,讓每個卷積輸出都包含較大範圍的信息。在圖像需要全局信息或者語音文本需要較長的sequence信息依賴的問題中,都能很好的應用dilated conv,比如圖像分割[3]、語音合成WaveNet[2]、機器翻譯ByteNet[1]中。簡單貼下ByteNet和WaveNet用到的dilated conv結構,可以更形象的了解dilated conv本身。

ByteNet

WaveNet

下面再闡述下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&

而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).


首先空洞卷積並不是什麼新鮮玩意兒,

這種數學處理是很常見的,舉個栗子:

就我有印象的最早的文章來自於

CMU1989年的《Shape from focus》

(應該不陌生吧,機器視覺的重要方向)

文章截圖如下:

實際上這就是一個改進的拉普拉斯運算元,作者做了兩個方面的處理:

1、橫向和縱向分別取絕對值相加,防止橫縱向值相互抵消;

2、引入步長參數(即標紅的step),代表隔step個像素取圖像像素值。

而所謂空洞卷積,實際上就是第二點的引申物,不同的是用在了神經網路中。

其實主要還是FCN中,圖像語義分割其實也是機器視覺領域吧。

所有,並沒有什麼不同~那這個改進運算元有什麼作用呢?

這個改進拉普拉斯運算元能夠提取圖像的對比度(圖像的一種特徵,描述聚焦程度)。

那為什麼要引入這個step呢?個人理解是因為圖像像素是連續變化的。

如果只取四鄰域點進行計算,那麼計算出來的對比度很小。

也就是說提取出來的特徵可能不那麼明顯,也就是說沒有充分利用圖像信息。

可以看到FCN裡面搞出了個感受野的概念,這個概念應該是更加形象的。

數學不行,演算法上隨便搞點小改動,然後玩概念瞎忽悠唄。

這是很多科研工作者的不二法門。心疼科研工作者一秒鐘。

我能怎麼辦,我也很無奈呀~

不過dilated conv在FCN中確實很好用,還是要點個贊吧

對了,最後膜拜下CMU~

——————————————

評論區@2prime 指出:小波分析里也有空洞卷積和stride2卷積。


感謝

@朱軍 的指正,之前說的dilated conv 也叫input stride是錯誤的,dilated conv 從表面上看,就是把卷積核膨脹了,增大了感受野,又沒有增加參數數量。把它看做一個局部下採樣的過程倒是可以的,我之前理解的全局下採樣是錯誤的。

我們熟悉的stride也叫 output stride,是對卷積計算後的 結果進行下採樣。這裡提到的卷積計算就是沒加任何特效的傳統stride為1的計算。 對output進行下採樣,就會得到dil stride=n的效果。

今天看到了一句話,就貼在這吧

Dilated convolutional layer (also called as atrous convolution in DeepLab) allows for exponential increase in field of view without decrease of spatial dimensions.


《Neural Machine Translation in Linear Time》閱讀筆記


dilated conv receptive field

糾結如何計算空洞卷積的感受野~

可以寫個腳本~


我想問下這篇論文里的 多尺度是什麼意思 ? 沒看明白, 它沒有用多尺度的feature map 啊 表一中的 basic 和 large 是什麼意思?


推薦閱讀:

LeCun 說的可微分編程是什麼?
深度學習cnn中,怎麼理解圖像進行池化(pooling)後的平移不變性?
學習聖經Deeplearning需要掌握哪些數學基礎?
神經網路的損失函數為什麼是非凸的?
如何評價邢波(Eric Xing)老師實驗室開發的深度學習平台 Poseidon?

TAG:圖像處理 | 神經網路 | 深度學習DeepLearning |