ConvNeXt网络详解

2023-11-03

ConvNeXt

论文名称:A ConvNet for the 2020s
论文下载链接:https://arxiv.org/abs/2201.03545
论文对应源码链接:https://github.com/facebookresearch/ConvNeXt
视频讲解:https://www.bilibili.com/video/BV1SS4y157fu



0 前言

自从ViT(Vision Transformer)在CV领域大放异彩,越来越多的研究人员开始拥入Transformer的怀抱。回顾近一年,在CV领域发的文章绝大多数都是基于Transformer的,比如2021年ICCV 的best paper Swin Transformer,而卷积神经网络已经开始慢慢淡出舞台中央。卷积神经网络要被Transformer取代了吗?也许会在不久的将来。今年(2022)一月份,Facebook AI ResearchUC Berkeley一起发表了一篇文章A ConvNet for the 2020s,在文章中提出了ConvNeXt纯卷积神经网络,它对标的是2021年非常火的Swin Transformer,通过一系列实验比对,在相同的FLOPs下,ConvNeXt相比Swin Transformer拥有更快的推理速度以及更高的准确率,在ImageNet 22KConvNeXt-XL达到了87.8%的准确率,参看下图(原文表12)。看来ConvNeXt的提出强行给卷积神经网络续了口命。

在这里插入图片描述
如果你仔细阅读了这篇文章,你会发现ConvNeXt“毫无亮点”,ConvNeXt使用的全部都是现有的结构和方法,没有任何结构或者方法的创新。而且源码也非常的精简,100多行代码就能搭建完成,相比Swin Transformer简直不要太简单。之前看Swin Transformer时,滑动窗口,相对位置索引,不光原理理解起来有些吃力,源码多的也挺让人绝望的(但无法否认Swin Transformer的成功以及设计的很巧妙)。为什么现在基于Transformer架构的模型效果比卷积神经网络要好呢?论文中的作者认为可能是随着技术的不断发展,各种新的架构以及优化策略促使Transformer模型的效果更好,那么使用相同的策略去训练卷积神经网络也能达到相同的效果吗?抱着这个疑问作者就以Swin Transformer作为参考进行一系列实验。

In this work, we investigate the architectural distinctions between ConvNets and Transformers and try to identify the confounding variables when comparing the network performance. Our research is intended to bridge the gap between the pre-ViT and post-ViT eras for ConvNets, as well as to test the limits of what a pure ConvNet can achieve.


1 设计方案

作者首先利用训练vision Transformers的策略去训练原始的ResNet50模型,发现比原始效果要好很多,并将此结果作为后续实验的基准baseline。然后作者罗列了接下来实验包含哪些部分:

  • macro design
  • ResNeXt
  • inverted bottleneck
  • large kerner size
  • various layer-wise micro designs

Our starting point is a ResNet-50 model. We first train it with similar training techniques used to train vision Transformers and obtain much improved results compared to the original ResNet-50. This will be our baseline. We then study a series of design decisions which we summarized as 1) macro design, 2) ResNeXt, 3) inverted bottleneck, 4) large kernel size, and 5) various layer-wise micro designs.

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


2 Macro design

在这个部分作者主要研究两方面:

  • Changing stage compute ratio,在原ResNet网络中,一般conv4_x(即stage3)堆叠的block的次数是最多的。如下图中的ResNet50stage1stage4堆叠block的次数是(3, 4, 6, 3)比例大概是1:1:2:1,但在Swin Transformer中,比如Swin-T的比例是1:1:3:1Swin-L的比例是1:1:9:1。很明显,在Swin Transformer中,stage3堆叠block的占比更高。所以作者就将ResNet50中的堆叠次数由(3, 4, 6, 3)调整成(3, 3, 9, 3),和Swin-T拥有相似的FLOPs。进行调整后,准确率由78.8%提升到了79.4%
    在这里插入图片描述

  • Changing stem to “Patchify”,在之前的卷积神经网络中,一般最初的下采样模块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也降低了一点。


3 ResNeXt-ify

