膨脹卷積與IDCNN
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的實現流程以及輸出的結合方式。
膨脹卷積與IDCNN