参数说明分为两部分第一部分为Caffe的prototxt中的参数说明第二部分为Digits中的数据库制作以及模型训练中的参数说明
本人caffe新手一枚,各位在阅读的过程中如果发现任何错误,还烦请在评论留言,我会及时改正
首先,第一部分,Caffe中的protptxt的参数说明
(本文中使用的例子是siftflow-fcn32s,可以从github上直接得到他的代码)
caffe中的prototx由两个文件组成,一个是solver.protxt用于存放训练过程中的参数设置,另一个是*****网络.prototxt。主要用于存放网络模型结构
solver.prototxt
参数说明:
train_net:存放训练用的网络文件(即prototx文件)
test_net:存放测试用的网络结构文件(即prototx文件)
test_iter: 在测试的时候需要迭代的次数,与测试网络结构文件中的batch_size想关联,一般情况下,test_iter*batch_size=测试集的大小
test_interval:在训练的时候,进行test_interval此训练就测试一次
display:每display次在终端或者IDE中输出loss
average_loss:是每次display的时候看到的loss是多少次的平均值
lr_policy:学习率下降的策略,可选的方式有(1)fixed(2)inv(3)step(4)multistep(5)stepearly(6)poly
一个外国小伙子的解释是这样的(后面会更新,给出各种下降策略的可视化)
// The learning rate decay policy. The currently implemented learning rate
// policies are as follows:
// - fixed: always return base_lr.
// - step: return base_lr * gamma ^ (floor(iter / step))
// - exp: return base_lr * gamma ^ iter
// - inv: return base_lr * (1 + gamma * iter) ^ (- power)
// - multistep: similar to step but it allows non uniform steps defined by
// stepvalue
// - poly: the effective learning rate follows a polynomial decay, to be
// zero by the max_iter. return base_lr (1 - iter/max_iter) ^ (power)
// - sigmoid: the effective learning rate follows a sigmod decay
// return base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))
// where base_lr, max_iter, gamma, step, stepvalue and power are defined
// in the solver parameter protocol buffer, and iter is the current iteration.
base_lr:初始的学习率
momentum:灵感来自于牛顿第一定律,基本思路是为寻优加入了“惯性”的影响,这样一来,当误差曲面中存在平坦区的时候,SGD可以更快的速度学习。
wi←m∗wi−η∂E∂wiwi←m*wi−η\frac{∂E}{∂wi}(不明觉厉)
iter_size:
max_iter:train 最大迭代max_iter
weight_decay:(权值衰减)的使用既不是为了提高你所说的收敛精确度也不是为了提高收敛速度,其最终目的是防止过拟合。在损失函数中,weight decay是放在正则项(regularization)前面的一个系数,正则项一般指示模型的复杂度,所以weight decay的作用是调节模型复杂度对损失函数的影响,若weight decay很大,则复杂的模型损失函数的值也就大。
test_initialization:可取值为true或者false,表示是否可以用上次保存的snapshot来继续训练,如果为True,则下次开始训练的时候,caffe会自动从这个目录下加载最近一次迭代的模型,继续训练,以节省时间。
如果是False,则会从0开始重新迭代。所以这个参数的默认值是False
solver_type:优化算法的选择,一共有六中选择:SGD,AdaDelta、AdaGrad、Adam、Nesterov和RMSProp。默认为SGD。(这里后面会加入详细的算法解释)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*****网络.prototxt
1、数据层
layer{
name: "cifar" //本层的名字,也就是数据层的名字,用于和后面其他层的连接的使用
type: "Data" //本层的类型,“Data”代表了是这里是数据层,表示数据源是LMDB或者LeveLDB
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
}
}
transform_param{}大括号中表示输入的时候对数据做的处理
data_para{}大括号中表示输入数据的信息
batch_size:每次输入数据的个数
backend:输入数据的数据源的类型,是以LMDB结尾还是以什么巴拉巴拉结尾的
当数据以图片形式输入的时候
layer {
name: "data"
type: "ImageData"
top: "data"
top: "label"
transform_param {
mirror: false
crop_size: 227
mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
}
image_data_param {
source: "examples/_temp/file_list.txt"
batch_size: 50
new_height: 256
new_width: 256
}
}
数据的source文件中是图片数据以及他的标注数据信息比如分类任务的时候,txt文件中的每一行都是图片路径加上他的种类
如:/image/aaaaa.jpg 1
在分割任务中就将后面的1或者0等种类信息换成与图片相对应的groundtruth图片
2、卷积层
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
param {
lr_mult: 2.0
decay_mult: 0.0
}
convolution_param {
num_output: 96
kernel_size: 11
stride: 4
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0.0
}
}
}
lr_mult:学习率。这里有两个学习率,fenbieshifilter和bias学习率
weight_filler {
type: "gaussian"
std: 0.01
}
上方代码代表的含义是使用高斯方法初始化权重值,设置方差为0.01,这里为设置均值,则默认均值为0,
bias_filler {
type: "constant"
value: 0.0
}
上方代码表示的是将bias的数值以常数0初始化
待更新fc层和softmaxwithloss层