Dilation Convolution

陳明佐
我就問一句,怎麼寫?
4 min readJun 3, 2019

--

dilated conv,中文可以叫做空洞卷積或者擴張卷積。

誕生背景在圖像分割領域,圖像輸入到CNN(典型的網絡比如FCN)中,FCN先像傳統的CNN那樣對圖像做卷積再pooling,降低圖像尺寸的同時增大感受野(Receptive field),但是由於圖像分割預測是pixel-wise的輸出,所以要將pooling後較小的圖像尺寸upsampling到原始的圖像尺寸進行預測(upsampling一般採用deconv反捲積操作),之前的pooling操作使得每個pixel預測都能看到較大感受野信息。因此圖像分割FCN中有兩個關鍵,一個是pooling減小圖像尺寸增大感受野,另一個是upsampling擴大圖像尺寸。在先減小再增大尺寸的過程中,肯定有一些信息損失掉了,那麼能不能設計一種新的操作,不通過pooling也能有較大的感受野看到更多的信息呢?答案就是dilated conv。

Different dilated parameter setting

(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,比如圖像分割、語音合成WaveNet、機器翻譯ByteNet中。

dilated convolution 並不是做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,圖像尺寸變小

Reference

--

--