标签:swin-transformer
作者:炼己者
本博客所有内容以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,并且是非商业用途,谢谢!
这是跑通的分类以及分割源码介绍,大家有需要可以参考一下:
1、Swin-Transformer分类源码(已跑通)
2、Swin-Transformer分割源码(已跑通)
3、Swin-Unet(分割改编)
一. 概要
- 关于swin transformer的原理有很多文章已经讲得非常清楚了,而且很详细,自问自己的功底是不如这些大佬的,只能尽一份绵薄之力,让大家更方便的跑通代码。那么在这篇博客我想要分享的是我自己在理解swin transformer过程中产生的疑惑以及解决之后的想法。首先是假设大家已经读了论文,以及一些博客了。然后咱们来看看在这里会不会有一些共鸣。
- 不知道大家看的时候有没有产生这样的疑问。1、关于swin transformer的降采样过程。2、复杂度的降低问题。3、SW-MSA是怎么操作的。
二. 正文
1、关于swin transformer的降采样过程
我们假设图片的大小是224×224的,窗口大小是固定的,7×7。这里每个方框都是一个窗口,每个窗口是固定有7×7个patch,但是patch的大小是不固定的,它会随着patch merging的操作而发生变化。比如我们看这儿,patch大小是4×4的,那怎么变成8×8呢?我们把周边4个窗口的patch拼在一起,相当于patch扩大了2×2倍,从而得到8×8大小的patch。
我们发现经过这一系列的操作之后,patch的数目在变少,最后整张图只有一个窗口,7个patch。所以我们可以认为降采样是指让patch的数量减少,但是patch的大小在变大。
这便是对ViT的一个改进,ViT从头至尾都是对全局做self-attention,而swin-transformer是一个窗口在放大的过程,然后self-attention的计算是以窗口为单位去计算的,这样相当于引入了局部聚合的信息,和CNN的卷积过程很相似,就像是CNN的步长和卷积核大小一样,这样就做到了窗口的不重合,区别在于CNN在每个窗口做的是卷积的计算,每个窗口最后得到一个值,这个值代表着这个窗口的特征。而swin transformer在每个窗口做的是self-attention的计算,得到的是一个更新过的窗口,然后通过patch merging的操作,把窗口做了个合并,再继续对这个合并后的窗口做self-attention的计算。
其实这边困扰了我一小下,因为我们印象中降采样都是像CNN一样,会变小,但是swin transformer没有给我们变小的感觉。其实这就是感受野没理解到位的问题,CNN到最后,设计适当,最后一个特征图的感受野是可以放大到整张图的,swin transformer最后一个stage也是一个窗口涵盖了整张图。
2、关于复杂度降低问题
Swin-transformer是怎么把复杂度降低的呢? Swin Transformer Block这个模块和普通的transformer的区别就在于W-MSA,而它就是降低复杂度计算的大功臣。
关于复杂度的计算,我简单的给大家介绍一下,首先是transformer本身基于全局的复杂度计算,这一块儿讲起来有点复杂,感兴趣的同学我们可以会后一起探讨推导过程。在这里,我们假设已知MSA的复杂度是图像大小的平方,根据MSA的复杂度,我们可以得出A的复杂度是(3×3)²,最后复杂度是81。Swin transformer是在每个local windows(红色部分)计算self-attention,根据MSA的复杂度我们可以得出每个红色窗口的复杂度是1×1的平方,也就是1的四次方。然后9个窗口,这些窗口的复杂度加和,最后B的复杂度为9。
3、关于SW-MSA的操作问题
W-MSA虽然降低了计算复杂度,但是不重合的window之间缺乏信息交流,所以想要窗口之间的信息有所交流,那么就可以把左图演化成右图这样,但是这就产生了一个问题,如此操作,会产生更多的windows,并且其中一部分window小于普通的window,比如4个window -> 9个window,windows数量增加了一倍多。这计算量又上来了。因此我们有两个目的,Windows数量不能多,window之间信息得有交流。
我们看到,原来的图被划分了9个窗口,中间的区域A就是信息交流的证明。我们先把左上部分(蓝色以外的窗口)移动到右下,然后再用切分四块的方法去切这个图片,这时候区域A就被隔出来了,达到了我们想要的效果。
三、小结
transformer的出现并不是为了替代CNN。因为transformer有着CNN没有的功能性,它不仅可以提取特征,还可以做很多CNN做不到的事情,比如多模态融合。而swin transformer就是一个趋势,将CNN与transformer各自的优势有效的结合了起来。这是暂时对它的一些细节补充。最近听说MLP出来了,还没有细看,时代进展未免也太快了,手里针对ViT改进的文章还没投出去,就已经开始要立不住脚了。
希望可以帮助到大家,如果你觉得这篇文章对你有一定的帮助,那就点个赞支持一下吧!如果有什么问题的话也可以在文章下面评论,我们一起交流解决问题!
以下是我所有文章的目录,大家如果感兴趣,也可以前往查看
戳右边:打开它,也许会看到很多对你有帮助的文章