2026/1/17 13:00:55
网站建设
项目流程
怎么建设免费网站,手机兼职在哪个网站做,建筑施工特种作业证件查询官网,wordpress 手机顶部菜单完美#xff01;这张图清楚地展示了Swin Transformer的核心创新。我来详细解释架构和为什么必须交替使用W-MSA和SW-MSA。 一、Swin Transformer整体架构
设计理念
Swin Shifted Window Transformer
核心思想#xff1a;在局部窗口内计算注意力#xff0c;而非全局通过窗…完美这张图清楚地展示了Swin Transformer的核心创新。我来详细解释架构和为什么必须交替使用W-MSA和SW-MSA。一、Swin Transformer整体架构设计理念Swin Shifted WindowTransformer核心思想在局部窗口内计算注意力而非全局通过窗口移动实现跨窗口信息交互构建层次化特征金字塔类似CNN完整流程对应你的图输入图像 [H×W×3] ↓ Patch Partition (4×4切分) ↓ [H/4 × W/4 × 48] ← 每个patch flatten成48维 ↓ Linear Embedding ↓ [H/4 × W/4 × C] ← 投影到C维如96 ↓ ┌──────────────────────────────────┐ │ Stage 1: 2× Swin Transformer Block │ │ - Block 1: W-MSA MLP │ │ - Block 2: SW-MSA MLP │ ← 交替使用 └──────────────────────────────────┘ ↓ Patch Merging (空间下采样) ↓ [H/8 × W/8 × 2C] ↓ Stage 2/3/4... (重复上述过程)二、W-MSAWindow Multi-Head Self-Attention传统ViT的问题# ViT的全局注意力 输入: [H×W个patches] 计算复杂度: O((H×W)²) # 每个patch和所有patch计算注意力 # 例如224×224图像patch16×16 patches数量 (224/16)² 196 复杂度 196² 38,416 次计算 # 如果高分辨率图像1024×1024 patches 4096 复杂度 4096² 16,777,216 次计算 无法承受W-MSA的解决方案将特征图划分成不重叠的窗口Window假设特征图 56×56窗口大小 M7 划分结果 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ W00 │ │ │ │ W01 │ │ │ │ │ 7×7│ │ │ │ 7×7│ │ │ │ │ │ │ │ │ │ │ │ │ ├─────┴─────┴─────┴─────┼─────┴─────┴─────┴─────┤ │ Window 0 │ Window 1 │ └────────────────────────┴────────────────────────┘ 总共: (56/7) × (56/7) 8×8 64个窗口 每个窗口: 7×7 49个patches计算复杂度对比# ViT全局注意力 complexity (56×56)² ≈ 10M # W-MSA窗口注意力 num_windows (56/7)² 64 complexity_per_window (7×7)² 2,401 total_complexity 64 × 2,401 ≈ 154K 加速比: 10M / 154K ≈ 65倍W-MSA的代码逻辑def window_partition(x, window_size): x: (B, H, W, C) 返回: (num_windows*B, window_size, window_size, C) B, H, W, C x.shape x x.view(B, H // window_size, window_size, W // window_size, window_size, C) windows x.permute(0, 1, 3, 2, 4, 5).contiguous() windows windows.view(-1, window_size, window_size, C) return windows # 在每个窗口内独立计算注意力 def W_MSA(x): windows window_partition(x, M7) # 切分窗口 attn_windows self_attention(windows) # 窗口内注意力 x window_reverse(attn_windows) # 还原 return x三、为什么W-MSA不够致命缺陷问题窗口之间完全隔离窗口划分示例M4: ┌────┬────┬────┬────┐┌────┬────┬────┬────┐ │ │ │ │ ││ │ │ │ │ ├────┼────┼────┼────┤├────┼────┼────┼────┤ │ │ │ │ ││ │ │ │ │ ├────┼────┼────┼────┤├────┼────┼────┼────┤ │ │ │ │ ⚠️ ││ ⚠️ │ │ │ │ ├────┼────┼────┼────┤├────┼────┼────┼────┤ │ │ │ │ ││ │ │ │ │ └────┴────┴────┴────┘└────┴────┴────┴────┘ Window 0 Window 1 ⚠️ 问题: - 和 永远无法交互 - 窗口边界的信息被人为割裂 - 无法建模跨窗口的长距离依赖具体例子物体检测任务 一只猫横跨两个窗口 ┌────────────┐┌────────────┐ │ 头部 ││ 身体 │ │ Window 0 ││ Window 1 │ └────────────┘└────────────┘ 纯W-MSA的结果: - Window 0只能看到头部特征 - Window 1只能看到身体特征 - 模型无法理解这是同一只猫四、SW-MSAShifted Window的解决方案核心思想移动窗口位置第 l 层 (W-MSA): ┌────┬────┐┌────┬────┐ │ A │ B ││ C │ D │ ├────┼────┤├────┼────┤ │ E │ F ││ G │ H │ └────┴────┘└────┴────┘ 窗口0 窗口1 第 l1 层 (SW-MSA): 向右下移动 M/2 ┌────┬────┐┌────┬────┐ │ ? │ A ││ B │ ? │ ├────┼────┤├────┼────┤ │ ? │ E ││ F │ ? │ └────┴────┘└────┴────┘ 新窗口0 新窗口1 关键变化: - 原来A和C在不同窗口现在在同一窗口 - B、F可以交互了 - 实现了跨原始窗口边界的信息交换详细图解M4的例子W-MSA (第l层)原始窗口划分 (4×4) ┌─────────┬─────────┐ │ 0 1 2 │ 3 4 5 │ │ 6 7 8 │ 9 10 11 │ │12 13 14 │15 16 17 │ ├─────────┼─────────┤ ← 窗口边界 │18 19 20 │21 22 23 │ │24 25 26 │27 28 29 │ │30 31 32 │33 34 35 │ └─────────┴─────────┘ 问题 - patch 14 和 15 无法交互被边界隔开 - patch 8 和 21 无法交互被边界隔开SW-MSA (第l1层)窗口向右下移动2个位置 (M/22) ┌─────────┬─────────┐ │ 7 8 9 │10 11 │ │13 14 15 │16 17 │ │19 20 21 │22 23 │ ├─────────┼─────────┤ │25 26 27 │28 29 │ │31 32 33 │34 35 │ └─────────┴─────────┘ 现在 - ✅ patch 14 和 15 在同一窗口了 - ✅ patch 8 和 21 也可以交互了SW-MSA的实现技巧Cyclic Shift直接移动会产生不规则窗口边界问题Swin使用巧妙的循环移位mask# 第1步Cyclic Shift循环移位 def cyclic_shift(x, shift_size): return torch.roll(x, shifts(-shift_size, -shift_size), dims(1, 2)) # 移位前 ┌──┬──┬──┬──┐ │A │B │C │D │ ├──┼──┼──┼──┤ │E │F │G │H │ ├──┼──┼──┼──┤ │I │J │K │L │ ├──┼──┼──┼──┤ │M │N │O │P │ └──┴──┴──┴──┘ # 向右下移动2格后循环 ┌──┬──┬──┬──┐ │K │L │I │J │ ← I、J循环到右边 ├──┼──┼──┼──┤ │O │P │M │N │ ├──┼──┼──┼──┤ │C │D │A │B │ ← A、B循环到右边 ├──┼──┼──┼──┤ │G │H │E │F │ └──┴──┴──┴──┘第2步使用Attention Mask循环移位后某些patch不应该交互比如原本距离很远# 构造mask防止不相邻区域交互 mask矩阵示例: ┌────┬────┬────┬────┐ │ 0 │ -∞ │ 0 │ -∞ │ ← 0表示可见-∞表示屏蔽 ├────┼────┼────┼────┤ │ -∞ │ 0 │ -∞ │ 0 │ ├────┼────┼────┼────┤ │ 0 │ -∞ │ 0 │ -∞ │ ├────┼────┼────┼────┤ │ -∞ │ 0 │ -∞ │ 0 │ └────┴────┴────┴────┘ # 注意力计算 attn softmax(Q·K^T / √d mask) # mask-∞的位置softmax后0不产生交互完整SW-MSA代码def SW_MSA(x, shift_size): B, H, W, C x.shape # Step 1: Cyclic Shift shifted_x torch.roll(x, shifts(-shift_size, -shift_size), dims(1, 2)) # Step 2: 窗口划分 x_windows window_partition(shifted_x, window_size) # Step 3: 窗口内注意力 (带mask) attn_windows self_attention(x_windows, maskattn_mask) # Step 4: 窗口合并 shifted_x window_reverse(attn_windows, window_size, H, W) # Step 5: Reverse Cyclic Shift移回去 x torch.roll(shifted_x, shifts(shift_size, shift_size), dims(1, 2)) return x五、为什么要交替使用W-MSA和SW-MSA设计原理Swin Block结构你的图中: ┌─────────────────────────────┐ │ Block l (偶数层) │ │ Layer Norm │ │ W-MSA ← 固定窗口 │ │ Residual │ │ Layer Norm │ │ MLP │ │ Residual │ └─────────────────────────────┘ ↓ ┌─────────────────────────────┐ │ Block l1 (奇数层) │ │ Layer Norm │ │ SW-MSA ← 移动窗口 │ │ Residual │ │ Layer Norm │ │ MLP │ │ Residual │ └─────────────────────────────┘交替使用的三大原因1. 建立跨窗口连接2层的信息流动 Layer l (W-MSA): ┌────┬────┐┌────┬────┐ │ A │ B ││ C │ D │ └────┴────┘└────┴────┘ 窗口内交互: A↔B, C↔D Layer l1 (SW-MSA): ┌────┬────┐ │ A │ B │ ← A现在可以和C交互了 │ C │ D │ └────┴────┘ 跨窗口交互: A↔C, B↔D 结果: 2层后所有patch间接相连2. 高效建模长距离依赖信息传播路径 A → B (layer l) ↓ B → D (layer l1) ← 跨窗口 ↓ D → ... (layer l2) 经过多层后: - 每个patch的感受野呈指数增长 - O(log(H/M))层后达到全局感受野 - 远比全局注意力O(n²)高效3. 保持计算效率复杂度对比 纯全局注意力ViT: 每层 O((H×W)²) 4层 4 × O((H×W)²) Swin (W-MSA SW-MSA交替): 每层 O(M² × H/M × W/M) O(M×H×W) ← 线性复杂度 4层 4 × O(M×H×W) 当HW56, M7: ViT: 4 × (56×56)² ≈ 40M Swin: 4 × 7 × 56 × 56 ≈ 88K六、直观类比城市交通网络类比W-MSA 社区内道路┌─────────┐ ┌─────────┐ │ 社区A │ │ 社区B │ │ →→│ │→→│ │ ↓ │ │ ↓ │ │ │ │ │ └─────────┘ └─────────┘ 社区内高效通行但社区间隔离SW-MSA 跨社区快速路┌─────────┐ │ │ ← A和B的居民可以交流了 │ │ └─────────┘ 定期调整道路布局连接不同社区交替使用 完整交通网络局部有社区道路高效定期有快速路连接几次换乘可达任意地点全局感受野七、与ViT的对比总结特性ViTSwin Transformer注意力范围全局局部窗口计算复杂度O(n²)O(n)特征层次单尺度多尺度金字塔跨窗口交互-Shifted Window适用任务分类分类检测分割高分辨率❌ 不可行✅ 可行八、实际效果验证# ImageNet分类性能 Swin-T (28M参数): 81.3% Top-1 ViT-B (86M参数): 81.8% Top-1 → Swin用更少参数达到相近性能 # COCO目标检测 Swin-T: 50.5 mAP ResNet-50: 46.9 mAP → Swin的层次化特征更适合检测 # 推理速度224×224图像 ViT-B: 18ms Swin-T: 12ms → Swin更高效总结为什么必须交替W-MSA单独使用✅ 计算高效❌ 窗口隔离无全局视野SW-MSA的作用打破窗口边界建立跨窗口连接扩大感受野交替使用的智慧平衡局部效率和全局感受野2层就能让所有patch间接相连深层网络后达到全局理解能力核心公式局部效率 (W-MSA) 全局连接 (SW-MSA) 高效的全局建模swin transform中的patch merging操作是不是在通道维度合并还是在空间维度合并看你上传的图片我来帮你详细分析Swin Transformer的Patch Merging操作。答案在空间维度合并同时通道维度扩展这个操作同时影响两个维度但核心是空间下采样Patch Merging的具体过程操作步骤结合你的图片输入特征图H × W × C比如图中的7×7网格每个patch有96通道第1步空间划分2×2分组将相邻的2×2个patches分成一组 ┌─────┬─────┐ │ P00 │ P01 │ → 一组 ├─────┼─────┤ │ P10 │ P11 │ └─────┴─────┘从你的图片看原始7×7 49个patches分组后每4个相邻patches作为一组结果空间分辨率降低到大约 4×4向下取整第2步通道拼接# 伪代码演示 x x.reshape(B, H//2, 2, W//2, 2, C) # 重排形状 x x.permute(0, 1, 3, 2, 4, 5) # 调整维度顺序 x x.reshape(B, H//2, W//2, 4*C) # 拼接4个patch的C通道 → 4C通道 # 具体例子 输入: [7, 7, 96] # H7, W7, C96 ├─ 重排: [3, 2, 3, 2, 96] # 7//23 (向下取整) └─ 拼接: [3, 3, 4×96] [3, 3, 384] # 4C 4×96 384关键理解对应图中的标注4C 4 × 964个patches的通道拼接在一起空间7×7 → 约4×4实际会是 ⌊7/2⌋ × ⌊7/2⌋ 3×3通道96 → 384第3步线性降维可选x Linear(4C, 2C)(x) # 384 → 192 # 最终输出 输入: [7, 7, 96] 输出: [3, 3, 192] # 空间减半通道翻倍通常会接一个线性层把4C降到2C这样空间分辨率降低2倍H/2 × W/2通道数翻倍C → 2C图解对比原始patches (你的图片) ┌───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ 7×7网格 ├───┼───┼───┼───┼───┼───┼───┤ 每个格子1个patch │ ││ │ ││ │ │ 通道数96 ├───┼───┼───┼───┼───┼───┼───┤ │ │││││ │ │ └───┴───┴───┴───┴───┴───┴───┘ ↓ Patch Merging 合并后 ┌─────────┬─────────┬─────────┐ │ │ │ │ 约4×4网格 │ 4个合1 │ 4个合1 │ 4个合1 │ 每个大格4个原始patch ├─────────┼─────────┼─────────┤ 通道数384 (4×96) │ │ │ │ └─────────┴─────────┴─────────┘ ↓ Linear降维 (可选) 最终输出 空间约4×4 通道192 (2×96)为什么这样设计1. 模拟CNN的下采样金字塔Stage 1: 56×56 patches, 96通道 ┐ ↓ Patch Merging │ 类似ResNet的 Stage 2: 28×28 patches, 192通道 │ 多尺度特征 ↓ Patch Merging │ Stage 3: 14×14 patches, 384通道 │ ↓ Patch Merging │ Stage 4: 7×7 patches, 768通道 ┘2. 计算效率考虑空间减半计算量降低到原来的1/4通道翻倍增加模型容量学习更复杂特征平衡深层网络用更少的空间位置但更丰富的通道特征代码实现解析class PatchMerging(nn.Module): def __init__(self, dim): super().__init__() self.dim dim self.reduction nn.Linear(4 * dim, 2 * dim, biasFalse) self.norm nn.LayerNorm(4 * dim) def forward(self, x): x: (B, H, W, C) B, H, W, C x.shape # 确保H和W是偶数padding处理 pad_input (H % 2 1) or (W % 2 1) if pad_input: x F.pad(x, (0, 0, 0, W % 2, 0, H % 2)) # 空间维度合并取2×2网格的4个位置 x0 x[:, 0::2, 0::2, :] # 左上角 [B, H/2, W/2, C] x1 x[:, 1::2, 0::2, :] # 右上角 x2 x[:, 0::2, 1::2, :] # 左下角 x3 x[:, 1::2, 1::2, :] # 右下角 # 通道维度拼接4个patch的通道拼在一起 x torch.cat([x0, x1, x2, x3], dim-1) # [B, H/2, W/2, 4C] x self.norm(x) x self.reduction(x) # [B, H/2, W/2, 2C] return x # 使用示例 input_tensor torch.randn(1, 7, 7, 96) # [B, H, W, C] merge PatchMerging(dim96) output merge(input_tensor) print(output.shape) # torch.Size([1, 4, 4, 192]) # ↑ ↑ ↑ # H/2 W/2 2C与你图片的对应关系你的图片展示的关键点7×7的网格原始patches的空间布局4C 4 × 964 2×2个相邻patches96 原始每个patch的通道数384 合并后的临时通道数猫的图像被分割每个小格子 1个patch embeddingMerging后4个小格子的信息融合到1个大格子总结对比维度操作类型变化目的空间下采样H×W → (H/2)×(W/2)减少计算量类似池化通道拼接降维C → 4C → 2C增加表达能力核心答案主要在空间维度合并2×2的patches变成1个通道维度是副作用4个patch的通道拼接导致4C然后降到2C与ViT的Patch Embedding对比ViT的Patch Embedding: 图像 [224×224×3] → 切分成patches [14×14个, 每个16×16×3] → 线性投影 [14×14, 768维] → 全程保持14×14不做merging Swin的Patch Merging: 特征图 [56×56×96] → 每2×2 patches合并 [28×28×384] → 线性降维 [28×28×192] → 多次merging构建金字塔 [56→28→14→7]Swin的优势多尺度特征层次更适合密集预测任务检测、分割