Swin Transformer(ICCV 2021 best paper):基于卷积层级式架构的移动窗口视觉Transformer!

有关ViT的学习笔记详见:学习笔记——ViT(Vision Transformer)-CSDN博客

ViT在图像分类方面的结果令人鼓舞,但由于其低分辨率的特征映射和复杂度随图像大小的二次方增长,其架构不适合作为密集视觉任务或高分辨率输入图像的backbone。根据经验,作者发现 Swin Transformer架构在这些图像分类方法中实现了最佳的速度和精度权衡,即使我们的工作侧重于通用性能而不是专门用于分类 。

Swin Transformer(“Swin”代表“Shifted window”)使用了类似卷积神经网络中的层次化构建方法(Hierarchical feature maps),比如特征图尺寸中有对图像下采样4倍、8倍以及16倍,这样的backbone有助于在此基础上构建目标检测,实例分割等任务。而在之前的 ViT 中是一开始就直接下采样16倍,后面的特征图也是维持这个下采样率不变。

在Swin Transformer中使用了Windows Multi-Head Self-Attention(W-MSA)的概念,比如在下图的4倍下采样和8倍下采样中,将特征图划分成了多个不相交的区域(Window),并且Multi-Head Self-Attention只在每个窗口(Window)内进行。相对于Vision Transformer中直接对整个(Global)特征图进行Multi-Head Self-Attention,这样做的目的是能够减少计算量的,尤其是在浅层特征图很大的时候。这样做虽然减少了计算量但也会隔绝不同窗口之间的信息传递,所以在论文中作者又提出了 Shifted Windows Multi-Head Self-Attention(SW-MSA)的概念,通过此方法能够让信息在相邻的窗口中进行传递。

1、Swin Transformer模型框架

  首先将图片输入到Patch Partition模块中进行分块,即每4x4相邻的像素为一个Patch,然后在channel方向展平(flatten)。假设输入的是RGB三通道图片,那么每个patch就有4x4=16个像素,然后每个像素有R、G、B三个值所以展平后是16x3=48,所以通过Patch Partition后图像shape由 [H, W, 3]变成了 [H/4, W/4, 48]。然后在通过Linear Embeding层对每个像素的channel数据做线性变换,由48变成C,即图像shape再由 [H/4, W/4, 48]变成了 [H/4, W/4, C]。

  其实在源码中Patch Partition和Linear Embeding就是直接通过一个卷积层实现的,和之前Vision Transformer中讲的 Embedding层结构一模一样。

  为产生一个层次化表示 (Hierarchical Representation),随着网络的加深,tokens 数逐渐通过 Patch 合并层 (Patch Meraging) 被减少。首个 Patch 合并层拼接了每组 2×2相邻 patch,则 patch token 数变为原来的 1/4,即 H/4×W/4 变成了 H/8×W/8,而 patch token 的维度则扩大4倍,即 4C,最后再对 4C 维的 patch 拼接特征使用了一个线性层,将输出维度降为 2C;

  然后使用 Swin Transformer blocks 进行特征转换,其分辨率保持 H/8×W/8不变。首个 Patch 合并层 和该特征转换 Swin Transformer block 被指定为 Stage 2 (如上图的第二个虚线框所示)。重复 2 次与 Stage 2 相同过程,则分别指定为 Stage 3 和 Stage 4 (如上图的第三、四个虚线框所示)。每个 Stage 都会改变张量的形状,分辨率降低(2×2)倍,维度提高2倍,从而形成一种类似于CNN结构的层次化表征。由此,该架构可方便地替换现有的各种视觉任务的主干网络。

  最后对于分类网络,后面还会接上一个Layer Norm层、全局池化层以及全连接层得到最终输出。

2、Window Partition/Reverse

window partition函数是用于对张量划分窗口,指定窗口大小。将原本的张量从 [N H W C], 划分成 [num_windows*B, window_size, window_size, C],其中 num_windows = H*W / (window_size*window_size),即窗口的个数。而window reverse函数则是对应的逆过程。

3、Window Attention

这是这篇文章的关键。传统的Transformer都是基于全局来计算注意力的,因此计算复杂度十分高。而Swin Transformer则将注意力的计算限制在每个窗口内,进而减少了计算量。主要区别是在原始计算Attention的公式中的Q,K时加入了相对位置编码 B。后续实验有证明相对位置编码的加入提升了模型性能。

4、Patch Merging详解

