caffe的prototxt檔案
阿新 • • 發佈:2018-11-17
【參考】
data_layer
1、Data層
layer { name: "cifar" type: "Data" top: "data" top: "label" include { phase: TRAIN } transform_param { mean_file: "examples/cifar10/mean.binaryproto" } data_param { source: "examples/cifar10/cifar10_train_lmdb" batch_size: 100 backend: LMDB } }
- name任取,表示這一層的名字
- type:層型別,如果是Data,表示資料來源是LevelDB後者LMDB,根據資料來源的不同,資料層的型別也不同,有些還是從磁碟中儲存hdf5或者圖片格式。
- top和bottom:top為此層輸出,bottom為此層輸入,在資料層中,至少有一個命名為data的top。如果有第二個top,一般命名為label。這種(data, label)的配對是分類模型所必需的。
- include:一般訓練和測試的時候,模型的引數有些不一樣。所以這個是用來指定該資料層是屬於訓練階段或者測試階段的層。若未指定,則該層既用在訓練模型又用在測試模型上。
- transform_param:資料的預處理,可以將資料變換到定義的範圍內。如設定scale為0.00390625,實際上就是1/255,即將輸入資料由0~255歸一化到0~1之間。
- data_param:根據資料來源的不同,來進行不同的設定。必須設定的引數有source和batch_size,source包含資料庫的目錄名字,batch_size就是每次處理的資料個數。可選引數有rand_skip和backend,backend是選擇採用LevelDB還是LMDB,預設是LevelDB【這個應該是選擇資料庫引擎】
vision_layer
【Convolution、Pooling】
2、Convolution層
layer { name: "conv1" type: "Convolution" bottom: "data" top: "conv1" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 96 kernel_size: 11 stride: 4 pad: 2 weight_filler { type: "gaussian" std: 0.01 #標準差:distribution with stdev 0.01(default mean: 0) } bias_filler { type: "constant" value: 0 } } }
- lr_mult:學習率的係數,最終的學習率是這個數乘以solver.prototxt配置檔案中的base_lr。如有兩個lr_mult,則第一個表示權值w的學習率,第二個表示偏置項的學習率。一般偏置項的學習率是權值學習率的兩倍。
- 必須設定的引數有:
- num_output:卷積核的個數
- kernel_size:卷積核的大小,如果kernel_size長寬不一樣,則需要通過kernel_h,kernel_w分別設定。
- 其他引數:
- stride:卷積核的步長,預設為1, 也可以用stride_h, stride_w來設定。
- pad
- weight_filter:權值初始化。預設為“constant”,值權威0,很多時候我們用“xavier”演算法來進行初始化,也可以設定為“gaussian”
- bias_filter:偏置項的初始化,一般設定為“constant”,值全為0。
- bias_term:是否開啟偏置項,預設為true
- group:分組,預設為1組。如果大於1,我們限制卷積的連線操作在一個子集裡。
3、pooling層
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
4、Local Response Normalization層
LRN是對一個區域性的輸入進行的歸一化操作。【貌似現在不怎麼用了】
5、im2col層
在caffe中,卷積運算就是先對資料矩陣進行im2col操作,在進行內積運算,這樣做,會比原始的卷積操作更快。
common_layer
【InnerProductLayer、SplitLayer、FlattenLayer、ConcatLayer、SilenceLayer、(Elementwise Operations)這個是我們常說的啟用函式層Activation Layers、EltwiseLayer、SoftmaxLayer、ArgMaxLayer、MVNLayer】
6、inner_product層(FC)
layers {
name: "fc8"
type: "InnerProduct"
blobs_lr: 1 # learning rate multiplier for the filters
blobs_lr: 2 # learning rate multiplier for the biases
weight_decay: 1 # weight decay multiplier for the filters
weight_decay: 0 # weight decay multiplier for the biases
inner_product_param {
num_output: 1000
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
bottom: "fc7"
top: "fc8"
7、accuracy
layer {
name: "accuracy"
type: "Accuracy"
bottom: "ip2"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
- accuracy只在test有,因此要設定include為TEST。輸出分類(預測)的精確度。
8、reshape
layer {
name: "reshape"
type: "Reshape"
bottom: "input"
top: "output"
reshape_param {
shape {
dim: 0 # copy the dimension from below
dim: 2
dim: 3
dim: -1 # infer it from the other dimensions
}
}
}
- 有一個可選的引數組shape,用於指定blob資料的各維的值(blob是一個四維的資料nxcxwxh)
- "dim:0"表示維度不變,即輸入和輸出是一樣的維度。"dim:-1"表示由系統自動計算維度。資料總量不變,系統根據其他三維來確定這一維。
9、dropout
layer {
name: "drop7"
type: "Dropout"
bottom: "fc7-conv"
top: "fc7-conv"
dropout_param {
dropout_ratio: 0.5 #只需要設定一個dropout_ratio引數即可
}
}
Neuron_layer
10、Sigmoid
layer {
name: "encode1neuron"
bottom: "encode1"
top: "encode1neuron"
type: "Sigmoid"
}
11、ReLU/Rectified-linear and Leaky-ReLU
layers {
name: "relu1"
type: RELU
bottom: "conv1"
top: "conv1"
}
12、TanH/Hyperbolic Tangent
layer {
name: "layer"
bottom: "in"
top: "out"
type: "TanH"
}
13、Absolute value(絕對值)
layer {
name: "layer"
bottom: "in"
top: "out"
type: "AbsVal"
}
14、Power(冪運算)
layer {
name: "layer"
bottom: "in"
top: "out"
type: "Power"
power_param {
power: 2
scale: 1
shift: 0
}
}
15、BNLL(binomial normal log likelihood)
layer {
name: "layer"
bottom: "in"
top: "out"
type: “BNLL”
}
loss_layer
【待續,還有很多的】
16、softmax-loss
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip1"
bottom: "label"
top: "loss"
}
ps:
- solver算是caffe核心的核心,它協調著整個模型的運作,caffe程式執行必須帶一個引數就是solver配置檔案。
- caffe提供了六種優化演算法來求解最優解,在solver配置檔案中,通過設定type型別來選擇:
-
Stochastic Gradient Descent (type: "SGD"), AdaDelta (type: "AdaDelta"), Adaptive Gradient (type: "AdaGrad"), Adam (type: "Adam"), Nesterov’s Accelerated Gradient (type: "Nesterov") and RMSprop (type: "RMSProp")
-
- Solver的流程:
-
1. 設計好需要優化的物件,以及用於學習的訓練網路和用於評估的測試網路。(通過呼叫另外一個配置檔案prototxt來進行) 2. 通過forward和backward迭代的進行優化來跟新引數。 3. 定期的評價測試網路。 (可設定多少次訓練後,進行一次測試) 4. 在優化過程中顯示模型和solver的狀態
-
#每一次的迭代過程 • 1、呼叫forward演算法來計算最終的輸出值,以及對應的loss • 2、呼叫backward演算法來計算每層的梯度 • 3、根據選用的slover方法,利用梯度進行引數更新 • 4、記錄並儲存每次迭代的學習率、快照,以及對應的狀態。
-