1、Convolution層:
就是卷積層,是卷積神經網絡(CNN)的核心層。
層類型:Convolution
lr_mult: 學習率的系數,最終的學習率是這個數乘以solver.prototxt配置文件中的base_lr。如果有兩個lr_mult, 則第一個表示權值的學習率,第二個表示偏置項的學習率。一般偏置項的學習率是權值學習率的兩倍。
在后面的convolution_param中,我們可以設定卷積層的特有參數。
必須設置的參數:
num_output: 卷積核(filter)的個數
kernel_size: 卷積核的大小。如果卷積核的長和寬不等,需要用kernel_h和kernel_w分別設定
其它參數:
stride: 卷積核的步長,默認為1。也可以用stride_h和stride_w來設置。
pad: 擴充邊緣,默認為0,不擴充。 擴充的時候是左右、上下對稱的,比如卷積核的大小為5*5,那么pad設置為2,則四個邊緣都擴充2個像素,即寬度和高度都擴充了4個像素,這樣卷積運算之后的特征圖就不會變小。也可以通過pad_h和pad_w來分別設定。
weight_filler: 權值初始化。 默認為“constant",值全為0,很多時候我們用"xavier"算法來進行初始化,也可以設置為”gaussian"
bias_filler: 偏置項的初始化。一般設置為"constant",值全為0。
bias_term: 是否開啟偏置項,默認為true, 開啟
group: 分組,默認為1組。如果大於1,我們限制卷積的連接操作在一個子集內。如果我們根據圖像的通道來分組,那么第i個輸出分組只能與第i個輸入分組進行連接。
輸入:n*c
0*w
0*h
0
輸出:n*c
1*w
1*h
1
其中,c
1就是參數中的num_output,生成的特征圖個數
w
1=(w
0+2*pad-kernel_size)/stride+1;
h
1=(h
0+2*pad-kernel_size)/stride+1;
如果設置stride為1,前后兩次卷積部分存在重疊。如果設置pad=(kernel_size-1)/2,則運算后,寬度和高度不變。
net.conv1 = caffe.layers.Convolution( net.data, param=[{"lr_mult": 1, "decay_mult": 1}, {"lr_mult": 2, "decay_mult": 1}], #lr_mult: 學習率的系數,最終的學習率是這個數乘以solver.prototxt配置文件中的base_lr。
#如果有兩個lr_mult, 則第一個表示權值的學習率,第二個表示偏置項的學習率。一般偏置項的學習率是權值學習率的兩倍。 name="Conv1", kernel_size=3, stride=1, pad=1, num_output=20, group=2, weight_filler=dict(type='xavier'), bias_filler=dict(type='constant',value=0))
輸出: layer { name: "Conv1" type: "Convolution" bottom: "data" top: "conv1" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 1 } convolution_param { num_output: 20 pad: 1 kernel_size: 3 group: 2 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } }
形式二: net.conv2 = caffe.layers.Convolution( net.data, param=[{"lr_mult": 1, "decay_mult": 1}, {"lr_mult": 2, "decay_mult": 1}], name="Conv2", convolution_param=dict( kernel_size=3, stride=1, pad=1, num_output=20, group=2, weight_filler=dict(type='xavier'), bias_filler=dict(type='constant',value=0)) ) 輸出相同: layer { name: "Conv2" type: "Convolution" bottom: "data" top: "conv2" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 1 } convolution_param { num_output: 20 pad: 1 kernel_size: 3 group: 2 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } }