1.刚开始, 先上小规模数据, 模型往大了放, 只要不爆显存, 能用256个filter你就别用128个. 直接奔着过拟合去(造成过拟合的原因:a.数据太少,导致无法描述问题的真实分布; b.参数太多,模型就会变得复杂,拟合数据分布的能力就强,复杂模型就会过度的去拟合训练集所刻画的分布)没错, 就是训练过拟合网络, 连测试集验证集这些都可以不用.
2. Loss设计要合理. 一般来说分类就是Softmax, 回归就是L2的loss,然后还要注意loss的错误范围不要太大,太大的话结果会是nan。你预测一个label是10000的值, 模型输出0, 你算算这loss多大, 这还是单变量的情况下。所以不仅仅输入要做normalization, 输出也要这么弄。 然后就是多任务情况下, 各loss想法限制在一个量级上, 或者最终限制在一个量级上, 初期可以着重一个任务的loss
3. 观察loss胜于观察准确率,准确率虽然是评测指标, 但是训练过程中还是要注意loss的. 你会发现有些情况下, 准确率是突变的, 原来一直是0, 可能保持上千迭代, 然后突然变1. 要是因为这个你提前中断训练了, 只有老天替你惋惜了. 而loss是不会有这么诡异的情况发生的, 毕竟优化目标是loss。(重要)
4. 确认分类网络是否学习充分,分类网络就是学习类别之间的界限. 你会发现, 网络就是慢慢的从类别模糊到类别清晰的. 怎么发现? 看Softmax输出的概率的分布, 如果是二分类, 你会发现, 刚开始的网络预测都是在0.5上下, 很模糊. 随着学习过程, 网络预测会慢慢的移动到0,1这种极值附近. 所以, 如果你的网络预测分布靠中间, 再学习学习.
5. Learning Rate设置合理:太大: loss爆炸, 或者nan。太小: 半天loss没反映。需要进一步降低了: loss在当前LR下一路降了下来, 但是半天不再降了。如果上面的Loss设计那块你没法合理, 初始情况下容易爆, 先上一个小LR保证不爆, 等loss降下来了, 再慢慢升LR, 之后当然还会慢慢再降LR。 LR在可以工作的最大值下往小收一收, 免得ReLU把神经元弄死了(这是因为如果梯度太大,而学习率又不小心设置得太大的时候,就会导致权重一下子更新过多,就有可能出现这种情况:举个例子:y = 3 x + 1,权重W=3,如果更新的步长很大,例如 ΔW = -100,那么就变成了 y=-97x+1了,有可能出现训练集中所有的样本经过这个映射,都变成小于 0 的数了,会使得ReLU把神经元弄死了)
参考链接:https://www.zhihu.com/question/67151971/answer/434079498
6. 对比训练集和验证集的loss,判断过拟合, 训练是否足够, 是否需要early stop的依据 (重要),早停法early stop
7. 清楚receptive field的大小,这个对效果的影响还是很显著的. 特别是用FCN, 大目标需要很大的receptive field
refer:
https://www.zhihu.com/question/25097993
当对原模型换了模块后,精度没提升反而下降的情况时,我们可以从两个层面进行分析:
1)模型层面:网络结构自身存在问题:如结构自身不适配等
①可以通过网络结构的原理来定位这个问题:比如你加的模块是为了解决什么问题,是不是本身这个网络本身也能解决这个问题;
②利用下面训练层面的分析方法来排除掉训练层面的问题从而定位到是网络上的问题。
③ 可视化特征图对分析这个问题没啥意义
2)训练层面:
①可视化模型改变前后的loss曲线或者AP收敛曲线,对比一下两个模型收敛速度的差异,看看是否是未收敛造成的结果。比如说你加了这个模块后收敛速度变快但是效果差了一些,那很大概率可能就是有点过拟合了。
loss与准确率的关系,说明不是loss越低auc越高
②可视化训练集,验证集的loss曲线,看看是否是由于数据集太小过拟合了训练集,所以在验证集上精度低。拟合了训练数据中的噪音和训练样例中没有代表性的特征。