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的1:1:3:11:1:3:1
  • 改变stem:模仿patch embedding
  • 使用depth sperable conv:改DSConv并增加网络宽度
  • 反转bottleneck
  • 增大卷积核:增大到7×77\times 7卷积
  • 改激活函数:使用受欢迎的GELU
  • 减少激活
  • 减少归一化
  • BN改LN
  • 下采样器改为不重叠卷积

2 方法

2.1 现代化训练方式

在文章增强的training recipe中,他们将优化器改为了AdamW。使用了类似DeiT的训练方法。
首先是先进的数据增强方法,

  • Mixu
  • Cutmi
  • RandAugmen
  • Random Erasig

然后是新的正则方法

  • Stochastic Depth
  • Label smoothing

2.2 Stage ratio

在ResNet50中使用了[3,4,6,3][3,4,6,3]的stage ratio,这里为了模仿Swin-T,改成了[3,3,9,3][3,3,9,3]
精准度78.8->79.4

2.3 Patchify

类似于Swin-T中的Patch Embedding,这里也直接使用不重叠卷积来对图像进行首次大幅度下采样。具体使用4×44\times 4卷积,步长为44来进行下采样。
精准度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 增大卷积核

分别试了不同的卷积核大小,这里最终确定7×77\times 7卷积核能带来最好的效果
准确度:80.6

2.7 把ReLU换成GELU

替换成最受欢迎的GELU,准确度没变化

2.8 减少激活

Swin-T里面就只有一次激活,所以这里就只使用一次激活,把激活函数放在了两个1×11\times 1卷积之间。
准确度80.6->81.3

2.9 减少归一化

Swin-T里面也有更少的归一化层,所以这里删掉两个归一化层,留一个在7×77\times 7之后
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中是3×33\times 3卷积步长为2来下采样,这里改为2×22\times 2卷积步长为2的不重叠卷积来下采样。注意到这个改动原本让训练不收敛了,最后在每个下采样层前,stem层后,以及全局平均池化后增加了LN。
准确度达到了82%

3 模型配置

  • Tinty: C=[96,192,384,768]C=[96, 192, 384, 768], B=[3,3,9,3]B=[3, 3, 9, 3]
  • Small: C=[96,192,384,768]C=[96, 192, 384, 768], B=[3,3,27,3]B=[3, 3, 27, 3]
  • Base: C=[128,256,512,1024]C=[128, 256, 512, 1024], B=[3,3,27,3]B=[3, 3, 27, 3]
  • Large: C=[192,384,768,1536]C=[192, 384, 768, 1536], B=[3,3,27,3]B=[3, 3, 27, 3]
  • XLarge: C=[256,512,1024,2048]C=[256, 512, 1024, 2048], B=[3,3,27,3]B=[3, 3, 27, 3]

ConvNeXt:A ConvNet for the 2020s
https://jesseprince.github.io/2023/09/26/convnets/frontier/convnextv1/
作者
林正
发布于
2023年9月26日
许可协议