Swin Transformer

论文地址:https://arxiv.org/pdf/2103.14030

代码地址:https://github. com/microsoft/Swin-Transformer

针对传统Vision Transformer(ViT)在高分辨率图像处理中的计算复杂度高和缺乏多尺度建模能力两大核心问题,提出改进方案。受CNN分层架构启发,结合局部窗口自注意力(Local Window Self-Attention)与跨窗口交互机制,构建高效且通用的视觉骨干网络。

Swin 采用逐层扩大感受野的策略:

• 第一层只在最小窗口内做多头自注意力;

• 第二层窗口变大,但 patch 数量与第一层相同,仍在窗口内部做注意力;

• 第三层进一步合并为单一窗口,仍保持 patch 数不变,在该窗口内完成全局多头自注意力。

  • 首先将图片输入到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层结构一模一样。

  • 然后就是通过四个Stage构建不同大小的特征图,除了Stage1中先通过一个Linear Embeding层外,剩下三个stage都是先通过一个Patch Merging层进行下采样(后面会细讲)。然后都是重复堆叠Swin Transformer Block注意这里的Block其实有两种结构,如图(b)中所示,这两种结构的不同之处仅在于一个使用了W-MSA结构,一个使用了SW-MSA结构。而且这两个结构是成对使用的,先使用一个W-MSA结构再使用一个SW-MSA结构。所以你会发现堆叠Swin Transformer Block的次数都是偶数

  • 最后对于分类网络,后面还会接上一个Layer Norm层、全局池化层以及全连接层得到最终输出。图中没有画,但源码中是这样做的。

  • 图3.1 模型架构图

整个网络主要分为 4 个阶段(Stage):

Stage 1: Patch Partition & Linear Embedding

|-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1.输入: | 一张 H x W x 3 的 RGB 图像。 |
| 2.操作: | 1)Patch Partition : 像 ViT 一样切块,但 Swin 的初始块非常小,比如 4 x 4 像素。这样每个图块就是一个 4 * 4 * 3 = 48 维的向量。 2)Linear Embedding: 通过一个线性层,将每个图块的维度映射到一个指定的维度 C(例如 96)。 |
| 3.输出: | 一个大小为 (H/4) x (W/4),通道数为 C 的特征图。 |

Stage 2: Swin Transformer Blocks

|-----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1.输入: | Stage 1 的输出。 |
| 2.操作: | 串联多个 Swin Transformer Block。这些 Block 成对出现: 第一个 Block 使用 W-MSA, 第二个 Block 使用 SW-MSA ...如此交替,注意:一定是成对的偶数出现!!!【该特征图经过另一个 SWIN Transformer Block,其维度保持完整。】 |
| 3.输出: | 特征图大小不变,仍为 (H/4) x (W/4) x C。 |

Stage 3: Patch Merging & More Blocks

|-----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1.输入: | Stage 2 的输出。 |
| 2.操作: | Patch Merging (核心步骤): 这是一个下采样层,作用类似于 CNN 中的池化层。它将特征图中每 2 x 2 相邻的四个图块拼接(Concatenate)在一起,这样通道数变为 4C,再通过一个线性层将通道数降为 2C。 我们可以把它看做,一个3x3的正方形网格,网格内像素值为1,对特征图进行采样,每次采样只保留正方形四个角的像素,这样我们就可以采样到4个新的特征图,随后将这四个新的特征图拼接到一起,这就是我们的Patch Merging,随后我会详细讲解Patch Merging 效果 :特征图分辨率减半 ((H/8) x (W/8) ),通道数翻倍 (2C)。这完美复刻了 CNN 的金字塔结构 Swin Transformer Blocks: 再次串联多个成对的 (W-MSA, SW-MSA) Block,对新的特征图进行处理。 |
| 3.输出: | (H/8) x (W/8) x 2C 的特征图。 |

Stage 4 & Stage 5: 重复操作

