caffe引數詳解
solver.prototxt
net:訓練預測的網路描述檔案,train_test.prototxt
test_initialization:取值為true或者false,預設為true,就是剛啟動就進行測試,false的話不進行第一次的測試。
test_iter:在測試的時候,需要迭代的次數,即test_iter* batchsize(測試集的)>=測試集的大小,測試集的 batchsize可以在prototxt檔案裡設定。
test_interval:訓練的時候,每迭代test_interval次就進行一次測試。
base_lr:基礎學習速率。
gamma:調節學習速率的因子
power:調節學習速率需要用到的引數
stepsize:每隔stepsize降低學習速率,每隔stepsize,基礎學習速率*gamma
stepvalue: "multistep"學習策略需要用到的引數,每到stepvalue,按"step"的方式調整學習速率
lr_policy:
"fixed":固定學習速率,始終等於base_lr
"step":步進衰減,base_lr*gamma^(floor(iter/stepsize))
"exp":指數衰減,base_lr*gamma^(iter)
"inv":倒數衰減,base_lr*(1+gamma*iter)^(-power)
"multistep":多步衰減,與步進衰減類似,允許非均勻步進值(stepvalue)
"ploy":多項式衰減,在max_iter時達到0,base_lr*(1-iter/max_iter)^(power)
"sigmoid":S形衰減,base_lr*(1/(1+exp^(-gamma*(iter-stepsize))))
display:每display次列印一次Loss
max_iter:訓練的最大迭代次數
momentum:衝量,靈感來自於牛頓第一定律,基本思路是為尋優加入了“慣性”的影響,這樣一來,當誤差曲面中存在平坦區的時候,SGD可以更快的速度學習。
weight_decay:權衰量,
snapshot:迭代snapshot次,列印一次快照,即儲存一次*.caffemodel,*.solverstate
snapshot_prefix:快照,*.caffemodel,*.solverstate儲存的位置
solver_mode:訓練模式,可選,CPU,GPU,2種模式
train_test.prototxt
資料層引數:
data:資料層
type:資料屬性,包含3種格式,1種是Data,輸入格式為LMDB,LEVELDB,另一種是ImageData,輸入格式為*.txt,txt中格式為,路徑圖片 類別標籤,第三種為HDF5Data,該格式支援頻譜圖、特徵向量的輸入,
ps:matlab生成HDF5步驟,假設每個特徵向量為512維,輸入1000個特徵向量
%
建立
HDF5
檔案,包含
data
和
label
兩個變數,資料型別是
caffe
支援的
float
型資料
h5
create('train.h5','/data',[1 1 512 1000],'Datatype','single');
h5create('train.h5','/label',[1 1 1 1000],'Datatype','single');
%reshape: width x height x channels x num
,注意
MATLAB
讀資料是列優先,是和
C++
裡面相反的。所以寫資料的時候也要倒著寫。
train_data = reshape(train_data,[1 1 512 1000]);
train_label = reshape(train_label,[1 1 1 1000]);
h5write('train.h5' ,'/data' , single(train_data));
h5write('train.h5' ,'/label', single(train_label));
HDF5Data-layer引數,
layer
{
name: "data"
type: "HDF5Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
hdf5_data_param {
source: "train.txt"
batch_size: 128
shuffle: true
}
}
train.txt內容,shuffle只對H5檔案進行亂序,而每個H5檔案內部的順序不動,
train1.h5
train2.h5
...
mean_value:訓練圖片需要減去的均值,一般為127.5
scale:資料變換使用的資料縮放因子
mirror:是否做映象操作,可選,true,false
crop_size:crop變換的大小
mean_file:均值檔案
source:資料來源地址,可以是LMDB或者txt格式的檔案
batchsize:批量讀取的圖片數目
shuffle:是否要打亂圖片順序,使不同類別交叉排列,可選,true,false
backend:資料格式,可選引數,LMDB,LEVELDB
rand_skip:跳過開頭的 rand_skip * rand(0,1)個數據,通常在非同步隨機梯度下降法裡使用
卷基層引數:
Convolution:卷基層
lr_mult: 學習率,但是最終的學習率需要乘以 solver.prototxt 配置檔案中的 base_lr .
如果有兩個 lr_mult, 則第一個表示 weight 的學習率,第二個表示 bias 的學習率
一般 bias 的學習率是 weight 學習率的2倍
blobs_lr:和lr_mult意思一樣,有的配置檔案也這麼寫
decay_mult:權值衰減,為了避免模型的over-fitting,需要對cost function加入規範項。
weight_decay: 和decay_mult意思一樣,有的配置檔案也這麼寫
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_filter:權值初始化。預設為“constant”,值全為0,很多時候我們用”xavier”演算法來進行初始化,也可以設定為”gaussian”
weight_filler {
type: "constant"
value:0
}
weight_filler {
type: "xavier"
}
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filter:偏置項的初始化。一般設定為”constant”,值全為0
bias_filler {
type: "constant"
value: 0
}
bias_term:是否開啟偏置項,預設為true,開啟
group:預設為1,如果大於1,那麼將每個濾波器都限定只與某個輸入的子集有關聯。換句話說,將輸入分為group組,同時將輸出也分為group組。那麼第i組輸出只與第i組輸入有關。
dilation:atrous(hole algorithms),RFCN中的亮點,可以增大map,提高對小目標的檢測。詳細可以參考RestNet-res3a,RestNet-OHEM。
AbsVal:使用 abs(x)函式計算每個輸入資料 x 的輸出
Power:使用函式(shift + scale * x) ^ power 計算每個輸入資料 x的輸出
power_param {
power: 1
scale: 1
shift: 0
}
BNLL:使用函式log(1 + exp(x)) 計算每個輸入資料 x 的輸出
Dropout:防止模型過擬合;訓練模型時,隨機讓網路某些隱含層節點的權重不工作,
dropout_param { dropout_ratio: 0.5 #
丟棄資料的概率
}
Eltwise:將2個bottom合併為1個top,合併的方式為,PRODUCT(點乘), SUM(相加減) 和 MAX(取大值),其中SUM是預設操作
bottom相加:
eltwise_param {
operation: SUM
}
bottom相減:
eltwise_param {
operation: SUM
coeff:1
coeff:-1
}
bottom取大值:
eltwise_param {
operation: MAX
}
InnerProduct:也就是全連線層,fully_connected (fc)layer,主要實現,C←αA×B+βC,A為M*K維矩陣,B為K*N維矩陣,C為M*N維矩陣,缺點就是,使用包含全連線層的模型(如AlexNet)必須使用固定大小的輸入,有時這是非常不合理的,因為必須對輸入圖片進行變形
lr_mult,decay_mult,weight_filter,bias_filter
Split:將blob複製為n份,分給不同的Layer,所有Layer共享該blob,實現為1個bottom,n個top
Slice:輸入1個bottom,輸出n個top,將blob中的資料切分為n份,假設input的維度是N*5*H*W,tops輸出的維度分別為N*1*H*W ,N*2*H*W, N*1*H*W, N*1*H*W 。
這裡需要注意的是,如果有slice_point,slice_point的個數一定要等於top的個數減一。
axis表示要進行分解的維度,0為N(num)上分解,1為C(channel)上分解。
slice_point的作用是將axis按照slic_point 進行分解。
slice_point沒有設定的時候則對axis進行均勻分解。
slice_param {
axis: 1
slice_point: 1
slice_point: 3
slice_point: 4
}
Concat:將多個layer進行組合拼接,輸入為n個bottom,輸出為1個top,例如,輸入k個blob為,n_i*c_i*h*w,則,
axis=0,輸出為(n_1+n_2+……+n_k)*c_i*h*w,
axis=1,輸出為n_i*(c_1+c_2+……c_k)*h*w,
axis表示要進行分解的維度,0為N(num)上拼接,1為C(channel)上拼接。
concat_param{
axis:1
}
Reduction:將某個維度縮減至1維,方法可以是sum、mean、asum、sumsq。
axis表示要進行縮減的維度,0為N(num)上縮減,1為C(channel)上縮減。
reduction_param {
axis: 0
}
Flatten: 把一個輸入的大小為n * c * h * w變成一個簡單的向量,其大小為 n * (c*h*w) * 1 * 1。
Reshape:改變blob的維度,而不改變其自身的資料,每個blob為4維,故有4個dim引數,0代表不改變維度的值,-1代表由caffe計算出值,正數代表將維度更改為對應的值
reshape_param {
shape {
dim: 0 # copy the dimension from below
dim: 2
dim: 3
dim: -1 # infer it from the other dimensions
}
}
Crop:輸入兩個blob,將bottom[0] 按照bottom[1]的尺寸進行剪裁,
axis=0,1,2,3分別表示為N,C,H,W;預設axis等於2,即預設從H開始裁剪(裁剪H和W);可以只設置1個,也可以為每個dimension分別設定,
offset表示裁剪時的偏移量,
crop_param {
axis: 2
offset: 5
}
BatchNorm:batch歸一化層,需要和Scale層一起使用,即一個BatchNorm後面跟一個Scale,use_global_stats訓練的時候設定為false,這時caffe會基於當前batch計算均值和方差,測試的時候設定為true,此時會強制使用模型中儲存的均值和方差引數。
batch_norm_param{
use_global_stats:true
}
Scale:
scale_param{
bias_term:true
}
LRN(Local ResponseNormalization):AlexNet的產物,後期感覺對performance提升意義不大,local_size ,預設為5,對於cross channel LRN為需要求和的鄰近channel的數量,對於within channel LRN為需要求和的空間區域的邊長
alpha ,預設為1,scaling引數
beta ,預設為 5,指數
norm_region,預設為ACROSS_CHANNELS,
選擇LRN實現的方法:
1. ACROSS_CHANNELS ,輸出大小為localsize×1×1,
2. WITHIN_CHANNEL,輸出大小為1×localsize×localsize,
lrn_param{
local_size:5
alpha:0.0001
beta:0.75
}
啟用層引數:
ReLU:非線性層,使用ReLU作為啟用函式,對於給定的一個輸入值x,如果x > 0,ReLU層的輸出為x,如果x < 0,ReLU層的輸出為0,可選引數negative_slope,此引數使得x <0時,ReLU層的輸出為negative_slope * x,類似於PReLU的功能,RELU層支援原址計算(in-place)
relu_param{ negative_slope: [
預設:
0] }
PReLU: 非線性層,使用PReLU作為啟用函式,在負半軸的輸出乘以一個係數,而這個係數是可學習的(你可以為其指定學習率),其中value是係數的初始值,channel_shared指定是否在各個通道間共享這個係數。
prelu_param { filler: { value: 0.33 #:
預設為
0.25 } channel_shared: false }
TanH: 使用 tanh(x)函式作為啟用函式計算每個輸入資料 x的輸出
損失層引數:
SoftmaxWithLoss:類似svm,用於分類的層,輸入blob為ip和label,這裡注意label要從0開始(2個bottom),輸出blob為loss(1個top),用於單標籤多分類任務,各概率相互不獨立,總和為1,這裡需要注意一下,softmax有一個預設的隱含的引數,loss_weight,預設該值為1,所以大部分的時候,尤其是隻有1個Loss的時候是不寫這個的。但是當有多個Loss的時候,loss_weight的設定就很有必要了,例如下面的center_loss
SigmoidCrossEntropyLoss:S形交叉熵損失,用於目標概率分佈和多標籤多分類任務,各概率相互獨立
layer{
name:"loss"
type:" SigmoidCrossEntropyLoss"
bottom:"loss3/classifier"
bottom:"label"
top:"loss"
}
EuclideanLoss:歐式距離損失,適用於實數值迴歸問題,
layer{
name:"loss"
type:" EuclideanLoss "
bottom:"loss3/classifiersigmoid"
bottom:"label"
top:"loss"
}
HingeLoss:鉸鏈損失,norm支援L1,L2,預設norm為L1,
# L1 Norm
layer {
name: "loss"
type: "HingeLoss"
bottom: "pred"
bottom: "label"
}
# L2 Norm
layer {
name: "loss"
type: "HingeLoss"
bottom: "pred"
bottom: "label"
top: "loss"
hinge_loss_param {
norm: L2
}
}
ContrastiveLoss:Siamese雙生貓中提出的損失,用於人臉識別中,deepid2中也有使用
layer {
name: "loss"
type: "ContrastiveLoss"
bottom: "feat"
bottom: "feat_p"
bottom: "sim"
top: "loss"
contrastive_loss_param {
margin: 1
}
}
TripletLoss:FaceNet中提出的三元組,用於人臉識別
CenterLoss:
caffeFace提出的損失,用於人臉識別,起到增大類間距離,減少類類距離
layer {
name: "center_loss"
type: "CenterLoss"
bottom: "fc5"
bottom: "label"
top: "center_loss"
param {
lr_mult: 1
decay_mult: 2
}
center_loss_param {
num_output: 10572
center_filler {
type: "xavier"
}
}
loss_weight: 0.008
}
池化層引數:
Pooling:池化層
pool:池化方法,預設為MAX。目前可用的方法有 MAX, AVE,STOCHASTIC
kernel_size:池化的核大小
stride:池化的步長
準確率層引數:
Accuracy:分類準確率層,只在test階段有效,輸入blob為的ip和label(2個bottom),輸出blob為accuracy(1個top)
可選引數,top_k表示前幾正確率
accuracy_param {
top_k: 5
}