接下来作者借鉴了ResNeXt中的组卷积grouped convolution,因为ResNeXt相比普通的ResNet而言在FLOPs以及accuracy之间做到了更好的平衡。而作者采用的是更激进的depthwise convolution,即group数和通道数channel相同,之前在讲MobileNet时由很详细讲解过,如果不了解的可以翻翻之前的文章。这样做的另一个原因是作者认为depthwise convolutionself-attention中的加权求和操作很相似。

We note that depthwise convolution is similar to the weighted sum operation in self-attention.

接着作者将最初的通道数由64调整成96和Swin Transformer保持一致,最终准确率达到了80.5%


4 Inverted Bottleneck

作者认为Transformer block中的MLP模块非常像MobileNetV2中的Inverted Bottleneck模块,即两头细中间粗。下图a是ReNet中采用的Bottleneck模块,b是MobileNetV2采用的Inverted Botleneck模块(图b的最后一个1x1的卷积层画错了,应该是384->96,后面如果作者发现后应该会修正过来),c是ConvNeXt采用的是Inverted Bottleneck模块。关于MLP模块可以参考之前讲的Vision Transformer博文,关于Inverted Bottleneck模块可以参考之前讲的MobileNetv2博文

在这里插入图片描述

作者采用Inverted Bottleneck模块后,在较小的模型上准确率由80.5%提升到了80.6%,在较大的模型上准确率由81.9%提升到82.6%

Interestingly, this results in slightly improved performance (80.5% to 80.6%). In the ResNet-200 / Swin-B regime, this step brings even more gain (81.9% to 82.6%) also with reduced FLOPs.


5 Large Kernel Sizes

Transformer中一般都是对全局做self-attention,比如Vision Transformer。即使是Swin Transformer也有7x7大小的窗口。但现在主流的卷积神经网络都是采用3x3大小的窗口,因为之前VGG论文中说通过堆叠多个3x3的窗口可以替代一个更大的窗口,而且现在的GPU设备针对3x3大小的卷积核做了很多的优化,所以会更高效。接着作者做了如下两个改动:

  • Moving up depthwise conv layer,即将depthwise conv模块上移,原来是1x1 conv -> depthwise conv -> 1x1 conv,现在变成了depthwise conv -> 1x1 conv -> 1x1 conv。这么做是因为在Transformer中,MSA模块是放在MLP模块之前的,所以这里进行效仿,将depthwise conv上移。这样改动后,准确率下降到了79.9%,同时FLOPs也减小了。
  • Increasing the kernel size,接着作者将depthwise conv的卷积核大小由3x3改成了7x7(和Swin Transformer一样),当然作者也尝试了其他尺寸,包括3, 5, 7, 9, 11发现取到7时准确率就达到了饱和。并且准确率从79.9% (3×3) 增长到 80.6% (7×7)

6 Micro Design

接下来作者在聚焦到一些更细小的差异,比如激活函数以及Normalization。

  • Replacing ReLU with GELU,在Transformer中激活函数基本用的都是GELU,而在卷积神经网络中最常用的是ReLU,于是作者又将激活函数替换成了GELU,替换后发现准确率没变化。
  • Fewer activation functions,使用更少的激活函数。在卷积神经网络中,一般会在每个卷积层或全连接后都接上一个激活函数。但在Transformer中并不是每个模块后都跟有激活函数,比如MLP中只有第一个全连接层后跟了GELU激活函数。接着作者在ConvNeXt Block中也减少激活函数的使用,如下图所示,减少后发现准确率从80.6%增长到81.3%
    在这里插入图片描述
  • Fewer normalization layers,使用更少的Normalization。同样在Transformer中,Normalization使用的也比较少,接着作者也减少了ConvNeXt Block中的Normalization层,只保留了depthwise conv后的Normalization层。此时准确率已经达到了81.4%,已经超过了Swin-T
  • Substituting BN with LN,将BN替换成LN。Batch Normalization(BN)在卷积神经网络中是非常常用的操作了,它可以加速网络的收敛并减少过拟合(但用的不好也是个大坑)。但在Transformer中基本都用的Layer Normalization(LN),因为最开始Transformer是应用在NLP领域的,BN又不适用于NLP相关任务。接着作者将BN全部替换成了LN,发现准确率还有小幅提升达到了81.5%
  • Separate downsampling layers,单独的下采样层。在ResNet网络中stage2-stage4的下采样都是通过将主分支上3x3的卷积层步距设置成2,捷径分支上1x1的卷积层步距设置成2进行下采样的。但在Swin Transformer中是通过一个单独的Patch Merging实现的。接着作者就为ConvNext网络单独使用了一个下采样层,就是通过一个Laryer Normalization加上一个卷积核大小为2步距为2的卷积层构成。更改后准确率就提升到了82.0%

