【图像识别】Swin Transformer

一、引言

论文: Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
作者: Microsoft Research Asia
代码: Swin Transformer
特点: 提出滑动窗口自注意力 (Shifted Window based Self-Attention) 解决Vision Transformer输入高分辨率图像注意力模块计算复杂度高的问题。

二、框架

Swin Transformer的整体框架图如下:

可见,Swin Transformer主要包括Patch Partition+Linear Embedding、Swin Transformer Block、Patch Merging几个组件。每经历一个Stage特征图都会缩小2倍、通道数放大2倍,这与ResNet网络的特征尺度变化过程很类似。

Swin Transformer Block的最小单位为上图右侧两个连续的Block,两个Block的差别仅在于注意力模块是窗口多头自注意力 (W-MSA) 还是滑动窗口多头自注意力 (SW-MSA)。所以每个Stage中包含的Block数量都是2的整数倍。

2.1 Patch Partition+Linear Embedding

Patch Partition是要将图像拆分成多个 4 ∗ 4 ∗ 3 4*4*3 443大小的Patch(4*4是每个Patch包含的像素点数,3是原始图像通道数),如下图所示:

之后将每个Patch按行展平,于是每个Patch形成一个 1 ∗ 1 ∗ 48 1*1*48 1148的像素点。 48 = 4 ∗ 4 ∗ 3 48=4*4*3 48=443,原本一个像素点通道数为3,一个Patch有 4 ∗ 4 4*4 44个像素点,所以展平后一个Patch变成一个通道数为48的像素点。所有Patch展平后按原位置拼接则形成 H 4 ∗ W 4 ∗ 48 \frac{H}{4}*\frac{W}{4}*48 4H4W48的特征图。

通过Linear Embedding(例如核为 1 ∗ 1 1*1 11的2D卷积)将通道数从48映射到 C C C(原文中 C = 96 C=96 C=96)。最后通过LayerNorm将所有通道数为 C C C的像素点归一化。

上图为一个Patch上16个像素点的Patch Partition+Linear Embedding过程(图中一个小方格代表一个有3个通道的像素点, c = C 3 c=\frac{C}{3} c=3C)。

事实上,Patch Partition+Linear Embedding就是要将图像尺寸从 H ∗ W ∗ 3 H*W*3 HW3转换为 H 4 ∗ W 4 ∗ C \frac{H}{4}*\frac{W}{4}*C 4H4WC 与Vision Transformer取Patch时采取的策略一致,Swin Transformer并没有分两步完成该操作,而是通过一个卷积核大小为 4 ∗ 4 4*4 44、步长为4、输出通道数为96的2D卷积层进行特征提取,再通过LayerNorm对所有token进行归一化(一个token对应 H 4 ∗ W 4 ∗ C \frac{H}{4}*\frac{W}{4}*C 4H4WC的特征图中的一个像素点)。

2.2 Swin Transformer Block

下图为Vision Transformer(左)和Swin Transformer(右)中Block的结构图:

其中,Swin Transformer中也有DropPath但是没有画出来,并且他们的MLP模块均为如下结构:

可见,两者结构基本一致,主要区别如下:
(1) Vision Transformer的每一个Block都一样,而Swin Transformer中两个不同的Block是一个基本单位,两个Block顺序连接,不会单独出现。
(2) Vision Transformer使用多头自注意力,而Swin Transformer中两个Block注意力模块不同,前一个使用窗口多头自注意力,后一个使用滑动窗口多头自注意力。
(3) Vision Transformer使用绝对位置编码,而Swin Transformer使用相对位置编码。

所以我们下面主要介绍窗口多头自注意力和滑动窗口多头自注意力,其余部分请参考我关于Vision Transformer的博客。

2.2.1 窗口多头自注意力

引入窗口多头自注意力 (W-MSA) 是为了减少计算复杂度。

如下为多头自注意力 (MSA) 与窗口多头自注意力的窗口划分方法:

