CV-Model【8】:ConvNeXt

news2024/11/25 23:57:58

文章目录

  • 前言
  • 1. Abstract & Introduction
    • 1.1. Abstract
    • 1.2. Introduction
  • 2. Modernizing a ConvNet: a Roadmap
    • 2.1. Training Techniques
    • 2.2. Macro Design
      • 2.2.1. Stage ratio
      • 2.2.2. "patchif" stem
    • 2.3. ResNeXt-ify
    • 2.4. Inverted Bottleneck
    • 2.5. Large Kernel Sizes
    • 2.6. Micro Design
      • 2.6.1. Replacing ReLU with GELU
      • 2.6.2. Fewer activation functions
      • 2.6.3. Fewer normalization layers
      • 2.6.4. Substituting BN with LN
      • 2.6.5. Separate downsampling layers
  • 3. ConvNeXt Architecture
    • 3.1. ConvNeXt variants
    • 3.2. Model Architecture
  • 总结


前言

随着 ViT 在计算机视觉领域大放异彩,越来越多的研究人员将工作重心放在 Transformer 上,在计算机视觉领域上 CNN 难道真的要被 Transformer 完全取代吗?

本文长篇分析并设计 CNN 架构的若干技巧,对照 Swin Transformer 的设计理念,渐进式“现代化”改造 ResNet,取得了良好的效果,对深度网络的设计具有较大的参考价值

原论文链接:A ConvNet for the 2020s


1. Abstract & Introduction

1.1. Abstract

分层变形器(如 Swin Transformers)重新引入了几个 ConvNet 先验,使得 Transformer作为通用视觉骨干实际上是可行的,并在各种视觉任务中表现出显著的性能。然而,这种混合方法的有效性仍然主要归功于 Transformers 的内在优势,而不是 Convolutions 的内在归纳偏见

本文逐步将一个标准的 ResNet “现代化”,并在这一过程中发现了几个促成性能差异的关键组件。ConvNeXt 完全由标准的 ConvNet 模块构成,在准确性和可扩展性方面与 Transformer 竞争,通过一系列实验比对,在相同的 FLOPs 下,ConvNeXt 相比 Swin Transformer 拥有更快的推理速度以及更高的准确率

1.2. Introduction

背景:

  • ConvNets
    • "滑动窗口 "策略是视觉处理的内在因素,特别是在处理高分辨率图像时
      • 以滑动窗口的方式使用时,计算是共享的
    • 基于区域的检测器让 ConvNets 成为视觉识别系统的基本构件
  • ViT
    • 除了最初的 "补丁化 "层(将图像分割成一连串的补丁),ViT 没有引入图像特定的感应偏差,并且对原始的 NLP Transformers 做了最小的改动
    • ViT 模型在作为通用视觉骨干时面临最大的挑战是 ViT 的全局注意力设计,它的复杂度与输入大小呈二次方
  • Swin Transformer
    • 采用了一种混合方法来弥补这一差距
      • "滑动窗口 "策略(如在局部窗口内的注意)被重新引入变形器,使其行为与 ConvNets 更加相似

我们可以发现,许多用于计算机视觉的变形器的进步都是为了让卷积回归,但这种尝试通常是有代价的

本文主要研究了 ConvNetsTransformers 之间的架构区别,并试图确定比较网络性能时的混杂变量。从一个标准的ResNet(例如ResNet50)开始,用改进的程序训练,并寻找到几个影响性能的关键组件,以实现与 Transformers 的竞争

在这里插入图片描述


2. Modernizing a ConvNet: a Roadmap

阅读完 这篇文章,你会发现 ConvNeXt “毫无亮点”,ConvNeXt 使用的全部都是现有的结构和方法,没有任何结构或者方法的创新。而且源码也非常的精简,100多行代码就能搭建完成

为什么现在基于 Transformer 架构的模型效果比卷积神经网络要好呢?本文认为可能是随着技术的不断发展,各种新的架构以及优化策略促使 Transformer 模型的效果更好,那么使用相同的策略去训练卷积神经网络也能达到相同的效果吗?

在这里插入图片描述

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

2.1. Training Techniques

Vision Transformers 不仅带来了一套新的模块和架构设计决策,而且还为视觉引入了不同的训练技术(如 AdamW 优化器)。这主要涉及到优化策略和相关的超参数设置

