一. 初始化
有人用normal初始化cnn的参数,最后acc只能到70%多,仅仅改成xavier,acc可以到98%。
或者直接用预训练模型,采用百度工程师推荐的warmup,然后再 finetune,怎么finetune,看我以前的文章。
二.从理解CNN网络以产生直觉去调参数的角度考虑,应该使用可视化
可视化(知乎用户 杨军)
- 刚开始, 先上小规模数据, 模型往大了放, 只要不爆显存, 能用256个filter你就别用128个. 直接奔着过拟合去. 没错, 就是训练过拟合网络, 连测试集验证集这些都可以不用.就是为了看整体训练流程没有错误,假如loss不收敛就要好好反思了。
- 观察loss胜于观察准确率
- 准确率虽然是评测指标, 但是训练过程中还是要注意loss的. 你会发现有些情况下, 准确率是突变的, 原来一直是0, 可能保持上千迭代, 然后突然变1.
卷积神经网络(CNN)中的独有技巧:
- CNN中将一个大尺寸的卷积核可以分解为多层的小尺寸卷积核或者分成多层的一维卷积。这样能够减少参数增加非线性
- CNN中的网络设计应该是逐渐减小图像尺寸,同时增加通道数,让空间信息转化为高阶抽象的特征信息。
- CNN中可以利用Inception方法来提取不同抽象程度的高阶特征,用ResNet的思想来加深网络的层数。
- CNN处理图像时,常常会对原图进行旋转、裁剪、亮度、色度、饱和度等变化以增大数据集增加鲁棒性。
- 经常会被问到你用深度学习训练模型时怎么样改善你的结果呢?然后每次都懵逼了,一是自己懂的不多,二是实验的不多,三是记性不行忘记了。所以写这篇博客,记录下别人以及自己的一些经验。
去年春夏接触到深度学习,直到现在,也有大半年了,但是关于训练调节参数一直没有很好的把握,刚好同组有调参大神,就向她请教了下:https://blog.youkuaiyun.com/qq_36113899/article/details/79108769?depth_1-
本着一个大原则:学习率尽量调大,只要不发散就行。
1、用什么:Adam和SGD
Adam:比较傻瓜式,可以自动调节学习率(初始学习率也不能太大,只是施加一个惯性?)。不追求极致的和初学者能用它把模型训练到一个比较满意的效果。
SGD:一般框架中默认的优化器,适合要求比较高的模型训练。普遍适用于各种数据集,一般给个较大的bash_lr训练一段时间后再降低进行训练。
以下例子来自于caffe源代码中的mnist训练例子(只看最后一个cell就行):
收敛速度: Adam > SGD
eg. 网络包含一个全连接层,lr=0.001,lr_policy=‘inv’, niter=500 (左Adam右SGD)
模型精度:SGD > Adam
SGD需要多次调参,逐步降低学习率。
eg. 网络包含一个全连接层,lr=0.01,lr_policy=‘inv’, niter=1500 (左Adam右SGD)
训练效果Adam反而比SGD好,猜想以下原因:
(1)学习速率一致,没有调低SGD参数;
(2)网络结构过于简单;
(3)学习率不够低,SGD迭代次数不够多
2、推荐做法:模型好且快速收敛的方法
用adam训练一段时间,然后用sgd继续训练提高模型精度。

4508

被折叠的 条评论
为什么被折叠?



