Swin Transformer原理(新手入门级理解)

目录

前言

1、Swin Transformer简介

2、Swin Transformer模型原理

2.1 Swin Transformer模型整体框架

2.2 基于窗口的自注意力计算

2.3 基于移动窗口的自注意力计算

2.4 PatchMerging

总结

前言

这是新手入门级理解Swin Transformer的原理。在大家想看Swin Transformer的原理的时候,小编建议大家先去看一下ViT模型的原理,Vision Transformer可以说是Transformer处理视觉任务的开山之作,可以说Vision Transformer成功的将视觉问题转换成了NLP问题,它成功的将2D的图像通过打成多个patch块来转换Transformer能处理的1Dpatch序列,Swin Transformer在前面也是借鉴了Vision Transformer对于图片的处理方法,如果大家看了并理解了Vision Transformer,那在座的各位兄弟将会更容易理解Swin Transformer

1、Swin Transformer简介

Swin Transformer名字的前部分Swin来自于Shifted Windows,Shifted Windows(移动窗口)也是Swin Transformer的主要特点。Swin Transformer的作者的初衷是想让Vision Transformer像卷积神经网络一样,也能够分成几个block做层级式的特征提取,从而导致提出来的特征具有多尺度的概念。

标准的Transformer直接用到视觉领域有一些挑战,难度主要来自于尺度不一和图像的resolution较大两个方面。首先是关于尺度的问题,例如一张街景的图片,里面有很多车和行人,并且各种物体的大小不一,这种现象不存在于自然语言处理。再者是关于图像的resolution较大问题,如果以像素点为基本单位,序列的长度就变得高不可攀,为了解决序列长度这一问题,科研人员做了一系列的尝试工作,包括把后续的特征图作为Transformer的输入或者把图像打成多个patch以减少图片的resolution,也包括把图片划成一个一个的小窗口,然后再窗口里做自注意力计算等多种办法。针对以上两个方面的问题,Swin Transformer网络被提出,它的特征是通过移动窗口的方式学来的,移动窗口不仅带来了更大的效率,由于自注意力是在窗口内计算的,所以也大大降低了序列的长度,同时通过Shiting(移动)的操作可以使相邻的两个窗口之间进行交互,也因此上下层之间有了cross-window connection,从而变相达到了全局建模的能力。

层级式结构的好处在于不仅灵活的提供各种尺度的信息,同时还因为自注意力是在窗口内计算的,所以它的计算复杂度随着图片大小线性增长而不是平方级增长,这就使Swin Transformer能够在特别大的分辨率上进行预训练模型。

2、Swin Transformer模型原理

2.1 Swin Transformer模型整体框架

Swin Transformer原理(新手入门级理解)

图1

我们来给定一张图片,来看看图片在Swin Transformer 模型中是如何变化的。在看到这些维度变化的时候,我相信在座的各位心中满满的疑问,这什么狗屁作者,竟然也不写怎么变化来的,不急不急,如何变化来的详细细节在整体流程的下面,也就是说基于窗口自注意力、基于移动窗口自注意力、patchmerging关键技术讲解部分,这样写的目的是希望大家跟我一样带着满脸疑问来学习。我希望当大家看完后面的技术部分再来看这一小节,相信大家会更容易理解看懂。

1、给定一张2242243的图片,先将图片打成patch,patch size设置为44,经过patch partition后图片的尺寸为565648(56=224/4,48=163,3为RGB通道数)

2、接下来进入linear embedding层,linear embedding层会将输入向量的维度变成预先设置好的值即Transformer能够接受的值,若此处将超参数C设置成96,那么向量大小就变成了565696,然后经过拉直变成3136*96,3136就是序列的长度,96成为了每个token的维度。在Swin Transformer中的patch partition层和linear embedding层相当于ViT模型的patch projection层操作,在代码里用一次卷积就能够完成。