本文首先利用训练 Vision Transformers 的策略去训练原始的 ResNet50 模型,在这种情况下是 ResNet50/200,发现比原始效果要好很多,并将此结果作为后续实验的基准 baseline

本文使用了与 DeiTSwin Transformer相近的训练策略:

  • 训练从原来的 90 个 epochs 扩展到 300 个 epochs 的 ResNets
  • 使用 AdamW 优化器
  • 数据增强技术,如 MixupCutmixRandAugmentRandom Erasing
  • 正则化方法,如 Stochastic DepthLabel Smoothing

就其本身而言,这个增强的训练配方将 ResNet-50 模型的性能从 76.1% 提高到 78.8% (+2.7%),这意味着传统 ConvNets 和视觉变形器之间的性能差异的很大一部分可能是由于训练技术造成的

2.2. Macro Design

2.2.1. Stage ratio

在原 ResNet 网络中,一般 conv4_x(即 stage3)堆叠的 block 的次数是最多的。如下图中的 ResNet50stage1stage4 堆叠 block 的次数是 ( 3 , 4 , 6 , 3 ) (3, 4, 6, 3) (3,4,6,3) 比例大概是 1 : 1 : 2 : 1 1:1:2:1 1:1:2:1,但在 Swin Transformer 中,比如 Swin-T 的比例是 1 : 1 : 3 : 1 1:1:3:1 1:1:3:1Swin-L 的比例是 1 : 1 : 9 : 1 1:1:9:1 1:1:9:1,很明显,在 Swin Transformer 中,stage3 堆叠 block 的占比更高

所以,本文将 ResNet50 中的堆叠次数由 ( 3 , 4 , 6 , 3 ) (3, 4, 6, 3) (3,4,6,3) 调整成 ( 3 , 3 , 9 , 3 ) (3, 3, 9, 3) (3,3,9,3),和 Swin-T 拥有相似的 FLOPs。进行调整后,准确率由 78.8 % 78.8\% 78.8% 提升到了 79.4 % 79.4\% 79.4%

在这里插入图片描述

2.2.2. “patchif” stem

stem 即卷机神经网络中,最初的下采样模块。如上图所示,ResNet50 网络当中,stem 是由 7 × 7 7 \times 7 7×7 的卷积与最大池化下采样组成,步距均为 2 2 2,图像的高和宽都下采样4倍

但在 Transformer 模型中一般都是通过一个卷积核非常大且相邻窗口之间没有重叠的(即 stride 等于 kernel_size)卷积层进行下采样。比如在 Swin Transformer 中采用的是一个卷积核大小为 4 × 4 4 \times 4 4×4 步距为 4 4 4 的卷积层构成 patchify,同样是下采样 4 4 4 倍。所以作者将 ResNet 中的 stem 也换成了和 Swin Transformer 一样的 patchify

替换后准确率从 79.4 % 79.4\% 79.4% 提升到 79.5 % 79.5\% 79.5%,并且 FLOPs 也降低了一点

2.3. ResNeXt-ify

本文试图采用 ResNeXt 的思想,因为 ResNeXt 相比普通的 ResNet 而言在 FLOPs 以及 accuracy 之间做到了更好的平衡。其核心部分是分组卷积 grouped convolution,其中卷积核被分成不同的组

如下图所示,左图是 ResNet 所采用的 bottleneck 结构,首尾两端通过 1 × 1 1 \times 1 1×1 的卷积核将通道数从 256 调整为 64 再调整回 256;右图是 ResNeXt 所采用的 block 结构,两者的最主要区别在于中间的卷积层,ResNet 采用的是普通的卷积层,而 ResNeXt 采用的是分组卷积

在这里插入图片描述

本文采用的是更激进的 depthwise convolution,即 group 数和通道数 channel 相同,使用 depthwise convolution 的一个原因是作者认为 depthwise convolutionself-attention 中的加权求和操作很相似,具体的原理可以参考我的另一篇 blog:CV-Model【2】:MobileNet v1

其结构与下图类似,针对每个 channel 的数据,我们单独用一个卷积核进行处理

在这里插入图片描述

