caffe中参数设置的解析

lenet_solver.prototxt:

net: "examples/mnist/lenet_train_test.prototxt"
test_iter: 100
test_interval: 500
base_lr: 0.01
momentum: 0.9
type: SGD
weight_decay: 0.0005
lr_policy: "inv"
gamma: 0.0001
power: 0.75
display: 100
max_iter: 20000
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
solver_mode: CPU

net:网络模型(训练网络模型、测试网络模型)

test_iter:测试的批次数,这个参数要与batch_size结合起来理解,例如:mnist数据集中测试样本总数为10000,一次执行全部数据效率很低,因此,我们将测试数据分几个批次来执行。假定我们设置batch_size为100,则需要迭代100次才能将10000个数据全部执行完,因此,将test_iter设置为100。执行完一次全部数据,称之为一个epoch


test_iterval:测试间隔,每训练500次进行一次测试


base_lr: 0.01    
lr_policy: "inv"
gamma: 0.0001
power: 0.75

这四行是对学习率的设置,base_lr用来设置基础学习率,在迭代的过程中,可以对基础学习率进行调整,lr_policy用来设置调整策略。其中,lr_policy的设置以及相应的学习率的计算:(在开始训练模型时,一般采用高的学习速率,因为高的学习速率,优化速度快;但是到达某个节点后会变得充满随机性,此时需要降低学习速率,这样才能以较低的学习速率到达损失函数的更低点。)

  • - fixed:      保持base_lr不变.
  • - step:       如果设置为step, 还需要设置一个stepsize,  返回 base_lr * gamma ^ (floor(iter / stepsize)),其中iter表示当前的迭代次数
  • - exp:        返回base_lr * gamma ^ iter, iter为当前迭代次数
  • - inv:         如果设置为inv, 还需要设置一个power, 返回base_lr * (1 + gamma * iter) ^ (- power)
  • - multistep:    如果设置为multistep, 还需要设置一个stepvalue。这个参数和step很相似,step是均匀等间隔变化,而multistep则是根据                                        stepvalue值变化
  • - poly:        学习率进行多项式误差, 返回 base_lr (1 - iter/max_iter) ^ (power)
  • - sigmoid:     学习率进行sigmod衰减,返回 base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))


type:优化算法的选择,目前caffe中有六种优化方法,参考博客:http://blog.csdn.net/qq_26898461/article/details/50445394

  • Stochastic Gradient Descent (type: "SGD"),
  • AdaDelta (type: "AdaDelta"),
  • Adaptive Gradient (type: "AdaGrad"),
  • Adam (type: "Adam"),
  • Nesterov’s Accelerated Gradient (type: "Nesterov"
  • RMSprop (type: "RMSProp")


weight_decay:权重衰减,主要是为了防止过拟合

momentum:动量,参考博客

max_iter:最大迭代次数,这个参数设置太小的话,会导致没有收敛,精确度很低

display:在屏幕上的显示频率,每训练100次显示一次,如果设置为0,则不显示

snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
这两行用来设置快照,snapsnot用来设置每训练多少次后进行保存一次模型,snapsnot_prefix用来设置保存的路径

solver_mode:设置运行模式,有CPU、GPU两种模式


lenet_train_test.prototxt :

name: "LeNet"
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN       //在训练阶段包含该层
  }
  transform_param {   
    scale: 0.00390625  //对数据进行均一化,幅度归一化到同样的范围[0, 255]

  }
  data_param {
    source: "examples/mnist/mnist_train_lmdb"  //训练数据来源
    batch_size: 64
    backend: LMDB
  }
}
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST         //在测试阶段包含该层
  }
  transform_param {
    scale: 0.00390625   //对数据进行均一化,幅度归一化到同样的范围[0, 255]
  }
  data_param {
    source: "examples/mnist/mnist_test_lmdb"  //测试数据来源
    batch_size: 100
    backend: LMDB
  }
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1       //weight的学习率,需要乘以base_lr
  }
  param {
    lr_mult: 2       //bias的学习率,需要乘以base_lr,一般bias的学习率是weight学习率的2倍
  }
  convolution_param {
    num_output: 20   //卷积核的个数
    kernel_size: 5   //卷积核的大小
    stride: 1        //卷积核的步长
    weight_filler {  //权值初始化,有以下几种方式:xavier, constant, gaussian等
      type: "xavier"
    }
    bias_filler {    //偏置项的初始化,一般设置为constant,值全为0
      type: "constant"
    }
  }
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX         //池化方法,有:MAX,AVG,SHOCHASTIC
    kernel_size: 2
    stride: 2
  }
}
...

其他参数:

decay_mult:权值衰减,需要乘以weight_decay,wi = wi -(base_lr * lr_mult) *dwi - (weight_dacay * decay_mult) * wi (dwi是误差关于wi的偏导数)

drop_ratio:丢弃数据的概率,和dropout层相关,详解:http://blog.csdn.net/u013989576/article/details/70174411

权值初始化的具体方法可以参考博客







发布了81 篇原创文章 · 获赞 51 · 访问量 27万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章