1. 程式人生 > >膨脹卷積與IDCNN

膨脹卷積與IDCNN

sha 處理 ted XA rate fin false 滑動 channel

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