Swin Transformer解读

Swin Transformer详细解读

这里以Swin-T(imagenet-1k)为例。PPL如下图:
Swin-T的PPL,包括四个block
Swin Transformer的解读按PPL的流程主要包括4个部分。
(1)Patch Embedding过程
(2)W-MSA(Window Multi-head self-attention)块的过程
(3)WS-MSA(Window-Shift Multi-head self-attention)块的过程
(4)Patch Merging过程

<1>Patch Embedding过程
首先设定patch的大小为44,所以一张2242243的输入图片被分成5656*3个patch(注意此处,先定patch大小,然后算patch的个数,这个ViT是不同的。)然后将每个patch映射到96-dim的embedding(这个过程等效于一个kernel-size=patch_size, stride = patch_size的卷积操作),即可以得到[56, 56, 96](这里不size考虑batch-size)的特征矩阵。然后直接把特征直接送入第一个Swin-transformer block中(此处和ViT也不同,不需要加position_embedding和cls_token)。
(2)W-MSA块过程
Patch Embedding送入W-MSA块中,对于W-MSA,它不做window_shift操作,采取常规的分窗操作, 论文中的window_size=7,也就是说每个window包含 7 × 7 = 49 7\times7=49 7×7=49个patch。对于[56, 56, 96]的特征来说,相当于有 8 × 8 8\times8 8×8个windows。每个windows与都有一个独立地 K Q V KQV KQV,相当于每个窗口只建模自己窗口内得 7 × 7 7\times7 7×7个patch的注意力向量。在计算了 K Q T KQ^T KQT得到attn向量之后,在给它加上相对位置编码(这个相对位置编码是针对一个window里面的 7 × 7 7\times7 7×7个patch而言的),之后在和 V V V相乘得到最终的自注意力向量, 在经过残差连接和MLP得到W-MSA块的最终输出。最终的输出和输入的维度相同,都为[3136, 96](忽略batch-size)。
相对位置编码

(2)WS-MSA块过程
W-MSA块的输出向量最后被送入block1中的WS-MSA块,这一块主要是保证让WS-MSA过程中划分的64个windows之间能得到交互,要得到交互要么就是重新分窗,怎么分窗这个问题比较复杂,因为窗口改了计算量也会改,所以作者就想出来一个不用重新分窗,而是让特征mapping循环移动,从而让每个窗口内都能包含相邻windows的信息,从而完成windows之间的交互,当然,block_1中的交互主要是和相邻相邻windows之间的交互,感受野还没有扩大到整张图片,在后面的block中,通过Patch Merging过程(窗口不变,可以理解为里面原来的 7 × 7 7\times7 7×7的patch变成了 28 × 28 28\times28 28×28个patch,因为每个patch与相邻四个合并)就可以将感受野慢慢扩大到整张图片,这就是仿CNN的层级过程,windows就类似卷积核,Patch Merging类似Pooling,也是这篇文章的核心,有人说核心是mask,我觉得mask只不过是为了避免不相关的信息对特征造成影响才搞出来的(后面会将)。
这个块主要是有一个shift_window操作。
也就是循环移动

你可能感兴趣的:(深度学习,transformer,深度学习)