SwinTransformer论文笔记

news2024/12/25 11:11:55

What:Swin Transformer

              用了移动窗口的层级式的Vision Transformer.

              Swin Transformer的思想是让Vision Transformer也能像CNN一样也能分成几个block,也能做层级式的特征提取,从而让提取的特征具有多尺度的概念。(设计的初衷是作为计算机视觉领域通用的骨干网络)

              SW-MSA:shifted windows-multi-head self-attention

              缺点:但是在模型大一统上,也就是 unified architecture 上来说,其实 ViT 还是做的更好的,因为它真的可以什么都不改,什么先验信息都不加,就能让Transformer在两个领域都能用的很好,这样模型不仅可以共享参数,而且甚至可以把所有模态的输入直接就拼接起来,当成一个很长的输入,直接扔给Transformer去做,而不用考虑每个模态的特性

Why:

1、因为ViT 在结论的部分指出,他们那篇论文只是做了分类任务,把下游任务比如说检测和分割留给以后的人去探索,所以说在 ViT 出来之后,大家虽然看到了Transformer在视觉领域的强大潜力,但是并不确定Transformer能不能把所有视觉的任务都做掉,所以 Swin Transformer这篇论文的研究动机就是想告诉大家用 Transformer没毛病,绝对能在方方面面上取代卷积神经网络,接下来大家都上 Transformer 就好了

Challenge:

Transformer在计算机视觉领域的应用仍然面临着一些挑战

  1. 对目标的多尺度检测(Transformer没有卷积,没有对图像做下采样,所以他没有检测多尺度的能力,VIT每个层级都是用的16x的下采样,无法精准识别多尺度窗口)

至于为什么卷积能提取多尺度信息:每个卷积核的感受野是指它在输入特征图上能够看到的区域大小。在浅层的卷积层中,卷积核的感受野较小,只能看到输入特征图的局部区域。但随着网络的深入,每个卷积层都会通过较大的卷积核和步幅来扩大感受野,以便捕捉更广阔的上下文信息

池化操作的主要作用是通过降采样的方式减小特征图的空间尺寸,从而减少计算量和参数数量,同时保留主要的特征信息。在池化过程中,通常使用最大值池化或平均值池化等方法。通过池化操作,每个池化窗口内的特征被汇聚成一个单一的值,这个值代表了该窗口内的主要特征。当池化操作应用于卷积层输出时,特征图的尺寸会减小,但是池化窗口的大小可以自由选择。通过适当选择池化窗口的大小和步幅,可以扩大卷积核的感受野。池化层的输出作为下一层的输入,使得下一层的卷积核能够看到更广阔的感受野

目标检测用FPN抓住不同尺寸的物体特征

对物体分割用UNet抓住不同尺寸的物体特征

(对计算机视觉的下游任务,尤其是密集预测型的任务(检测,分割),有多尺寸的特征是至关重要的)

  1. 图像经过处理放入Transformer的token个数往往比一个句子转化过后的token个数多得多。如果要以像素点作为基本单位的话,序列的长度就变得高不可攀,计算量就会变得非常的大所以说之前的工作要么就是用后续的特征图来当做Transformer的输入,要么就是把图片打成 patch 减少这个图片的 resolution,要么就是把图片画成一个一个的小窗口,然后在窗口里面去做自注意力,所有的这些方法都是为了减少序列长度
  2. 作者采用2中的法三,但是法三的问题是,窗口间的attention无法计算,窗口和窗口之间没有通讯,窗口之间会成为孤立的自注意力,这样就达不到全局建模了,会限制模型的能力。
  3. 采用移动窗口之后计算attention会面临窗口大小不一的问题
  4. 解决了窗口大小不一的问题又会面临新窗口内的patch不相邻的问题

