1. 程式人生 > >空洞卷積與反捲積

空洞卷積與反捲積

空洞卷積(dilated conv),也稱擴張卷積。空洞卷積可以在kernel有效增大感受野的同時不增加模型引數或者計算量。在影象需要全域性資訊或者語音文字需要較長的sequence資訊依賴的問題中,都能較好的應用空洞卷積。在影象分割,語音合成WaveNet,機器翻譯ByteNet中都有空洞卷積的身影。

一般情況下,圖片輸入到網路中,網路將會對影象做卷積再池化(pooling)的操作,pooling的操作即降低了影象尺寸的同時增大感受野。但由於影象分割預測是pixel-wise的輸出,所以將pooling後較小的影象上取樣(upsampling)到原始的影象尺寸進行預測一般需要採用反捲積(deconv)操作。之前pooling一般為max pooling,所以該pooling操作使得每個pixel能預測都能看大較大感受野資訊。

所以在影象分割網路中有兩個關鍵點:
1、pooling減少圖片的尺寸增大感受野
2、通過upsampling擴大圖片尺寸。

由於在先減少再增大的過程中肯定會有一些資訊損失,為了減少由pooling帶來資訊損失,所以就提出空洞卷積,他能不通過pooling來增大感受野。
第一個是正常卷積

在空洞卷積中有個重要的引數叫raterate,這個引數代表了空洞的大小。
要理解空洞概念和如何操作可以從兩個角度去看
1)從原圖角度,所謂空洞就是在原圖上做取樣。取樣的頻率是根據rate引數來設定的,當rate為1時候,就是原圖不丟失任何資訊取樣,此時卷積操作就是標準的卷積操作,當rate>1,比如2的時候,就是在原圖上每隔一(rate-1)個畫素取樣,如圖b,可以把紅色的點想象成在原圖上的取樣點,然後將取樣後的影象與kernel做卷積,這樣做其實變相增大了感受野
2)從kernel角度去看空洞的話就是擴大kernel的尺寸,在kernel中,相鄰點之間插入rate-1個零,然後將擴大的kernel和原圖做卷積 ,這樣還是增大了感受野。

在VGG網路中就證明了使用小卷積核疊加來取代大卷積核可以起到減少引數同時達到大卷積核同樣大小感受野的功效。但是通過疊加小卷積核來擴大感受野只能線性增長,而空洞卷積可以以指數級增長感受野。

反捲積(deconv):
主要用於增大影象尺寸,是upsampling的一種,而空洞卷積並沒有做upsampling,空洞卷積是為了增大感受野,可以不改變影象的大小。
對於反捲積簡單理解就是在輸入特徵矩陣中插入空白點,再進行卷積,這樣卷積後輸出的特徵矩陣就變大了。

對於標準k*k卷積核,stride為s,分三種情況:

1) s

> 1 s>1 ,在卷積同時伴隨著downsampling操作,卷積後圖像變小了(這種操作也可以增大感受野,但是輸出的影象大小變小了)
2) s = 1 s=1 ,在padding設定為stride大小時,卷積後圖片大小不變
3) s < 1 s<1 ,相當於對原圖作upsampling操作進行擴大原圖,然後再卷積,這樣得到的結果圖就變大了。例如 s = 0.5 s=0.5 意味著在原特徵圖的每相鄰資料間插入一個空白資料,這樣再進行卷積,它的輸出特徵圖就變大了。

上面3)所描述的就是反捲積,它的核心是在原來影象上插入空白資料。而空洞卷積就是在卷積核插入空白資料,或是說在卷積是跳過特徵圖的部分資料。