30_Swin-Transformer网络结构详解

1.1 简介

Swin Transformer 是一种用于计算机视觉任务的新型深度学习架构,由微软亚洲研究院于2021年提出。它结合了Transformer模型在序列数据处理上的强大能力与卷积神经网络(CNN)在图像识别中的高效局部特征提取优势,特别适用于图像分类、目标检测、语义分割等任务。Swin Transformer的主要创新点在于其“Shifted Window”机制,这一机制使得模型既能保持Transformer的全局注意力特性,又能有效利用图像数据的空间局部性,从而在性能和计算效率上取得了平衡。下面是Swin Transformer的几个核心特点和组成部分的详细介绍:

1. 分层Transformer结构

  • 分层设计:与ViT(Vision Transformer)直接将整个图像分割为固定大小的patch不同,Swin Transformer采用了类似于CNN的分层设计。它首先将图像分割成小块(称为“patches”),然后通过多层逐步减小这些块的大小和增加通道数,形成了层次化的特征表示。这种设计有助于捕捉不同尺度的特征。

2. Shifted Windows机制

  • 窗口划分:Swin Transformer的核心创新在于引入了“窗口”概念,即在每个阶段,模型只在局部窗口内计算自注意力,这大大减少了计算复杂度,使其在图像数据上变得可行。

  • 位移窗口:在连续的Transformer层中,窗口会按照一定的模式(例如,上下左右平移一定步长)进行移动或“shift”,这样可以确保信息在不同窗口间流动,实现跨窗口的交互,同时保持计算效率。这一机制既保留了局部特征的有效提取,又引入了一定程度的全局上下文信息。

3. 轻量级自注意力计算

  • 无重叠窗口内的自注意力:仅在窗口内部计算自注意力,避免了全局自注意力带来的高昂计算成本。

  • 线性计算复杂度:由于窗口内的自注意力计算是独立的,Swin Transformer的自注意力计算复杂度与窗口大小相关,而非与图像尺寸相关,这使得模型在处理高分辨率图像时更加高效。

4. 连续的下采样策略

  • 与传统CNN中的池化操作类似,Swin Transformer通过在某些层级减少窗口的数量(即窗口合并)来实现空间下采样,进一步提高模型的感受野,同时保持了窗口内的局部注意力机制。

5. 性能与应用

  • 广泛适用性:Swin Transformer因其高效的结构设计,在多个视觉任务上展现出优越的性能,包括图像分类、目标检测、实例分割和语义分割等。

  • 可训练性和可扩展性:该模型易于训练且具有良好的可扩展性,能够通过增加层数或调整窗口大小等手段进一步提升性能。

总结

Swin Transformer的成功在于它创造性地融合了Transformer架构与图像处理中的局部性原理,通过Shifted Windows机制实现了高效而强大的视觉特征表示能力。这种设计不仅在理论上具有创新意义,也在实际应用中展示了强大的竞争力,成为当前视觉变换器研究的一个重要里程碑。

下图中可以看到,Swin Transformer的模型效果非常好。

1.2 网络整体框架

和VIT做一个对比,我们可以发现,(1)Swin Transformer的下采样的倍率是不一样的,所以能构建出不同层次的特征图,而VIT全都是16倍下采样。(2)Swin Transformer将特征图用窗口的形式分割开了,窗口与窗口之间是没有重叠的。在VIT当中,特征图是一个整体并没有分割。

window与window之间不进行信息的传递。这样做的好处在于能够减少运算量,尤其是浅层网络。

网络的整体架构如下:

先来说一下图(a)中的patch partition是什么东西,看图中的上半部分。

对于输入的图像,patch partition会使用一个4x4大小的窗口对图像进行分割。分割之后,按照channel方向进行展平(沿深度方向进行拼接),因为每个图像都是三通道的,这里一个通道有16个,那么三通道就是48个。所以经过patch partition,原来图像的高宽缩减为原来的四分之一,通道数变为48。接下来通过linear embedding层来对输入特征矩阵的channel进行一个调整,调整之后通道数变为C,这个C具体为多少需要针对Swin transformer的不同版本(T\S\B\L)采用不同值。然后linear embedding后跟着一个layer norm层归一化。

patch partition和linear embedding都是通过卷积层实现的。

接着看图(a),在stage1还要堆叠swin transformer block 2次。注意一下,在不同stage中block的堆叠次数都是偶数次,原因是因为图b,这俩block我们都是成对去使用的。和VIT不同的是,这里的block将多头注意力机制替换成了W-msa和sw-msa。

1.3 Patch Merging

这是对于stage2\3\4,在block前都会进行一个patch emerging。它的作用就是下采样。

