文章來源:https://blog.csdn.net/alxe_made/article/details/88594550
1. 擴張卷積的提出
- Multi-Scale Context Aggregation by Dilated Convolutions
- Dilated Residual Networks
- 論文筆記——CVPR 2017 Dilated Residual Networks
在圖像分割領域,圖像輸入到CNN(典型的網絡比如FCN)中,FCN先像傳統的CNN那樣對圖像做卷積再pooling,降低圖像尺寸的同時增大感受野,但是由於圖像分割預測是pixel-wise的輸出,所以要將pooling後較小的圖像尺寸upsampling到原始的圖像尺寸進行預測(upsampling一般採用deconv反捲積操作,之前的pooling操作使得每個pixel預測都能看到較大感受野信息。因此圖像分割FCN中有兩個關鍵,一個是pooling減小圖像尺寸增大感受野,另一個是upsampling擴大圖像尺寸。在先減小再增大尺寸的過程中,肯定有一些信息損失掉了,那麼能不能設計一種新的操作,不通過pooling也能有較大的感受野看到更多的信息呢?答案就是dilated conv。
這裏的話我們就主要介紹一下擴張卷積的理解,具體在圖像分割或者語音合成、機器翻譯應用暫時不做考慮。
2. 理解的難點
其實上來就給出這個圖,確實有點不知所云,有幾個問題需要我們回答:
3. 感受野
在理解上面這個公式之前,我們先理解一下感受野這個含義。
參考:
1.A guide to receptive field arithmetic for Convolutional Neural Networks
2.你知道如何計算CNN感受野嗎?這裏有一份詳細指南
然後看完之後我們纔可以進行下面的內容,我們截取其中重要的圖進行說明:
4. 計算空洞卷積感受野
空洞卷積就是在傳統的卷積中加入了一個dilation rate這個係數。可以從兩個方面理解這個參數,從原圖像層面理解:就是我們對原圖以(dilation rate-1)進行間隔採樣;從卷積核自身的角度來看,我們相當於在未使用空洞卷積的卷積核中,在其內部插入(dilation rate-1)個0,可以理解爲使用空洞卷積之後我們卷積核的尺寸變大了。後面的公式推導中,我們按照後面一種理解進行講述。
下圖是空洞卷積的動態示意圖:
Dilated Convolution with a 3 x 3 kernel and dilation rate 2
4.1 從一個簡單的一維例子出發
爲了更好理解空洞卷積,我們從一維入手:
a: 卷積核大小是3,然後移動的步長是2,padding是1
b: 卷積核大小是3,移動的步長是1,padding是1
c.卷積核大小是3,移動的步長是1,dilation rate是2
然後我們着重對比b和c兩張圖,考慮亮黃色的神經元,我們在b中視野(感受野)只有2-4,也就是隻有3;在c圖中我們的視野變成了1-5,也就是感受野變成了5,增加了感受野了。那麼爲什麼感受野變成了5?
我們可以這樣理解,從b到c圖,我們僅僅是使用了空洞卷積,按照上面對空洞卷積第二層理解也就是從卷積核的角度出發,我們相當於在kernel size內部每隔一個卷積核插入(dilation rate - 1)個0,共插入(kernel-1)次。再加上原始的卷積核的感受野,可以這樣計算:
kernel_size_after_dilate = (dilate rate -1) * (kernel_size_before_dilate - 1) + kernel_size_before_dilate
這裏是dilation rate是2,kernel_size_before_dilate=3。因此我們的kernel_size_after_dilate感受野爲:(2-1)*(3-1)+3 = 5。 這裏第一個3代表的原始的感受野,也就是kernel size大小,這裏是3。
4.2 一個稍微複雜的例子
5. 最初的四個問題
在第二小節中我們提出了四個問題,現在我們可以嘗試回答一下:
- 紅點代表什麼意思?代表的是感受野的中心~
- 爲什麼擴張卷積導致圖像尺寸不變?
從4.1那個一維的例子出發我們可以直觀的理解,空洞卷積只是可以以指數形式提高網絡的感受野,但是不改變圖像輸出的特徵圖。特徵圖的計算可以依據:
3.圖中最外層圖像的代表什麼?
代表的就是感受野的大小
其實這個公式自己並不是特別理解,也不是特別好用,感覺不具有一般性。
下面是關於多尺度的一些理解:
個人理解,理解多尺度首先理解尺度空間,我們的尺度空間是分辨率是相同的,然後使用不同的高斯核(傳統反向);從直覺上說,這個多尺度是模仿人類的視網膜的特徵,不同的距離看的物體模糊是不同的,離我們越遠,然後越模糊,從而我們看到全局信息;離我們越近的話,我們看的越清楚,然後看到的是局部信息。從cnn網絡來看我們使用不同的conv層,(縮放到同一尺寸下面)。越深的卷積層提取出的特徵圖越抽象,提取到的特徵更高級。所以這個就相當於是一種不同的尺度下的特徵(分辨率一致)這麼理解的。而多和多尺度相對應的是多分辨率,他的分辨率不是不變的,常見的是圖像金字塔,它的分辨率是逐漸縮小的
7. Tensorflow和Pytorch使用空洞卷積
7.1 Tensorflow
tf.nn.atrous_conv2d()
參考:
7.2 Pytorch
參考文章: