目录
prototxt文件
solver.prototxt
train_net: "models/VGGNet/SSD_FT_300x300/0107/train.prototxt"
test_net: "models/VGGNet/SSD_FT_300x300/0107/test.prototxt"
test_iter: 619 # specifies how many forward passes the test should carry out.
test_interval: 5000 #训练每迭代5000次,进行一次预测
base_lr: 0.0005
display: 10 #每经过10次迭代,在屏幕上打印一次log
max_iter: 240000 #最大迭代次数
lr_policy: "multistep" #采用的学习策略
gamma: 0.1
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000 #每10000次迭代打印一次快照
snapshot_prefix: "ssd_models/VGGNet/SSD_FT_300x300/0107/VGG_VOC0712_SSD_FT_300x300"#保存路径
solver_mode: GPU
device_id: 0
debug_info: false
snapshot_after_train: true
test_initialization: false
average_loss: 10
stepvalue: 160000
stepvalue: 200000
stepvalue: 240000
iter_size: 1
type: "SGD"
eval_type: "detection"
ap_version: "11point"
show_per_class_result: true
这个文件告诉了我们训练的网络和超参数。用caffe训练时会首先读取该文件,获得其中特定字段的数值,并据此设置内存中模型训练时的超参数变量值。solver.prototxt的主要作用就是交替调用前向算法和后向算法来更新参数,从而最小化loss,实际上就是一种迭代的优化算法。
train.prototxt
这个文件是网络配置文件,给出了网络的具体定义。
name: "VGG_VOC0712_SSD_FT_300x300_train"
layer {
name: "data" #输入层的名称
type: "AnnotatedData" #输入层的类型
top: "data"
top: "label" #层的输出blob有两个:data和label
include {
phase: TRAIN #训练阶段,该层参数只在训练阶段有效
}
transform_param {
mirror: true #镜像操作
mean_value: 104
mean_value: 117
mean_value: 123
......
}
data_param {
source: "examples/VOC0712/VOC0712_trainval_lmdb" #输入数据路径
batch_size: 16 #batch
backend: LMDB #数据格式为LMDB
}
......
}
layer {
name: "conv1_1"
type: "Convolution"
bottom: "data"
top: "conv1_1"
param {
# 学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr。如果有两个lr_mult
# , 则第一个表示权值的学习率,第二个表示偏置项的学习率。一般偏置项的学习率是权值学习率的两倍。
# 这里是权值学习率
lr_mult: 1
# 权值衰减,防止过拟合
decay_mult: 1
}
param {
# 这里是偏置项的学习率,偏置项一般不存在过拟合的问题
lr_mult: 2
decay_mult: 0
}
convolution_param {
# 卷积核的个数
num_output: 64
pad: 1
# 卷积核的大小,如果卷积核不是正方形的,可以使用kernel_h和kernel_w分别设定
kernel_size: 3
# 卷积核的步长stride,默认为1
# 权值初始化
weight_filler {
type: "xavier"
}
# 偏置项的初始化
bias_filler {
type: "constant"
value: 0
}
}
}
# Relu层
layer {
name: "relu1_1"
type: "ReLU"
bottom: "conv1_1"
top: "conv1_1"
}
......
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1_2"
top: "pool1"
pooling_param {
# pooling类型,默认值为MAX,也可以设置为AVE,STOCHASTIC
pool: MAX
kernel_size: 2
stride: 2
}
}
常见的层的类型:
卷积层:Convolution
数据层:Data
池化层:Pooling
ReLU层:Relu
Dropout层:Dropout
全连接层:InnerProduct
局部相应归一化层:lrn_param
SoftMax层:SoftmaxWithLoss
Accuracy层:Accuracy
也可自己定义层
deploy.prototxt
测试时用的文件。
xxx.caffemodel vs xxx.solversate
train.prototxt与deploy.prototxt的区别,参看:https://blog.csdn.net/fx409494616/article/details/53008971
caffemodel文件保存了最终训练的模型权值,solversate保存了训练状态。
caffe下各层概念(主要层)
Convolution卷积层
lr_mult: 学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr。如果有两个lr_mult, 则第一个表示权值的学习率,第二个表示偏置项的学习率。一般偏置项的学习率是权值学习率的两倍。
num_output: 卷积核(filter)的个数
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_filler: 权值初始化。 默认为“constant",值全为0,很多时候我们用"xavier"算法来进行初始化,也可以设置为”gaussian"
bias_filler: 偏置项的初始化。一般设置为"constant",值全为0。
group: 分组,默认为1组。如果大于1,我们限制卷积的连接操作在一个子集内。如果我们根据图像的通道来分组,那么第i个输出分组只能与第i个输入分组进行连接。
FLOPS的计算:输入规模(上层输出边长乘积)*(kernel_size^2+bias_filler)*num_output(这里pad=0)
4Pooling层
也叫池化层,为了减少运算量和数据维度而设置的一种层。
层类型:Pooling
必须设置的参数:
kernel_size: 池化的核大小。也可以用kernel_h和kernel_w分别设定。
其它参数:
pool: 池化方法,默认为MAX。目前可用的方法有MAX, AVE, 或STOCHASTIC
pad: 和卷积层的pad的一样,进行边缘扩充。默认为0
stride: 池化的步长,默认为1。一般我们设置为2,即不重叠。也可以用stride_h和stride_w来设置。
FLOPS的计算:(kernel_size^2+1)*num_output*输出规模(下层输入边长乘积)
全连接层
实际上,全连接层也可以被视为是一种极端情况的卷积层,其卷积核尺寸就是输入矩阵尺寸,因此输出矩阵的高度和宽度尺寸都是1。
FLOPS的计算:(kernel_size^2+1)*num_output*输出规模(下层输入边长乘积)
参考:https://blog.csdn.net/a554142589/article/details/81184172
caffe命令行解析
参考:https://www.cnblogs.com/denny402/p/5076285.html (有空看一下这个系列博客)
caffe的运行提供三种接口:c++接口(命令行)、python接口和matlab接口。本文先对命令行进行解析,后续会依次介绍其它两个接口。
caffe的c++主程序(caffe.cpp)放在根目录下的tools文件夹内, 当然还有一些其它的功能文件,如:convert_imageset.cpp, train_net.cpp, test_net.cpp等也放在这个文件夹内。经过编译后,这些文件都被编译成了可执行文件,放在了 ./build/tools/ 文件夹内。因此我们要执行caffe程序,都需要加 ./build/tools/ 前缀。
./build/tools/caffe <command> <args>
其中的<command>有这样四种:
- train----训练或finetune模型(model),
- test-----测试模型
- device_query---显示gpu信息
./build/tools/caffe device_query -gpu 0
- time-----显示程序执行时间
train指令
- -solver 必选参数,模型的配置文件
./build/tools/caffe train -solver examples/mnist/lenet_solver.prototxt
- -gpu 指定用哪一块gpu运行,根据gpu的id进行选择,如果设置为'-gpu all'则使用所有的gpu运行。
./build/tools/caffe train -solver examples/mnist/lenet_solver.prototxt -gpu 2
- -snapshot 从快照(snapshot)中恢复训练。可以在solver配置文件设置快照,保存solverstate。
./build/tools/caffe train -solver examples/mnist/lenet_solver.prototxt -snapshot examples/mnist/lenet_iter_5000.solverstate
- -weights 预先训练好的权重来fine-tuning模型,需要一个caffemodel,不能和-snapshot同时使用。
./build/tools/caffe train -solver examples/finetuning_on_flickr_style/solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel
- -iteration 迭代次数,默认为50。 如果在配置文件文件中没有设定迭代次数,则默认迭代50次。
- -model 定义在protocol buffer文件中的模型。也可以在solver配置文件中指定。
- -sighup_effect 用来设定当程序发生挂起事件时,执行的操作,可以设置为snapshot, stop或none, 默认为snapshot
- -sigint_effect 用来设定当程序发生键盘中止事件时(ctrl+c), 执行的操作,可以设置为snapshot, stop或none, 默认为stop
test指令
利用训练好了的权重(-weight),输入到测试模型中(-model),用编号为0的gpu(-gpu)测试100次(-iteration)。
./build/tools/caffe test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 100
time指令
在屏幕上显示lenet模型迭代10次所使用的时间。包括每次迭代的forward和backward所用的时间,也包括每层forward和backward所用的平均时间。
./build/tools/caffe time -model examples/mnist/lenet_train_test.prototxt -iterations 10
在屏幕上显示lenet模型用gpu迭代50次所使用的时间。
./build/tools/caffe time -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 10
利用给定的权重,利用第一块gpu,迭代10次lenet模型所用的时间。
./build/tools/caffe time -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 10
报错信息
https://blog.csdn.net/xunan003/article/details/78429189
https://blog.csdn.net/u012841667/article/details/53316948