学习笔记——Swin Transformer(ICCV 2021 best paper)

有关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/145809.html

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

相关文章

如何模拟异常情况进行接口测试自动化?

接口测试是软件测试中的重要环节,尤其是在分布式系统和微服务架构中,接口的稳定性和正确性直接影响系统的整体性能。在实际应用中,除了要验证接口的功能性,还需要测试接口在各种异常情况下的表现,如网络异常、超时、接…

华为地图服务 - 如何在地图指定位置增加气泡?-- HarmonyOS自学19

场景介绍 本章节将向您介绍如何在地图的指定位置添加气泡。 您可以通过气泡在道路上指定位置显示测速、拥堵情况。气泡支持功能: 支持设置四个方向的图标(传入的图标宽高需要相同)。支持设置图标碰撞规则。支持设置当前气泡的候选坐标段&a…

二叉搜索树(附源码C++)

游凡/搜索二叉树https://gitee.com/you-fan-a/search-binary-tree 一、什么是二叉搜索树? 若它的左子树不空,则左子树上所有结点的值均小于它根结点的值。若它的右子树不空,则右子树上所有结点的值均大于它根结点的值。它的左、右树又分为⼆…

Linux移植之系统烧写

直接参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81 本文仅作为个人笔记使用,方便进一步记录自己的实践总结。 前面我们已经移植好了 uboot 和 linux kernle,制作好了根文件系统。但是我们移植都是通过网络来测试的,在实际的产品开发中…

Autosar Dcm开发-诊断2E或31服务实现pending功能

文章目录 前言Dcm规范功能实现总结前言 项目开发过程中,有需求在31服务(Routine)收到请求时,等待应用层反馈执行完后再进行响应。所以pending一段时间,本文介绍该功能的实现。 Dcm规范 以Routine为例,其服务包含以下返回状态 0:E_OK,服务成功执行 1:E_NOT_OK,服务…

【PythonCode】力扣Leetcode46~50题Python版

【PythonCode】力扣Leetcode46~50题Python版 前言 力扣Leetcode是一个集学习、刷题、竞赛等功能于一体的编程学习平台,很多计算机相关专业的学生、编程自学者、IT从业者在上面学习和刷题。 在Leetcode上刷题,可以选择各种主流的编程语言,如C…

数据仓库建模方法论 :维度模型

使用ER模式建立的数仓,优点是没有冗余的数据。缺点是:数仓是用于分析的,分析的数据量特别大,多个表需要join操作,运行的时候特别慢。 比如:统计哪一年,哪个国家的哪个品类卖的最好?…

如何实现一个流畅的滚动列表

如何实现一个流畅的滚动列表 在网页开发中,滚动列表是展示大量数据时常用的交互方式。通过结合CSS动画和视觉设计,我们可以让列表内容自动滚动,为用户提供顺畅的浏览体验。今天,我将带你一步步实现一个流畅、富有视觉吸引力的滚动…

地平线占用预测 FlashOcc 参考算法-V1.0

1.简介 3D Occupancy Networks 的基本思路是将三维空间划分成体素网格,并对每个网格进行各类感知任务的预测。目前以网格为中心的方法能够预测每个网格单元的占用率、语义类别、未来运动位移和实例信息。3D occupancy 可以对道路障碍物进行更细粒度的划分&#xff…

如何利用nw.js打包vue项目

引言 最近有一个开发windows桌面应用的需求, 需要将vue项目打包成.exe文件,最好是变成可安装版(非绿色版)。特此记录一下如何通过nw.js将vue项目打包成.exe。可能这种方式不是最优,仅供大家参考! nw.js简介(以下描述来自nw.js官…

如何估算 Transformer 模型中的参数数量

最有效的理解新机器学习架构(以及任何新技术)的方式是从零开始实现它。虽然这种方法非常复杂、耗时,并且有时几乎不可能做到,但它能帮助你深入理解每一个实现细节。例如,如果你没有相应的计算资源或数据,你…

AI宠物拟人化新玩法,教你如何用0成本打造爆款创意内容!

近年来,随着AI技术的快速发展,各种创新玩法不断涌现,尤其是在内容创作领域,AI带来的变革尤为显著。 **其中,宠物拟人化逐渐成为社交媒体上的一大热门话题。**通过AI生成工具,我们不仅可以将宠物拟人化&…

面试面经|大模型算法岗常见面试题100道

本文提供了一份全面的大模型算法岗位面试题清单,包括基础理论、模型结构、训练微调策略、应用框架、分布式训练和模型推理等方面的知识点,旨在帮助求职者准备相关技术面试。 一、基础篇 1、目前主流的开源模型体系有哪些? Transformer体系&a…

基于yolov8和openpose人体骨骼关键点实现的摔倒姿态识别检测系统实现

【参考源码】 GitHub - HRonaldo/Openpose_YOLO 本项目参考上面框架进行全面改进,改进如下: (1)将检测框架换成当前最流行框架yolov8,并封装成类实现模块化设计。关于yolov5优化项目可以访问:https://bl…

队列的各种接口的实现(C)

队列的概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 队列的实…

华为地图服务 - 如何在地图上绘制多边形? -- HarmonyOS自学16

场景介绍 本章节将向您介绍如何在地图上绘制多边形。 接口说明 添加多边形功能主要由MapPolygonOptions、addPolygon和MapPolygon提供,更多接口及使用方法请参见接口文档。 接口名 描述 MapPolygonOptions 用于描述MapPolygon属性。 addPolygon(options: mapC…

(八)使用Postman工具调用WebAPI

访问WebAPI的方法&#xff0c;Postman工具比SoapUI好用一些。 1.不带参数的get请求 [HttpGet(Name "GetWeatherForecast")] public IEnumerable<WeatherForecast> Get() {return Enumerable.Range(1, 5).Select(index > new WeatherForecast{Date DateT…

优优嗨聚集团:引领互联网服务新篇章

在当今这个日新月异的互联网时代&#xff0c;企业之间的竞争愈发激烈&#xff0c;如何高效地运营线上业务成为了众多商家关注的焦点。在这一背景下&#xff0c;四川优优嗨聚集团凭借其卓越的服务质量、创新的技术解决方案和强大的品牌影响力&#xff0c;逐渐成为了众多商家信赖…

【大模型教程】如何在Spring Boot中无缝集成LangChain4j,玩转AI大模型!

0 前言 LangChain4j 提供了用于以下功能的 Spring Boot 启动器&#xff1a; 常用集成声明式 AI 服务 1 常用集成的 Spring Boot starters Spring Boot 启动器帮助通过属性创建和配置 语言模型、嵌入模型、嵌入存储 和其他核心 LangChain4j 组件。 要使用 Spring Boot 启动…

基于MATLAB的虫害检测系统

课题背景介绍 中国为农业大国&#xff0c;因此在农业病虫害防治等方面积累了丰富的经验&#xff0c;但在实际工作过程中也存在许多问题。如过于依赖传统经验&#xff0c;对突如而来的新型病虫害问题研究不够到位&#xff0c;如由于判断者主观上面的一些模糊&#xff0c;而带来…