7 ConvNeXt variants

对于ConvNeXt网络,作者提出了T/S/B/L四个版本,计算复杂度刚好和Swin Transformer中的T/S/B/L相似。

We construct different ConvNeXt variants, ConvNeXt-T/S/B/L, to be of similar complexities to Swin-T/S/B/L.

这四个版本的配置如下:

  • 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)

其中C代表4个stage中输入的通道数,B代表每个stage重复堆叠block的次数。


8 ConvNeXt-T 结构图

下图是我根据源码手绘的ConvNeXt-T网络结构图,仔细观察ConvNeXt Block会发现其中还有一个Layer Scale操作(论文中并没有提到),其实它就是将输入的特征层乘上一个可训练的参数,该参数就是一个向量,元素个数与特征层channel相同,即对每个channel的数据进行缩放。Layer Scale操作出自于Going deeper with image transformers. ICCV, 2021这篇文章,有兴趣的可以自行了解。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ConvNeXt网络详解 的相关文章

  • 让Redis突破内存大小的限制

    Redis虽然可以实现持久化存储 也是基于数据内存模型的基础之上 单机内存大小限制着Redis存储的数据量 有没有一种替代方案呢 本文介绍一款笔者使用的采用New BSD License 许可协议的软件 SSDB 官网地址 http ssd
  • EF常见数据库连接字符串示例

    数据库类型 字符串 Sqlite Data Source Furion db MySql Data Source localhost Database Furion User ID root Password 000000 pooling
  • 第四周课程总结&试验报告(二)

    实验二 Java简单类与对象 实验目的 掌握类的定义 熟悉属性 构造函数 方法的作用 掌握用类作为类型声明变量和方法返回值 理解类和对象的区别 掌握构造函数的使用 熟悉通过对象名引用实例的方法和属性 理解static修饰付对类 类成员变量及