假设我们输入的特征矩阵的高和宽都是4x4的,以单通道为例,我们以2x2大小作为一个窗口,在这窗口中有四个像素,然后我们将每个窗口位置中相同的像素取出来,然后得到四个特征矩阵,按照channel进行concat,层归一化,再通过一个全连接层进行线性映射。

经过Patch Merging,高宽缩减为原来的一半,通道数变为原来的二倍。

1.4 W-MSA(windows-multi head self attention)

对于普通的MSA,我们会对每一个像素pixel去求它的QKV,然后对于每一个像素所求的Q和K进行匹配然后进行一系列操作。也就是说对于每一个pixel会对特征矩阵当中所有的像素进行一个沟通。

对于W-MSA,我们会对特征图分成一个个的window,然后对每个window内部进行MSA。这么做的目的就是为了减少计算量。缺点是窗口之间无法进行信息交互,也就导致感受野变小,无法看到全局的视野。

MSA和W-MSA模块计算量

这俩公式是怎么来的:https://blog.csdn.net/qq_37541097/article/details/121119988

(对于矩阵相乘,假设有矩阵A(形状axb)和B(bxc),他俩进行矩阵相乘,FLOPS应该为:axbxc。)

1.5 SW-MSA(shifted windows-multi head self attention)

对于SW-MSA是怎么划分窗口的,其实是将原来WMSA划分窗口的那个东西向右又向下移动了两个像素(或者说patch)。

这样划分之后,我们那第一行第二个窗口举例,在对划分后的窗口进行MSA计算的话就会融合上一层第一行那两个窗口的信息。其他窗口同理。

一开始WMSA划分窗口是这样的:

然后向右再向下移动两个像素:

这样划分来的就是SWMSA的窗口了。

现在有一个问题,原来是四个window,现在变成9个window了,如果我们要实现并行计算的话,除了中间那个,其他八个大小都是小于 4x4的,那么就要进行填充到 4x4大小,那么这相当于9个windows计算量,那么这样做我们的计算量又增加了。

作者为了解决这个问题提出了一个解决方法,见图右下角以及后面的图片。

通过SWMSA已经划分为9个window了,接下来我们将左上角的window标记为区域A,然后1,2标记为C,3和6标记为B。

接下来我们将A和C移动到下面来:

接下来我们再将A和B移动到右边去:

然后我们重新划分window,接下来我们把4不变,3和5合并,7和1合并,0268合并,这样我们对这合并后的四个window分别进行一个MSA,那么它的计算量和WMSA其实是一样的。

那么这又会引入一个新的问题。比如,对于5和3,它本来是两个分开的区域并不连续,我们强行把它俩划在一个windows里面去了,如果我们对它进行一个MSA计算的话,其实是有问题的。

那么,我们就希望在这个window内,单独计算5和3的MSA。

具体怎么做呢?论文中给出了方法:加上MSAK MSA,就是加上一个蒙版。

举一个例子,还是刚刚的5和3,我们有16个patch,计算5和3的MSA是分开计算的。根据之前讲的MSA计算公式,我们对0这个像素先算,算出来q0矩阵,然后与其他像素进行匹配(点乘计算相似度),得到α0,0到α0,15。但是我们又不希望引入区域3的信息,作者将区域三的α的值全部减去100,然后进行softmax的时候就会非常小趋近于0,也就是说,对于像素0,它与区域三内的像素的相似度全是0。

通过这个方法我们就将区域5和区域3的像素分开了。计算量和WMSA是一样的,只不过多了一个mask中的减法操作。

注意,我们在计算完之后,需要将数据挪回去(因为之间对区域进行了移动)。

现在举一个例子,假设我们经过WMSA得到的矩阵是9x9的特征矩阵,然后window尺寸是3x3的,那么现在就有一个问题,我们需要将那几行或者那几列数据进行挪动呢?

论文给的方法是:首先我们将窗口尺寸M除以2然后向下取整,那么3对应的就是1,也就是说我们只需要移动第一行和第一列。

粗的黑色分割线是原始的window。接下来我们再用3x3的window重新划分。

对于这四个橙色的而言我们可以直接进行MSA操作,因为内部它们的数据本来就是连续的。而且我们可以观察到,橙色的每一个windows都能融合上一层的四个windows的信息。

而对于紫色的而言并不是连续的,需要mask MSA。

1.6 Relative Position Bias (相对位置偏置)

下图中偏置就是公式中的B。

表4说明,如果我们不去使用任何位置编码的话,准确率是80.1%,如果使用绝对位置编码(即VIT中的位置编码),Imagenet准确率上升了一点点,但是在COCO和ADE上的目标检测性能反而降低了,这就说明使用绝对位置编码其实效果并不好。

