參考:https://www.cnblogs.com/houjun/p/10275215.html
https://www.jianshu.com/p/f743bd9041b3

正常卷積運算

二、提出的原因
Deep CNN 對於其他任務還有一些致命性的缺陷。較為著名的是 up-sampling 和 pooling layer 的設計。
主要問題有:
1、Up-sampling / pooling layer (e.g. bilinear interpolation) is deterministic. (參數不可學習)
2、內部數據結構丟失;空間層級化信息丟失。
3、小物體信息無法重建 (假設有四個pooling layer 則 任何小於 2^4 = 16 pixel 的物體信息將理論上無法重建。)
在這樣問題的存在下,語義分割問題一直處在瓶頸期無法再明顯提高精度, 而 dilated convolution 的設計就良好的避免了這些問題。
三、膨脹卷積的好處是不做pooling損失信息的情況下,加大了感受野,讓每個卷積輸出都包含較大范圍的信息。在圖像需要全局信息或者自然語言處理中需要較長的sequence信息依賴的問題中,都能很好的應用。
1 tf.nn.atrous_conv2d(value,filters,rate,padding,name=None)
value:輸入的卷積圖像,[batch, height, width, channels]。
filters:卷積核,[filter_height, filter_width, channels, out_channels],通常NLP相關height設為1。
rate:正常的卷積通常會有stride,即卷積核滑動的步長,而膨脹卷積通過定義卷積和當中穿插的rate-1個0的個數,實現對原始數據采樣間隔變大。
padding:”SAME”:補零 ; ”VALID”:丟棄多余的
膨脹后的卷積核尺寸:
膨脹的卷積核尺寸 = 膨脹系數 * (原始卷積核尺寸 - 1) + 1
kd = k +(k-1)·(r-1),其中kd是膨脹后的卷積核大小,k是原卷積核大小,r是膨脹系數
膨脹卷積感受野:
[(n-1)*(ksize+1)+ksize]×[(n-1)*(ksize+1)+ksize],n = 膨脹系數
空洞卷積的疊加感受野計算方法,下面來介紹一下空洞卷積的感受野變化(卷積核大小為 ,stride=1,下面的卷積過程后面的以前面的為基礎):
1-dilated conv:rate=1的卷積其實就是普通 因此
(
)卷積因此感受野為
2-dilated conv:rate=2可以理解為將卷積核變成了 ,因此
(
)感受野大小為
。
4-dilated conv:rate=4可以理解為將卷積核變成了 因此
(
)感受野大小為 15×15
可以看到將卷積以上面的過程疊加感受野變化會指數增長,感受野公式為 2i+2−1,for i = 0,1,2,3,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的感受野是指數級的增長。
a,b,c三張圖都是以前面結果為基礎,a的感受野是3x3,b以a圖進行卷積,b本身感受野為5x5(以原圖進行卷積,圖b示黑色正方形區域)加上以a的3x3感受野變成7x7,即,b圖的紅點對應a圖的卷積結果,對應原圖9x9像素。
(a)為k=3,stride=2 的普通卷積;(b)為k=3,stride=1的卷積;(c)為k=3,stride=1,dilation=2的空洞卷積,這里雖然卷積核長度仍為3,但每隔2個點采樣一次(也可以理解為長度為5但其中兩個位置權重為0)
以一維圖b紅色筆所示k=3,stride=1,dilation=1的卷積 + k=3,stride=1,dilation=2的空洞卷積之后每個feature maps像素對應疊加感受野是7x7。同理二維也一樣。五、問題

圖2.網格問題的圖示。 從左到右:像素(用藍色標記)有助於通過三個內核大小為3×3的卷積層計算中心像素(用紅色標記)。 (a)所有卷積層都具有膨脹率= 2.(b)隨后的卷積層的膨脹率分別為r = 1,2,3。
我們發現我們的 kernel 並不連續,也就是並不是所有的 pixel 都用來計算了,因此這里將信息看做 checker-board 的方式會損失信息的連續性。這對 pixel-level dense prediction 的任務來說是致命的。
我們將其稱為“網格化”(圖2):對於空洞卷積層L中的像素p,對像素p有貢獻的信息來自來自以p為中心的層L-1中的附近kd×kd區域。。由於擴張卷積在卷積核中引入零,因此從kd×kd區域參與計算的實際像素僅為k×k,
它們之間的間隙為r-1。如果k = 3,r = 2,則該區域中僅25個像素中的9個用於計算(圖2(a))。由於所有層具有相等的膨脹率r,那么對於頂部擴張卷積層L中的像素p,有助於計算p值的最大可能位置數是(w'×h')/ r2
其中w' ,h'分別是底部擴張卷積層的寬度和高度。結果,像素p只能以棋盤方式查看信息,並且在信息中丟失大部分(當r = 2時至少75%)。當由於額外的下采樣操作而在較高層中變大時,來自輸入可能非常稀疏,
這可能不利於學習,因為1)本地信息完全丟失; 2)信息可能在很遠的距離上無關緊要。網格效應的另一個結果是第L層的r×r區域附近的像素從完全不同的“網格”集接收信息,這可能損害本地信息的一致性。
2、Long-ranged information might be not relevant.
六、解決辦法-通向標准化設計:Hybrid Dilated Convolution (HDC)
在這里,我們提出一個簡單的解決方案 - 混合擴張卷積(HDC),以解決這個理論問題。 假設我們有N個卷積層,內核大小為K×K,擴展率為[r1,...,ri,...,rn],HDC的目標是讓一系列卷積運算的感受野的最終大小完全覆蓋一個正方形 區域沒有任何孔或缺少邊緣。
第一個特性是,疊加卷積的 dilation rate 不能有大於1的公約數。比如 [2, 4, 6] 則不是一個好的三層卷積,依然會出現 gridding effect。
第二個特性是,我們將 dilation rate 設計成 鋸齒狀結構,例如 [1, 2, 5, 1, 2, 5] 循環結構。
第三個特性是,我們需要滿足一下這個式子:
其中 是 i 層的 dilation rate 而
是指在 i 層的最大dilation rate,那么假設總共有n層的話,默認
。假設我們應用於 kernel 為 k x k 的話,我們的目標則是
,這樣我們至少可以用 dilation rate 1 即 standard convolution 的方式來覆蓋掉所有洞。

僅僅在一個卷積分支網絡下使用 dilated convolution 去抓取多尺度物體是一個不正統的方法。比方說,我們用一個 HDC 的方法來獲取一個大(近)車輛的信息,然而對於一個小(遠)車輛的信息都不再受用。假設我們再去用小 dilated convolution 的方法重新獲取小車輛的信息,則這么做非常的冗余。基於港中文和商湯組的 PSPNet 里的 Pooling module (其網絡同樣獲得當年的SOTA結果),ASPP 則在網絡 decoder 上對於不同尺度上用不同大小的 dilation rate 來抓去多尺度信息,每個尺度則為一個獨立的分支,在網絡最后把他合並起來再接一個卷積層輸出預測 label。這樣的設計則有效避免了在 encoder 上冗余的信息的獲取,直接關注與物體之間之內的相關性。
改進了ASPP包含:


參考: https://blog.csdn.net/u011974639/article/details/79144773
https://blog.csdn.net/gzq0723/article/details/80153848