随机推荐

  • python-gif图生成

    python 用几行代码便生成gif图 代码如下 import imageio filenames 1 jpg 2 jpg 3 jpg images for filename in filenames images append image
  • C语言

    1024G 嵌入式资源大放送 包括但不限于C C 单片机 Linux等 关注微信公众号 嵌入式大杂烩 回复1024 即可免费获取 C语言类型 C的类型分为 对象类型 char int 数组 指针 结构体等 函数类型 不完全类型 什么是不完全
  • 机器学习——支持向量机

    机器学习 支持向量机 一 定义 二 基本概念 1 线性可分 2 分割超平面 3 超平面 4 点相对于分割面的间隔 5 间隔 6 支持向量 三 寻找最大间隔 1 分隔超平面 2 如何决定最好的参数 3 凸优化 4 拉格朗日对偶 拉格朗日乘子法
  • Java的String类

    Java中String是常量 其对象一旦创建完毕就无法 改变 当使用 拼接字符串时 会生成新的String对象 而不是向原有的String对象追加内容 对于Java 维护着一个字符串池的概念 String pool String s aaa
  • 服务环境搭建-Traefik网关服务

    服务环境搭建 Traefik网关服务 1 说明 Traefik网关服务用于提供一个实现反向代理 中间件鉴权 服务负载均衡 与服务发现的环境 2 反向代理 2 1 基本概念 EntryPoints 入口点是进入Traefik的网络入口点 它们
  • Python3-面向对象

    Python之面向对象 面向对象 走进对象的世界 类的基本操作 定义 属性 方法 三性 封装 继承 多态 封装 继承 多态 单例 练习 面向对象 对象创建 属性 定义 封装 继承 多态 单例 走进对象的世界 类的基本操作 定义 面向对象 程
  • 未来的工作都被计算机代替,未来10年,50%的工作将被机器取代?而这些职业却无法被取代...

    声明 原创不易 禁止搬运 违者必究 50 的工作将被机器人取代 时代的车轮在前进 更新换代也越来越快了 总是有新兴行业的诞生 也总是有传统的行业退出 变化成为了时代发展的一个重要标志 创建阿里巴巴的马云 之所以能够如此的成功 不得不说他的前
  • Vue中BootStrap和分页组件 实现分页功能(页码过多时带省略号)

    更新 其实vue中的分页插件结合上 spring data jpa 使用的效果非常好 使用更加方便 vue组件中 div class box footer no border div
  • 微信小程序:云开发·初探四(数据库操作)

    The course of true love never did run smooth 真爱无坦途 新建集合 1 打开云开发控制台 数据库 2 添加集合users 添加代码 onAdd function const db wx cloud
  • DX90SDK SDK源码分析(二) 推模式的例子

    转载请标明是引用于 http blog csdn net chenyujing1234 例子代码 编译工具 VS2005 http www rayfile com zh cn files 46611607 78a2 11e1 ac18 00
  • Makefile的函数调用详解

    1 Makefile的函数调用语法 Makefile的函数调用格式
  • 高德地图的简单使用:点击标记获取经纬度和详细地址

    准备工作 1 先进入高德开发平台注册登录 2 进入地图 js Api 按照步骤申请key 3 使用npm安装依赖包 npm i amap amap jsapi loader save 4 高德api 都有说明 下面看下我实现的功能和代码 弹
  • hutool的HttpRequest.post的使用-包括上传文档等多个传参【总结版本】

    首先hutool已经为我们封装好了远程调用的接口 我们只要将对应的传参和方式对应填写即可 hutool官方文档 1实际应用 post 常见的使用json传参 contend type为application json RequestMapp
  • 计算机键盘运算符号输入,电脑上感叹号怎么打出来(电脑键盘符号大全)

    01 在使用键盘输入标点符号时 大部分都可以直接通过键盘按键或者按Ctrl 键盘按键直接输入 比如按下shift 1 就可以输入感叹号 中文状态下按反斜杠键就可以输入顿号 其实在键盘上的很多同一个按键 中文状态下和英文状态下是不一样的 如下
  • King 【POJ - 1364】【差分约束+SPFA+卡了判负环的进队次数】

    题目链接 题目大意 n个数的一个序列 m个条件 si ni oi ki 代表了序列中第si个数到第si ni个数的和大于或小于ki gt 大于 lt 小于 问是否存在相悖的约束 op为gt时 sum si ni sum si 1 gt ki
  • 宽带远端服务器无响应什么意思,宽带远程服务器无响应

    宽带远程服务器无响应 内容精选 换一换 已成功添加目标环境 如果目标环境处于在线状态 只允许修改目标环境名称 如果目标环境处于离线状态 可以输入登录远程服务器的用户名和密码重新部署分析辅助软件 如果目标环境处于在线状态 只允许修改目标环境名
  • 10.12技术沉淀

    cpp 编写程序实现ADT表的定义 及常用操作 1 判断表是否为空 2 获取第i个节点的内容 3 删除 4 插入 include
  • 全局变量/局部变量/静态变量

    1 全局变量 全局变量是在所有函数体的外部定义的 程序的所有部分 其他文件的代码 都可以使用 全局变量不受作用域的影响 全局变量的生命周期一直到程序的结束 全局变量是静态存储方式 如果在一个文件中使用extern关键字来声明另一个文件中存在
  • 论文-- 基于 证据理论 的 不确定信息 度量与融合应用

    摘要 1 工程应用 不确定信息 1 模糊集合 表示的 模糊信息 2 语义上不一致或非特异性 造成的 歧义信息 3 开放世界特性 导致的 非完备信息 1 不确定信息的处理 基于证据理论 2 不确定信息分类 封闭世界 空集的基本概率指派函数值为
  • ConvNeXt网络详解

    ConvNeXt 论文名称 A ConvNet for the 2020s 论文下载链接 https arxiv org abs 2201 03545 论文对应源码链接 https github com facebookresearch C