Swin Transformer论文总结

Swin Transformer

(2021.3.25)微软

和PVT思想类似,提出了一种包含滑窗操作,具有层级设计的Swin Transformer。

解读:https://zhuanlan.zhihu.com/p/367111046

论文地址:https://arxiv.org/pdf/2103.14030.pdf

开源代码:https://github.com/microsoft/Swin-Transformer

问题

目前Transformer应用到图像领域主要有两大挑战:

  • 视觉实体变化大,在不同场景下视觉Transformer性能未必很好
  • 图像分辨率高,像素点多,Transformer基于全局自注意力的计算导致计算量较大

其中滑窗操作包括不重叠的local window,和重叠的cross-window。将注意力计算限制在一个窗口中,一方面能引入CNN卷积操作的局部性,另一方面能节省计算量

方法

Swin Transformer论文总结_第1张图片

Patch Partition

Patch Partition在源码中对应patch embedding,将图片切成一个个不重叠的图块,并嵌入到Embedding。

具体是对原始图片裁成一个个 patch_size * patch_size的窗口大小,然后进行嵌入。这里通过二维卷积层,将stride,kernelsize设置为patch_size大小。设定输出通道来确定嵌入向量的大小。(同PVT)

Linear Embedding

与Vit的positional embedding中一样,默认采用学习(训练的)的1-D positional embedding,在输入transformer的encoder之前直接将patch embeddings和positional embedding相加。

#Vit分类
# 这里多1是为了后面要说的class token,embed_dim即patch embed_dim
self.pos_embed = nn.Parameter(torch.zeros(1, num_patches, embed_dim)) 

# patch emded + pos_embed
x = x + self.pos_embed

Patch Merging

在每个Stage开始前做降采样,用于缩小分辨率,调整通道数进而形成层次化的设计,同时也能节省一定运算量。

每次降采样是两倍,因此在行方向和列方向上,间隔2选取元素。然后拼接在一起作为一整个张量,最后展开。此时通道维度会变成原先的4倍(因为H,W各缩小2倍),此时再通过一个全连接层再调整通道维度为原来的两倍。

Swin Transformer论文总结_第2张图片

Swin transformer block

传统的Transformer都是基于全局来计算注意力的,因此计算复杂度十分高。Swin Transformer将注意力的计算限制在每个窗口内,进而减少了计算量。计算公式如下

A t t e n t i o n ( Q , K , V ) = S o f t m a x ( Q K T d + B ) V Attention(Q,K,V)=Softmax(\frac{QK^T}{\sqrt{d}}+B)V Attention(Q,K,V)=Softmax(d QKT+B)V

主要区别是在原始计算Attention的公式中的Q,K时加入了相对位置编码。后续实验有证明相对位置编码的加入提升了模型性能。

Window Attention是在每个窗口下计算注意力的,为了更好的和其他window进行信息交互,Swin Transformer还引入了shifted window操作。通过对特征图移位,并给Attention设置mask来间接实现的。能在保持原有的window个数下,最后的计算结果等价。
Swin Transformer论文总结_第3张图片

你可能感兴趣的:(transformer,计算机视觉)