多头自注意力不对特征图进行划分,左图中共16个像素点(也叫token),每个像素点作为query时都要与所有像素点进行自注意力计算。而窗口多头自注意力会先将特征图拆分为一个个窗口(右图中窗口高宽为 2 ∗ 2 2*2 22),然后在每个窗口内部单独进行自注意力计算。

两者的计算复杂度如下:

其中, h h h为特征图高度, w w w为特征图宽度, C C C为特征图通道数, M M M为每个窗口的大小;自注意力的计算是以特征图或窗口上的token为单位的,所以未被拆分的特征图中应包含 h w hw hw个长度为 C C C的token。该计算复杂度不包括除以 d k \sqrt{d_k} dk 和SoftMax产生的计算量。

在讲解两者计算复杂度推导过程前,我们需要明确两个矩阵相乘所产生的计算量,如果 A A A矩阵高宽为 a ∗ b a*b ab B B B矩阵高宽为 b ∗ c b*c bc,则 A ⋅ B A\cdot B AB的计算量为 a ∗ b ∗ c a*b*c abc

下图实线部分为单头自注意力的计算过程:

其中,黑色字体为当前矩阵含义,红色字体为当前矩阵高宽,绿色和橙色字体为当前运算复杂度。多头自注意力在通道上对token的拆分不会影响计算复杂度,所以除最后将 A ⋅ V A\cdot V AV通过 W o W_o Wo映射为输出时产生的计算复杂度(上图右侧虚线部分),其余与单头自注意力计算复杂度相同。于是,我们可以得到多头自注意力的计算复杂度为 4 h w C 2 + 2 ( h w ) 2 C 4hwC^2+2(hw)^2C 4hwC2+2(hw)2C

对于窗口多头自注意力,特征图大小为 h ∗ w h*w hw,窗口大小为 M ∗ M M*M MM时,则从特征图上可拆分出 h M ∗ w M \frac{h}{M}*\frac{w}{M} MhMw个窗口。每个窗口单独执行多头自注意力产生计算复杂度为 4 M 2 C 2 + 2 M 4 C 4M^2C^2+2M^4C 4M2C2+2M4C。则 h M ∗ w M \frac{h}{M}*\frac{w}{M} MhMw个窗口的总计算复杂度为 4 h w C 2 + 2 M 2 h w C = h M ∗ w M ∗ ( 4 M 2 C 2 + 2 M 4 C ) 4hwC^2+2M^2hwC=\frac{h}{M}*\frac{w}{M}*(4M^2C^2+2M^4C) 4hwC2+2M2hwC=MhMw(4M2C2+2M4C)

两者计算复杂度差别在后半部分,以原文中的参数 h = 56 , w = 56 , C = 96 , M = 7 h=56,w=56,C=96,M=7 h=56,w=56,C=96,M=7为例,多头自注意力后半部分计算复杂度为 2 ( h w ) 2 C = 2 ( 56 ∗ 56 ) 2 ∗ 96 = 1888223232 2(hw)^2C=2(56*56)^2*96=1888223232 2(hw)2C=2(5656)296=1888223232,窗口多头自注意力后半部分的计算复杂度为 2 M 2 h w C = 2 ∗ 7 2 ∗ 56 ∗ 56 ∗ 96 = 29503488 2M^2hwC=2*7^2*56*56*96=29503488 2M2hwC=272565696=29503488。两者相差64倍。

此外,Swin Transformer使用相对位置编码来避免注意力运算未考虑token顺序的问题。与绝对位置编码直接加在输入特征图上不同,相对位置编码以偏执形式存在参与注意力权重的计算,其公式如下:
A t t e n t i o n ( Q , K , V ) = S o f t M a x ( Q K T d k + B ) V Attention(Q,K,V)=SoftMax(\frac{QK^T}{\sqrt{d_k}}+B)V Attention(Q,K,V)=SoftMax(dk QKT+B)V

详情请参考我关于绝对位置编码和相对位置编码的博客。

2.2.2 滑动窗口多头自注意力

采用窗口多头自注意力时,每个窗口都是独立的,会导致窗口间的相关信息无法被捕捉。例如一个目标处于多个窗口上,窗口独立进行注意力计算就导致该目标各个部分的相关信息无法被考虑。Swin Transformer引入滑动窗口来解决这一问题。