该模块的作用是在每个Stage开始前做降采样,用于缩小分辨率,调整通道数 进而形成层次化的设计,同时也能节省一定运算量。

在每个Stage中首先要通过一个Patch Merging层进行下采样(Stage1除外)。如下图所示,假设输入Patch Merging的是一个4x4大小的单通道特征图(feature map),Patch Merging会将每个2x2的相邻像素(不重叠)划分为一个patch,然后将每个patch中相同位置(同一颜色)像素给拼在一起就得到了4个feature map。接着将这四个feature map在深度方向进行concat拼接,然后在通过一个LayerNorm层。最后通过一个全连接层在feature map的深度方向做线性变化,将feature map的深度由C变成C/2。通过这个简单的例子可以看出,通过Patch Merging层后,feature map的高和宽会减半,深度会翻倍。

5、W-MSA详解

引入Windows Multi-head Self-Attention(W-MSA)模块是为了减少计算量。如下图所示,左侧使用的是普通的Multi-head Self-Attention(MSA)模块,对于feature map中的每个像素(或称作token,patch)在Self-Attention计算过程中需要和所有的像素去计算。但在图右侧,在使用Windows Multi-head Self-Attention(W-MSA)模块时,首先将feature map按照MxM(例子中的M=2)大小划分成一个个Windows,然后单独对每个Windows内部进行Self-Attention。

为高效建模,我们提出在非重叠的局部窗口中计算自注意力,取代全局自注意力。以不重叠的方式均匀地划分图像得到各个窗口。设每个非重叠局部窗口都包含 N = M × M 个 patch tokens,则基于具有 N = h × w 个 patch tokens 的图像窗口的 MSA 模块 和 基于非重叠局部窗口的 W-MSA 模块 的计算复杂度分别是:

对于一个 h*w*C 的图像,被分割后每个窗口包括 M*M 块。则对应的MSA和W-MSA的计算如下式所示:

其中,MSA 关于 patch token 数 h×w 具有 二次复杂度 (共 h*w个 patch tokens,每个 patch token 在全局计算 h*w次)。W-MSA 则当 M 固定时 (默认设为 7) 具有线性复杂度  (共 h*w个 patch tokens,每个 patch token 在各自的局部窗口内计算 M2次)。巨大的 h×w 对全局自注意力计算而言是难以承受的,而基于窗口的自注意力 (W_MSA) 则具有良好的扩展性。

6、SW-MSA详解(难点)

采用W-MSA模块时,只会在每个窗口内进行自注意力计算,所以窗口与窗口之间是无法进行信息传递的。为了解决这个问题,作者引入了Shifted Windows Multi-Head Self-Attention(SW-MSA)模块,即进行偏移的W-MSA。如下图所示,左侧使用的是W-MSA(假设是第L层),那么根据之前介绍的W-MSA和SW-MSA是成对使用的,那么第L+1层使用的就是SW-MSA(右侧图)。根据左右两幅图对比能够发现窗口(Windows)发生了偏移(可以理解成窗口从左上角分别向右侧和下方各偏移了⌊ M/2 ⌋ 个像素)。看下偏移后的窗口(右侧图),比如对于第一行第2列的2x4的窗口,它能够使第L层的第一排的两个窗口信息进行交流。再比如,第二行第二列的4x4的窗口,他能够使第L层的四个窗口信息进行交流,其他的同理。那么这就解决了不同窗口之间无法进行信息交流的问题。

环形移动窗口法(cyclic shift):先向右边位移,把左边被排开的内容填充到右边空着的位置,shift的尺寸是window_size/2。然后再往下位移,把上边被排开的内容填充到下边空着的位置。

经过了 cycle shift 的方法,一个 window 可能会包括来自不同 window 的内容,如上图红色框内的 sub-window,来自4个不同的 sub-window。因此,要采用 masked MSA 机制将 self-attention 的计算限制在每个子窗口内。最后通过 reverse cycle shift 的方法将每个 window 的 self-attention 结果返回。

这里进行下简单的图解,下图5代表 cycle shift 的过程,这9个 window 通过移位从左边移动到右侧的位置。

按子窗口划分即可得到 5 号子窗口的自注意力的结果,但直接计算会使得 6 号 / 4 号子窗口的自注意力计算混在一起,类似的混算还包括 8 号 / 2 号子窗口 和  9 号 / 7 号 / 3 号 / 1 号子窗口的纵向或横向等。所以需采用 masked MSA 机制:先正常计算自注意力,再进行 mask 操作将不需要的注意力图置 0,从而将自注意力计算限制在各子窗口内。

