2017-09-01 152 views
0

我在Ubuntu下成功編譯Caffe並開始研究如何定義和訓練我自己的網絡。然而,我很難理解卷積層如何產生它的輸出。例如,第二卷積層(CONV2)的LeNet MNIST教程(tutoriallenet.prototxt)具有20個輸入圖像和50倍輸出的圖像:瞭解Caffe卷積層

layer { 
    name: "conv2" 
    type: "Convolution" 
    bottom: "pool1" 
    top: "conv2" 
    param { 
    lr_mult: 1 
    } 
    param { 
    lr_mult: 2 
    } 
    convolution_param { 
    num_output: 50 
    kernel_size: 5 
    stride: 1 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
    } 
    } 
} 

如何輸出圖像O_0, ..., O_49計算的?我的直覺是,它是這樣工作的(I_i輸入圖像,K_j仁,B_k biasses,*卷積運算符):

O_0 = I_0 * K_0 + ... + I_19 * K_19 + B_0 
O_1 = I_0 * K_20 + ... + I_19 * K_39 + B_1 
... 
O_49 = I_0 * K_980 + ... + I_19 * K_999 + B_49 

這是假設是正確的?

回答

2

在卷積層中,內核(也稱爲過濾器)與輸入特徵映射進行卷積並生成輸出特徵映射。一組特徵映射被稱爲blob。每個內核都是一個3D對象,其大小爲C x H x W。這裏C是平面或通道號,H是高度和W是內核的寬度。通常,內核是方形的,即內核的高度和寬度是相同的。內核的通道或平面的數量或深度應與輸入特徵映射或圖像的數量相同。圖像和一組內核之間的卷積運算的輸出被稱爲特徵映射。此外,特徵映射和內核之間的後續卷積產生也稱爲特徵映射的輸出。如上所述,內核是3D數組。當內核在輸入圖像上滑動或卷積時,它將內核中的值與圖像的原始像素值相乘。因此,內核數組的每個值都與圖像的相應像素相乘。最後,將所有產品加在一起給出輸出特徵映射的一個值。然後內核按給定的步幅滑動,並再次啓動該過程以生成輸出特徵映射的下一個值。一個內核產生一個稱爲特徵映射的輸出平面。因此N內核生成N功能圖。每個內核都有一個偏置元素,它被添加到輸出特徵映射的每個值中。偏置元素的數量等於內核的數量。

對於3×3×3內核的卷積計算如下:

enter image description here

這裏pqř取決於步幅。

下面是從Stanford wiki的動畫精美解釋它:

enter image description here

的輸入和輸出特徵圖之間的關係給定爲

輸入:
C_IN =否在通道的輸入特徵圖
H_in =輸入特徵圖的高度
W_in =輸入特徵圖的寬度

輸出:
N_OUT =無籽粒的
C_out =否在內核通道
H_out =(H_IN + 2×填充高度 - 內核高度)/步幅高度+ 1
W_OUT =(W_IN + 2 x填充寬度 - 核寬度)/步幅寬度+ 1

所有C_out平面合併(累積)以形成一個平面。因此輸出是一組N_out,H_out x W_out特徵映射。

服用AlexNet例如:

層1個

輸入數據(RGB圖像):(3,227,227)
CONV1內核:(96,3,11,11 )
器CONV1的輸出:(96,55,55)

N = 96,C = 3,H = 11,W = 11
填充高度= 0,填充寬度= 0
步幅高度= 4
跨距寬度= 4

在這裏,每個(3×11×11)的內核卷積用(3×227 X 227)圖像,使得與相應的信道內核卷積的每個信道的形象。您可以將其視爲一個(11 x 11)蒙板,在(227 x 227)輸入要素圖上進行卷積以得到(55 x 55)輸出要素圖。這3個通道是針對每個內核獲得的。之後,將不同通道的相應特徵加在一起以給出一個(55×55)特徵圖。生成這樣的96個特徵圖。因此,獲得(96 x 55 x 55)輸出斑點。

(55,55)=((227 + 2×0 - 11)/ 4 + 1,(227 + 2×0 - 11)/ 4 + 1)

RELU

正常化

二層

輸入特徵圖:(96,27,27)
CONV2內核:(256,48,5,5)
CONV2輸出:(256,27,27)

N = 256,C = 48,H = 5,W = 5
填充高度= 2,填充寬度= 2
步幅高度= 1
跨距寬度= 1

這裏,輸入特徵映射具有96個通道,但內核48只有頻道。所以,輸入特徵映射被分成兩組(48×27×27)特徵映射。 256(48×5×5)內核也被分成兩組128(48×5×5)內核。之後,每組輸入特徵映射與一組128(48×5×5)內核卷積。這導致2組(48×27×27)特徵圖。兩組中的每一組都有128個(48 x 27 x 27)特徵地圖。現在,每個集合的48個通道合併爲128(27 x 27)個特徵地圖。因此獲得2組128(27×27)個特徵圖。這兩組現在連接在一起產生(256 x 27 x 27)輸出blob。

(27,27)=((27 + 2×2 - 5)/ 1 + 1,(27 + 2×2 - 5)/ 1 + 1)

PS:後面卷積的數學無論是Caffe,Keras,Tensorflow還是Torch,所有工具都是常見的。只是代碼在每個實現中都有不同的優化。