Transformer实战-系列教程7:SwinTransformer 算法原理 1

🚩🚩🚩Transformer实战-系列教程总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的PPT资源已经上传

1、SwinTransformer

  • SwinTransformer 可以看作为一个backbone
  • 用来做分类、检测、分割都是非常好的
  • 也可以直接套用在下游任务中
  • 不仅源码公开了,预训练模型也公开了
  • 预训练模型提供大中小三个版本

图像中的像素点太多了,如果需要更多的特征就必须构建很长的序列
很长的序列会导致效率问题
SwinTransformer 针对ViT使用了窗口和分层的方式来替代长序列进行改进
CNN经常提起感受野,怎样在Transformer中体现出来呢?进行分层

SwinTransformer 怎样进行分层呢?在ViT或者原始Transformer中,假如最开始是400个Token,在堆叠过程中,还是会有400个Token。
而SwinTransformer 将原本的400个Token进行了合并处理,在堆叠过程中400个Token会变成200、100

也就是说SwinTransformer 就是在堆叠Transformer过程中,Token数量会不断减少,每一层的特征提取效率就会更高

2、网络架构

在这里插入图片描述

  • 首先输入还是一张图像数据,2242243
  • 通过卷积得到多个特征图,把特征图分成每个Patch,和ViT一样
  • 堆叠Swin Transformer Block,与ViT 的Block不同的是,Swin Transformer
    Block在每次堆叠后长宽减半特征图翻倍,这与CNN的堆叠过程有点类似,特别像VGG
  • 减少序列的长度,同时增加模型每一层的特征通道数,可以看作为是一个下采样的操作,是Patch Merging完成的
  • Block最核心的部分是对Attention的计算方法做出了改进

3、Swin Transformer Block

在这里插入图片描述

  • W-MSA与SW-MSA是一个组合
  • W-MSA:基于窗口的注意力计算
  • SW-MSA:窗口滑动后重新计算注意力
  • 串联在一起就是一个Block

4、Patch Embbeding

  • 输入:图像数据(224,224,3)
  • 输出:(3136,96)相当于序列长度是3136个,每个的向量是96维特征
  • 通过卷积得到,Conv2d(3, 96, kernel_size=(4, 4), stride=(4, 4))
  • 3136也就是 (224/4) * (224/4)得到的,也可以根据需求更改卷积参数

实际上就是一个下采样的操作,是不同于池化,这个相当于间接的
(对H和W维度进行间隔采样后拼接在一起,得到H/2,W/2,C*4)
在这里插入图片描述

maxpooling是将4个特征中,选择最大的一个留下,所以说会长宽减半,通道数不变,而Patch Embbeding是将这4个特征分开利用,所以也会长宽减半,但是通道数乘以4

5、window_partition

  • 输入:特征图(56,56,96)
  • 默认窗口大小为7,所以总共可以分成8*8个窗口
  • 输出:特征图(64,7,7,96)
  • 之前的单位是序列,现在的单位是窗口(共64个窗口)

56=224/4,5656分成每个都是77大小的窗口,一共可以的得到8*8的窗口,因此输出为(64,7,7,96),因此输入变成了64个窗口不再是序列了

6、W-MSA

W-MSA,Window Multi-head Self Attention

  • 对得到的窗口,计算各个窗口自己的自注意力得分
  • qkv三个矩阵放在一起了:(3,64,3,49,32)
  • 3个矩阵,64个窗口,heads为3,窗口大小7*7=49,每个head特征96/3=32
  • attention结果为:(64,3,49,49) 每个头都会得出每个窗口内的自注意力

原来有64个窗口,每个窗口都是77的大小,对每个窗口都进行Self Attention的计算
(3,64,3,49,32),第一个3表示的是QKV这3个,64代表64个窗口,第二个3表示的是多头注意力的头数,49就是7
7的大小,每头注意力机制对应32维的向量

attention权重矩阵维度(64,3,49,49),64表示64个窗口,3还是表示的是多头注意力的头数,49*49表示每一个窗口的49个特征之间的关系

7、window_reverse

  • 通过得到的attention计算得到新的特征(64,49,96)
  • 总共64个窗口,每个窗口7*7的大小,每个点对应96维向量
  • window_reverse就是通过reshape操作还原回去(56,56,96)
  • 这就得到了跟输入特征图一样的大小,但是其已经计算过了attention

attention权重与(3,64,3,49,32)乘积结果为(64,49,96),这是新的特征的维度,96还是表示每个向量的维度,这个时候的特征已经经过重构,96表示了在一个窗口的每个像素与每个像素之间的关系

8、SW-MSA

SW-MSA,Shifted Window Multi-head Self Attention

  • 为什么要shift?原来的window都是算自己内部的
  • 这样就会导致只有内部计算,没有它们之间的关系
  • 容易上模型局限在自己的小领地,可以通过shift操作来改善

