train_val.prototxt首先要修改的就是mean_file和data_param里面source的路径;
data层中有两个transform_param,如下图。只需要用到其中一个,当选择镜像操作时把mirror那边改为true,三个mean_value分别表示三个通道:
下面的batch_size(由于样本数据一般比较大,一次性执行全部数据效率很低,需要分成多个批次来处理,batch_size是每批次处理的数据量),网络原始的参数是256,显卡比较弱的会显示内存不足,我个人的显卡是GTX960,改成64出现如下情况,后面改成16才顺利跑了起来
其他的也没啥要改的,不过最后一个InnerProduct层的num_output需要改成自己的类别数
solver.prototxt文件是caffe核心的核心,协调整个模型的运作,它是caffe程序运行中比带的一个参数文件;
solver的作用是交替执行前向和后向算法来更新参数,最小化loss,是严格迭代的算法;
solver的流程如下:
1、调用train_val.prototxt设计优化对象、训练网络和测试网络;
2、通过forward和backward迭代优化更新参数;
3、根据test_interval定期评价测试网络;
4、优化过程中显示模型和solver的状态;
每一步迭代,solver的工作如下:
1、调用forward算法来计算最终的输出值,以及对应的loss;
2、调用backward算法来计算每层的梯度;
3、根据选用的solver方法,利用梯度进行参数更新;
4、保存并记录每次迭代的学习率、快照和对应的状态;
其配置文件如下:
基本上都是根据自己的需要修改相应的参数,这里主要说一下lr_policy:
“step”:设置了step,还要设置一个stepsize,返回base_lr*gamma^(floor(iter/stepsize)),其中iter表示当前迭代次数;
“fixed”:固定不变;
“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);
“sigmod”:学习率进行sigmod衰减,返回base_lr(1/(1+exp(-gamma*(iter-stepsize))))
另外,个人觉得要注意还有:
一、我的训练正负样本各2000,总共:4000;batch_size:16;将所有样本处理完一次(一个epoch)需要: 4000/16=250次迭代才能完成;
所以将test_interval设置为300,即处理完一次所有的训练数据后才去进行测试。这个数要大于等于250
如果想迭代100代(100个epoch),则最大迭代次数为25000;
二、测试样本正负各400,总共:800;batch_size:16;测试一次需:800/16=50;
所以test_iter为50;这个数要大于等于50;
三、学习率变化规律我们设置为随着迭代次数的增加,慢慢变低。总共迭代25000次,变化5次的情况下,将stepsize 设置为:25000/5=5000;即每迭代5000次,降低一次学习率;
stepsize不能太小,如果太小会导致学习率再后来越来越小,达不到充分收敛的效果。