深度学习调参技巧----可视化

在网上看了一下额深度学习调参技巧,放在这篇文章做个整理。
https://www.zhihu.com/question/25097993
1.Visualize Layer Activations
2.Visualize Layer Weights

----------------------------------
作者:Captain Jack
链接:https://www.zhihu.com/question/25097993/answer/127472322

训练原则:

1、小规模数据 大模型 filter尽量大 

2、LOSS设计合理,输入输出要做normalization,
一般来说分类就是Softmax, 回归就是L2的loss

多任务情况下, 各loss想法限制在一个量级上, 或者最终限制在一个量级上, 初期可以着重一个任务的loss

3、观察loss变化 > 准确率

4、确认分类网络学习充分

网络就是慢慢的从类别模糊到类别清晰的.

5、 Learning Rate设置合理
+ 太大: loss爆炸, 或者nan
+ 太小: 半天loss没反映(但是, LR需要降低的情况也是这样, 这里可视化网络中间结果, 不是weights, 有效果, 俩者可视化结果是不一样的, 太小的话中间结果有点水波纹或者噪点的样子, 因为filter学习太慢的原因, 试过就会知道很明显)
+ 需要进一步降低了: loss在当前LR下一路降了下来, 但是半天不再降了.
+ 如果有个复杂点的任务, 刚开始, 是需要人肉盯着调LR的. 后面熟悉这个任务网络学习的特性后, 可以扔一边跑去了.
+ 如果上面的Loss设计那块你没法合理, 初始情况下容易爆, 先上一个小LR保证不爆, 等loss降下来了, 再慢慢升LR, 之后当然还会慢慢再降LR, 虽然这很蛋疼.

+ LR在可以工作的最大值下往小收一收, 免得ReLU把神经元弄死了.

6、 对比训练集和验证集的loss

判断过拟合, 训练是否足够, 是否需要early stop的依据, 这都是中规中矩的原则, 不多说了.

7 、清楚receptive field的大小

CV的任务, context window是很重要的. 所以你对自己模型的receptive field的大小要心中有数. 这个对效果的影响还是很显著的. 特别是用FCN, 大目标需要很大的receptive field. 不像有fully connection的网络, 好歹有个fc兜底, 全局信息都有.

简短的注意事项:

  1. 预处理: -mean/std zero-center就够了, PCA, 白化(去除输入数据的冗余信息)都用不上. 个人观点, 反正CNN能学习encoder, PCA用不用其实关系不大, 大不了网络里面自己学习出来一个.
  2. shuffle, shuffle, shuffle.
  3. 网络原理的理解最重要, CNN的conv这块, 你得明白sobel算子的边界检测.
  4. Dropout, Dropout, Dropout(不仅仅可以防止过拟合, 其实这相当于做人力成本最低的Ensemble, 当然, 训练起来会比没有Dropout的要慢一点, 同时网络参数你最好相应加一点, 对, 这会再慢一点).
  5. CNN更加适合训练回答是否的问题, 如果任务比较复杂, 考虑先用分类任务训练一个模型再finetune.
  6. 无脑用ReLU(CV领域).
  7. 无脑用3x3.
  8. 无脑用xavier(神经网络初始化方法).
  9. LRN一类的, 其实可以不用. 不行可以再拿来试试看.
  10. filter数量2^n.
  11. 多尺度的图片输入(或者网络内部利用多尺度下的结果)有很好的提升效果.
  12. 第一层的filter, 数量不要太少. 否则根本学不出来(底层特征很重要).
  13. sgd adam 这些选择上, 看你个人选择. 一般对网络不是决定性的. 反正我无脑用sgd + momentum.
  14. batch normalization我一直没用, 虽然我知道这个很好, 我不用仅仅是因为我懒. 所以要鼓励使用batch normalization.
  15. 不要完全相信论文里面的东西. 结构什么的觉得可能有效果, 可以拿去试试.
  16. 你有95%概率不会使用超过40层的模型.
  17. shortcut的联接是有作用的.
  18. 暴力调参最可取, 毕竟, 自己的生命最重要. 你调完这个模型说不定过两天这模型就扔掉了.
  19. 机器, 机器, 机器.
  20. Google的inception论文, 结构要好好看看.
  21. 一些传统的方法, 要稍微了解了解. 我自己的程序就用过1x14的手写filter, 写过之后你看看inception里面的1x7, 7x1 就会会心一笑...

猜你喜欢

转载自blog.csdn.net/summermaoz/article/details/79026879