通过W-MSA我们得到的是每个窗口内的特征,还没有每个窗口与窗口之间的特征,SW-MSA就是用来得到每个窗口与窗口之间的特征

窗口与窗口之间的特征,是用一种滑动shift 的方式计算

不管是SW-MSA还是W-MSA,实际上都是在做self-Attention的计算,只不过W-MSA是只对一个窗口内部做self-Attention的计算,SW-MSA是使用了一种偏移的方式,但是还是对一个窗口内部做self-Attention的计算。

实际上SW-MSA的偏移就是窗口在水平和垂直方向上分别偏移一定数量的像素
假设这是原始特征图:

+---+---+---+---+
| A | B | C | D |
+---+---+---+---+
| E | F | G | H |
+---+---+---+---+
| I | J | K | L |
+---+---+---+---+
| M | N | O | P |
+---+---+---+---+

偏移后的特征图:

+---+---+---+---+
| 0 | 0 | 0 | 0 |
+---+---+---+---+
| 0 | A | B | C |
+---+---+---+---+
| 0 | E | F | G |
+---+---+---+---+
| 0 | I | J | K |
+---+---+---+---+

原本多出来的地方,可以用0填充也可以用偏移后没有用到地方填充:

+---+---+---+---+
| M | N | O | P |
+---+---+---+---+
| D | A | B | C |
+---+---+---+---+
| H | E | F | G |
+---+---+---+---+
| L | I | J | K |
+---+---+---+---+

在这里插入图片描述
实际上就是像素点发生了挪动

在这里插入图片描述
如图所示,红色线是窗口的分割,灰色是patch的分割,W-MSA将相邻的patch进行拼凑成窗口,但是这就导致了,窗口之间没有办法连接,SW-MSA的偏移计算会重新划分窗口,但是窗口不可以重叠的情况下,窗口由4个变成了9个。窗口的数量和大小都发生了变化
在这里插入图片描述
如图所示原文给出了一个办法,将窗口的大小做出了限制

论文中使用了pad和mask的方法解决了这一问题,如上图中cyclic shift部分,对边缘部分尺寸较小的windows进行了填充(图中蓝色、绿色和黄色部分),使得每个windows都能够保持原来的大小,并且论文还采用了mask的方法来使得模型只在除了pad的部分做self-attention计算,这样一来就能够解决上面所提到的问题

在这里插入图片描述
如图所示,4自始至终都没有改变,原来在W-MSA使用self-Attention进行计算,在SW-MSA还是使用self-Attention进行计算,但是比如1和7发生了变化

在这里插入图片描述
7和1的计算,假如了mask和padding的一些处理

一开始是4个窗口,经过偏移后变成了9个,但是计算不方便,还是按照4个窗口进行计算,多出来的值mask掉就行了。

位移中的细节

  • 只需要设置好对应位置的mask,让其值为负无穷即可(softmax)
  • 输出结果同样为(56,56,96)
  • 不要忘记,计算完特征后需要对图像进行还原,也就是还原平移
  • 这俩组合就是SwinTransformer中的核心计算模块

无论是W-MSA和SW-MSA,数据的维度始终都没有发生变化

所以一个Swin Transformer Block就是先后经过W-MSA和SW-MSA,而Swin Transformer主要就是Swin Transformer Block的堆叠

9、分层计算

在这里插入图片描述

  • 分层计算
  • 一次下采样后(3136->784也就是5656->2828),和卷积非常类似
  • 然后继续执行W-MSA和SW-MSA,也就是各个stage的流程
  • 最后根据任务来选择合适的head层即可(分类,分割,检测等)

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

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

相关文章

zxxxxczzvdsgbhfdb

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏:《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

低代码与MES系统相结合

​低代码平台通常是指aPaaS平台,通过为开发者提供可视化的应用开发环境,降低或去除应用开发对原生代码编写的需求量,进而实现便捷构建应用程序的一种解决方案。 更加简单点的理解就是“拖拽!搭建应用”。 一、低代码开发平台概述 …

单片机最小系统是什么?包含哪几个部分?

单片机最小系统是什么?包含哪几个部分? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家&…

流式 dbt:RisingWave 流计算的正确打开方式

让我们先来看一则 Reddit 经典提问: “为啥 dbt 如此流行?有没有替代品?” 获赞最多的回答抓住了精髓: “dbt 这么流行是因为它为 SQL 分析师和数据集市构建者提供了 Git 工作流,使得他们可以跟其他软件工程师一样工作…

Innodb索引页文件结构

Innodb索引页文件结构 首先Mysql的基本存储结构是页,Mysql中的存取数据是按照页进行存取的,在查找数据的时候是需要先定位到记录所在页,再从所在页中查找到相应的记录 数据页以一个双向链表维持着顺序,每个数据页以单向链表的格式…

