caffe配置总结

参数设置

参考文档:
https://www.cnblogs.com/mtcnn/p/9411845.html
https://www.cnblogs.com/Allen-rg/p/5795867.html
https://www.cnblogs.com/denny402/p/5074049.html
https://www.cnblogs.com/denny402/p/5083300.html
https://www.cnblogs.com/denny402/p/5686067.html
https://www.cnblogs.com/denny402/p/5679154.html
https://www.cnblogs.com/ya-cpp/p/9205552.html
https://www.cnblogs.com/ylHe/p/8619520.html
https://www.cnblogs.com/ya-cpp/p/9205552.html
https://www.jianshu.com/p/9b6b0d6d3bd0

1. 训练样本

训练样本总量:121368个
训练 batch_szie:256
将所有样本处理完一次(称为一代,即epoch)需要:121368/256=475 次迭代才能完成
所以这里将test_interval设置为475,即处理完一次所有的训练数据后,才去进行测试。所以这个数要大于等于475.
如果想训练100代,则最大迭代次数为47500

2.测试样本

同理,如果有1000个测试样本,batch_size为25,那么需要40次才能完整的测试一次。
所以test_iter为40;这个数要大于等于40.

3. 学习率

学习率变化规律我们设置为随着迭代次数的增加,慢慢变低。
总共迭代47500次,我们将变化5次,所以stepsize设置为47500/5=9500,即每迭代9500次,就降低一次学习率。

solver配置

net: "examples/AAA/train_val.prototxt"   #训练或者测试配置文件
test_iter: 40        #完成一次测试需要的迭代次数
test_interval: 475   #测试间隔
base_lr: 0.01        #基础学习率
lr_policy: "step"    #学习率变化规律
gamma: 0.1           #学习率变化指数
stepsize: 9500       #学习率变化频率
display: 20          #屏幕日志显示间隔
max_iter: 47500      #最大迭代次数
momentum: 0.9        #动量
weight_decay: 0.0005 #权重衰减
snapshot: 5000       #保存模型间隔
snapshot_prefix: "models/A1/caffenet_train"  #保存模型的前缀
solver_mode: GPU     #是否使用GPU

【注意】
max_iter:最大迭代次数。这个数设置太小,会导致没有收敛,精确度很低。设置太大,会导致震荡,浪费时间。
stepsize:不能太小,如果太小会导致学习率再后来越来越小,达不到充分收敛的效果。
weight_decay:权重衰减项,防止过拟合的一个参数。

solver配置详细注解

# The train/test net protocol buffer definition   //对训练和测试网络的定义
//网络的路径,可以使用绝对路径或者相对路径
net: "D:/Software/Caffe/caffe-master/examples/mnist/lenet_train_test.prototxt"
//test_iter参数定义训练流程中前向传播的总批次数
# test_iter specifies how many forward passes the test should carry out.
//在MNIST中,定义的是每批次100张图片,一共100个批次,覆盖了全部10000个测试图例
# In the case of MNIST, we have test batch size 100 and 100 test iterations,
# covering the full 10,000 testing images.

/*
test_iter是定义的测试图例分为多少批次,由于一次性执行所有的测试图例效率很低,所以把测试
图例分为几个批次来依次执行,每个批次包含的图例数量是在net网络的模型文件.prototxt中的
batch_size变量定义的,test_iter*batch_size等于总的测试图集数量
*/
test_iter: 100
//测试间隔,训练没迭代500次后执行一次测试(测试是为了获得当前模型的训练精度)
# Carry out testing every 500 training iterations.
test_interval: 500

/*
网络的学习率设置
1. base_lr:表示base learning rate,基础学习率,一般在网络模型中的每一层都会定义两个名称为
“lr_mult”的学习率系数,这个学习率系数乘上基础学习率(base_lr*lr_mult)才是最终的学习率
2. momentum:冲量单元是梯度下降法中一种常用的加速技术,作用是有助于训练过程中逃离局部
最小值,使网络能够更快速的收敛,具体的值是经过反复的迭代调试获得的经验值
3. weight_decay:权值衰减的设置是为了防止训练出现过拟合,在损失函数中,weight_decay是放
在正则项(regularization)前面的一个系数,正则项一般指示模型的复杂度。weight_decay可以调节 
模型复杂度对损失函数的影响,提高模型的泛化能力
*/
# The base learning rate, momentum and the weight decay of the network.
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005