Idea:为了解决2、作者将原图画成小窗口,为了解决3,作者提出移动窗口的思想,能够让相邻的两个窗口之间有了交互,所以上下层之间就可以有cross-window connection从而变相地达到了一种全局建模的能力,为了解决1,作者提出hierarchical Transformer,其中层级之间包含了patchmerging操作,(把相邻的小patch和成一个大patch,这样合并出来的这一个大patch其实就能看到之前四个小patch看到的内容,它的感受野就增大了,同时也能抓住多尺寸的特征)相当于CNN中的池化操作,为了解决4,作者提出了一种移动再拼接再分窗的办法,为了解决5,作者提出了一种窗口掩码后再进行attention的方法。

Model

层级式与窗口

       Swin Transformer 刚开始的下采样率是4倍,然后变成了8倍、16倍,之所以刚开始是4×的,是因为最开始的 patch 是4乘4大小的,一旦有了多尺寸的特征信息,有了这种4x、8x、16x的特征图,那自然就可以把这些多尺寸的特征图输给一个 FPN,从而就可以去做检测了(用UNet做分割)

采用窗口计算子注意力的计算复杂度为什么低?

以标准的多头自注意力为例

  1. 如果现在有一个输入,自注意力首先把它变成 q k v 三个向量,这个过程其实就是原来的向量分别乘了三个系数矩阵
  2. 一旦得到 query 和 k 之后,它们就会相乘,最后得到 attention,也就是自注意力的矩阵
  3. 有了自注意力之后,就会和 value 做一次乘法,也就相当于是做了一次加权
  4. 最后因为是多头自注意力,所以最后还会有一个 projection layer,这个投射层会把向量的维度投射到我们想要的维度

如果这些向量都加上它们该有的维度,也就是说刚开始输入是 h*w*c

首先,to_q_k_v()函数相当于是用一个 h*w*c 的向量乘以一个 c*c 的系数矩阵,最后得到了 h*w*c。所以每一个计算的复杂度是 h*w*c^2,因为有三次操作,所以是三倍的 h*w*c^2

然后,算自注意力就是 h*w*c乘以 k 的转置,也就是 c*h*w,所以得到了 h*w*h*w,这个计算复杂度就是(h*w)^2*c

接下来,自注意力矩阵和value的乘积的计算复杂度还是 (h*w)^2*c,所以现在就成了2*(h*w)^2*c

最后一步,投射层也就是h*w*c乘以 c*c 变成了 h*w*c ,它的计算复杂度就又是 h*w*c^2

最后合并起来就是最后的公式(1)

基于窗口的自注意力计算复杂度又是如何得到的呢?

因为在每个窗口里算的还是多头自注意力,所以可以直接套用公式(1),只不过高度和宽度变化了,现在高度和宽度不再是 h * w,而是变成窗口有多大了,也就是 M*M,也就是说现在 h 变成了 M,w 也是 M,它的序列长度只有 M * M 这么大

所以当把 M 值带入到公式(1)之后,就得到计算复杂度是4 * M^2 * c^2 + 2 * M^4 * c,这个就是在一个窗口里算多头自注意力所需要的计算复杂度

那我们现在一共有 h/M * w/M 个窗口,现在用这么多个窗口乘以每个窗口所需要的计算复杂度就能得到公式(2)了

对比公式(1)和公式(2),虽然这两个公式前面这两项是一样的,只有后面从 (h*w)^2变成了 M^2 * h * w,看起来好像差别不大,但其实如果仔细带入数字进去计算就会发现,计算复杂的差距是相当巨大的,因为这里的 h*w 如果是56*56的话, M^2 其实只有49,所以是相差了几十甚至上百倍的

滑动窗口:Shift的操作

最后shift完就得到下边右图的结果

滑动窗口的目的是使窗口与窗口之间可以进行互动,因为如果按照原来的方式,就是没有 shift,这些窗口之间都是不重叠的,如果每次自注意力的操作都在小的窗口里头进行了,每个窗口里的 patch 就永远无法注意到别的窗口里的 patch 的信息,窗口内的自注意力就都变成孤立自注意力,就没与全局建模的能力。这就达不到使用 Transformer 更好的理解上下文的初衷