2.2.2.1 窗口滑动

对于 M ∗ M M*M MM的窗口,滑动方向为右下,向右移动 ⌊ M 2 ⌋ \lfloor\frac{M}{2}\rfloor 2M个像素点,向下移动 ⌊ M 2 ⌋ \lfloor\frac{M}{2}\rfloor 2M个像素点。

下图是窗口高宽为 4 ∗ 4 4*4 44时窗口滑动前后的窗口分割情况(因为是向右下滑动,所以我在图中增加了左上方的窗口):

可见,经滑动之后的窗口中可能包含滑动前多个窗口的内容。例如,滑动后的中心窗口就包含滑动前的4个窗口中的内容。该操作从一定程度上缓解了相关信息完全丢失的问题。

2.2.2.2 窗口移位与掩码

不过,滑动后各个窗口大小不一,只有在padding后才能组成tensor进行并行运算。以上图为例,原本只有4个 4 ∗ 4 4*4 44的窗口,padding后会产生9个 4 ∗ 4 4*4 44的窗口,这无疑增加了很多计算负担。Swin Transformer通过移位和掩码解决了该问题。

移位流程如下:

可见, A , B , C A,B,C A,B,C均为左上方新增窗口向右下滑动时产生的窗口,因此 A , C A,C A,C的高度为 ⌊ M 2 ⌋ \lfloor\frac{M}{2}\rfloor 2M A , B A,B A,B的宽度为 ⌊ M 2 ⌋ \lfloor\frac{M}{2}\rfloor 2M C C C的宽度为 w − ⌊ M 2 ⌋ w-\lfloor\frac{M}{2}\rfloor w2M B B B的高度为 h − ⌊ M 2 ⌋ h-\lfloor\frac{M}{2}\rfloor h2M

这样,所有新的窗口大小都是统一的 M ∗ M M*M MM但是这引入了另一个问题,同一窗口内包括原本不应相互计算注意力的内容。 例如上图中的右下角窗口,同时包含 A , B , C , D A,B,C,D A,B,C,D四个部分的内容,但 A A A原本在左上角,与 B B B的下侧、 C C C的右侧、 D D D的右下侧一般是没有联系的。就像一张仅包含天空和草地的图片, A , C A,C A,C是天空, B , D B,D B,D是草地, A A A不必与 B , D B,D B,D进行注意力计算。

于是Swin Transformer又引入了掩码。首先给移位后的各个窗口一个编号,如下图:

然后给每个窗口每个像素点一个掩码矩阵,如下图(以右下角窗口中两个像素点为例):

掩码矩阵中仅有两种值,0和-100。与查询像素点属于同一编号的像素点对应掩码为0,否则为-100。窗口注意力会计算每个像素点与所有像素点间的相似度,所以窗口中有几个像素点就有几个掩码矩阵,每个掩码矩阵都与窗口大小一致。

这个掩码矩阵像相对位置偏执一样被施加在注意力计算相似度的公式中,如下:
A t t e n t i o n ( Q , K , V ) = S o f t M a x ( Q K T d k + B + M a s k ) V Attention(Q,K,V)=SoftMax(\frac{QK^T}{\sqrt{d_k}}+B+Mask)V Attention(Q,K,V)=SoftMax(dk QKT+B+Mask)V

我们不考虑相对位置偏执 B B B,相似度 Q K T d k \frac{QK^T}{\sqrt{d_k}} dk QKT+掩码 M a s k Mask Mask经SoftMax产生效果如下:

可见,对于橙色框中像素点来说,同编号的像素点与其的相似度没有被改变,其它像素点相似度被减去100。因相似度矩阵中的值都比较小,减去100相当于变成一个很小的数,经SoftMax后其值接近于0。

在各个窗口上计算完多头自注意力后,按照之前移位流程逆向复原,滑动窗口多头自注意力就完成了。

综上,移位操作使并行运算成为可能,掩码操作使注意力计算不跨窗口。

2.3 Patch Merging