按照 Swin Transformer 的代码实现 (下面会有讲解),还是做正常的 self-attention (在 window_size 上做),之后要进行一次 mask 操作,把不需要的 attention 值给它置为0。

例1: 比如右上角这个 window,如下图6所示。它由4个 patch 组成,所以应该计算出的 attention map是4×4的。但是6和4是2个不同的 sub-window,我们又不想让它们的 attention 发生交叠。所以我们希望的 attention map 应该是图7这个样子。

因此我们就需要如下图8所示的 mask。

模型配置

Swin-T:C=96,layer number:{2262}  。

Swin-S:C=96,layer number:{22182}  。

Swin-B:C=128,layer number:{22182}  。

Swin-L:C=128,layer number:{22182}  。

win. sz 7x7 表示窗口大小为7x7

dim表示feature map的channel深度(或者说token的向量长度)

head表示多头注意力模块中head的个数

7、总结

1SwinT提出了一种类似于CNN的层次化结构,使得能够学习多尺度的特征,感受野不断扩大,对于局部细节的捕捉能力更强,并且可以作为一个视觉任务的通用backboneViT只强调了Transformer在视觉图片分类领域的开创性作用,SwinT更多的是想证明Transformer可以和CNN一样作为通用的模型

2SwinT提出了W-MSA(窗口多头注意力),使得计算复杂度远远降低。ViT由于是在整张图计算自注意力,其计算复杂度会随着输入图片大小呈二次方增长,这是非常庞大的计算量;而SwinT提出的W-MSA,将注意力计算范围限制在每一个小窗口内,所以随着输入图片大小变化,但窗口大小是固定的,计算复杂度呈线性增长。

3SwinT提出了SW-MSA(移动窗口多头注意力),W-MSA虽然将计算复杂度降下来了,但是窗口之间的计算是独立的,导致缺乏信息流通,于是就有了移动窗口,能够既降低计算复杂度又产生窗口之间的信息交流。

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

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

相关文章

JetBrains系列产品无限重置免费试用方法

JetBrains系列产品无限重置免费试用方法 写在前面安装插件市场安装插件 写在前面 支持的产品: IntelliJ IDEA AppCode CLion DataGrip GoLand PhpStorm PyCharm Rider RubyMine WebStorm为了保证无限重置免费试用方法的稳定性,推荐下载安装2021.2.2及其…

OpenAI GPT-3 API error: “This model‘s maximum context length is 2049 tokens“

题意:OpenAI GPT-3 API 错误:“此模型的最大上下文长度是 2049 个token” 问题背景: I have two issues relating to the response result from OpenAI completion. 我遇到了两个与OpenAI完成响应结果相关的问题 The following result does…

Sam Altman的博客:The Intelligence Age

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

《深入解析:水果销售数据库操作与查询技巧》

文章目录 一、数据库结构与数据源插入1.1 创建数据库与表1.2 插入数据 二、基础数据查询2.1 查询客户信息2.2 查询供应商信息 三、查询优化与技巧3.1 使用LIMIT子句 四、高级查询技巧4.1 使用聚合函数4.2 连接查询4.3 使用子查询 五、案例分析5.1 客户订单详情查询 一、数据库结…

无法将“allure”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的解决方法-allure的安装配置全过程

新手在使用allure之前,以为只是pip install allure-pytest就可以,no!!! 其实,还需要下载allure,allure的具体步骤如下: 1.下载 allure。 allure的下载地址:Central Re…

828华为云征文 | 使用Linux管理面板1Panel管理华为云Flexus云服务器X实例

828华为云征文 | 使用Linux管理面板1Panel管理华为云Flexus云服务器X实例 一、华为云Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点 二、1Panel介绍2.1 1Panel 简介2.2 1Panel 特点 三、本次实践介绍3.1 本次实践简介3.2 本次环境规划 四、购…

报表做着太费劲?为你介绍四款好用的免费报表工具

1. 山海鲸可视化 介绍: 山海鲸可视化是一款免费的国产可视化报表软件,与许多其他宣传免费的软件不同,山海鲸的报表功能完全免费并且没有任何限制,就连网站管理后台这个功能也是免费的。同时山海鲸可视化还提供了种类丰富的可视化…

「数组」离散化 / Luogu B3694(C++)

