最近调参调的很无力,从网上找了一些调参技巧总结一下,希望最自己精度提升有帮助。
参考知乎:https://www.zhihu.com/question/25097993
0. 先把中间多余的计算去掉,等参数调好精度上去了再计算中间的。节省时间!!!
1. 更多关注loss而不是acc。
2. 先用小数据集进行计算,如果精度都没有上去,应该反思模型的是否正确。大网络小数据集一般都会过拟合,训练精度肯定不错。
3. 优先调学习率。lr设置:
太大:loss爆炸,或者nan
太小:loss没反应
手动调lr: 如果刚开始loss设计不合理,初始情况下很容易爆,先用小的lr保证不爆,loss降下来后在慢慢上升lr,之后再慢慢降lr
4. 对比训练集和验证集的loss,判断是否过拟合。训练足够,就需要早停法来结束
5. 优化函数sgd adam 这些选择上, 看你个人选择. 一般对网络不是决定性的. 反正我无脑用sgd + momentum.
adam效果不错,但是比sgd+momentum训练得慢点;一般可以先上Adam试一下。这两个效果都还不错,可以都试一下
优化函数的对比图:https://img-blog.csdn.net/20160824161755284
https://img-blog.csdn.net/20160824161815758
6. 验证集上调参!!!
其他注意事项:
1. 预处理: -mean/std zero-center就够了, PCA, 白化什么的都用不上. 我个人观点, 反正CNN能学习encoder, PCA用不用其实关系不大, 大不了网络里面自己学习出来一个.
2. shuffle, shuffle, shuffle.
因为一般自己的数据集都是有序的,接近的几个样例都是相关的。训练一般来说要求数据不要相关性太大,否则类似一条数据不停地连续塞给模型几次。
3. 无脑用ReLU(CV领域).
4. 无脑用3x3.
5. 无脑用xavier.
6. batch normalization我一直没用, 虽然我知道这个很好, 我不用仅仅是因为我懒. 所以要鼓励使用batch normalization.
可以大大加快训练速度和模型性能
7. 不要完全相信论文里面的东西. 结构什么的觉得可能有效果, 可以拿去试试.
8. 有95%概率不会使用超过40层的模型.
9. shortcut的联接是有作用的.
10. 暴力调参最可取, 毕竟, 自己的生命最重要. 你调完这个模型说不定过两天这模型就扔掉了.
11. Google的inception论文, 结构要好好看看.
12. 无脑用maxout
13. Dropout 也是防止过拟合的大杀器,如果不知道怎么设比例的话,就直接设置为0.5,即一半一半,但是测试的时候记得把dropout关掉
待学习:
1. maxout https://blog.csdn.net/hjimce/article/details/50414467
2. 看google inception文章