caffe的model是需要用prototxt來定義的,如果要訓練自己的model我們就需要自己來寫prototxt文件,這篇博文主要寫caffe的layer是如何來定義的。
參考:http://caffe.berkeleyvision.org/tutorial/layers.html
layer的源代碼在$caffe-master/src/caffe/layers
卷積層
- layer類型:
Convolution
- 參數:(
ConvolutionParameter convolution_param
)- 必選
num_output
(c_o
):filter的的數目kernel_size
(orkernel_h
andkernel_w
):filter的尺寸,即長、寬
- 推薦
-
weight_filler
:對權值的初始化設置,默認是{type:"constant" value:0},即初始化為常數0。type也可以選擇高斯分布,這需要給定標准差和均值
-
- 可選
bias_term
[defaulttrue
]:是否對filter設定偏置項,默認為truepad
(orpad_h
andpad_w
) [default 0]:對輸入的每個邊進行填充像素的個數,默認為0-
stride
(orstride_h
andstride_w
) [default 1]:filter在輸入圖像上的滑動步長 -
group
(g) [default 1]:當g>1時,將輸入和輸出的channels分為g個組,第i個輸入group channels只與第i個輸出group channels相對應。
- 必選
- 輸入
n * c_i * h_i * w_i
- 輸出
n * c_o * h_o * w_o
,其中h_o = (h_i + 2 * pad_h - kernel_h) / stride_h + 1
,w_o也類似
layer {
name: "conv1" //層的名字
type: "Convolution" //層的類型
bottom: "data" //底層的blob
top: "conv1" //上層的blob
//filters的學習率和衰減參數
param { lr_mult: 1 decay_mult: 1 }
// biases的學習率和衰減參數
param { lr_mult: 2 decay_mult: 0 }
convolution_param {
num_output: 96 # learn 96 filters
kernel_size: 11 # each filter is 11x11
stride: 4 # step 4 pixels between each filter application
weight_filler {
type: "gaussian" // 用Gaussian分布初始化
std: 0.01 // 標准差為0.01,均值默認為0
}
bias_filler {
type: "constant" //初始化為常數
value: 0
}
}
}
池化層
- layer類型:
Pooling
- 參數:
PoolingParameter pooling_param
- 必選
kernel_size
:filter的尺寸
- 可選
-
pool
[default MAX]:pool的類型,MAX、AVE或者 STOCHASTIC pad
(orpad_h
andpad_w
) [default 0]:對輸入的每個邊進行填充像素的個數,默認為0stride
(orstride_h
andstride_w
) [default 1]:filter在輸入圖像上的滑動步長
-
- 必選
- 輸入
n * c_i * h_i * w_i
- 輸出
n * c_o * h_o * w_o
,其中h_o = (h_i + 2 * pad_h - kernel_h) / stride_h + 1
,w_o也類似
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3 # pool over a 3x3 region
stride: 2 # step two pixels (in the bottom blob) between pooling regions
}
}
ReLU層
layer {
name: "relu1"
type: "ReLU"
bottom: "conv1"
top: "conv1"
}
Dropout層
layer {
name: "drop7"
type: "Dropout"
bottom: "fc7"
top: "fc7"
dropout_param {
dropout_ratio: 0.5 //dropout率
}
}
全連接層
- layer類型:
Pooling
- 參數:
InnerProductParameter inner_product_param
- 必選
kernel_size
:filter的尺寸
- 推薦
-
weight_filler
:對權值的初始化設置,默認是{type:"constant" value:0},即初始化為常數0。type也可以選擇高斯分布,這需要給定標准差和均值
-
- 可選
-
bias_term
[defaulttrue
]:是否對filter設定偏置項,默認為true -
bias_filler
[defaulttype: 'constant' value: 0
]
-
- 必選
- 輸入
n * c_i * h_i * w_i
- 輸出
n * c_o * h_o * w_o
,其中h_o = (h_i + 2 * pad_h - kernel_h) / stride_h + 1
,w_o也類似
layer {
name: "fc8"
type: "InnerProduct"
param { lr_mult: 1 decay_mult: 1 }
param { lr_mult: 2 decay_mult: 0 }
inner_product_param {
num_output: 1000
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
bottom: "fc7"
top: "fc8"
}
SoftMax層
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "fc8"
bottom: "label"
top: "loss"
}
Accuracy層
layer {
name: "accuracy"
type: "Accuracy"
bottom: "fc8"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}