ConvNeXt网络

论文:A ConvNet for the 2020s

会议:2022 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)

时间:2022

在视觉识别领域,Vision Transformers(ViTs)的引入开启了"Roaring 20",并迅速取代ConvNets成为最先进的图像分类模型。然而,传统的ViT在应用于通用的计算机视觉任务(如目标检测和语义分割)时面临困难。而层级Transformer(例如Swin Transformers)重新引入了一些ConvNet的先验知识,使得Transformer成为了通用视觉骨干模型,并在各种视觉任务上展现出卓越的性能。然而这种混合方法的有效性很大程度上仍归于Transformer的内在优势,而不是卷积的固有归纳偏差。因此,本文重新设计,测试纯ConvNet所能达到的极限。我们逐步将标准的ResNet向视觉Transformer的设计方向进行"现代化",并发现了几个关键组件,在这个过程中对性能差异起到了贡献。这次探的结果是一个被称为ConvNeXt的纯ConvNet模型系列。ConvNets完全由标准的ConvNet模块构建,与Transformers在准确性和可扩展性方面相媲美,在ImageNet的top-1准确率达到了87.8在COCO检测和ADE20K分割任务上胜过了Swin Transformers,同时保持了标准ConvNets的单和高效性。


 Training Techniques

本文探索旨在研究并遵循Swin Transformer不同级别的设计,同时保持网络的简单性作为标准ConvNet。我们的出发点是 ResNet-50 模型。我们首先使用用于训练vision Transformers的类似训练技术(e.g. AdamW optimizer, data augmentation techniques such as Mixup, Cutmix, RandAugment, Random Erasing, and regularization schemes including Stochastic Depth and Label Smoothing)对其进行训练,并获得比原始 ResNet-50 更好的结果,这将是我们的基线。然后,我们研究了一系列设计决策,我们将其总结为:

1) macro design

2) ResNeXt

3) inverted bottleneck

4) large kernel size

5) various layer-wise micro designs

下图(原论文Figure 2)展现了每个方案对最终结果的影响(Imagenet 1K的准确率)。很明显最后得到的ConvNeXt在相同FLOPs下准确率已经超过了Swin Transformer。接下来,针对每一个实验进行解析。


  • macro design

We now analyze Swin Transformers' macro network design. Swin Transformers follow ConvNets to use a multi-stage design, where each stage has a different feature map resolution. There are two interesting design considerations: the stage compute ratio, and the "stem cell" structure.

Changing stage compute ratio:我们将ResNet-50中每个阶段的stage数量从[3,4,6,3]调整为[3,3,9,3]和Swin-T拥有相似的FLOPs。进行调整后,准确率由78.8%提升到了79.4%。

Changing stem to “Patchify”:stem cell design关注的是输入图像在网络开始时是如何处理的。在之前的卷积神经网络中,一般最初的下采样模块stem一般都是通过一个卷积核大小为7x7步距为2的卷积层以及一个步距为2的最大池化下采样共同组成,高和宽都下采样4倍。但在Transformer模型中一般都是通过一个卷积核非常大且相邻窗口之间没有重叠的(即stride等于kernel_size)卷积层进行下采样。比如在Swin Transformer中采用的是一个卷积核大小为4x4步距为4的卷积层构成patchify,同样是下采样4倍。所以作者将ResNet中的stem也换成了和Swin Transformer一样的patchify。替换后准确率从79.4% 提升到79.5%,并且FLOPs也降低了一点。

stem = nn.Sequential(
            nn.Conv2d(in_chans, dims[0], kernel_size=4, stride=4),
            LayerNorm(dims[0], eps=1e-6, data_format="channels_first")
        )

  • ResNeXt-ify

在这一部分中,我们尝试采用ResNeXt的思想,与普通ResNet相比,它具有更好的FLOPS/精度权衡。核心组件是分组卷积(grouped convolution),其中卷积滤波器被分成不同的组。在高层次上,ResNeXt 的指导原则是“使用更多的组,扩展宽度”。更准确地说,ResNeXt 在bottleneck block中对 3⇥3 conv 层采用分组卷积。由于这显着减少了 FLOP,因此扩展了网络宽度以补偿容量损失。

