Dilation 卷積,也被稱為:空洞卷積、膨脹卷積。
一、一般的卷積操作:
首先,可以通過動態圖,理解正常卷積的過程:

如上圖,可以看到卷積操作。
對於CNN結構,通常包括如下部分:
輸入層 (input layer)--- 卷積計算層 (CONV)--- 激勵層(RELU) --- 池化層(Pooling) --- 全連接層(FC)
通常利用卷積來實現數據的特征提取。卷積層還有一個權值共享的原則:用一句話表達就是每個神經元只關注一個特征。
當然卷積完經過激勵層做一個非線性映射,輸出后就到Pooling layer了。
池化層的作用:
(1)壓縮數據和參數的量,減小過擬合。
(2)增大感受野。
主要兩種方法:Max Pooling 和 Average Pooling
對於有些算法,池化完還需要upsampling獲得原始數的尺寸進行后續操作。由於這種通過卷積操作存在內部數據丟失的問題,存在信息損失,有人提出了dilated conv算法,即不通過池化獲得較大的視野,並減小信息損失。
二、膨脹卷積

如上圖,膨脹卷積的好處是不做pooling損失信息的情況下,加大了感受野,讓每個卷積輸出都包含較大范圍的信息。在圖像需要全局信息或者自然語言處理中需要較長的sequence信息依賴的問題中,都能很好的應用。
在tensorflow中代碼為:
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”:丟棄多余的
三、IDCNN(Iterated Dilated CNN)
模型是4個大的相同結構的Dilated CNN block拼在一起,每個block里面是dilation width為1, 1, 2的三層Dilated卷積層,所以叫做 Iterated Dilated CNN。參考代碼實現:
layers = [
{
'dilation': 1
},
{
'dilation': 1
},
{
'dilation': 2
},
]
finalOutFromLayers = []
totalWidthForLastDim = 0
for j in range(4):
for i in range(len(layers)):
dilation =layers[i]['dilation']
isLast = True if i == (len(layers) - 1) else False
w = tf.get_variable("filterW",shape=[1, filter_width, num_filter,num_filter],initializer=tf.contrib.layers.xavier_initializer())
b = tf.get_variable("filterB", shape=[num_filter])
conv = tf.nn.atrous_conv2d(layerInput,w,rate=dilation,padding="SAME")
conv = tf.nn.bias_add(conv, b)
conv = tf.nn.relu(conv)
if isLast:
finalOutFromLayers.append(conv)
totalWidthForLastDim += num_filter
layerInput = conv
finalOut = tf.concat(axis=3, values=finalOutFromLayers)
通過代碼可以看到具體的IDCNN的實現流程以及輸出的結合方式。