3、Swin Transformer在最前面将2D的图片处理成1D的序列的方法同ViT模型没有什么较大的区别。前面处理好的序列的长度为3136,但相对于ViT模型里的196来说太长了,在这里就用到了基于窗口的自注意力,每个窗口都有7*7=49个小patch,所以序列长度就变成了49,这样就解决了计算复杂度的问题。基于窗口的自注意力在下面进行介绍。这里实在是困惑,建议兄弟可以先去看看下面如何基于窗口计算注意力。

4、如果我们想要有多尺寸的特征信息,就要构建一个层级式的Transformer,也就是说需要像卷积神经网络里一样有一个池化的操作,所以这里就提出了parch merging的操作。经过patch merging之后我们的整张图片的尺寸就从565696变成了2828192。

5、再经过一个Transformer Block(如图3.1中的stage2),维度不变仍然是2828192。图3.1中的stage3和stage4的过程和stage2基本一致。通过stage4之后维度就变成了77768。

6、最后Swin Transformer并没有像ViT一样使用CSL token,而是像卷积神经网络一样在得到最后的特征图之后用了一个global average polling(全局池化的操作)直接将77取平均拉直变成1。如果是在ImageNet数据集上做分类任务,那么最后将1768变成1*1000。这就完成了整个网络的分类任务。

2.2 基于窗口的自注意力计算

基于全局的自注意力计算会导致平方倍的复杂度,当进行视觉里的下游任务时尤其是密集预测型任务或者非常大尺寸的图片时,基于全局计算自注意力的复杂度会非常的高,而Swin Transformer则采用了窗口计算自注意力。

Swin Transformer原理(新手入门级理解)

图2

如图,原来的图片会不重叠的分成多个窗口,但窗口并不是最小的计算单元,最小的计算单元是窗口里的patch图像块,每个窗口里都有m*m个patch,在Swin Transformer的原文中,m的值一般默认为7,此时每个窗口里就有49个patch,自注意力计算都是分别在窗口内完成的,所以序列长度永远都是49。

2.3 基于移动窗口的自注意力计算

基于窗口的计算自我注意的方法虽然解决了内存和计算的问题,但窗口之间没有通信,无法达到全局建模的效果,限制了模型的能力。移动窗口提出后,先对窗口进行自我注意计算,然后在移动窗口后进行自我注意计算,从而实现窗口与窗口之间的交流,从而达到全局建模的效果。

[En]

Although the method of calculating self-attention based on window solves the problem of memory and computation, there is no communication between windows, which can not achieve the effect of global modeling, which limits the ability of the model. After the mobile window is proposed, the advanced self-attention calculation of the window, and then the self-attention calculation after moving the window, so as to realize the communication between the window and the window, thus achieving the effect of global modeling.

Swin Transformer原理(新手入门级理解)

图3

图3是由图2向右下角移动2个patch的单位得到,原来的窗口与移动后的窗口有了重叠的部分,这样就到达了窗口与窗口之间的相互通信。虽然已经能达到窗口与窗口之间的通信,但是原来的特征图只有4个窗口,经过移动窗口后,得到了9个窗口,窗口的数量有所增加并且9个窗口的大小也不是完全相同,这就导致计算难度增加。

Swin Transformer原作者团队使用了循环移位和掩码操作的方式,既保证了移动窗口后窗口的数量保持不变,也保证了每个窗口内的patch数量不变。

Swin Transformer原理(新手入门级理解)

图4

通过循环移位,由图4中的window partition图变成图4的cyslic shift图,经过循环移位后,图片重新分成4个窗口,移动窗口前是4个窗口,经过循环移位后仍是4个窗口,这就使得窗口数量还是4个,窗口的数量就固定了,这就使得计算难度降低了。

循环移位后仍然有一些问题存在,A,B,C所在的三个窗口中不仅包含了原本就在这个地方的元素,同时也包含了A,B,C三个从很远的地方移位过来的元素,每个窗口中原本存在的元素和移位过来的元素之间是没有什么较大的关系的,因为二者离的比较远,所以我们不需要对二者进行注意力的计算。针对这个问题Swin Transformer原作者团队提出了掩码操作,从而能够让一个窗口中不同的区域之间能用一次前向过程就能把自注意力就散出来,而相互之间都不干扰。以下将举例说明循环移位和掩码操作的具体计算过程。

