ConvNeXt:A ConvNet for the 2020s
本文最后更新于:2023年11月12日 晚上
ConvNeXt: A ConvNet for the 2020s
原Paper发布日期:2022.5.2于’arxiv.org’, 文章号:2201.03545
1 主要思想
通过全面模仿Vision Transformer的设计来提升ConvNets的能力,使用的有效的trick总结在了下面
- 现代化训练方式:使用AdamW优化器,先进的数据增强方法和正则方法
- 改变stage之间的比例:模仿ViT的
- 改变stem:模仿patch embedding
- 使用depth sperable conv:改DSConv并增加网络宽度
- 反转bottleneck
- 增大卷积核:增大到卷积
- 改激活函数:使用受欢迎的GELU
- 减少激活
- 减少归一化
- BN改LN
- 下采样器改为不重叠卷积
2 方法
2.1 现代化训练方式
在文章增强的training recipe中,他们将优化器改为了AdamW。使用了类似DeiT的训练方法。
首先是先进的数据增强方法,
- Mixu
- Cutmi
- RandAugmen
- Random Erasig
然后是新的正则方法
- Stochastic Depth
- Label smoothing
2.2 Stage ratio
在ResNet50中使用了的stage ratio,这里为了模仿Swin-T,改成了
精准度78.8->79.4
2.3 Patchify
类似于Swin-T中的Patch Embedding,这里也直接使用不重叠卷积来对图像进行首次大幅度下采样。具体使用卷积,步长为来进行下采样。
精准度79.4->79.5
2.4 类ResNeXt设计
ResNeXt的设计哲学类似于使用分组卷积,分更多的组,并增加宽度来trade-off计算量和准确度。所以这里直接采用深度可分离卷积,然后扩大宽度,具体是把初始的64个通道改成了96个(模仿Swin-T)。
2.5 反转Bottleneck
将原来的
graph TD
A[conv2d 1x1 384->96]
B[conv2d 3x3 96->96]
C[conv2d 1x1 96->384]
A --> B --> C
改为
graph TD
A[dwconv2d 3x3 96->96]
B[conv2d 1x1 96->384]
C[conv2d 1x1 384->96]
A --> B --> C
注意为了模仿Swin-T的设计,bottleneck的通道数量变换从原来的两倍变成了四倍。注意这里同一般的反转bottleneck不同,这里是将DWConv提前了,实际上也是对齐了Transformer里面先进行MSA运算,然后再用MLP扩大四倍缩小四倍的操作。
2.6 增大卷积核
分别试了不同的卷积核大小,这里最终确定卷积核能带来最好的效果
准确度:80.6
2.7 把ReLU换成GELU
替换成最受欢迎的GELU,准确度没变化
2.8 减少激活
Swin-T里面就只有一次激活,所以这里就只使用一次激活,把激活函数放在了两个卷积之间。
准确度80.6->81.3
2.9 减少归一化
Swin-T里面也有更少的归一化层,所以这里删掉两个归一化层,留一个在之后
81.3->81.4
2.10 BN换LN
简单更换为LN之后性能也有提升
81.4->81.5
最后得到的ConvNeXt Block是
graph TD
G[Source signal]
A[dwconv2d 7x7 96->96]
D[LayerNorm]
B[conv2d 1x1 96->384]
E[GELU]
C[conv2d 1x1 384->96]
F[Element-wise Add]
G-->A --> D --> B --> E --> C --> F
G --> F
2.11 使用分离的下采样层
原本ResNet中是卷积步长为2来下采样,这里改为卷积步长为2的不重叠卷积来下采样。注意到这个改动原本让训练不收敛了,最后在每个下采样层前,stem层后,以及全局平均池化后增加了LN。
准确度达到了82%
3 模型配置
- Tinty: ,
- Small: ,
- Base: ,
- Large: ,
- XLarge: ,