caffe 配置文件中的一些参数介绍

转自:http://blog.csdn.net/cyh_24 https://blog.csdn.net/cyh24/article/details/51537709

文章仅仅为了怕遗忘,当作学习笔记来翻阅~原作者整理的蛮清楚就转载过来了~

caffe 参数介绍

solver.prototxt

net: "models/bvlc_alexnet/train_val.prototxt" 
test_iter: 1000       # 
test_interval: 1000   # 
base_lr: 0.01         # 开始的学习率
lr_policy: "step"     # 学习率的drop是以gamma在每一次迭代中
gamma: 0.1
stepsize: 100000      # 每stepsize的迭代降低学习率:乘以gamma
display: 20           # 没display次打印显示loss
max_iter: 450000      # train 最大迭代max_iter 
momentum: 0.9         #
weight_decay: 0.0005  #
snapshot: 10000       # 没迭代snapshot次,保存一次快照
snapshot_prefix:   "models/bvlc_reference_caffenet/caffenet_train"
solver_mode: GPU      # 使用的模式是GPU 


test_iter 
在测试的时候,需要迭代的次数,即test_iter* batchsize(测试集的)=测试集的大小,测试集的 batchsize可以在prototx文件里设置。

test_interval 
训练的时候,每迭代test_interval次就进行一次测试。

momentum 
灵感来自于牛顿第一定律,基本思路是为寻优加入了“惯性”的影响,这样一来,当误差曲面中存在平坦区的时候,SGD可以更快的速度学习。 
wi←m∗wi−η∂E∂wi


train_val.prototxt

layer { # 数据层
    name: "data"
    type: "Data"
    top: "data"
    top: "label"
    include {
        phase: TRAIN # 表明这是在训练阶段才包括进去
    }
    transform_param { # 对数据进行预处理
        mirror: true # 是否做镜像
        crop_size: 227
        # 减去均值文件
        mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
    }
    data_param { # 设定数据的来源
        source: "examples/imagenet/ilsvrc12_train_lmdb"
        batch_size: 256
        backend: LMDB
    }
}

layer {
    name: "data"
    type: "Data"
    top: "data"
    top: "label"
    include {
        phase: TEST # 测试阶段
    }
    transform_param {
        mirror: false # 是否做镜像
        crop_size: 227
        # 减去均值文件
        mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
    }
    data_param {
        source: "examples/imagenet/ilsvrc12_val_lmdb"
        batch_size: 50
        backend: LMDB
    }
}


lr_mult 
学习率,但是最终的学习率需要乘以 solver.prototxt 配置文件中的 base_lr .

如果有两个 lr_mult, 则第一个表示 weight 的学习率,第二个表示 bias 的学习率 
一般 bias 的学习率是 weight 学习率的2倍’


decay_mult 
权值衰减,为了避免模型的over-fitting,需要对cost function加入规范项。 
wi←wi−η∂E∂wi−ηλwi


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”

weight_filler {
    type: "gaussian"
    std: 0.01
}


bias_filler
偏置项的初始化。一般设置为”constant”, 值全为0。

bias_filler {
    type: "constant"
    value: 0
}


bias_term

是否开启偏置项,默认为true, 开启

group 
分组,默认为1组。如果大于1,我们限制卷积的连接操作在一个子集内。 
卷积分组可以减少网络的参数,至于是否还有其他的作用就不清楚了。

每个input是需要和每一个kernel都进行连接的,但是由于分组的原因其只是与部分的kernel进行连接的
如: 我们根据图像的通道来分组,那么第i个输出分组只能与第i个输入分组进行连接。


pool 
池化方法,默认为MAX。目前可用的方法有 MAX, AVE, 或 STOCHASTIC

dropout_ratio 
丢弃数据的概率

补充一项,有些层中(如下)会有engine:CAFFE

layer {
  name: "conv9/dw"
  type: "Convolution"
  bottom: "conv8"
  top: "conv9/dw"
  param {
    lr_mult: 0.1
    decay_mult: 0.1
  }
  convolution_param {
    num_output: 512
    bias_term: true
    pad: 1
    kernel_size: 3
    group: 512
    engine: CAFFE
    weight_filler {
      type: "msra"
    }
  }
}

在caffe的proto文件里,多次能看到枚举类engine,可选的类别有defaul、caffe和cudnn,这个变量是什么意思,对应的3个可选值分别代表什么呢?

其实就两种引擎CAFFE vs. cuDNN。Default就是指向caffe engine的。
要讲清两者的区别,先要说一下什么是cuDNN.
CUDA是GPU编程的API。BLAS(as you know)是矩阵运算的高度优化的函数库。cuDNN就有点像BLAS,是GPU上深度学习计算时常用的一些计算操作/函数的实现库,如卷积,Pooling, softmax, sigmoid, tanh之类的。它是针对这些操作,像BLAS一样,做了超强的优化的,性能优,内存占用小,效率高。
 
用它的好处,自不必说,一个功能,就不用大家,即每个框架,都自己实现一遍了,直接统一调用cuDNN库里的实现就好了。当然,不是每个layer,cuDNN都支持,所以,你可以看到,engine这个参数,只有上述部分layer里才可以定义。

猜你喜欢

转载自blog.csdn.net/c20081052/article/details/85205837