Swin Transformer Block不改变特征图尺寸,Patch Merging起到使特征图缩小2倍、通道数放大2倍的作用。

以大小为 4 ∗ 4 4*4 44、单通道的特征图为例,Patch Merging的过程如下图:

无论特征图是多大,Patch Merging时Patch的高宽均为 2 ∗ 2 2*2 22。截取各Patch同相对位置的像素点,之后将截取结果拼接到一起形成新的特征图。假设原特征图为 [ H , W , C ] [H,W,C] [H,W,C],则中间特征图为 [ H 2 , W 2 , 4 C ] [\frac{H}{2},\frac{W}{2},4C] [2H,2W,4C] 之后对中间特征图每个像素点所有通道分别执行归一化,并经过一次全连接线性映射将每个像素点的通道数减半。最后特征图为 [ H 2 , W 2 , 2 C ] [\frac{H}{2},\frac{W}{2},2C] [2H,2W,2C]

致谢:

本博客仅做记录使用,无任何商业用途,参考内容如下:
Swin-Transformer中MSA和W-MSA模块计算复杂度推导
Swin Transformer论文精读【论文精读】
Swin-Transformer网络结构详解

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

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

相关文章

RegExp魔法阵与Cookie记忆宫殿:JavaScript 中的秘密宝藏

个人主页:学习前端的小z 个人专栏:JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 🔆RegExp 🎲 1 什么是正则表达式 🎲2 创建…

「TypeScript」TypeScript入门练手题

前言 TypeScript 越来越火&#xff0c;现在很多前端团队都使用它&#xff0c;因此咱们前端码农要想胜任以后的前端工作&#xff0c;就要更加熟悉它。 入门练手题 interface A {x: number;y: number; }type T Partial<A>;const a: T { x: 0, y: 0 }; const b: T { …

数据可视化训练第二天(对比Python与numpy中的ndarray的效率并且可视化表示)

绪论 千里之行始于足下&#xff1b;继续坚持 1.对比Python和numpy的性能 使用魔法指令%timeit进行对比 需求&#xff1a; 实现两个数组的加法数组 A 是 0 到 N-1 数字的平方数组 B 是 0 到 N-1 数字的立方 import numpy as np def numpy_sum(text_num):"""…

互动科技如何强化法治教育基地体验?

近年来&#xff0c;多媒体互动技术正日益融入我们生活的各个角落&#xff0c;法治教育领域亦不例外。步入法治教育基地&#xff0c;我们不难发现&#xff0c;众多创新的多媒体互动装置如雨后春笋般涌现&#xff0c;这些装置凭借前沿的科技手段&#xff0c;不仅极大地丰富了法制…

【RabbitMQ】消息队列 - RabbitMQ的使用记录

目录 一、什么是消息队列 二、什么是RabbitMQ 三、安装RabbitMQ 3.1 安装Erlang环境 3.2 安装RabbitMQ 3.3 打开服务管理界面 3.4 常用命令 四、Python示例代码 4.1 发送数据 4.2 接收数据 一、什么是消息队列 消息队列(Message Queue)是一种用于在应用程序之间传递消…

【数据结构与算法】Huffman编码/译码(C/C++)

实践要求 1. 问题描述 利用哈夫曼编码进行信息通讯可以大大提高信道利用率&#xff0c;缩短信息传输时间&#xff0c;降低传输成本。但是&#xff0c;这要求在发送端通过一个编码系统对待传数据预先编码&#xff1b;在接收端将传来的数据进行译码(复原)。对于双工信道(即可以…

上亿用户面临风险!小米、WPS等知名安卓应用竟藏有“文件覆盖”漏洞

Google Play商店中的几款热门安卓应用程序容易受到与路径遍历相关的漏洞攻击&#xff0c;该漏洞的代号为“Dirty Stream”攻击&#xff0c;恶意应用程序可能会利用此漏洞覆盖易受攻击的应用程序主目录中的任意文件。 微软威胁情报团队的Dimitrios Valsamaras在周三发布的一份报…

elementui- button按钮自适应大小