nvm安装node后,npm无效

类似报这种问题,是因为去github下载npm时下载失败, Please visit https://github.com/npm/cli/releases/tag/v6.14.17 to download npm. 第一种方法:需要复制这里面的地址爬梯子去下载(github有时不用梯子能直接下载,有…

CodeFuse-VLM 开源,支持多模态多任务预训练/微调

CodeFuse-MFT-VLM 项目地址:https://github.com/codefuse-ai/CodeFuse-MFT-VLM CodeFuse-VLM-14B 模型地址:CodeFuse-VLM-14B CodeFuse-VLM框架简介 随着huggingface开源社区的不断更新,会有更多的vision encoder 和 LLM 底座发布&#x…

力扣● 62.不同路径 ● 63. 不同路径 II

● 62.不同路径 单解这道题的话,发现第一行或者第一列的这些位置,都只有一条路径走到,所以路径条数都是1。这就是初始化。坐标大于第一行第一列的这些位置,因为机器人只能向下/向右走,所以只能从上个位置向下走和从左…

CentOS基于volatility2的内存取证实验

CentOS,Redhat和Fedora 都是Red Hat体系,采用yum管理器,不同于Debian、Ubuntu作为Debian体系使用apt 本文以CentOS为例,采用avml制作内存镜像,并利用volatility官方所给工具制作profile符号文件,进行简单的…

对象存储minio

参考Linux搭建免费开源对象存储 wget https://dl.minio.io/server/minio/release/linux-amd64/minio yum install -y wget yum install -y wget wget https://dl.minio.io/server/minio/release/linux-amd64/minio chmod x minio sudo mv minio /usr/local/bin/ minio --vers…

第7节、双电机直线运动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】,查看本系列全部文章 摘要:前面章节主要介绍单个电机控制,本节内容介绍两个电机完成Bresenham直线运动 一、Bresenham直线算法介绍 Bresenham直线算法由Jack Elton Bresenham于1962年在IBM开发,最初用于计…

小白水平理解面试经典题目LeetCode 20. Valid Parentheses【栈】

20.有效括号 小白渣翻译 给定一个仅包含字符 ‘(’ 、 ‘)’ 、 ‘{’ 、 ‘}’ 、 ‘[’ 和 ‘]’ ,判断输入字符串是否有效。 输入字符串在以下情况下有效: 左括号必须由相同类型的括号封闭。 左括号必须按正确的顺序关闭。 每个右括号都有一个对…

openstack(T版)公有云--Dashboard服务

公有云上OpenStack Train最小化安装_openstack最小化部署-CSDN博客 我的opensatck(T)是参考上面链接去部署完成的,在部署完Dashboard服务后,将要用浏览器访问的时候出现了404 500 Internal Server Error 等各种各样的问题,以下是我排查问题…

代码随想录算法训练营第二七天 | 回溯 组合 分割

目录 组合总和组合总和II分割回文串 LeetCode 39. 组合总和 LeetCode 40.组合总和II LeetCode 131.分割回文串 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &am…

嵌入式软件的设计模式与方法

思想有多远,我们就能走多远 4、状态与工作流类设计模式 4.1 状态与事件 行为随条件变化而改变,这里状态切换的模式也称为状态机。有限状态机 (Finite State Machine,FSM) 是由3 个主要元素组成的有向图: 状态、转换和动作。 状态是系统或者…

12. UE5 RPG使用GameplayEffect修改角色属性(三)

书接 11. UE5 RPG使用GameplayEffect修改角色属性(二) 前面,介绍了GameplayEffect的Instant和Duration的使用,这一篇主要介绍一下无限制时间类型的infinite的使用方式。 无限时间限制模式下,如果你的周期时间&#xff…

Android meminfo 查看方法及解析

目录 Android 上查看memory 信息的方法 内存限制的信息 手动释放缓存 例 adb shell dumpsys meminfo pid 解析 adb shell dumpsys meminfo 汇总信息说明 Total RAM Free RAM ION Used RAM Lost RAM ZRAM /proc/meminfo 参考文档 Android 上查看memory 信息的方法 …

vscode配置wsl ubuntu c++的环境

在ubuntu安装llvm/clang sudo apt install llvm clang clangd lldb vscode的调试器接口是按GDB开发的,所以需要一个适配器,lldb-mi就是这个适配器。lldb-mi原来是llvm项目的一部分,后面成为了一个单独的项目https://github.com/lldb-tools/…

【Docker】.NET Core 6.0 webapi 发布上传到Docker Desktop并启动运行访问,接口返回数据乱码解决方法

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Docker容器》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…

C语言——联合体类型

📝前言: 在前面两篇文章:C语言——结构体类型(一)和C语言——结构体(二)中,我们讲述了C语言中重要的数据类型之一:结构体类型,今天我们来介绍一下C语言中的另…