Swin Transformer

一、前言

论文:https://arxiv.org/pdf/2103.14030.pdf
代码:https://github.com/microsoft/Swin-Transformer

Swin Transformer是 ICCV 21的最佳论文,它之所以能有这么大的影响力主要是因为在 ViT 之后,Swin Transformer通过在一系列视觉任务上的强大表现 ,进一步证明了Transformer是可以在视觉领域取得广泛应用的

Swin Transformer是3月份传到 arxiv上的,4月份代码库就放出来了,紧接着5月12号又放出来了自监督版本的Swin Transformer–moby,其实就是把MoCo的前两个字母和 BYOL 的前两个字母合在了一起,从方法上和性能上其实和MoCo v3和DINO都差不多,只是换了个骨干网络,所以在上一篇对比学习串讲中也没有提这篇论文

接下来过了一个月,Swin Transformer就被用到了视频领域,推出了Video-Swin-Transformer,在一系列数据集上都取得了非常好的效果

比如说在 k-400这个数据集上就已经达到了84.9的准确度

7月初的时候,因为看到了有 MLP Mixer 这篇论文,把 Swin 的思想用到了 MLP 里,推出了 Swin MLP

8月初的时候,把 Swin Transformer 用到了半监督的目标检测里,然后取得了非常好的效果

10月份的时候获得了ICCV 的最佳论文奖

12月份受到了 BEiT 和 MAE 的推动,用 Swin Transformer 基于掩码自监督学习的方式做了一个叫 SimMIM 的论文

所以说在这大半年的时间里,原作者团队就以每个月一篇论文的速度,基本把视觉领域所有的任务都刷了个遍,而且 Swin Transformer 不光应用范围广,效果也非常的炸裂。

二、题目

Swin Transformer是一个用了移动窗口的层级式的Vision Transformer

  • Swin:来自于 Shifted Windows ,S 和 win,Shifted Window(移动窗口)也是 Swin
    Transformer这篇论文的主要贡献
  • 层级式 Hierarchical

其实 Swin Transformer就是想让 Vision Transformer像卷积神经网络一样,也能够分成几个 block,也能做层级式的特征提取,从而导致提出来的特征有多尺度的概念

三、摘要

这篇论文提出了一个新的 Vision Transformer 叫做 Swin Transformer,它可以被用来作为一个计算机视觉领域一个通用的骨干网络

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

但是直接把Transformer从 NLP 用到 Vision 是有一些挑战的,这个挑战主要来自于两个方面

  • 一个就是尺度上的问题。因为比如说现在有一张街景的图片,里面有很多车和行人,里面的物体都大大小小,那这时候代表同样一个语义的词,比如说行人或者汽车就有非常不同的尺寸,这种现象在NLP 中就没有
  • 另外一个挑战是图像的分辨率太大了,如果要以像素点作为基本单位的话,序列的长度就变得高不可攀,所以说之前的工作要么就是用后续的特征图来当做Transformer的输入,要么就是把图片打成 patch 减少这个图片的分辨率,要么就是把图片画成一个一个的小窗口,然后在窗口里面去做自注意力,所有的这些方法都是为了减少序列长度。

基于这两个挑战,本文的作者就提出了 hierarchical Transformer,它的特征是通过一种叫做移动窗口的方式学来的

移动窗口的好处:不仅带来了更大的效率,因为跟之前的工作一样,现在自注意力是在窗口内算的,所以这个序列的长度大大的降低了;同时,通过 shifting 移动的这个操作,能够让相邻的两个窗口之间有了交互,所以上下层之间就可以有 cross-window connection,从而变相的达到了一种全局建模的能力。

然后作者说这种层级式的结构不仅非常灵活,可以提供各个尺度的特征信息,同时因为自注意力是在小窗口之内算的,所以说它的计算复杂度是随着图像大小而线性增长,而不是平方级增长,这其实也为作者之后提出 Swin V2 铺平了道路,从而让他们可以在特别大的分辨率上去预训练模型

四、引言

在这里插入图片描述

  • 图一如上图所示,作者先说了一下 Vision Transformer,把它放在右边做对比。
  • Vision Transformer就是把图片打成 patch,因为 ViT 里用的 patch size 是16*16的,所以说这里的16 ×,也就意味着是16倍的下采样率,这也就意味着每一个 patch,也就是每一个token,自始至终代表的尺寸都是差不多的;每一层的Transformer block看到token的尺寸都是16倍下采样率。虽然它可以通过这种全局的自注意力操作,达到全局的建模能力,但是它对多尺寸特征的把握就会弱一些。
  • 对于视觉任务,尤其是下游任务比如说检测和分割来说,多尺寸的特征是至关重要的,比如说对目标检测而言,运用最广的一个方法就是 FPN(a feature pyramid network:当有一个分层式的卷积神经网络之后,每一个卷积层出来的特征的 receptive field (感受野)是不一样的,能抓住物体不同尺寸的特征,从而能够很好的处理物体不同尺寸的问题;对于物体分割任务来说,那最常见的一个网络就是 UNet,UNet 里为了处理物体不同尺寸的问题,提出来一个叫做 skip connection 的方法,当一系列下采样做完以后,去做上采样的时候,不光是从 bottleneck 里去拿特征,还从之前也就是每次下采样完之后的东西里去拿特征,这样就把那些高频率的图像细节又全都能恢复出来了,当然分割里大家常用的网络结构还有 PspNet 、DeepLab,这些工作里也有相应的处理多尺寸的方法,比如说使用空洞卷积、使用 psp 和 aspp 层
  • 总之,对于计算机视觉的下游任务,尤其是密集预测型的任务(检测、分割),有多尺寸的特征是至关重要的

但是在 ViT 里处理的特征都是单一尺寸,而且是低分辨率,也就是说自始至终都是处理的16倍下采样率过后的特征,所以说,它可能就不适合处理这种密集预测型的任务,同时对 ViT 而言,自注意力始终都是在最大的窗口上进行,也就是说始终都是在整图上进行的,所以它是一个全局建模,它的复杂度是跟随图像的尺寸进行平方倍的增长,像检测和分割领域,一般现在常用的输入尺寸都是800乘以800或者1000乘1000,之前虽然用 patch size 16能处理 224*224 的图片,但是当图片变到这么大的时候,即使用patch size16,序列长度还是会上千,计算复杂度还是难以承受的。

所以基于这些挑战,作者提出了 Swin Transformer,Swin Transformer 其实是借鉴了很多卷积神经网络的设计理念以及先验知识

  • 比如说为了减少序列的长度、降低计算复杂度,Swin Transformer采取了在小窗口之内算自注意力,而不是像 ViT一样在整图上算自注意力,这样只要窗口大小是固定的,自注意力的计算复杂度就是固定的,整张图的计算复杂度就会跟图片的大小而成的线性增长关系,就是说图片增大了x倍,窗口数量也增大了 x 倍,计算复杂度也就乘以 x,而不是乘以 x 的平方
  • 这个就算是利用了卷积神经网络里的 Locality 的 Inductive bias,就是利用了局部性的先验知识,同一个物体的不同部位或者语义相近的不同物体还是大概率会出现在相连的地方,所以即使是在一个Local,一个小范围的窗口算自注意力也是差不多够用的,全局计算自注意力对于视觉任务来说,其实是有点浪费资源的。
  • 另外一个挑战是如何生成多尺寸的特征,卷积神经网络为什么会有多尺寸的特征?主要是因为有 Pooling (池化)这个操作,池化能够增大每一个卷积核能看到的感受野,从而使得每次池化过后的特征抓住物体的不同尺寸,所以类似的 ,Swin Transformer也提出来了一个类似于池化的操作叫做 patch merging,就是把相邻的小 patch 合成一个大 patch,这样合并出来的这一个大patch其实就能看到之前四个小patch看到的内容,它的感受野就增大了,同时也能抓住多尺寸的特征。

所以所上图中图一左边所示,Swin Transformer 刚开始的下采样率是4倍,然后变成了8倍、16倍,之所以刚开始是4×的,是因为最开始的 patch 是4乘4大小的,一旦有了多尺寸的特征信息,有了这种4x、8x、16x的特征图,那自然就可以把这些多尺寸的特征图输给一个 FPN,从而就可以去做检测了
同样的道理,有了这些多尺寸的特征图以后,也可以把它扔给一个 UNET,然后就可以去做分割了
所以这就是作者在这篇论文里反复强调的,Swin Transformer是能够当做一个通用的骨干网络的,不光是能做图像分类,还能做密集预测性的任务

在这里插入图片描述

  • 如果在 Transformer 第 L 层把输入或者特征图分成小窗口的话,就会有效的降低序列长度,从而减少计算复杂度
  • 图中每一个灰色的小 patch 是最基本的元素单元,也就是图一中4*4的 patch;每个红色的框是一个中型的计算单元,也就是一个窗口
  • 在 Swin Transformer 这篇论文里,一个小窗口里面默认有七七四十九个小patch的

4.1、shift 的操作

  • 如果用一个大的蓝色的正方形来描述整体的特征图,其实 shift 操作就是往右下角的方向整体移了两个
    patch,也就变成了像下图中右图的格式
  • 然后在新的特征图里把它再次分成四方格,如下图中右图所示
  • 最后 shift 完就能得到下图中红线标出的结果了
    在这里插入图片描述

这样的好处是窗口与窗口之间可以进行互动,因为如果按照原来的方式,就是没有 shift,这些窗口之间都是不重叠的,如果每次自注意力的操作都在小的窗口里头进行了,每个窗口里的 patch 就永远无法注意到别的窗口里的 patch 的信息,这就达不到使用 Transformer 的初衷

  • 因为Transformer的初衷就是更好的理解上下文,如果窗口都是不重叠的,那自注意力真的就变成孤立自注意力,就没有全局建模的能力
  • 但如果加上 shift 的操作,每个 patch 原来只能跟它所在的窗口里的别的 patch 进行交互,但是 shift 之后,这个 patch就可以跟新的窗口里的别的 patch就进行交互了,而这个新的窗口里所有的 patch 其实来自于上一层别的窗口里的 patch,这也就是作者说的能起到 cross-window connection,就是窗口和窗口之间可以交互了

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

五、结论

这篇论文提出了 Swin Transformer,它是一个层级式的Transformer,而且它的计算复杂度是跟输入图像的大小呈线性增长的

Swin Transformerr 在 COCO 和 ADE20K上的效果都非常的好,远远超越了之前最好的方法,所以作者说基于此,希望 Swin Transformer 能够激发出更多更好的工作,尤其是在多模态方面

因为在Swin Transformer 这篇论文里最关键的一个贡献就是基于 Shifted Window 的自注意力,它对很多视觉的任务,尤其是对下游密集预测型的任务是非常有帮助的,但是如果 Shifted Window 操作不能用到 NLP 领域里,其实在模型大一统上论据就不是那么强了,所以作者说接下来他们的未来工作就是要把 Shifted Windows用到 NLP 里面,而且如果真的能做到这一点,那 Swin Transformer真的就是一个里程碑式的工作了,而且模型大一统的故事也就讲的圆满了

六、相关工作

跟 ViT 的相关工作非常相似,作者先大概讲了一下卷积神经网络,然后又讲了一下自注意力或者 Transformer 是如何用来帮助卷积神经网络的,最后纯 Transformer 用来做视觉里的骨干网络

七、方法

主要分为两大块

  • 大概把整体的流程讲了一下,主要就是过了一下前向过程,以及提出的 patch merging 操作是怎么做的
  • 基于 Shifted Window 的自注意力,Swin Transformer怎么把它变成一个transformer block进行计算

模型总览图如下图所示
在这里插入图片描述

7.1、前向过程

假设说有一张2242243(ImageNet 标准尺寸)的输入图片

  • 第一步就是像 ViT 那样把图片打成 patch,在 Swin Transformer 这篇论文里,它的 patch size4x4,而不是像 ViT 一样16x16,所以说它经过 patch partition 打成 patch之后,得到图片的尺寸是56x56x48,56就是224/4,因为 patch size 是4,向量的维度48,因为4x4x3,3是图片的 RGB 通道
  • 打完了 patch ,接下来就要做 Linear Embedding,也就是说要把向量的维度变成一个预先设置好的值,就是Transformer 能够接受的值,在 Swin Transformer 的论文里把这个超参数设为 c,对于 Swin tiny网络来说,也就是上图中画的网络总览图,它的 c 是96,所以经历完 Linear Embedding之后,输入的尺寸就变成了56x56x96,前面的56x56就会拉直变成3136,变成了序列长度,后面的96就变成了每一个token向量的维度,其实Patch Partition 和 Linear Embedding 就相当于是 ViT 里的Patch Projection操作,而在代码里也是用一次卷积操作就完成了,

第一部分跟 ViT 其实还是没有区别的,但紧接着区别就来了

  • 首先序列长度是3136,对于 ViT 来说,用 patch size 16x16,它的序列长度就只有196,是相对短很多的,这里的3136就太长了,是目前来说Transformer不能接受的序列长度,所以Swin Transformer 就引入了基于窗口的自注意力计算,每个窗口按照默认来说,都只有七七四十九个 patch,所以说序列长度就只有49就相当小了,这样就解决了计算复杂度的问题

  • 所以也就是说, stage1中的swin transformer block 是基于窗口计算自注意力的,现在暂时先把 transformer block当成是一个黑盒,只关注输入和输出的维度,对于 Transformer 来说,如果不对它做更多约束的话,Transformer输入的序列长度是多少,输出的序列长度也是多少,它的输入输出的尺寸是不变的,所以说在stage1 中经过两层Swin Transformer block 之后,输出还是565696

  • 到这其实 Swin Transformer的第一个阶段就走完了,也就是先过一个 Patch Projection 层,然后再过一些Swin Transformer block,接下来如果想要有多尺寸的特征信息,就要构建一个层级式的transformer,也就是说需要一个像卷积神经网络里一样,有一个类似于池化的操作

这篇论文里作者就提出 Patch Merging 的操作,Patch Merging 其实在之前一些工作里也有用到,它很像 Pixel Shuffle 的上采样的一个反过程,Pixel Shuffle 是 lower level 任务中很常用的一个上采样方式

7.1.1、Patch Merging操作

在这里插入图片描述

  • 假如有一个张量, Patch Merging 顾名思义就是把临近的小 patch 合并成一个大 patch,这样就可以起到下采样一个特征图的效果了
  • 这里因为是想下采样两倍,所以说在选点的时候是每隔一个点选一个,也就意味着说对于这个张量来说,每次选的点是1、1、1、1
  • 其实在这里的1、2、3、4并不是矩阵里有的值,而是给它的一个序号,同样序号位置上的 patch 就会被 merge 到一起,这个序号只是为了帮助理解
  • 经过隔一个点采一个样之后,原来的这个张量就变成了四个张量,也就是说所有的1都在一起了,2在一起,3在一起,4在一起,如果原张量的维度是 h * w * c ,当然这里 c 没有画出来,经过这次采样之后就得到了4个张量,每个张量的大小是 h/2、w/2,它的尺寸都缩小了一倍
  • 现在把这四个张量在 c 的维度上拼接起来,张量的大小就变成了 h/2 * w/2 * 4c,相当于用空间上的维度换了更多的通道数
  • 通过这个操作,就把原来一个大的张量变小了,就像卷积神经网络里的池化操作一样,为了跟卷积神经网络那边保持一致(不论是 VGGNet 还是 ResNet,一般在池化操作降维之后,通道数都会翻倍,从128变成256,从256再变成512),所以这里也只想让他翻倍,而不是变成4倍,所以紧接着又再做了一次操作,就是在 c 的维度上用一个1乘1的卷积,把通道数降下来变成2c,通过这个操作就能把原来一个大小为 h x w x c 的张量变成 h/2 * w/2 *2c 的一个张量,也就是说空间大小减半,但是通道数乘2,这样就跟卷积神经网络完全对等起来了

整个这个过程就是 Patch Merging,经历过这次Patch Merging操作之后,输出的大小就从56x56x96变成了28x28x192,经过stage2中的 Transformer block,尺寸是不变的,所以出来之后还是28x28x192

这样第二阶段也就完成了,第三和第四阶段都是同理,都是先进来做一次Patch Merging,然后再通过一些 Swin Transformer block,所以维度就进一步降成了14x14x384以及7x7x768

而且为了和卷积神经网络保持一致,Swin Transformer这篇论文并没有像 ViT 一样使用 CLS token,ViT 是给刚开始的输入序列又加了一个 CLS token,所以这个长度就从196变成了197,最后拿 CLS token 的特征直接去做分类,但 Swin Transformer 没有用这个 token,它是像卷积神经网络一样,在得到最后的特征图之后用global average polling,就是全局池化的操作,直接把7*7就取平均拉直变成1了

所以看完整个前向过程之后,就会发现 Swin Transformer 有四个 stage,还有类似于池化的 patch merging 操作,自注意力还是在小窗口之内做的以及最后还用的是 global average polling,所以说 Swin Transformer 这篇论文真的是把卷积神经网络和 Transformer 这两系列的工作完美的结合到了一起,也可以说它是披着Transformer皮的卷积神经网络.

7.2、主要贡献

这篇论文的主要贡献就是基于窗口或者移动窗口的自注意力,这里作者又写了一段研究动机,就是为什么要引入窗口的自注意力,其实跟之前引言里说的都是一个事情,就是说全局自注意力的计算会导致平方倍的复杂度,同样当去做视觉里的下游任务,尤其是密集预测型的任务,或者说遇到非常大尺寸的图片时候,这种全局算自注意力的计算复杂度就非常贵了,所以就用窗口的方式去做自注意力

7.3、窗口划分举例

原图片会被平均的分成一些没有重叠的窗口,拿第一层之前的输入来举例,它的尺寸就是565696,也就说有一个维度是56*56张量,然后把它切成一些不重叠的方格,也就是下图中用橘黄色表示的方格
在这里插入图片描述

  • 每一个橘黄色的方格就是一个窗口,但是这个窗口并不是最小的计算单元,最小的计算单元其实还是之前的那个 patch,也就意味着每一个小窗口里其实还有 m * m 个 patch,在 Swin Transformer 这篇论文里一般 m 默认为7,也就是说,一个橘黄色的小方格里有七七四十九个小 patch
  • 现在所有自注意力的计算都是在这些小窗口里完成的,就是说序列长度永远都是七七四十九
  • 原来大的整体特征图到底里面会有多少个窗口呢?其实也就是每条边56/7就8个窗口,也就是说一共会有8*8等于64个窗口,就是说会在这64个窗口里分别去算它们的自注意力

7.4、基于窗口的自注意力模式的计算复杂度

在这里插入图片描述
公式(1)对应的是标准的多头自注意力的计算复杂度
公式(2)对应的是基于窗口的自注意力计算的复杂度,这里的 M 就是刚才的7,也就是说一个窗口的某条边上有多少个patch

7.4.1、公式推算

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

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

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

  • 首先,to_q_k_v()函数相当于是用一个 h×w×c 的向量乘以一个 c×c 的系数矩阵,最后得到了h×w×c。所以每一个计算的复杂度是 h×w×c2,因为有三次操作,所以是三倍的 h×w×c2
  • 然后,算自注意力就是 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×c2,最后合并起来就是最后的公式(1)

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

  • 因为在每个窗口里算的还是多头自注意力,所以可以直接套用公式(1),只不过高度和宽度变化了,现在高度和宽度不再是 h * w,而是变成窗口有多大了,也就是 M*M,也就是说现在 h 变成了 M,w 也是 M,它的序列长度只有 M * M 这么大
  • 所以当把 M 值带入到公式(1)之后,就得到计算复杂度是4 * M2 * c2 + 2 * M4 *c,这个就是在一个窗口里算多头自注意力所需要的计算复杂度
  • 那我们现在一共有 h/M * w/M 个窗口,现在用这么多个窗口乘以每个窗口所需要的计算复杂度就能得到公式(2)了

这种基于窗口计算自注意力的方式虽然很好地解决了内存和计算量的问题,但是窗口和窗口之间没有通信,这样就达不到全局建模了,也就文章里说的会限制模型的能力,所以最好还是要有一种方式能让窗口和窗口之间互相通信起来,这样效果应该会更好,因为具有上下文的信息,所以作者就提出移动窗口的方式

移动窗口就是把原来的窗口往右下角移动一半窗口的距离,如果Transformer是上下两层连着做这种操作,先是 window再是 shifted window 的话,就能起到窗口和窗口之间互相通信的目的了

所以说在 Swin Transformer里, transformer block 的安排是有讲究的,每次都是先要做一次基于窗口的多头自注意力,然后再做一次基于移动窗口的多头自注意力,这样就达到了窗口和窗口之间的互相通信。如下图所示
在这里插入图片描述

  • 每次输入先进来之后先做一次 Layernorm,然后做窗口的多头自注意力,然后再过 Layernorm 过 MLP,第一个 block 就结束了
  • 这个 block 结束以后,紧接着做一次Shifted window,也就是基于移动窗口的多头自注意力,然后再过 MLP 得到输出
  • 这两个 block 加起来其实才算是 Swin Transformer 一个基本的计算单元,这也就是为什么stage1、2、3、4中的 swin transformer block 为什么是 *2、*2、*6、*2,也就是一共有多少层 Swin Transformer block 的数字总是偶数,因为它始终都需要两层 block连在一起作为一个基本单元,所以一定是2的倍数

到此,Swin Transformer整体的故事和结构就已经讲完了,主要的研究动机就是想要有一个层级式的 Transformer,为了这个层级式,所以介绍了 Patch Merging 的操作,从而能像卷积神经网络一样把 Transformer 分成几个阶段,为了减少计算复杂度,争取能做视觉里密集预测的任务,所以又提出了基于窗口和移动窗口的自注意力方式,也就是连在一起的两Transformer block,最后把这些部分加在一起,就是 Swin Transformer 的结构

7.5、补充(技术细节)

其实作者后面还讲了两个点:

  1. 一个是怎样提高移动窗口的计算效率,他们采取了一种非常巧妙的 masking(掩码)的方式
  2. 另外一个点就是这篇论文里没有用绝对的位置编码,而是用相对的位置编码

在这里插入图片描述
上图是一个基础版本的移动窗口,就是把左边的窗口模式变成了右边的窗口方式,虽然这种方式已经能够达到窗口和窗口之间的互相通信了,但是会发现一个问题,就是原来计算的时候,特征图上只有四个窗口,但是做完移动窗口操作之后得到了9个窗口,窗口的数量增加了,而且每个窗口里的元素大小不一,比如说中间的窗口还是4*4,有16个 patch,但是别的窗口有的有4个 patch,有的有8个 patch,都不一样了,如果想做快速运算,就是把这些窗口全都压成一个 patch直接去算自注意力,就做不到了,因为窗口的大小不一样,有一个简单粗暴的解决方式就是把这些小窗口周围再 pad 上0 ,把它照样pad成和中间窗口一样大的窗口,这样就有9个完全一样大的窗口,这样就还能把它们压成一个batch,就会快很多,但是这样的话,无形之中计算复杂度就提升了,因为原来如果算基于窗口的自注意力只用算4个窗口,但是现在需要去算9个窗口,复杂度一下提升了两倍多,所以还是相当可观的,那怎么能让第二次移位完的窗口数量还是保持4个,而且每个窗口里的patch数量也还保持一致呢?作者提出了一个非常巧妙的掩码方式,如下图所示
在这里插入图片描述

上图是说,当通过普通的移动窗口方式,得到9个窗口之后,现在不在这9个窗口上算自注意力,先再做一次循环移位( cyclic shift )

在这里插入图片描述
Swin Transformer的几个变体

  • Swin Tiny
  • Swin Small
  • Swin Base
  • Swin Large

这些变体之间有哪些不一样呢?,其实主要不一样的就是两个超参数

  • 一个是向量维度的大小 c
  • 另一个是每个 stage 里到底有多少个 transform block

八、实验

首先是分类上的实验,这里一共说了两种预训练的方式

  • 第一种就是在正规的ImageNet-1K(128万张图片、1000个类)上做预训练
  • 第二种方式是在更大的ImageNet-22K(1,400万张图片、2万多个类别)上做预训练

当然不论是用ImageNet-1K去做预训练,还是用ImageNet-22K去做预训练,最后测试的结果都是在ImageNet-1K的测试集上去做的,结果如下表所示
在这里插入图片描述
接下来是目标检测的结果,作者是在 COCO 数据集上训练并且进行测试的,结果如下图所示
在这里插入图片描述
第三个实验作者选择了语义分割里的ADE20K数据集,结果如下图所示
在这里插入图片描述
消融实验
在这里插入图片描述
上图中表4主要就是想说一下移动窗口以及相对位置编码到底对 Swin Transformer 作用

九、学习参考

https://www.bilibili.com/video/BV13L4y1475U/?spm_id_from=333.788&vd_source=dd75d88b2d870abec738899faf601118

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值