发布时间:2023-04-29 19:30
Transformer越来越火,个人感觉基于Transformer来做视觉真是把矩阵用得出神入化!!
Swin-Transformer相较于VIT改进的方法:
接下来分别对Patch Merging、W-MSA、SW-MSA以及使用到的相对位置偏执(relative position bias)进行详解,而SwinT block中使用的MLP结构和VIT中结构是一样的
Patch Merging跟Yolov5中focus结构差不多,隔一个像素点为一个patch,这样宽高/2,C * 4,然后通过一个Layer Norm层,最后通过一个FC层在Feature Map的深度方向做线性变化(H/2,W/2,C*4)-> (H/2,W/2,C * 2) 。
引入Windows Multi-head Self-Attention模块是为了减少计算量,实现思路:就是将一张图片分成多个window,window很多分patch(像素),每个patch只在该部分的window中做Multi-head Self-Attention。注意: W-MSA中每个window并没有信息的交互。
作者根据W-MSA中window之间不能进行信息交互做出了改进,提出了SW-MSA。
如上图所示,左侧为W-MSA在layer L使用,SW-MSA则在L+1层使用,因为从SwinT block中可以看到都是成对使用的,从左右两幅图对比能够发现窗口(Windows)发生了偏移,以这个↘偏移 M/2 个像素,这就解决了不同窗口之间无法进行信息交流的问题!!
window个数有之前4个变成现在的9个了!!!!!!!!!!!!!!!!!
作者采用Efficient batch computation for shifted configuration 这种计算方法,也就是将右图中每个window重新组合成4个window!但是一个问题是不同区域所带的信息不同,如果强制合并在一起的话容易造成信息混乱,作者解决的方式是新区域的像素不是原区域的像素的话,在计算QK后都减去100,这样在softmax后,这部分的像素与其他像素的联系则是0了,**注意:**计算完后还要把数据给挪回到原来的位置。
win.sz 7 * 7表示使用的window大小
dim表示feature map的通道深度(或者可以说是token的向量长度)
head表示多头注意力模块中head个数