目录 概述 思路 算法过程 复杂度 Code 概述 Luogu B3694: 给定一个长度为 n 的数列 aa。定义 rank(i) 表示数列 a 中比 ai 小的不同数字个数再加一。 对 1≤i≤n,现在请你求出所有的 rank(i)。 输出格式 对每组数据,输出一行 n 个整数&a…

BUUCTF [SCTF2019]电单车

使用audacity打开,发现是一段PT2242 信号 PT2242信号 有长有短,短的为0,长的为1化出来 这应该是截获电动车钥匙发射出的锁车信号 0 01110100101010100110 0010 0前四位为同步码0 。。。中间这20位为01110100101010100110为地址码0010为功…

关于预处理的一系列问题

1. 预定义符号 C语⾔设置了⼀些预定义符号,可以直接使⽤,预定义符号也是在预处理期间处理的。 2. #define定义常量 #define name stuff 如果定义的 stuff过⻓,可以分成⼏⾏写,除了最后⼀⾏外,每⾏的后⾯都加⼀个反…

值得入手的宠物空气净化器——希喂、352、IAM三款产品真实测评

在快节奏的现代生活中,养宠成为很多人的精神寄托,回到家中与猫咪玩耍是一天中最放松的时刻。但这美好的生活也存在着一些烦恼——宠物毛发清理与异味。宠物空气净化器作为一种新兴的清理工具,以其高效、全面的特点,受到了越来越多…

PMP--二模--解题--91-100

文章目录 14.敏捷91、 [单选] 在敏捷团队完成三次迭代之后,项目经理确定团队在这三次迭代中的平均速度是30个故事点。还有292个故事点来完成项目的剩余部分。团队需要多少次额外的迭代才能完成项目? 9.资源管理92、 [单选] 项目经理前往另一个国家执行最…

Go基础学习04-变量重声明;类型转换;类型断言;Unicode代码点;类型别名;潜在类型

目录 变量重声明 类型断言 类型转换 类型转换注意事项 Unicode代码点 类型别名、潜在类型 类型别名的意义 变量重声明 编写代码: package mainimport "fmt"var container []string{"Beijing", "Shanghai"}func main() {fmt.Pr…

关于Python升级以后脚本不能运行的问题

近日将Python从3.11升级到了3.12,然后把几个包例如numpy等也通过pip给upgrade了一下,结果原来运行的好好的脚本,都运行不了了,还出现各种报错。怀疑是自己升级了环境导致的,因此通过搜索引擎检索了一下,有这…

两个月学习大语言模型(LLM)的详细计划,保姆级教程非常详细收藏我这一篇就够了!

随着人工智能技术的发展,大语言模型(Large Language Models, LLMs)因其在自然语言处理、机器翻译、文本生成等领域的广泛应用而受到越来越多的关注。对于希望掌握这一前沿技术的朋友来说,制定一个系统的学习计划至关重要。本计划旨…

ATTCK实战系列-Vulnstack靶场内网域渗透(二)

ATT&CK实战系列-Vulnstack靶场内网域渗透(二) 前言一、环境搭建1.1 靶场下载地址1.2 环境配置1.2.1 DC域控服务器:1.2.2 WEB服务器:1.2.3 PC域内主机:1.2.4 攻击者kali: 1.3 靶场拓扑图 二、外网渗透2.…

Ubuntu磁盘不足扩容

1.问题 Ubuntu磁盘不足扩容 2.解决方法 安装一下 sudo apt-get install gpartedsudo gparted

Selenium 自动化测试:如何搭建自动化测试环境?

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 最近也有很多人私下问我,selenium学习难吗,基础入门的学习内容很多是3以前的版本资料,对于有基础的人来说,3到4的差…

mybaits获取sqlsession对象后自动开启事务,增删改要记得提交事务!

mybaits中在使用 SQLSession 对象进行数据库操作时,需要注意事务的处理。 以下是关于这个问题的详细说明: 一、SQLSession 与事务的关系 SQLSession 是 MyBatis 框架中用于执行 SQL 语句和与数据库交互的关键对象。当获取 SQLSession 对象后&#xff…

2024年主流前端框架的比较和选择指南

在选择前端框架时,开发者通常会考虑多个因素,包括框架的功能、性能、易用性、社区支持和学习曲线等。以下是一些主流前端框架的比较和选择指南。 1. 主流前端框架简介 React 优点: 组件化开发,易于复用和维护。虚拟DOM提高了性能。强大的生…