<el-button type"primary" class"daochu" click"download">导出</el-button> .daochu {width: calc(100vw * 80 / 1920);height: calc(100vw * 30 / 1920);font-size: calc(100vw * 13 / 1920); } 效果图&#xff1a;

做一个属于自己的软件-pyside6快速上手教程

首先环境需要安装python3和pip&#xff0c;软件使用pycharm&#xff0c;安装也都很简单 首先需要安装pyside6,在终端执行&#xff1a; pip install pyside6 然后进入可视化编辑界面 pyside6-designer 进入后创建即可 可以从左侧点击鼠标拉组件进入到中间的工作区&#xff…

android基础-服务

同样使用intent来传递服务 oncreate是服务第一次启动调用&#xff0c;onStartCommand是服务每次启动的时候调用&#xff0c;也就是说服务只要启动后就不会调用oncreate方法了。可以在myservice中的任何位置调用stopself方法让服务停止下来。 服务生命周期 前台服务类似于通知会…

人人都是开发者?Baidu Comate智能代码助手改变你传统的编程之路

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引入一、人人都是开发者二、Baidu Comate 智能编码助手2.1 Baidu Comate 是什么&#xff1f;2.2 Baidu Comate 支持那…

FANUC机器人工具坐标偏移的用法

一、工具坐标偏移的使用场景 在机器人位置不改变的情况下&#xff0c;工业机器人使用默认工具坐标系示教的一系列运动点位&#xff0c;要保持原本点位位置不变的情况下&#xff0c;改变机器人工具坐标的参数&#xff0c;就要用到机器人坐标转化的功能。在FANUC机器人上体现为机…

OSPF综合实验(超详细易懂)(HCIP)

1、拓扑信息 2、需求分析 3、IP规划 4、配置 5、测试 1、拓扑信息 2、需求分析 R4为ISP&#xff0c;其上只能配置I地址&#xff1b; R4与其他所有直连设备间均使用公…

【Linux系列】tail查询使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

在数字化时代保持企业财务管理的持续技术创新

根据全球市场调查&#xff0c;在现阶段企业如果还不更新自身的商业运作模式&#xff0c;企业的业务可能会一点一点丧失市场竞争力。技术进步是所有行业发展的明显趋势。许多年轻的初创企业具有创新管理思维、精益求精的决策流程和现代化的商业基础设施&#xff0c;这些顺应时代…

转行网络安全的重要建议,助你顺利入门

目录 为什么写这篇文章 为什么我更合适回答这个问题 先问自己3个问题 1.一定要明确自己是否是真喜欢&#xff0c;还是一时好奇。 2.自学的习惯 3.选择网安、攻防这行的目标是什么&#xff1f; 确认无误后&#xff0c;那如何进入这个行业&#xff1f; 1.选择渗透测试集中…

重生奇迹mu烈火剑带什么技能

在重生奇迹mu游戏中&#xff0c;35级是每个职业的分水岭&#xff0c;只要到了35级&#xff0c;三职业都可以学习自己的高级技能&#xff0c;道士可以召唤自己的大狗&#xff0c;法师拥有冰咆哮&#xff0c;战士就是咱们今天要说的烈火剑法&#xff0c;这三种技能都需要玩家自己…

Chromium 调试指南2024 Windows11篇-安装代码编辑器VSCode(三)

1. 前言 在进行Chromium项目的开发和调试之前&#xff0c;安装适合的代码编辑器是至关重要的一步。本文将介绍如何安装Visual Studio Code&#xff0c;这是一个功能强大且广受开发者欢迎的代码编辑器。通过正确安装Visual Studio Code&#xff0c;我们将为后续的Chromium代码编…

张驰咨询六西格玛黑带培训,上海开班,质量精英的摇篮!

一、课程背景与意义 在当今竞争激烈的市场环境中&#xff0c;企业要想立于不败之地&#xff0c;就必须不断提升自身的核心竞争力。而六西格玛作为一种先进的质量管理工具和方法&#xff0c;已经被越来越多的企业所采纳。通过六西格玛黑带培训&#xff0c;学员们可以系统地掌握…

Windows上安装Seata服务

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Seata 是一款开源的…