深度学习调参技巧

最近调参调的很无力,从网上找了一些调参技巧总结一下,希望最自己精度提升有帮助。

参考知乎: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文章

你可能感兴趣的:(NN)