Swin Transformer原理(新手入门级理解)

图5

图5是经过循环移位后得到的图,图的大小为1414,每个窗口的大小为77,其中数字0~8用来区分不同的区域。

现在区域0是窗口,区域1和2是窗口,区域3和6是窗口,区域4、5、7和8是窗口。区域2和5相当于图3.3中的区域B,区域6和7相当于图3.3中的区域C,区域8相当于图4中的区域A。

[En]

Now area 0 is a window, area 1 and 2 are a window, area 3 and 6 are a window, and areas 4, 5, 7 and 8 are a window. Areas 2 and 5 are equivalent to area B in figure 3.3, areas 6 and 7 are equivalent to area C in figure 3.3, and area 8 is equivalent to area An in figure 4.

0号区域所在的窗口内的所有元素可以相互去做自注意力的计算。

对于区域1和区域2所在的窗户,区域1是原始区域,但区域2是从其他地方移来的,因此这两个区域是不同的,不应从注意力计算。

[En]

For the windows where areas 1 and 2 are located, area 1 is the original area, but area 2 is shifted from somewhere else, so the two areas are different and should not be calculated from attention.

对于3号和6号窗口,3号区域是原来的区域,但6号区域是从其他地方移来的,所以这两个区域是不同的,不应该在它们之间做自我注意的计算。

[En]

For the windows No. 3 and No. 6, area 3 is the original area, but area 6 is shifted from somewhere else, so the two areas are different, and they should not do self-attention calculation between them.

最复杂的是4区、5区、7区和8区所在的窗口,4区是原来的区域,5区、7区和8区是从外地转移过来的区域,所以这四个区域都不一样。他们中的任何一个都不应该做自我关注的计算。

[En]

The most complex is the window where areas 4, 5, 7 and 8 are located, area 4 is the original area, and areas 5, 7 and 8 are areas that have been transferred from other places, so these four areas are all different. none of them should do self-attention calculations.

以3号、6号区域所在窗口来举例说明自注意力是如何计算以及掩码是如何设置的。

Swin Transformer原理(新手入门级理解)

图6

3号和6号区域所在的窗口内有49个patch,每个patch都是一个向量,如果现在把这个窗口拉直,就变成了如图6的矩阵,矩阵大小为491,这个矩阵一共有47=28个3号位元素,有3*7=21个6号位元素,每个向量的维度是C。

Swin Transformer原理(新手入门级理解)

图7

图6的矩阵经过转置后得到图7的矩阵,这两个矩阵相乘得到图8的矩阵。

Swin Transformer原理(新手入门级理解)

图8

在图8中,可以根据注意力计算出成对相同的元素,例如33、66,这样的矩阵元素需要保留。两个不同的元素不需要做自我注意计算,比如36、63,这样的矩阵元素需要屏蔽。

[En]

In figure 8, pairwise identical elements can be calculated from attention, such as 33, 66, and such matrix elements need to be retained. Two different elements do not need to do self-attention calculation, such as 36, 63, such matrix elements need to be masked.

Swin Transformer原理(新手入门级理解)

图9

掩码设置如图9所示,需要掩码的部分是-100,需要留下的掩码部分是0,需要添加的数字仍然是原来的数字。此时,需要掩码的部分变为负数,传递Softmax函数后整个掩码矩阵中需要掩码的部分变为0,需要保留的部分仍为原始数。

[En]

The mask is set as shown in figure 9, the mask part that needs to be masked is-100, the mask part that needs to be left behind is 0, and the number that needs to be added is still the original number. At this point, the part that needs to be masked becomes negative, the part of the whole masked matrix that needs to be masked after passing the softmax function becomes 0, and the part that needs to be retained is still the primitive number.

2.4 PatchMerging