如果我们使用相对位置偏置的话,那么它在下列任务中准确率均有了比较大的提升。

表的前两行使用了WMSA和SWMSA的对比可以发现是用SWMSA也是非常有必要的。

那么到底什么是相对位置偏置呢?

我们首先假设我们这里有一个feature map,我们先对这个特征图进行标注绝对位置索引。

接下来我们标注相对位置索引,相对位置索引的值,就是先选一个颜色所在的像素,然后剩余位置的相对索引就是用选中参考点的减去剩余的位置的绝对位置索引。比如选蓝色,然后橙色的相对位置索引就是蓝色的绝对位置索引减去橙色的绝对位置索引。以此类推。

我们将每一个相对位置索引的矩阵在行方向上展平,然后拼接在一起就得到了下图的矩阵。根据矩阵每个位置上的相对位置索引可以在relative position bias table中取到一个对应的参数。

注意相对位置索引和相对位置偏置是两个不同的概念,我们需要利用索引去取相应的参数。

在原作者使用的代码中并不是使用的这样的一个二元的位置坐标,它使用的是一个一元的位置坐标,那么就需要将二元坐标转为一元坐标。

首先,我们先使偏移从0开始,我们将位置坐标全部加上M-1(M是窗口尺寸,这里举的例子是2)

然后,我们在行标乘上2M-1。

 

接着我们将行标列标相加。

我们可以发现,原来相同的索引的位置在变换后还是相同的。

我们再来看这个bias table,元素个数为(2M-1)X(2M-1)。

拿取到表中的偏置值之后,矩阵变化成如下这样子。这个最终的矩阵才是我们最后要的B。

那么元素个数为什么是(2M-1)X(2M-1)呢?我们回到这张图上,这里我们取两个最极端的位置,即蓝色和绿色,那么我们可以的出来,相对位置索引的值最大是M-1,最小是-M+1,以M=2为例,那么范围内就有-1,0,1这三个数,对它进行排列组合一共有9种。

所以,对于行而言,一共有2M-1个数可以取,对于列而言,也有2M-1个数可以取。

1.7 模型详细配置参数

对于stage1中的,就是指这两个模块,作用就是对输入进行下采样,调整通道数,4x4意思就是将高和宽下采样四倍,96-d意思是通过Linear embedding后特征矩阵通道数变为96,LN就是layer normalization。

stage1中,win.sz指的是窗口的大小,dim86就是说经过stage1后输出的channel是96,也就是那个C。head3指的是多头注意力机制MSA是3头。

下面stage同理。

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

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

相关文章

《数据结构》预备

在学习数据结构之前,需要预先准备学习的C语言知识是:自定义类型--结构体类型。 本节主要讲的内容有: 1.结构体类型的声明 2.结构体变量的创建和初始化 3.结构成员的访问操作符 4.结构体传参 5.结构体内存对齐 6.结构体实现位段(位域) 正文开…

verilog实现ram16*8 (vivado)

