本文以O(shè)penPose的網(wǎng)絡(luò)結(jié)構(gòu)為例對各層參數(shù)進(jìn)行解析
訓(xùn)練的網(wǎng)絡(luò)文件
數(shù)據(jù)層
layer {
name: "data" 表示該層名字
type: "CPMData" 層有多種類型磅网,比如:Data、Convolution呼胚、Pooling犯犁,Data表示數(shù)據(jù)來源于Leveldb或者LMDB
top: "data" 每一層用top來輸出數(shù)據(jù)毕莱,只有top沒有bottom,則這一層只有輸出沒有輸入,反之亦然
top: "label" 如果有多個top和bottom嘀粱,表示有多個blobs數(shù)據(jù)的輸入輸出
data_param {
source: "/mnt/sdb/yangbin/COCO_kpt/lmdb" 包含數(shù)據(jù)庫的目錄名稱
batch_size: 10 每次處理數(shù)據(jù)的個數(shù)
backend: LMDB 選擇采用Leveldb還是LMDB嚣镜,默認(rèn)采用leveldb
}
cpm_transform_param { 自定義層爬迟,之后會進(jìn)行補充
stride: 8
max_rotate_degree: 40
visualize: false
crop_size_x: 368
crop_size_y: 368
scale_prob: 1
scale_min: 0.5
scale_max: 1.1
target_dist: 0.6
center_perterb_max: 40
do_clahe: false
num_parts: 56
np_in_lmdb: 17
}
}
Eltwise層
layer {
name: "weight_stage1_L2" 官方注釋:http://caffe.berkeleyvision.org/tutorial/layers/eltwise.html
type: "Eltwise" 按元素操作層
bottom: "conv5_5_CPM_L2"
bottom: "heat_weight"
top: "weight_stage1_L2"
eltwise_param {
operation: PROD 支持三種基本操作:1.PROD - 按元素乘積; 2.SUM - 按元素求和(默認(rèn)菊匿,若實現(xiàn)相減付呕,設(shè)置第一個coeff參數(shù)為1,第二個coeff參數(shù)為-1)跌捆; 3.MAX - 保存元素大者
}
}
EuclideanLoss層
layer {
name: "loss_stage1_L1" 官方注釋:http://caffe.berkeleyvision.org/tutorial/layers/euclideanloss.html
type: "EuclideanLoss" 源碼分析:https://blog.csdn.net/seashell_9/article/details/68064294
bottom: "weight_stage1_L1"
bottom: "label_vec"
top: "loss_stage1_L1"
loss_weight: 1 默認(rèn)為1
}
BatchNorm層
BN層的設(shè)定一般按照conv→BN→scale→relu的順序來形成一個block
https://www.cnblogs.com/makefile/p/batch-norm.html?utm_source=debugrun&utm_medium=referral
layer {
name: "conv1/bn"
type: "BatchNorm"
bottom: "conv1"
top: "conv1" #inplace
param { #均值
lr_mult: 0
decay_mult: 0
}
param {
lr_mult: 0 #方差
decay_mult: 0
}
param {
lr_mult: 0 #Scale
decay_mult: 0
}
batch_norm_param {
use_global_stats: true #訓(xùn)練的時候要設(shè)置為false徽职,測試時設(shè)置為true
eps: 1e-5 #分母附加值,防止除以方差時出現(xiàn)除0操作佩厚,默認(rèn)為1e-5
}
}
VGG19前十層
OpenPose采用VGG19模型的前十層網(wǎng)絡(luò)進(jìn)行初始化
卷積層
layer {
name: "conv1_1" #表示該層的名稱
type: "Convolution" #層類型
bottom: "image" #輸入
top: "conv1_1" #輸出
param {
lr_mult: 1.0 #權(quán)值的學(xué)習(xí)率姆钉,最終的學(xué)習(xí)率是這個系數(shù)乘以solver.prototxt配置文件中的base_Ir
decay_mult: 1 #權(quán)值衰減系數(shù)
}
param {
lr_mult: 2.0 #如果有兩個Ir_mult,則第二個代表偏置項的學(xué)習(xí)率抄瓦,一般來說偏置項的學(xué)習(xí)率是權(quán)值學(xué)習(xí)率的兩倍
decay_mult: 0
}
convolution_param {
num_output: 64 #卷積核的個數(shù)潮瓶,convolution_param主要用于設(shè)定卷積層的特有參數(shù)
pad: 1
kernel_size: 3
weight_filler { #權(quán)值初始化
type: "gaussian" #默認(rèn)為“constant”,值為0钙姊,“gaussian”使用高斯分布初始化權(quán)值
std: 0.01 #std是參數(shù)初始化成是高斯分布的標(biāo)準(zhǔn)差毯辅,std越小,證明高斯曲線越平滑煞额,各個權(quán)重值基本相同
詳見https://blog.csdn.net/kenny_star/article/details/69949846
}
bias_filler {
type: "constant" #偏置項的初始化悉罕,一般設(shè)置為“constant”,值全為0
}
}
}
激活層
layer {
name: "relu1_1" 對輸入數(shù)據(jù)進(jìn)行激活操作(一種函數(shù)變換)立镶,從bottom得到一個blob數(shù)據(jù)輸入壁袄,運算后,從top輸出一個blob數(shù)據(jù)
type: "ReLU" 在運算過程中媚媒,只對輸入數(shù)據(jù)逐個元素進(jìn)行函數(shù)變化嗜逻,不改變數(shù)據(jù)維度大小
bottom: "conv1_1" 輸入:n*c*h*w 輸出:n*c*h*w
top: "conv1_1" Relu層支持in-place計算,因此Relu層的輸入輸出可以相同缭召,這意味著該層的輸入輸出可以共享同一塊內(nèi)存栈顷,減少內(nèi)存消耗逆日,其它層不支持
}
池化層
layer {
name: "pool1_stage1"
type: "Pooling" #層類型
bottom: "conv1_2"
top: "pool1_stage1"
pooling_param {
pool: MAX #池化方法,默認(rèn)為MAX萄凤,其他還有AVE室抽、STOCHASTIC(隨機采樣池化)
kernel_size: 2
stride: 2
}
}
連接層
layer {
name: "concat_stage2" #輸入:n_i * c_i * h * w for each input blob i from 1 to K.
type: "Concat"
bottom: "conv5_5_CPM_L1"
bottom: "conv5_5_CPM_L2"
bottom: "conv4_4_CPM"
top: "concat_stage2"
concat_param { https://blog.csdn.net/u012426298/article/details/80743284
axis: 1 if axis = 0: (n_1 + n_2 + ... + n_K) * c_1 * h * w, and all input c_i should be the same
if axis = 1: n_1 * (c_1 + c_2 + ... + c_K) * h * w, and all input n_i should be the same
}
}
Scale層
https://blog.csdn.net/zxyhhjs2017/article/details/85265921