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