但如果加上 shift 的操作,每个 patch 原来只能跟它所在的窗口里的别的 patch 进行交互,但是 shift 之后,这个 patch就可以跟新的窗口里的别的 patch就进行交互了,而这个新的窗口里所有的 patch 其实来自于上一层别的窗口里的 patch,这也就是作者说的能起到 cross-window connection,就是窗口和窗口之间可以交互了

再配合上之后提出的 patch merging,合并到 Transformer 最后几层的时候,每一个 patch 本身的感受野就已经很大了,就已经能看到大部分图片了,然后再加上移动窗口的操作,它所谓的窗口内的局部注意力其实也就变相的等于是一个全局的自注意力操作了

Patch Merging操作

Patch Merging顾名思义就是把临近的小patch合并成一个大patch,这样就可以起到下采样一个特征图的效果了,文中的的patch Merging是想下采样两倍,所以说在选点的时候是每隔一个点选一个,经过隔一个点采一个样之后,原来这个张量就变成了四个张量,,如果原张量的维度是h*w*c,经过这次采样之后就得到了四个张量,每个张量的大小是h/2、w/2,4c它的尺寸都缩小了一倍,相当于用空间上的维度换了更多的通道数。通过这个操作,就把原来一个大的张量变小了,通道数变成了原来的四倍,但是卷积神经网络里池化操作是让特征的通道数翻倍而不是变成四倍,这里为了跟CNN保持一致,就在c的维度上用一个1*1的卷积,把通道数降下来变成2c,通过这个操作就能把原来一个大小为h*w*c的张量变成h/2*w/2*2c的一个张量,也就是说空间大小减半,但是通道数乘2,这样就跟卷积神经网络对等起来了

掩码操作:略

位置编码:在attention中改变公式,使用相对位置编码,(在B中体现)

参考:

Swin Transformer论文精读【论文精读】_哔哩哔哩_bilibili

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

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

相关文章

计算机二级Python题目13

目录 1. 基本题 1.1 基本题1 1.2 基本题2 1.3 基本题3 2. turtle画图 3. 大题 3.1 大题1 3.2 大题2 1. 基本题 1.1 基本题1 lseval(input()) s"" for item in ls:if type(item)type("香山"):s item print(s) 1.2 基本题2 import random random.se…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的手写数字和符号识别(深度学习训练+UI界面+训练数据集)

摘要:开发手写数字和符号识别对于智能交互系统具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个手写数字和符号识别,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5,展示了不同模…

电源常用通讯电路详解

数字电源的采样和PWM驱动电路原理,通过这些技术,数字电源可以在内部形成控制闭环。但是要实现电源的控制和管理,还是需要与数字控制核心建立通讯连接。本期将带领大家了解数字电源常用的通讯电路。 一、常用的通讯方式 在前面数字电源与模拟…

运行gazebo机器人模型没有cmd_vel话题

运行赵虚左教程代码出现上诉问题 roslaunch urdf02_gazebo demo03_env.launch 原因:缺少某个包 在工作空间catkin_make编译发现报错 解决: sudo apt-get install ros-noetic-gazebo-ros-pkgs ros-noetic-gazebo-ros-control 下载后再次运行launch文件…

redis中List和hash数据类型