使用 depthwise convolution 后,准确率由 79.5 % 79.5\% 79.5% 下降到 78.3 % 78.3\% 78.3%,同时 Flops 也从 4.4 下降到 2.4

接下来增大输入特征层的 channel,如下图所示:

  • ResNet
    • 输入通道数为 64
      在这里插入图片描述
  • Swin Transformer
    在这里插入图片描述
    • 以 Swin-T 为例,输入通道数为 96

作者参照 Swin Transformer,将每个 stage 的 channel 与 Swin Transformer 中的参数保持一致,可以发现准确率由 78.3 % 78.3\% 78.3% 提升到了 80.5 % 80.5\% 80.5%

2.4. Inverted Bottleneck

作者认为 Transformer block 中的 MLP 模块非常像 MobileNetV2中的 Inverted Bottleneck 模块,即两头细中间粗:

  • 下图 a 是 ReNet 中采用的 Bottleneck 模块
  • 下图 b 是 MobileNetV2 采用的 Inverted Botleneck 模块
  • 下图 c 是 ConvNeXt 采用的 Inverted Bottleneck 模块

在这里插入图片描述

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

关于 MLP 模块可以参考我的另一篇 blog:CV-Model【6】:Vision Transformer,关于 Inverted Bottleneck 模块可以参考我的另一篇 blog:CV-Model【3】:MobileNet v2

2.5. Large Kernel Sizes

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

  • 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 % 79.9\% 79.9%,同时 FLOPs 也减小了。
  • Increasing the kernel size
    • 接着作者将 depthwise conv 的卷积核大小由 3 × 3 3 \times 3 3×3 改成了 7 × 7 7 \times 7 7×7(和 Swin Transformer 一样),当然作者也尝试了其他尺寸,包括 3 , 5 , 7 , 9 , 11 3, 5, 7, 9, 11 3,5,7,9,11 发现取到 7 7 7 时准确率就达到了饱和
    • 准确率从 79.9 % 79.9\% 79.9% ( 3 × 3 3 \times 3 3×3) 增长到 80.6 % 80.6\% 80.6% ( 7 × 7 7 \times 7 7×7)

在这里插入图片描述

2.6. Micro Design

这里的大部分探索是在层级上完成的,重点是激活函数和归一化层的具体选择

2.6.1. Replacing ReLU with GELU

在 Transformer 中激活函数基本用的都是 GELU,而在卷积神经网络中最常用的是 ReLU,于是作者又将激活函数替换成了 GELU,替换后发现准确率没变化

2.6.2. Fewer activation functions

在之前的神经网络学习过程中,我们习惯性地在每一个卷积层和全联接层之后加上一个激活函数,在这里,作者尝试使用更少的激活函数

如下图所示,在 Transformer 中并不是每个模块后都跟有激活函数,比如 MLP 中只有第一个全连接层后跟了 GELU 激活函数,其他模块后面都没有使用激活函数。接着作者在 ConvNeXt Block中也减少激活函数的使用,减少后发现准确率从 80.6 % 80.6\% 80.6% 增长到 81.3 % 81.3\% 81.3%

在这里插入图片描述

2.6.3. Fewer normalization layers

同样在 Transformer 中,Normalization 使用的也比较少,接着作者也减少了 ConvNeXt Block 中的 Normalization 层,只保留了 depthwise conv 后的 Normalization

此时准确率已经达到了 81.4 % 81.4\% 81.4%,已经超过了 Swin-T

2.6.4. Substituting BN with LN

Batch Normalization (BN) 在卷积神经网络中是非常常用的操作了,它可以加速网络的收敛并减少过拟合

但在 Transformer 中基本都使用 Layer Normalization (LN),因为最开始 Transformer 是应用在 NLP 领域的,BN 不适用于 NLP 相关任务

接着作者将 BN 全部替换成了 LN,发现准确率还有小幅提升达到了 81.5 % 81.5\% 81.5%

2.6.5. Separate downsampling layers

ResNet 网络中 stage2 - stage4 的下采样都是通过将主分支上 3 × 3 3 \times 3 3×3 的卷积层步距设置成 2 2 2,捷径分支上 1 × 1 1 \times 1 1×1 的卷积层步距设置成 2 2 2 进行下采样的