我们使用深度卷积(depthwise convolution),分组卷积的一种特殊情况,其中组的数量等于通道数。我们注意到深度卷积类似于 self-attention 中的加权和操作,该操作基于每个通道进行操作,即仅在空间维度上混合信息接着作者将最初的通道数由64调整成96和Swin Transformer保持一致,最终准确率达到了80.5%。

The combination of depthwise conv and 1 ⇥ 1 convs leads to a separation of spatial and channel mixing, a property shared by vision Transformers, where each operation either mixes information across spatial or channel dimension, but not both.


  •  inverted bottleneck

作者认为Transformer block中的MLP模块非常像MobileNetV2中的Inverted Bottleneck模块,即两头细中间粗。下图a是ReNet中采用的Bottleneck模块,b是MobileNetV2采用的Inverted Botleneck模块(图b的最后一个1x1的卷积层画应该是384->96),c是ConvNeXt采用的是Inverted Bottleneck模块。


  • Large Kernel Sizes

vision Transformers最显着的方面之一是它们的non-local self-attention,这使得每一层都具有全局感受野。虽然过去使用ConvNets使用了较大的kernels,但黄金标准(由VGGNet普及)是堆叠小内核大小(3⇥3)的卷积层,这些层在现代gpu上具有高效的硬件实现。尽管 Swin Transformers 将局部窗口重新引入自注意力块,但窗口大小至少为 7⇥7,明显大于 3⇥3 的 ResNe(X)t 内核大小。在这里,我们重新审视了对 ConvNets 使用大型内核大小的卷积。

Moving up depthwise conv layer:为了探索large kernels,一个先决条件是将深度卷积层的位置(Figure 3 (b) 移动到 (c))。这是一个在Transformer中也很明显的设计决策:MSA块被放置在MLP层之前。即将depthwise conv模块上移,原来是1x1 conv -> depthwise conv -> 1x1 conv,现在变成了depthwise conv -> 1x1 conv -> 1x1 conv

Increasing the kernel size:我们将在每个块中使用7⇥7 depthwise conv。我们尝试了几种kernels size,包括 3, 5, 7, 9 和 11。网络的性能从 79.9% (3⇥3) 增加到 80.6% (7⇥7),而网络的 FLOPs 大致相同。

以下是一个ConvNeXt Block的代码实现,共有4个block。 

class Block(nn.Module):
    r""" ConvNeXt Block. There are two equivalent implementations:
    (1) DwConv -> LayerNorm (channels_first) -> 1x1 Conv -> GELU -> 1x1 Conv; all in (N, C, H, W)
    (2) DwConv -> Permute to (N, H, W, C); LayerNorm (channels_last) -> Linear -> GELU -> Linear; Permute back
    We use (2) as we find it slightly faster in PyTorch
    
    Args:
        dim (int): Number of input channels.
        drop_path (float): Stochastic depth rate. Default: 0.0
        layer_scale_init_value (float): Init value for Layer Scale. Default: 1e-6.
    """
    def __init__(self, dim, drop_path=0., layer_scale_init_value=1e-6):
        super().__init__()
        self.dwconv = nn.Conv2d(dim, dim, kernel_size=7, padding=3, groups=dim) # depthwise conv
        self.norm = LayerNorm(dim, eps=1e-6)
        self.pwconv1 = nn.Linear(dim, 4 * dim) # pointwise/1x1 convs, implemented with linear layers
        self.act = nn.GELU()
        self.pwconv2 = nn.Linear(4 * dim, dim)
        self.gamma = nn.Parameter(layer_scale_init_value * torch.ones((dim)), 
                                    requires_grad=True) if layer_scale_init_value > 0 else None
        self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity()

    def forward(self, x):
        input = x
        x = self.dwconv(x)
        x = x.permute(0, 2, 3, 1) # (N, C, H, W) -> (N, H, W, C)
        x = self.norm(x)
        x = self.pwconv1(x) # (N, H, W, C) -> (N, H, W, 4*C)
        x = self.act(x)
        x = self.pwconv2(x)  # (N, H, W, 4*C) -> (N, H, W, C)
        if self.gamma is not None:
            x = self.gamma * x
        x = x.permute(0, 3, 1, 2) # (N, H, W, C) -> (N, C, H, W)

        x = input + self.drop_path(x)
        return x

  • Micro Design