list类型是用来存储多个有序的字符串的,列表当中的每一个字符看做一个元素,一个列表当中可以存储一个或者多个元素,redis的list支持存储2^32-1个元素。redis可以从列表的两端进行插入(pubsh)和弹出(pop&…

Flink 集群部署模式

文章目录 前言一、会话模式(Session Mode)二、单作业模式(Per-Job Mode)三、应用模式(Application Mode) 前言 Flink支持多种集群部署模式,以满足不同场景和需求。以下是Flink的主要集群部署模…

外包干了3天,技术明显进步。。。。。

先说一下自己的情况,本科生,19年通过校招进入南京某软件公司,干了接近2年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

奇怪的比赛(Python,递归,状态压缩动态规划dp)

目录 前言:题目:思路:递归:代码及详细注释: 状态压缩dp:代码及详细注释: 总结: 前言: 这道题原本是蓝桥上的题,现在搜不到了,网上关于此题的讲解…

【ESP32接入国产大模型之MiniMax】

1. MiniMax 讲解视频: ESP32接入语言大模型之MiniMax MM智能助理是一款由MiniMax自研的,没有调用其他产品的接口的大型语言模型。MiniMax是一家中国科技公司,一直致力于进行大模型相关的研究。 随着人工智能技术的不断发展,自然语…

springboot绩效管理系统(源码私信呢)

链接如下: 20240316_173655_哔哩哔哩_bilibili 代码解析理解: 前置知识:三层架构: con...>ser接口>imp接口实现类>mapper写sql语句Controller 层控制层-->调用业务方法来控制业务逻辑 ,功能的请求和响应控制,controller层负责前…

减肥实践和经验分享

在当下竞争激烈、物质丰富的现代社会,每个人都会同时面临两个不同指向的问题 和别人竞争,实现个人价值,创造个人财富,此为:显性指向(explicit)和自己比拼,实现个人内在提升&#xf…

数据库——书籍+内容0.1版本

背景:将一本书,存入我们的数据库中,并可以查出来 采用:第三范式(3NF)设计模式 设计数据库模板 第一范式(1NF):确保表的每一列都是不可分割的原子数据项。 第二范式&…

什么时候去检测大数据信用风险比较合适?

什么时候去检测大数据信用风险比较合适?在当今这个数据驱动的时代,大数据信用风险检测已经成为个人的一项重要需求。本文将从贷前检测、信息泄露检测和定期检测三个方面,阐述何时进行大数据信用风险检测较为合适。 一、贷前检测 大数据信用风险检测在贷…

1.Spring入门

1.1 Spring简介 Spring是一个轻量级Java 企业级应用程序开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。 Spring Fra…

力扣701. 二叉搜索树中的插入操作

思路:往二叉搜索树中插入一个值,树的结构有多种符合的情况,那我们可以选一种最容易的插入方式,反正只需要插入一个值而已,我们不难发现,不管插入什么值,都可以安排插入到叶子节点上。 再利用二叉…

Internet协议的安全性

Internet协议的安全性 文章目录 Internet协议的安全性1. 网络层1. IP*62. ARP*33. ICMP * 3 2. 传输层协议1. TCP1. * SYN-Flood攻击攻击检测* 防御 2. TCP序号攻击攻击 3. 拥塞机制攻击 2. UDP 3. 应用层协议1. DNS攻击*3防范*3: 2. FTP3. TELNET: 改用ssh4. 电子邮件1. 攻击2…

Microsoft Visio 编辑属性值

Microsoft Visio 编辑属性值 1. 编辑属性值References 1. 编辑属性值 单击长度或高度位置,弹出形状的各属性值,点击编辑对应的属性值。 ​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

解决:IDEA编译Java程序时报编译失败

1、问题展示: 2、解决方法:

自制一个操作系统 第一天

目录 环境准备引导程序 环境准备 自制操作系统的第一个困难是假设我们写好了操作系统,我们怎么模拟运行我们的操作系统?不用担心,已经有现成的模拟工具了,QEMU(Quick Emulator) 是一个广泛使用的开源计算机仿真器和虚拟机。使用它…

2023年中国抗DDoS市场规模现状及竞争格局,公有云抗DDoS是主要增长点

分布式拒绝服务(DDoS)是在DoS基础之上产生的一种新的攻击方式,具有多对一的攻击模式。它通过制造伪造的流量,使得被攻击的服务器、网络链路或是网络设备(如防火墙、路由器等)负载过高,无法处理正…