Caffe教程系列之Proto元素

本教程旨在督促自己从头到尾重新学习一遍Caffe,主要参考Caffe主页的教程和大牛们的博文,若有不妥之处,还望告知。

Caffe系列教程 - 闲渔的文章 - 知乎专栏

solver.prototxt

net: "models/bvlc_alexnet/train_val.prototxt" 
test_iter: 1000       # 测试时,需要迭代的次数
test_interval: 1000   # 训练,每迭代test_interval次就进行一次测试 
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 * batchsize(针对测试集)= 测试集的大小,测试集的 batchsize在prototx文件里设置。

momentum是用来修改搜索方向加快收敛速度的一种简单方法,一般的通过加入之前的梯度来修改更新梯度步长。灵感来自于牛顿第一定律,基本思路:为寻优加入了“惯性”的影响,这样一来,当误差曲面中存在平坦区的时候,SGD可以更快的速度学习:

w_i\leftarrow m\times w_i-\eta\frac{\partial E}{\partial w_i}

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加入规范项。
  • 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。
  • bias_term:是否开启偏置项,默认为true, 开启。
  • group:分组,默认为1。如果大于1,我们限制卷积的连接操作在一个子集内。卷积分组可以减少网络的参数,至于是否还有其他的作用就不清楚了。每个input是需要和每一个kernel都进行连接的,但是由于分组的原因其只是与部分的kernel进行连接的。如: 我们根据图像的通道来分组,那么第i个输出分组只能与第i个输入分组进行连接。
  • pool:池化方法,默认为MAX。目前可用的方法有 MAX, AVE, 或 STOCHASTIC
  • dropout_ratio:丢弃数据的概率,用于防止模型过拟合。

参考:

【深度学习】caffe 中的一些参数介绍

编辑于 2016-11-07