继续重复 Patch Merging + Swin Transformer Blocks 的组合。 Stage 4 输出: (H/16) x (W/16) x 4C 的特征图。 Stage 5 输出: (H/32) x (W/32) x 8C 的特征图 最后,根据具体任务(如图像分类),在最后一层特征图后接上全局平均池化层和全连接层进行预测。

第二部分 核心模块介绍

3.1 Patch Partition

Patch Partition结构是将图片数据进行分割成不重叠的M*M补丁。每个补丁被视为一个"标记",其特征被设置为原始像素RGB值的串联。在论文中,使用4 × 4的patch大小,因此每个patch的特征维数为4 × 4 × 3 = 48。在此原始值特征上应用线性嵌入层(Linear Embedding),将其投影到任意维度(记为C)。

图3.2 patch partition和Linear Embedding原理示意图

假设原始一张图片,高H,宽W,通道为3,对输入图像进行分割(size=4*4)再展平,那么通过patch partion后,图像的高和宽划分有,H/4*W/4*48的

假设输入图像为 224×224×3:

  • H=224, W=224, C=3

  • Patch大小 4×4

  • Patch数量:224/4 = 56(高度方向),224/4 = 56(宽度方向)

  • 输出形状:[56, 56, 48]

3.2 Patch Merging(图块合并)

在每个Stage中首先要通过一个Patch Merging层进行下采样(Stage1除外)。此操作的目的是将特征信息从空间维度转移到通道维度。假设输入Patch Merging的是一个4x4大小的单通道特征图,以特征图左上角的四个元素为起点,通过间隔采样得到四个子特征图,然后将这四个子特征在通道维度上进行拼接,再通过一个LN层。 最后通过一个全连接层在特征图的深度方向做线性变换,将特征图的深度由C变成C/2,如下图所示。通过这个简单的例子可以看出,经过Patch Merging层后,特征图的高和宽会减半,深度会翻倍。

3.3 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。

注意:这会带来一个问题是窗口与窗口之间是无法进行信息传递的

SW-MSA

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

Swin Transformer 还有一个巧妙设计:先在 Layer1 的各红框内分别做自注意力,再在 Layer1+1 的各红框内分别做自注意力,两步完成后才算完整的一层计算。这样一来,像素点会随着窗口移动,与周围不同位置的像素依次做自注意力,例如第一阶段胸部与头、肩部交互,第二阶段胸部又与腹部交互,虽然未做全局注意力,却把所有可能相关的局部关系都遍历了一次。

不同版本:下图是原论文中给出的关于不同Swin Transformer的配置,T(Tiny),S(Small),B(Base),L(Large)

模型二:

Iwin Transformer: Hierarchical Vision Transformerusing Interleaved Windows

https://mp.weixin.qq.com/s/t5wXelfkQzho9_97dEO8ww

相关推荐
User_芊芊君子37 分钟前
光影协同:基于Rokid CXR-M SDK构建工业级远程专家协作维修系统
人工智能
摘星编程38 分钟前
AI文物复活馆:基于 AiOnly 一键调用 Claude 4.5 + Gemini 3 Pro 的多模态复原神器
人工智能·aionly
AI绘画哇哒哒2 小时前
【收藏必看】大模型智能体六大设计模式详解:从ReAct到Agentic RAG,构建可靠AI系统
人工智能·学习·ai·语言模型·程序员·产品经理·转行
CNRio3 小时前
人工智能基础架构与算力之3 Transformer 架构深度解析:从注意力机制到算力适配演进
人工智能·深度学习·transformer
qy-ll3 小时前
深度学习——CNN入门
人工智能·深度学习·cnn
青瓷程序设计6 小时前
动物识别系统【最新版】Python+TensorFlow+Vue3+Django+人工智能+深度学习+卷积神经网络算法
人工智能·python·深度学习
F_D_Z7 小时前
数据集相关类代码回顾理解 | sns.distplot\%matplotlib inline\sns.scatterplot
python·深度学习·matplotlib
金智维科技官方7 小时前
RPA财务机器人为企业高质量发展注入动能
人工智能·机器人·rpa·财务
沫儿笙7 小时前
安川机器人tag焊接怎么节省保护气
人工智能·物联网·机器人