最近在看论文时发现了一篇总结性的文章,推荐给大家最近一段时间transform 太火了,基本上大家都在用这些东西,传统CNN 用的反而少了起来,因此这篇论文提出了一些提高CNN 的方法,最后超过了大热的transform。这篇文章是ConVNet for the 2020.这是一篇总结性的论文。
大概扫一扫你会发现好像没什么创新点,好像文章说的东西你都懂啊?是的,可以理解这次提出的ConvNeXt其实就是ResNet的魔改,类似于打比赛刷榜那样,一点点trick不断地加,并用非常solid的实验验证了这些trick的有效性。那就一起来看看这些熟悉的trick是如何work的:
训练技巧
- 多训练一会呗——ResNets从训练90个epoch加到300个epoch
- 优化器更新换代了,别守着Adam,试试AdamW!
- 数据增强扩充数据量:Mixup、Cutmix,RandAugment,RandomErasing
- 正则化防过拟合:Stochastic Depth,Label Smoothing
一顿操作猛如虎,ResNet-50直接从76.1的精度提高到78.8
结构设计
- 改一改每一阶段的block数量,ResNet-50从(3,5,6,3)改为(3,3,9,3)
- ResNeXt化
加深加宽
- depthwise conv 代替 bottleneck中的 3x3卷积
- 使用和Swin-T一样的网络宽度,从原来的64改为96
更大的感受野
transformer的感受野往往可以是global的,而cnn通常用比较小的卷积核,改!加大感受野
这里其实是为了和Swin-T对齐,并没有带来提升
细节决定成败
- 激活函数也在更新换代,试着在卷积网络中也用一下GELU!虽然在这里也没提升
- 真的有必要那么多激活函数吗?transformer中其实只有在MLP块中有一层激活函数。删减CNN中的激活函数!只要两层 1x1卷积层之间放激活函数
- normalization也不是越多越好,删!
- 用layer norm替代batch norm
- 学习Swin Transformer在两个stage之间加一层下采样层,带来的问题是训练不稳定了,解决办法是多加点LN层: one before each downsampling layer, one after the stem, and one after the final global average pooling