但在 Swin Transformer 中是通过一个单独的 Patch Merging 实现的。接着作者就为 ConvNext 网络单独使用了一个下采样层,就是通过一个 Laryer Normalization 加上一个卷积核大小为 2 2 2 步距为 2 2 2 的卷积层构成

在这里插入图片描述

更改后准确率就提升到了 82.0 % 82.0\% 82.0%


3. ConvNeXt Architecture

3.1. ConvNeXt variants

对于 ConvNeXt 网络,作者提出了 T/S/B/L 四个版本,计算复杂度刚好和 Swin Transformer 中的 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 C C 代表 4 4 4stage 中输入的通道数, B B B 代表每个 stage 重复堆叠 block 的次数

3.2. Model Architecture

ConvNeXt - T 模型结构图如下所示

  • 通过卷积核大小为 4 × 4 4 \times 4 4×4,步距为 4 4 4 的卷积层对图像进行下采样
  • 依次通过 stage1 - stage4
    • Depthwise conv2d 卷积核大小为 7 × 7 7 \times 7 7×7,步距为 1 1 1,padding 为 3 3 3 h , w , d i m h, w, dim h,w,dim 不变,后接一个 Layer Norm
    • Conv2d 卷积核大小为 1 × 1 1 \times 1 1×1,步距为 1 1 1 h , w h, w h,w 不变, d i m × 4 dim \times 4 dim×4,后接一个 GELU
    • Layer Scale
      • 论文中并没有提到,其实它就是将输入的特征层乘上一个可训练的参数,该参数就是一个向量,元素个数与特征层 channel 相同,即对每个 channel 的数据进行缩放
    • Drop path
      • 随机的点对层之间的关闭
      • 具体讲解可以参考我的另一篇 blog:CV【3】:drop_out & drop_path

在这里插入图片描述


总结

本文提出的纯 CNN 的网络 ConvNeXt,在多种任务上取得了超越 Transformer 的效果,同时能够保留 ConvNet 的简洁高效性质

作者期望本文的结论能够推进对卷积及训练的重新思考

博客参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/189425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AWK简单总结

目录AWK简单总结常用命令选项变量内置变量自定义变量printf命令格式AWK简单总结 awk是linux/unix下的一个强大编程工具,他支持用户自定义函数和动态正则表达式,灵活性强,运行速度快。 常用命令选项 -F fs:fs指定输入分隔符,fs可…

利用SMB协议实现局域网内设备文件的共享

文章目录参考资料说明步骤1:[windows]开启SMB协议步骤2:[windows]创建新的用户账号步骤3:[windows]共享文件夹属性-共享-共享属性-共享-高级共享步骤4:[windows]查看共享文件的主机在局域网内的IP地址步骤5:[ipad]打开…

华为机试题:HJ35 蛇形矩阵(python)

文章目录知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input()与list(input())的区别、及其相互转换方法2、print() :打印输出。3、算术运算符4、整型int() :将字符串或数字转换为整型…

π122M31 双通道数字隔离器 CAN通信隔离兼容ADuM7241ARZ

π122M31 双通道数字隔离器 CAN通信隔离兼容ADuM7241ARZ电路简单、稳定性更高,具有出色的性能特征和可靠性,整体性能优于光耦和基于其他原理的数字隔离器产品。 产品传输通道间彼此独立,可实现多种传输方向的配置,可实现 5.0kVrms…

excel软件应用:如何妙用Word拆分单元格数据

打仗亲兄弟,上阵父子兵!Word和Excel就是一对好兄弟,虽然各有分工,但有时也能彼此帮忙。Excel中的莫名其妙问题找Word帮忙解决,往往有效。譬如从平台中导出的数据,先使用Word做一次符号处理再粘贴到Excel中处…

Go语言基础入门第五章