module ram_16x2 (input clk, // 时钟信号input we, // 写使能input en, // 使能信号input [3:0] addr, // 地址线input [1:0] datain, // 输入数据线output reg [1:0] dataout // 输出数据线 );// 定义存储器数组reg [1:0] mem [15:0];always (posedge…

影响转化率的多元因素分析及定制开发AI智能名片S2B2C商城系统小程序的应用案例

摘要:在互联网时代,转化率是衡量营销活动成功与否的关键指标。本文首先分析了影响转化率的多种因素,包括活动页面的设计、活动的限时性、主题文案的吸引力、从众心理的运用,以及最核心的产品质量与优惠力度。接着,本文…

Linux 13:网络编程1

1. 预备知识 1-1. 理解源IP地址和目的IP地址 在IP数据包头部中,有两个IP地址,分别叫做源IP地址,和目的IP地址。 我们光有IP地址就可以完成通信了嘛?想象一下发qq消息的例子,有了IP地址能够把消息发送到对方的…

【周记】2024暑期集训第一周

例题记录 Together 题目解析 输入n个数,你可以将这些数分别1,-1或者保持不变,尽可能多的将这些数变成同一个数x,输出x的个数。 算法思路 每个数都有3种情况,那么只需要将所有情况得到的数,每一个的个数…

【Qt】常用控件 Q widget的enabled属性,geometry属性

Qt是一个实现图形化程序的程序。为了便于我们开发,Qt为我们提供了许多“控件”。我们需要熟悉并掌握这些控件的使用。 一.什么是控件 控件是构成⼀个图形化界⾯的基本要素. 示例一: 像上述⽰例一中的,按钮,列表视图,树形视图,单⾏输⼊框,多⾏输⼊框,滚动…

Web开发:图片九宫格与非九宫格动态切换效果(HTML、CSS、JavaScript)

目录 一、业务需求 二、实现思路 三、实现过程 1、基础页面 2、图片大小调整 3、图片位置调整 4、鼠标控制切换 5、添加过渡 四、完整代码 一、业务需求 默认显示基础图片; 当鼠标移入,使用九宫格效果展示图片; 当鼠标离开&#…

SpringCloud—08—高级之SpringCloud Alibaba中—Sentinel

文章目录 提前预知18、Sentinel是什么?18.1、sentinel是什么?18.2、Sentinel下载安装运行18.3、Sentinel初始化监控18.4、Sentinel流控规则1、流控规则基本介绍2、流控规则之-QPS-直接-快速失败3、流控规则之-线程数-直接失败4、流控规则之-QPS-关联-快速…

做可视化项目如何才能让前端开发和UI设计和谐相处呢?仅供参考

做可视化项目如何才能让前端开发和 UI 设计和谐相处呢? 在当今数字化的时代,可视化项目在各个领域都变得越来越重要。无论是构建一个精美的网站、开发一款实用的移动应用,还是设计一套复杂的数据可视化系统,前端开发和 UI 设计都…

c++信号和槽机制的轻量级实现,sigslot 库介绍及使用

Qt中的信号与槽机制很好用,然而只在Qt环境中。在现代 C 编程中,对象间的通信是一个核心问题。为了解决这个问题,许多库提供了信号和槽(Signals and Slots)机制。今天推荐分享一个轻量级的实现:sigslot 库。…

【UE5.1】NPC人工智能——04 NPC巡逻

效果 步骤 一、准备行为树和黑板 1. 对我们之前创建的AI控制器创建一个子蓝图类 这里命名为“BP_NPC_AIController_Lion”,表示专门用于控制狮子的AI控制器 2. 打开狮子蓝图“Character_Lion” 在类默认值中将“AI控制器类”修改为“BP_NPC_AIController_Lion” 3…

web的运行

目录 1. web基础知识 1. http协议 2. 网络的三种架构及特点 1.客户机/服务器结构(C/S) 2. 浏览器/服务器结构(B/S) 3. P2P结构 3. 网站搭建 1. 服务器 2.中间件 4. 网站的运行原理 1. 网站的常用术语 1. 基本术语 2. …

《JavaSE》---16.<抽象类接口Object类>

目录 前言 一、抽象类 1.1什么是抽象类 1.2抽象类代码实现 1.3 抽象类特点 1.4抽象类的作用 二、接口 2.1什么是接口 2.2接口的代码书写 2.3 接口使用 2.4 接口特点 2.5 实现多个接口 快捷键(ctrl i ): 2.6接口的好处 2.7 接…

windows常用命令整理

本文分享一些常用的windows命令。根据功能的不同,大致可分为以下几个方面,一是文件操作命令,二是进程相关命令,三是磁盘相关命令,四是网络相关命令,五是其他命令。 1.文件操作命令 dir:显示当…

如何搭建一个RADIUS服务器?

1. 系统环境 1.1.操作系统 Ubuntu-20.04.1 (kernel: 5.15.0-58-generic) 1.2.所需软件 FreeRADIUS MariaDB 1.3.注意事项 本文提到的所有操作,都是以root 身份执行; 2. FreeRADIUS的安装 2.1. 安装FreeRADIUS服务器程序 以…

数据预处理在建模中的重要性与常见方法(三):特征工程篇

数据预处理在建模中的重要性与常见方法(三):特征工程篇 特征工程是数据预处理中至关重要的一步,通过构建、转换和选择最能代表数据特性的特征,以提高模型的性能和准确性。常见的特征工程方法包括特征选择、特征提取和特…

零基础入门鸿蒙开发 HarmonyOS NEXT星河版开发学习

今天开始带大家零基础入门鸿蒙开发,也就是你没有任何编程基础的情况下就可以跟着石头哥零基础学习鸿蒙开发。 目录 一,为什么要学习鸿蒙 1-1,鸿蒙介绍 1-2,为什么要学习鸿蒙 1-3,鸿蒙各个版本介绍 1-4&#xff0…

P4-AI产品经理-九五小庞

从0开始做AI产品的完整工作方法 项目启动 项目实施 样本测试模型推荐引擎 构建DMP(数据管理平台) 项目上线

Leetcode双指针法应用

1.双指针法 文章目录 1.双指针法1.1什么是双指针法?1.2解题思路1.3扩展 1.1什么是双指针法? 双指针算法是一种在数组或序列上操作的技巧,实际上是对暴力枚举算法的一种优化,通常涉及到两个索引(或指针)从两…