在本节中,我们研究了微观层面的其他一些架构差异——这里的大部分探索都是在层级别完成的,重点是激活函数(activation functions)和规范化层(normalization layers)的具体选择。

Replacing ReLU with GELU:NLP 和视觉架构之间的一个区别是要使用激活函数的细节,ReLU 也可以在我们的 ConvNet 中用 GELU 代替,尽管准确度保持不变(80.6%)。

Fewer activation functions:Transformer 和 ResNet 块之间的一个小区别是 Transformer 的激活函数更少,如图 4 所示,我们从残差块中删除了所有 GELU 层,除了两个 1 ⇥ 1 层之间的层,复制了 Transformer 块的样式。这个过程将结果提高了 0.7% 到 81.3%,实际上与 Swin-T 的性能相匹配。我们现在将在每个块中使用单个 GELU 激活。

Fewer normalization layers:Transformer Blocks通常也有更少的归一化层(normalization layers)。我们删除了两个 BatchNorm (BN) 层,在 conv 1 ⇥ 1 层之前只剩下一个 BN 层。这进一步提高了 81.4% 的性能,已经超过了 Swin-T 的结果。

Substituting BN with LN:BatchNorm是ConvNets的重要组成部分,因为它提高了收敛性,减少了过拟合。但是BN 也有许多可能会对模型的性能产生不利影响 。Transformers 中使用了更简单的层归一化  (LN),从而在不同的应用场景中表现良好。我们将使用一个 LayerNorm 作为我们在每个残差块中归一化的选择,准确率为 81.5%。

Separate downsampling layers:在ResNet网络中stage2-stage4的下采样都是通过将主分支上3x3的卷积层步距设置成2,捷径分支(shotcut)上1x1的卷积层步距设置成2进行下采样的。但在Swin Transformer中是通过一个单独的Patch Merging实现的。接着作者就为ConvNext网络单独使用了一个下采样层,就是通过一个Laryer Normalization加上一个卷积核大小为2步距为2的卷积层构成。更改后准确率就提升到了82.0%。


ConvNeXt variants

我们构建了不同的ConvNeXt变体ConvNeXtT/S/B/L,与Swin-T/S/B/L具有相似的复杂性。变体仅在通道数 C 和每个阶段的块数 B 上有所不同,在 ResNets 和 Swin Transformers 之后,每个新阶段的通道数量都会翻倍。总结了以下配置:

• ConvNeXt-T: C = (96, 192, 384, 768), B = (3, 3, 9, 3)

• ConvNeXt-S: C = (96, 192, 384, 768), B = (3, 3, 27, 3)

• ConvNeXt-B: C = (128, 256, 512, 1024), B = (3, 3, 27, 3)

• ConvNeXt-L: C = (192, 384, 768, 1536), B = (3, 3, 27, 3)

• ConvNeXt-XL: C = (256, 512, 1024, 2048), B = (3, 3, 27, 3)


结论

在 2020 年代,vision Transformers,尤其是 Swin Transformers 等分层 Transformer开始将 ConvNets 作为通用视觉主干的首选。人们普遍认为,vision Transformers比ConvNets更准确、更高效、可扩展。我们提出了ConvNeXts,这是一种纯粹的ConvNet模型,可以在多个计算机视觉基准上与最先进的hierarchical vision Transformers竞争,同时保持标准ConvNet的简单性和效率。在某种程度上,我们的观察结果令人惊讶,而我们的 ConvNeXt 模型本身并不是全新的——在过去十年中,许多设计选择都是单独检查的,但不是集体的。我们希望本研究中的新结果将挑战几个广泛持有的观点,并促使人们重新思考卷积在计算机视觉中的重要性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值