string 什么是stringGo中的字符串是一个字节的切片,可以通过将其内容封装在""中来创建字符串,Go中的字符串是 Unicode 兼容的,并且是 UTF-8 编码。 字符串是一些字节的集合。 package mainimport "fmt"func main() {st…

白盒测试用例设计-笔记

白盒测试用例设计方法白盒设计方法静态:桌面检查、代码审查、代码走查、代码扫描工具动态:逻辑覆盖法:语句覆盖、判断覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖基本路径测试法逻辑覆盖法:是通过对程序逻辑结构的遍历…

97. BERT微调、自然语言推理数据集以及代码实现

1. 微调BERT 2. 句子分类 3. 命名实体识别 4. 问题回答 5. 总结 即使下游任务各有不同,使用BERT微调时只需要增加输出层但根据任务的不同,输入的表示,和使用的BERT特征也会不一样 6. 自然语言推理数据集 斯坦福自然语言推断语料库&#xf…

BP神经网络算法实现

目录 一、实验数学原理 二、实验算法和实验步骤 三、结果分析 1. 均方误差变化的影响 2. 迭代次数变化的影响 3. 学习效率变化的影响 四、预测 一、实验数学原理 激活函数: 一般使用S形函数(即sigmoid函数),比如可以使用log-…

【爬虫系列】Python如何实现进度条效果?

一、需求 在爬取数据过程中,发现不看输出日志是不知道当前的爬取进度,而单纯靠控制台输出日志信息也不方便判断。因此,就想办法给爬取过程加个进度条,实时展示当前的爬取进度。 有了这个需求和想法之后,那如何实现呢…

k8s中不同名称空间下的pod无法解析服务名

1、背景 公司的项目需要使用容器化部署,为了更好的维护和管理,我将各个项目按照命名空间进行隔离开,但是却发现存在一些问题 不同的系统间需要项目调用,而且是按照服务名进行调用,但是却导致不同名称空间下pod无法解析…

mac 快应用开发工具 真机调试 usb调试 提示Error:没有找到Android设备

项目场景: 项目场景:mac使用快应用开发工具连接Android手机 问题描述 显示错误没有找到Android设备 原因分析: adb连接的问题 解决方案: 1.确保手机开启开发者模式 2.确保手机与mac的连接线能传输数据,有的线只能…

python+moviepy音视频处理(一):基本操作

目录 视频处理 视频加载和输出 视频转换gif 视频裁剪 视频音量调节 去掉视频声音 视频中的音频提取与替换 获取视频属性 倍数播放视频 截取视频某帧为封面 多视频拼接 音频处理 替换视频文件的音频 多个音频文件拼接 安装:pip install moviepy 中文官…

【自学Docker】Docker stats命令

Docker stats命令 大纲 docker stats命令教程 docker stats 命令可以用于动态显示 Docker容器 的资源消耗情况,包括:CPU、内存、网络I/O。docker stats命令也可以指定已停止的容器,但是不会返回任何信息。 docker stats命令语法 haicoder…

Windows下载安装Nignx

下载 下载地址:http://nginx.org/en/download.html 下载完成以后,得到nginx压缩包; Nginx启动 方式一:可执行文件启动 双击nginx.exe启动 现在,我们打开任务管理器,如果发现nginx进程存在,说明启动完成; 方式二:命令行启动 进入nginx所在…

【Mysql第三期 基本查询语句结构】

文章目录1. SQL概述1.1 SQL背景知识1.2SQL 分类2. SQL语言的规则与规范2.1 基本规则2.2 SQL大小写规范 (建议遵守)2.3 注 释2.4 命名规则(暂时了解)3.基本的SELECT语句3.1 查询基本结构3.2 列的别名3.3 去除重复行扩展windows cmd…

同步FIFO设计verilog设计及仿真

同步FIFO设计 1.功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计。由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出。写入和读出的操作由时钟的上升沿触发。当FIFO的数据满和空的时候分别设置相应的高电平加以指示。 2.顶层信号定义: 信号名…

最小生成树问题(Prim算法和Kruskal算法)

问题引入: 这算是一道模板题了,只不过这次在做的时候感觉又学到了些新的东西,之前都是数据结构里学的,因为用惯了C,所以就想摆脱那些邻接数组之类的写法,用STL试一下,在其中把我遇到的一些问题写…

【论文翻译】边缘应用中加速卷积神经网络的剪枝算法综述

摘要 随着卷积神经网络(CNN)模型大小的增加,模型压缩和加速技术对于在边缘设备上部署这些模型变得至关重要。在本文中,我们对修剪进行了全面的调查,这是一种主要的压缩策略,可以从CNN模型中删除非关键或冗…