SwinTransformer原理解读

解决问题及优势

传统的transformer需要将patch划分的细致,图像中像素点太多,需要更多的特征就必须构建更长的序列。因此算注意力机制时效率会更低。

而SwinTransformer通过窗口和分层的形式来替代长序列的方法,先每一层提取四百个token,细粒度提取每个token的特征,再进行两两合并,将一层400个token转化为200个token,依次类推,使得效率提高。传统的Transformer每一层注意力机制都是400个token。分层的思想就是每层的token合并,类似于卷积操作的池化操作。

整体网络架构

其中下方的x2都必须是偶数倍的,因为Block包含组合W-MSA和SW-MSA

简单理解

首先输入3通道图像数据,将数据构建为每个patch(先对原始图像进行卷积,得到特征图,再对特征图进行切分得到patch),随后进行分层的attention block计算,随着层次的下降特征图大小逐步减小。其中patch merge是下采样,从C到4C,特征图进行翻倍。

Swin Transformer Block

分为W-MSA和SW-MSA。将两者串联一起就是一个Block。

W-MSA:基于窗口的注意力计算。

SW-MSA:窗口滑动后重新计算注意力。

W-MSA

Patch Embedding
  1. 输入图像为(224,224,3)
  2. 进行卷积Conv2d(3,96,kernel_size=(4,4),stride=(4,4))
  3. 输出为(3136,96),序列长度是3136=(224/4)*(224/4),每个向量是96维度,每个点的特征都是96维的向量。
 window_partition
  1. 输入特征图:(56,56,96)其中56是224/4得到的,要将这个特征图转换为实际的token(通过窗口去做token)
  2. 默认窗口大小为7,所以总共为8*8个窗口
  3. 输出特征图:(64,7,7,96)其中64是8*8=64总共64个窗口
  4. 之前单位是序列,现在的单位是窗口
W-MSA(Window Multi-head Self Attention)
  • 对于得到的窗口,计算各个窗口自己的自注意力得分。对于64个窗口,第一步对于每个7*7的窗口都要细致的构造,每个窗口包含49个像素点也就是49维向量。
  • qkv三个矩阵放在一起(3,64,3,49,32)其中3个矩阵,64个窗口,3个head进行多头注意力机制,窗口大小为7*7=49,每个head特征96/3=32。对于每个像素点的96维特征,分头算注意力机制。
  • attention权重矩阵:(64,3,49,49)每个头都会得出每个窗口内的自注意力。64个窗口,每个窗口3头(3种注意力机制,3种权重项),每个注意力机制都是49个特征每个值都与其他每个值算关系,所以是49*49。
window_reverse
  • 通过得到的attention权重矩阵计算得到新的特征(64,49,96)总共为64个窗口,每个窗口包含7*7=49个点,每个点包含96维向量,最后的96维向量不光包含自己的信息,还包含和其他信息的关系。
  • window_reverse通过reshape操作还原回(56,56,96)输入特征图的维度大小,因为要对原始输入继续做window_attention,要进行多次的窗口注意力机制。

SW-MSA(shifted Window)

基于滑动窗口,只知道窗口内部的特征,但是不知道窗口之间的特征关系,因此要做shift,通过滑动来改善模型的局限性。

窗口偏移的细节

位移就是像素点挪一下位置,H和W都要做偏移

窗口移动后,原本计算量为4个,现在是9个,会使计算量显著翻倍,如何解决?

首先得到新窗口,并对其做位移操作,往右移动一个单元格

其中”7,1“中空余部分mask掉,还是按照4个窗口进行计算,计算后没有意义的值mask掉,通过乘0,之后都是如此。虽然窗口移动后和会增加窗口原本的划分个数,但是我们可以按照原始的窗口划分方式进行计算,得到的无效值mask掉。

  • 只需要设置好对应位置的Mask,让其值为负无穷即可(softmax)
  • 输出结果同样为(56,56,96)其中做的和W-MSA一样,先前先进行偏移。
  • 计算完特征后需要对图像进行还原,还原平移

下采样PatchMerging

不同于池化,相当于间接(对于H和W进行间隔采样后进行拼接,得到H/2,W/2,C*4)

分层计算

  • 一次下采样后(224/4)*(224/4)= 3136 --> (224/8)*(224/8) = 784 也就是56*56 --> 28*28
  • 然后继续走Block,也就是各个stage的流程
  • 最后根据任务来选择合适的head层(分类,检测,分割)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值