想要有多尺寸的特征信息,就要构建一个层级式的Transformer,也就是说我们要像卷积神经网络里一样有一个池化的操作,所以就提出了patch merging。Patch merging 顾名思义,合并小patch成一个大patch,这样就起到了下采样一个特征图效果的了。

Swin Transformer原理(新手入门级理解)

图10

对于图10左上角的简单张量,块合并的操作是将相邻的小块合并成一个大块,从而达到对特征地图进行下采样的效果。

[En]

For a simple tensor in the upper left corner of figure 10, the operation of patch merging is to merge the adjacent small patch into a large patch, so as to achieve the effect of downsampling a feature map.

如果要采样两倍,请选择每隔一个面片。对于图10左上角的张量,每次选择的点1、1、1、1和1不是矩阵中的值,而是为方便起见在此处定义的序列号。序列号只是为了帮助理解,相同序列号的补丁在采样后会合并在一起。张量变成图10右上角的四个张量,所有的数字都在一起,所有的数字都在一起,依此类推。

[En]

If you want to sample twice as much, then select every other patch. For the tensor in the upper left corner of figure 10, the point 1, 1, 1, 1 and 1 selected each time is not a value in the matrix, but a sequence number defined here for convenience. The sequence number is only to help understand, and the patch with the same sequence number will be merged together after sampling. A tensor becomes the four tensors in the upper right corner of figure 10, all the numbers are together, all the numbers are together, and so on.

如果原始张量的维度为hwc,则经过采样后,每个张量的维度大小变为(HMab 2)(Wmax 2),并且每个张量的大小加倍。如果四个张量在C维上拼接,得到的张量的大小变成(HAP2)(WRAP2)4C,这相当于使用空间维度改变更多的通道。就像卷积神经网络中的池化运算一样,为了与卷积神经网络一致,我们只想将通道数增加一倍,而不是四倍,所以我们又做了一次卷积运算,在C的维度上使用1对1的卷积,将通道数减少到2C。经过这一系列运算,原来的大张量变成了(Hbank 2)(Whand2)2C的张量。上面的整个过程就是补丁合并。

[En]

If the dimension of the original tensor is hw*c, after sampling, the dimension size of each tensor becomes (HMab 2) * (Wmax 2), and the size of each tensor is doubled. If the four tensors are spliced on the C dimension, the size of the resulting tensor becomes (Hap2) * (WRAP2) * 4C, which is equivalent to using the spatial dimension to change more channels. Just like the pooling operation in the convolution neural network, in order to be consistent with the convolution neural network, we only want to double the number of channels instead of four times, so we do another convolution operation, using a convolution of 1 to 1 on the dimension of C, reducing the number of channels to 2C. After this series of operations, the original large tensor becomes a tensor of (Hbank 2) * (Whand 2) * 2C. The whole process above is patch merging.

总结

小编觉得,要有耐心在这里看一看,并不容易。如果换成编辑本人,我只想说其中一半很烦人。真是一件了不起的事!所以你比编辑强多了。

[En]

The editor feels that it is not easy for you to have the patience to see here. If it were changed to the editor himself, I would only want to say that half of it is annoying. What a thing! So you’re much better than the editor.

无论是图像分类,还是图像分割,亦或是视频,Swin Transformer已经出现在视觉领域的各项任务中,并且已经成为了屠榜的存在,我的毕业设计题目是Transformer在计算机视觉中应用的研究,除了理解Swin Transformer原理以外,我还实现了以下几点,并也写在CSDN中。

Swin Transformer源码基于win10实现分类模型的预训练(ImageNet-1k数据集)

Swin Transformer使用预训练模型训练自己数据集实现特定类别分类

Swin Transformer实现图像实例分割并训练自己的数据集

如果大家能够赏个脸,也可以去看下我写的关于以上Swin Transformer的博客

最后,谢谢你给我的点赞,比心!

[En]

Finally, thank you for giving me a like, than the heart!

Original: https://blog.csdn.net/wobushizhainanyu/article/details/125235288
Author: 时芷_
Title: Swin Transformer原理(新手入门级理解)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/6288/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

发表回复

登录后才能评论
免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部