跳过正文
  1. 日常记录、技术札记与转载收藏。/

Swin Transformer

目录

论文提出
#

核心
#

Patch 分割和线性嵌入 \(Patch Partition + Linear Embedding\)

  • 输入图像首先被切割为 $4\times4$(或其他)的小块(patches),然后通过一个线性层映射为一个维度为 C 的特征向量。

  • 例如论文中所述,“每个 patch 是 4×4×3=48维,然后投影为维度 C”。 CVF开放获取

分层特征 \(Hierarchical Feature Maps\)

  • 与 ViT 只产生一个固定尺度的特征图不同,Swin 在不同阶段(stage)产生不同分辨率的特征图,类似 CNN 中的特征金字塔。

  • 在每个合并 \(Patch Merging\) 层,将邻近 2×2 的 tokens 进行合并,从而空间维度减半、通道维度增加。

  • 这种机制使得网络在浅层获取高分辨率细节,在深层获取大感受野特征,适合检测、分割任务。

窗口内自注意力 + 窗口位移 \(Window‑MSA \& Shifted Window‑MSA\)

  • 在某一层中,Swin 将特征图划分为不重叠的 M×M 窗口,在每个窗口内部执行多头自注意力 \(W‑MSA\),从而复杂度从全局 O\(N2\)O\(N^2\)O\(N2\) 降至 O\(NM2\)O\(NM^2\)O\(NM2\),当 M 固定时近似线性于 N(patch 数量)。

  • 然而,纯局部窗口会限制跨窗口的信息交互。于是 SWin 交替使用“普通窗口分区”与“窗口位移分区 \(shifted windows\)”的块:在第二个块中,窗口整体向右下(比如 ⌊M/2⌋\lfloor M/2 \rfloor⌊M/2⌋)位移,从而新的窗口跨越了前一个块中的窗口边界,促进跨窗口依赖。

  • 例如论文中提到:通过位移窗口,Swin‐T 在 ImageNet 上比未位移版本提升 ~1.1% top‑1 精度;在 COCO 检测上提升 +2.8 box AP。

相对位置偏差 \(Relative Position Bias\)

  • 在 self‑attention 中引入相对位置偏差 \(relative position bias\) 来反映 patch 间的空间关系,更适合视觉任务。论文中指出加入该机制效果明显

模型架构
#

Image

流程
#

输入图像 → Patch Partition → Linear Embedding →

\[Stage 1 → Stage 2 → Stage 3 → Stage 4\]

→ Patch Merging \(在各 stage 之间\) → 最终输出(分类或分割 head)

聚集代码
#

Patch partition
#

Image

就是一个打成4*4patch

输入:x[B, 3, 224, 224]

patch_size = 4

输出:[B, 96, 56, 56](因为 224 / 4 = 56)

同时也做了Linear Embedding的操作。

Linear Embedding
#

Image

[B, 56*56, 96] = [B, 3136, 96]

🔹 这一步就完成了 Patch Partition: 相当于把图片划分成 56×56 = 3136 个小 patch,每个 patch 有 96 维嵌入特征。 (也就是 “把 2D 图像 → 1D patch token 序列”)

Image

Swin Transformer block
#

通过窗口的形式去做注意力

Swin 把整张特征图划分成 不重叠窗口(7×7),在每个窗口内单独做自注意力, 因此复杂度变成 O(M^2 × N),其中:

  • M = 每个窗口 token 数(7×7 = 49)

  • N = 窗口数量(比如 56×56/49 ≈ 64)

计算量从平方级降到线性级。

**1–》**原先我们不是把图打成44吗?相当于是224224的图像划分为很多个4*4的小图像,然后行列都是56个小图像。这个时候,相当于是行,列都有56个token。最终这个图像有56×56 = 3136 个 token

1如果是 SW-MSA,则 shift
#

这个就是做不同窗口之间做计算,加强不同patch之间的特征交互。也就是框架图里面这个。

Image

先做一次窗口没有移动的注意力,然后做一个窗口移动了的注意力,这样就是为什么在模型架构里面都需要*2都是偶数

Image
  • x 的 shape 一般是 [B, H, W, C]

  • shift_size = window_size // 2 = 7 // 2 = 3

  • torch.roll 会对张量进行循环平移(cyclic shift)

也就是说:

整个特征图沿着高度方向(dim=1)和平行方向(dim=2)各平移 3 个像素,超出部分循环到另一侧。

Image

2窗口划分
#

这个设计的为77的窗口大小。其实不一定为77因为这个操作本质上是为了减少计算量,那么到底是怎么减少的呢?刚刚我们讲到一个图片都被划分为44小的图像,所以说不管图像多大,一次计算都是一个窗口内77个(4*4)的特征token。

Image

3计算注意力
#

Image

这个时候就是在每个窗口中独立的做注意力计算。但是特别要注意的

Shifted Window Attention(SW-MSA)特殊情况

  • 在偶数层做 SW-MSA,会先 对整个特征图做 cyclic shift

  • 再划分窗口 → 窗口内部注意力 → 合并窗口

  • 最后再 逆向 shift,保证信息能跨窗口传递

这个时候还需要mask操作,如图:

Image

4拼回原图
#

Image

这个代码就是将刚刚对每个窗口计算注意力后进行拼接会原来的特征图大小

5反向平移
#

在 Swin Transformer 的 SW-MSA(Shifted Window Multi-Head Self-Attention) 中,所谓的 反向平移(reverse shift / reverse cyclic shift),指的是把先前为了让窗口跨界互相通信而做的 cyclic shift 给恢复回原来的位置。

6残差连接&&MLP
#

Image

做完这些就和普通的vit没有区别的。

Patch Merging
#

Image
Image

相当于是将4个token变为一个token,因为是H W上各个取一个,所以就是H W减半然后C变成4了,所以这样时候就要一个线性成将通道减半变为2*c

所以这个操作也可以是看成不同的patch中做token之间的特征交互。所以通过滑动窗口和Patch Merging 形成了局部与全局的信息交互。这样大大节约的计算量!!!!

Image

效果
#

Image
Image

怎么做Loss
#

Image

基本都是这个哈哈哈哈哈!!!

相关文章