Caffe 中 solver.prototxt 和 train_test.prototxt 參數詳解

A. 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:調節學習速率需要用到的參數

type:採用哪一種優化算法,參考:http://blog.csdn.net/renhanchi/article/details/77983345

stepsize:”step”學習策略需要用到的參數,每隔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))))

關於lr_policy的可視化理解,可以參考下面兩個鏈接的內容,更直觀的表達了用不同的學習策略時學習率的變化情況。
https://stackoverflow.com/questions/30033096/what-is-lr-policy-in-caffe
http://blog.csdn.net/langb2014/article/details/51274376

display:每display次打印一次Loss

max_iter:訓練的最大迭代次數

momentum:衝量,靈感來自於牛頓第一定律,基本思路是爲尋優加入了“慣性”的影響,這樣一來,當誤差曲面中存在平坦區的時候,SGD可以更快的速度學習。

weight_decay:權衰量,

snapshot:迭代snapshot次,打印一次快照,即保存一次.caffemodel,.solverstate

snapshot_prefix:快照,.caffemodel,.solverstate保存的位置

solver_mode:訓練模式,可選,CPU,GPU,2種模式

B.train_test.prototxt:

1, 數據層參數:

data:數據層

type:數據屬性,包含3種格式,1種是Data,輸入格式爲LMDB,LEVELDB,另一種是ImageData,輸入格式爲*.txt,txt中格式爲,路徑圖片 類別標籤,第三種爲HDF5Data,該格式支持頻譜圖、特徵向量的輸入,

ps:matlab生成HDF5步驟,假設每個特徵向量爲512維,輸入1000個特徵向量。

% 創建HDF5文件,包含data和label兩個變量,數據類型是caffe支持的float型數據

h5create('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)個數據,通常在異步隨機梯度下降法裏使用

2, 卷基層參數:

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

}

3, 激活層參數:

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的輸出

4, 損失層參數:

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

}

4, 池化層參數:

Pooling:池化層

pool:池化方法,默認爲MAX。目前可用的方法有 MAX, AVE,STOCHASTIC

kernel_size:池化的核大小

stride:池化的步長

5, 準確率層參數:

Accuracy:分類準確率層,只在test階段有效,輸入blob爲的ip和label(2個bottom),輸出blob爲accuracy(1個top)

可選參數,top_k表示前幾正確率

accuracy_param {

    top_k: 5

  }

本文轉載自:http://blog.csdn.net/qq_14845119/article/details/54929389

發佈了22 篇原創文章 · 獲贊 40 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章