Dilation Convolution
dilated conv,中文可以叫做空洞卷積或者擴張卷積。
誕生背景在圖像分割領域,圖像輸入到CNN(典型的網絡比如FCN)中,FCN先像傳統的CNN那樣對圖像做卷積再pooling,降低圖像尺寸的同時增大感受野(Receptive field),但是由於圖像分割預測是pixel-wise的輸出,所以要將pooling後較小的圖像尺寸upsampling到原始的圖像尺寸進行預測(upsampling一般採用deconv反捲積操作),之前的pooling操作使得每個pixel預測都能看到較大感受野信息。因此圖像分割FCN中有兩個關鍵,一個是pooling減小圖像尺寸增大感受野,另一個是upsampling擴大圖像尺寸。在先減小再增大尺寸的過程中,肯定有一些信息損失掉了,那麼能不能設計一種新的操作,不通過pooling也能有較大的感受野看到更多的信息呢?答案就是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損失信息的情況下,加大了感受野,讓每個卷積輸出都包含較大範圍的信息。在圖像需要全局信息或者語音文本需要較長的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,圖像尺寸變小