/*
学习率修改策略
以上设置的是初始学习率参数,在训练过程中,依据需要,可以不断调整学习率的参数,调整的策略是
通过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))))
*/
# The learning rate policy
lr_policy: "inv"
gamma: 0.0001
power: 0.75
//每迭代100次显示一次执行结果
# Display every 100 iterations
display: 100
//最大迭代次数
# The maximum number of iterations
max_iter: 10000
//生成中间结果,记录迭代5000次之后结果,定义caffeModel文件生成路径
# snapshot intermediate results
snapshot: 5000
snapshot_prefix: "D:/Software/Caffe/caffe-master/examples/mnist/lenet"
//运行模式,CPU或者GPU
# solver mode: CPU or GPU
solver_mode: GPU


在每一次的迭代过程中,solver做了这几步工作:
1、调用forward算法来计算最终的输出值,以及对应的loss
2、调用backward算法来计算每层的梯度
3、根据选用的slover方法,利用梯度进行参数更新
4、记录并保存每次迭代的学习率、快照,以及对应的状态

欠拟合、过拟合

过拟合和欠拟合怎么判断,如何解决?

在这里插入图片描述

答:主要可以通过训练误差和测试误差入手判断是否过拟合或欠拟合。
【过拟合】
训练误差很低,但是测试误差较高,过拟合的概率较大。
过拟合可以从增加样本量,减少特征数,降低模型复杂度等方面入手,实际的例子比如线性回归中,对于几十个样本的数据点就没必要用几十个变量去拟合。

【欠拟合】
如果训练误差和测试误差都很高,一般是欠拟合。
欠拟合则反之,需要考虑模型是否收敛,特征是否过少,模型是否过于简单入手。

另外还有L1,L2正则化用于限制权重以及dropout用在神经网络中使得每次训练的网络结构多样。
L1正则化其实就是讲权值的绝对值和加入损失函数,使得权值中0值比重增大,因此得到的权值较为稀疏。
L2正则化则是将权重的平方和加入损失函数,使得权值分布更加平均,所以权值较为平滑。

采取的措施主要包括以下6种:
增加训练样本的数目(该方法适用于过拟合现象时,解决高方差。一般都是有效的,但是代价较大,如果下面的方法有效,可以优先采用下面的方式);
尝试减少特征的数量(该方法适用于过拟合现象时,解决高方差);
尝试获得更多的特征(该方法适用于欠拟合现象时,解决高偏差);
尝试增加多项式特征(该方法适用于欠拟合现象时,解决高偏差);
尝试减小正则化程度λ(该方法适用于欠拟合现象时,解决高偏差);
尝试增加正则化程度λ(该方法适用于过拟合现象时,解决高方差);

特征如何构造?

答:其实特征主要针对业务来构造,业务则对应数据,举个例子,时间特征可能在交通预测方面有效,但是对于文本挖掘可能无效。因此可以考虑从数据统计分析入手,结合业务场景构造特征,后期可考虑细化特征或组合特征等。

逻辑回归的含义和推导?逻辑回归和线性回归的区别?

答:含义不多说,这个算法原理是最基本的。推导可以从损失函数最小化或最大似然方向入手。二者的区别曾经在面试阿里的时候被问到,当时脱口而出一个是分类一个是回归,但深层的含义或许是一个是迭代求解,一个是直接求解。望指教

模型怎么优化?怎么评估模型好坏?

答:模型优化主要从数据和模型两方面入手,根据具体问题来,比如过拟合且数据量太少的话可以考虑增加数据量。模型评估指标包括分类和回归,分类比如准确率,AUC值,或和业务相关的加权计算公式。这里强调下ROC曲线的AUC值是比较重要的内容,要能知道具体ROC曲线是怎么画出来的。回归的话比如MSE,RMSE或和业务相关的加权计算公式等。

数据如何清洗,怎么处理缺失值?

答:数据清洗主要还是通过分析数据的统计信息、分布情况、缺失情况等来定,在数据质量较好的前提下尽可能保留更多数据。缺失值的处理方法较多,也是根据具体特征和业务来定,可以随机填充、均值填充、或采用简单算法如KNN,聚类进行填充。当然,如果某些特征或某些样本的缺失率太大,可以考虑直接舍弃,是具体情况而定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值