为了产生分层表示,随着网络变得更深,通过补丁合并层来减少令牌的数量。第一个补丁合并层连接每组 2 × 2 相邻补丁的特征,并在 4C 维连接特征上应用线性层。这将令牌数量减少了 2×2 = 4 的倍数(分辨率的 2 倍下采样),并且输出维度设置为 2C。之后应用 Swin Transformer 块进行特征转换,分辨率保持在 H 8 × W 8 \frac{H}{8}\times \frac{W}{8} 8H×8W 。补丁合并和特征转换的第一个块表示为“第 2 阶段”。该过程重复两次,分别为“第 3 阶段”和“第 4 阶段”,输出分辨率分别为 H 16 × W 16 \frac{H}{16}\times \frac{W}{16} 16H×16W 和 H 32 × W 32 \frac{H}{32}\times \frac{W}{32} 32H×32W。这些阶段共同产生一个分层表示,具有与典型卷积网络相同的特征图分辨率,例如 VGG [51] 和 ResNet [29]。因此,所提出的架构可以方便地替换现有方法中用于各种视觉任务的骨干网络。
Swin Transformer 模块 Swin Transformer 是通过将 Transformer 模块中的标准多头自注意力 (MSA) 模块替换为基于移动窗口的模块(在第 3.2 节中描述)而构建的,其他层保持不变。 如图 3(b) 所示,Swin Transformer 模块由一个基于移动窗口的 MSA 模块组成,后跟一个 2 层 MLP,其间具有 GELU 非线性。 在每个 MSA 模块和每个 MLP 之前应用一个 LayerNorm (LN) 层,在每个模块之后应用一个残差连接。
标准的 Transformer 架构 [61] 及其对图像分类的适应 [19] 都进行全局自注意力,其中计算了令牌与所有其他令牌之间的关系。 全局计算会导致与标记数量相关的二次复杂性,使其不适用于许多需要大量标记进行密集预测或表示高分辨率图像的视觉问题。
非重叠窗口中的自注意力 为了有效建模,我们建议在局部窗口内计算自注意力。 窗口被布置为以不重叠的方式均匀地划分图像。 假设每个窗口包含 M × M 个补丁,全局 MSA 模块和基于 h × w 补丁图像的窗口的计算复杂度为:
Ω ( M S A ) = 4 h w C 2 + 2 ( h w ) 2 C Ω ( W − M S A ) = 4 h w C 2 + 2 M 2 h w C \begin{aligned} &\Omega(\mathrm{MSA})=4 h w C^{2}+2(h w)^{2} C \\ &\Omega(\mathrm{W}-\mathrm{MSA})=4 h w C^{2}+2 M^{2} h w C \end{aligned} Ω(MSA)=4hwC2+2(hw)2CΩ(W−MSA)=4hwC2+2M2hwC
其中前者与补丁号 hw 的二次方,当 M 固定时后者是线性的(默认设置为 7)。 全局自注意力计算对于大型hw来说通常是负担不起的,而基于窗口的自注意力是可扩展的。
连续块中的移位窗口分区 基于窗口的自注意力模块缺乏跨窗口的连接,这限制了其建模能力。 为了在保持非重叠窗口的高效计算的同时引入跨窗口连接,我们提出了一种移位窗口分区方法,该方法在连续的 Swin Transformer 块中的两个分区配置之间交替。
如图 2 所示,第一个模块使用从左上角像素开始的常规窗口划分策略,将 8 × 8 特征图均匀划分为大小为 4 × 4 (M = 4) 的 2 × 2 窗口。 然后,下一个模块采用从前一层的窗口配置偏移的窗口配置,通过将窗口从规则分区的窗口中移动 ( ⌊ M 2 ⌋ , ⌊ M 2 ⌋ ) \left ( \left \lfloor \frac{M}{2} \right \rfloor, \left \lfloor \frac{M}{2} \right \rfloor \right ) (⌊2M⌋,⌊2M⌋)个像素。 使用移位窗口分区方法,连续的 Swin Transformer 块计算为
z ^ l = W − M S A ( L N ( z l − 1 ) ) + z l − 1 z l = MLP ( L N ( z ^ l ) ) + z ^ l z ^ l + 1 = S W − M S A ( L N ( z l ) ) + z l z l + 1 = M L P ( L N ( z ^ l + 1 ) ) + z ^ l + 1 \begin{aligned} &\hat{\mathbf{z}}{l}=\mathrm{W}-\mathrm{MSA}\left(\mathrm{LN}\left(\mathbf{z}{l-1}\right)\right)+\mathbf{z}^{l-1} \\ &\mathbf{z}{l}=\operatorname{MLP}\left(\mathrm{LN}\left(\hat{\mathbf{z}}{l}\right)\right)+\hat{\mathbf{z}}^{l} \\ &\hat{\mathbf{z}}{l+1}=\mathrm{SW}-\mathrm{MSA}\left(\mathrm{LN}\left(\mathbf{z}{l}\right)\right)+\mathbf{z}^{l} \\ &\mathbf{z}{l+1}=\mathrm{MLP}\left(\mathrm{LN}\left(\hat{\mathbf{z}}{l+1}\right)\right)+\hat{\mathbf{z}}^{l+1} \end{aligned} zl=W−MSA(LN(zl−1))+zl−1zl=MLP(LN(zl))+zlzl+1=SW−MSA(LN(zl))+zlzl+1=MLP(LN(zl+1))+zl+1
其中 z ^ l \hat{\mathbf{z}}^{l} z^l和 z l \mathbf{z}^{l} zl 分别表示块 l l l 的 (S)WMSA 模块和 MLP 模块的输出特征; W-MSA 和 SW-MSA 分别表示使用常规和移位窗口分区配置的基于窗口的多头自注意力。
移位窗口分区方法在前一层中引入了相邻非重叠窗口之间的连接,并被发现在图像分类、对象检测和语义分割中是有效的,如表 4 所示。
移位配置的高效批量计算 移位窗口分区的一个问题是它会导致更多窗口,在移位配置中从 ⌈ h M ⌉ × ⌈ w M ⌉ \left \lceil \frac{h}{M} \right \rceil \times \left \lceil \frac{w}{M} \right \rceil ⌈Mh⌉×⌈Mw⌉ 到 ( ⌈ h M ⌉ + 1 ) × ( ⌈ w M ⌉ + 1 ) \left ( \left \lceil \frac{h}{M} \right \rceil +1 \right ) \times \left ( \left \lceil \frac{w}{M} \right \rceil+1 \right ) (⌈Mh⌉+1)×(⌈Mw⌉+1),并且一些窗口将小于 M × M。一个简单的解决方案是将较小的窗口填充到 M × M 的大小,并在计算注意力时屏蔽填充的值。当常规分区中的窗口数量很少时,例如 2 × 2,这个简单的解决方案增加的计算量是相当可观的(2 × 2 !3 × 3,是 2.25 倍)。在这里,我们提出了一种更有效的批量计算方法,通过向左上方向循环移位,如图 4 所示。 在这种移位之后,一个批量窗口可能由几个在特征图中不相邻的子窗口组成,因此采用屏蔽机制将自注意力计算限制在每个子窗口内。使用循环移位,批处理窗口的数量与常规窗口分区的数量相同,因此也是有效的。这种方法的低延迟如表 5 所示。
相对位置偏差 在计算自注意力时,我们遵循 [48, 1, 31, 32] 通过在计算相似度时将相对位置偏差 B ∈ R M 2 × M 2 B\in \mathbb{R}{M{2}\times M^{2}} B∈RM2×M2添加到每个头部:
Attention ( Q , K , V ) = S o f t Max ( Q K T / d + B ) V \operatorname{Attention}(Q, K, V)=\operatorname{Soft\operatorname{Max}}\left(Q K^{T} / \sqrt{d}+B\right) V Attention(Q,K,V)=SoftMax(QKT/d +B)V
其中 Q , K , V ∈ R M 2 × d Q, K, V \in \mathbb{R}{M{2} \times d} Q,K,V∈RM2×d是查询、键和值矩阵; d 是查询/键维度,M2 是窗口中的补丁数。 由于沿每个轴的相对位置位于 [−M + 1; M − 1],我们参数化一个更小的偏置矩阵 B ^ ∈ R ( 2 M − 1 ) × ( 2 M − 1 ) \hat{B} \in \mathbb{R}^{(2 M-1) \times(2 M-1)} B^∈R(2M−1)×(2M−1),B 中的值取自 B ^ \hat{B} B^
我们观察到与没有这个偏置项或使用绝对位置嵌入的对应项相比有显着的改进,如表 4 所示。在 [19] 中进一步向输入添加绝对位置嵌入会略微降低性能,因此在我们的实现中没有采用。
预训练中学习到的相对位置偏差也可用于初始化模型,通过双三次插值 [19, 60] 使用不同的窗口大小进行微调。
我们建立我们的基础模型,称为 Swin-B,具有 模型大小和计算复杂度类似于 ViTB/DeiT-B。 我们还介绍了 Swin-T、Swin-S 和 Swin-L,它们分别是模型大小和计算复杂度约为 0.25x、0.5x 和 2x 的版本。 请注意,Swin-T 和 Swin-S 的复杂度分别与 ResNet-50 (DeiT-S) 和 ResNet-101 的复杂度相似。 默认情况下,窗口大小设置为 M = 7。 对于所有实验,每个头部的查询维度为 d = 32,每个 MLP 的扩展层为 α = 4。 这些模型变体的架构超参数是:
-
Swin-T: C = 96 C=96 C=96, layer numbers = { 2 , 2 , 6 , 2 } =\{2,2,6,2\} ={2,2,6,2}
-
Swin-S: C = 96 C=96 C=96, layer numbers = { 2 , 2 , 18 , 2 } =\{2,2,18,2\} ={2,2,18,2}
-
Swin-B: C = 128 C=128 C=128, layer numbers = { 2 , 2 , 18 , 2 } =\{2,2,18,2\} ={2,2,18,2}
-
Swin-L: C = 192 C=192 C=192, layer numbers = { 2 , 2 , 18 , 2 } =\{2,2,18,2\} ={2,2,18,2}
其中 C 是第一阶段隐藏层的通道数。 表 1 列出了 ImageNet 图像分类模型变体的模型大小、理论计算复杂度 (FLOPs) 和吞吐量。
===============================================================
我们对 ImageNet-1K 图像分类 [18]、COCO 对象检测 [42] 和 ADE20K 语义分割 [80] 进行了实验。 在下文中,我们首先将所提出的 Swin Transformer 架构与之前在三个任务上的最新技术进行比较。 然后,我们在 Swin Transformer 的重要设计元素做了消融实验。
设置 对于图像分类,我们在 ImageNet-1K [18] 上对提议的 Swin Transformer 进行了基准测试,其中包含来自 1,000 个类别的 1.28M 训练图像和 50K 验证图像。 报告了单个作物的 top-1 准确度。 我们考虑两种训练设置:
-
常规 ImageNet-1K 训练。 此设置主要遵循 [60]。 我们使用一个 AdamW [36] 优化器,使用余弦衰减学习率调度器和 20 个 epochs 的线性热身进行 300 个 epochs。 使用 1024 的批大小、0.001 的初始学习率和 0.05 的权重衰减。 我们在训练中包含了 [60] 的大部分增强和正则化策略,除了重复增强 [30] 和 EMA [44],它们不会提高性能。 请注意,这与[60]相反,其中重复增强对于稳定 ViT 的训练至关重要。
-
在 ImageNet-22K 上进行预训练并在 ImageNet-1K 上进行微调。 我们还在更大的 ImageNet-22K 数据集上进行了预训练,该数据集包含 1420 万张图像和 22K 类。 我们使用带有 5 个时期线性热身的线性衰减学习率调度器对 60 个时期使用 AdamW 优化器。 批量大小为 4096,初始学习率为 0.001,权重衰减为 0.01。 在 ImageNet-1K 微调中,我们以 1024 的批大小、10-5 的恒定学习率和 1 0 − 8 10^{-8} 10−8 的权重衰减训练模型 30 个时期。
常规 ImageNet-1K 训练的结果 表 1(a) 展示了使用常规 ImageNet-1K 训练与其他主干的比较,包括基于 Transformer 和基于 ConvNet 的主干。
与之前最先进的基于 Transformer 的架构(即 DeiT [60])相比,Swin Transformers 明显优于具有相似复杂性的对应 DeiT 架构:Swin-T (81.3%) 比 DeiT-S (79.8%) + 1.5% ) 使用 2242 输入,Swin-B (83.3%/84.2%) 使用 22 4 2 / 38 4 2 224{2}/384{2} 2242/3842 输入,分别超过 DeiT-B (81.8%/83.1%) +1.5%/1.1%。
与最先进的 ConvNets,即 RegNet [47] 和 EfficientNet [57] 相比,Swin Transformer 实现了稍微更好的速度-精度权衡。 请注意,虽然 RegNet [47] 和 EfficientNet [57] 是通过彻底的架构搜索获得的,但所提出的 Swin Transformer 改编自标准 Transformer,并且具有进一步改进的强大潜力。
ImageNet-22K 预训练的结果 我们还在 ImageNet-22K 上预训练了更大容量的 Swin-B 和 Swin-L。 在 ImageNet-1K 图像分类上微调的结果如表 1(b) 所示。 对于 Swin-B,ImageNet-22K 预训练比从头开始训练 ImageNet-1K 带来了 1.8%∼1.9% 的收益。 与之前 ImageNet-22K 预训练的最佳结果相比,我们的模型在速度和准确度之间取得了明显更好的权衡:Swin-B 获得了 86.0% 的 top-1 准确度,比具有相似推理吞吐量的 ViT 高 2.0% (84.7 对 85.9 张图像/秒)和略低的 FLOP(47.0G 对 55.4G)。 较大的 Swin-L 模型实现了 86.4% 的 top-1 准确率,略好于 Swin-B 模型。
设置 对象检测和实例分割实验在 COCO 2017 上进行,其中包含 118K 训练、5K 验证和 20K 测试开发图像。使用验证集进行消融研究,并在 test-dev 上报告系统级比较。对于消融研究,我们考虑了四种典型的对象检测框架:级联掩码 R-CNN [28, 5]、ATSS [76]、RepPoints v2 [11] 和 mmdetection [9] 中的稀疏 RCNN [55]。对于这四个框架,我们使用相同的设置:多尺度训练 [7, 55](调整输入的大小,使短边在 480 到 800 之间,而长边最多为 1333)、AdamW [43] 优化器(初始学习率为 0.0001,权重衰减为 0.05,批量大小为 16),以及 3x 计划(36 个时期)。对于系统级比较,我们采用改进的 HTC [8](表示为 HTC++)和 instaboost [21]、更强的多尺度训练 [6]、6x 计划(72 epochs)、soft-NMS [4] 和 ImageNet -22K 预训练模型作为初始化。
我们将 Swin Transformer 与标准 ConvNets(即 ResNe(X)t)和之前的 Transformer 网络(例如 迪特。 比较是通过在其他设置不变的情况下仅更改主干来进行的。 请注意,虽然 Swin Transformer 和 ResNe(X)t 由于其分层特征图可直接适用于上述所有框架,但 DeiT 仅生成单一分辨率的特征图,不能直接应用。 为了公平比较,我们按照 [78] 使用反卷积层为 DeiT 构建分层特征图。
与 ResNe(X)t 的比较 表 2(a) 列出了 Swin-T 和 ResNet-50 在四个对象检测框架上的结果。 与 ResNet-50 相比,我们的 Swin-T 架构带来了一致的 +3.4∼4.2 box AP 增益,模型尺寸、FLOPs 和延迟略大 。
表 2(b) 比较了使用 Cascade Mask RCNN 在不同模型容量下的 Swin Transformer 和 ResNe(X)t。 Swin Transformer 实现了 51.9 box AP 和 45.0 mask AP 的高检测精度,与具有相似模型大小、FLOPs 和延迟的 ResNeXt101-64x4d 相比,显着提高了 +3.6 box AP 和 +3.3 mask AP。 在使用改进的 HTC 框架的 52.3 box AP 和 46.0 mask AP 的更高基线上,Swin Transformer 的收益也很高,为 +4.1 box AP 和 +3.1 mask AP(见表 2(c))。 关于推理速度,虽然 ResNe(X)t 是由高度优化的 Cudnn 函数构建的,但我们的架构是通过内置的 PyTorch 函数实现的,这些函数并非都经过优化。 彻底的内核优化超出了本文的范围。
与 DeiT 的比较 使用 Cascade Mask R-CNN 框架的 DeiT-S 的性能如表 2(b) 所示。 Swin-T 的结果比 DeiT-S 高 +2.5 box AP 和 +2.3 mask AP,具有相似的模型大小(86M vs. 80M)和显着更高的推理速度(15.3 FPS vs. 10.4 FPS)。 DeiT 较低的推理速度主要是由于其对输入图像大小的二次复杂度。
与之前最先进技术的比较 表 2© 将我们的最佳结果与之前最先进模型的结果进行了比较。 我们的最佳模型在 COCO test-dev 上实现了 58.7 box AP 和 51.1 mask AP,超过了之前的最佳结果 +2.7 box AP(没有外部数据的复制粘贴 [25])和 +2.6 mask AP(DetectoRS [45])。
设置 ADE20K [80] 是一个广泛使用的语义分割数据集,涵盖了广泛的 150 个语义类别。 它总共有 25K 张图像,其中 20K 用于训练,2K 用于验证,另外 3K 用于测试。 我们利用 mmseg [15] 中的 UperNet [66] 作为其高效的基础框架。 附录中提供了更多详细信息。
结果 表 3 列出了不同方法/主干对的 mIoU、模型大小(#param)、FLOP 和 FPS。 从这些结果可以看出,Swin-S 比 DeiT-S 高 +5.3 mIoU(49.3 vs. 44.0),计算成本相似。它也比 ResNet-101 高 +4.4 mIoU,比 ResNet-101 高 +2.4 mIoU ResNeSt-101 [75]。 我们使用 ImageNet-22K 预训练的 Swin-L 模型在 val 集上实现了 53.5 mIoU,超过了之前最好的模型 +3.2 mIoU(SETR [78] 的 50.3 mIoU,具有更大的模型尺寸)
在本节中,我们使用 ImageNet-1K 图像分类、COCO 对象检测上的 Cascade Mask R-CNN 和 ADE20K 语义分割上的 UperNet 消除了所提出的 Swin Transformer 中的重要设计元素。
移窗 表 4 中报告了对三个任务的移位窗口方法的消融。在 ImageNet-1K 上,具有移位窗口分区的 Swin-T 在每个阶段的性能优于基于单个窗口分区的对应物+1.1% top-1,+ COCO 上为 2.8 box AP/+2.2 mask AP,ADE20K 上为 +2.8 mIoU。 结果表明使用移位窗口在前面层中的窗口之间建立连接的有效性。 移位窗口的延迟开销也很小,如表 5 所示 。
相对位置偏差 表 4 显示了不同位置嵌入方法的比较。 具有相对位置偏差的 Swin-T 在 ImageNet-1K 上产生 +1.2%/+0.8% top-1 准确度,在 COCO 上产生 +1.3/+1.5 box AP 和 +1.1/+1.3 mask AP,在 COCO 上产生 +2.3/+2.9 mIoU ADE20K 分别与那些没有位置编码和绝对位置嵌入的相关,表明相对位置偏差的有效性。 另请注意,虽然包含绝对位置嵌入提高了图像分类精度(+0.4%),但它会损害对象检测和语义分割(COCO 上的框/掩码 AP 为 -0.2,ADE20K 上的为 -0.6 mIoU)。
虽然最近的 ViT/DeiT 模型放弃了图像分类中的平移不变性,尽管它长期以来一直被证明对视觉建模至关重要,但我们发现鼓励某些平移不变性的归纳偏差对于通用视觉建模仍然是可取的,特别是对于 目标检测和语义分割的密集预测任务。
不同的self-attention方法 表 5 中比较了不同自注意力计算方法和实现的实际速度。我们的循环实现比朴素填充的硬件效率更高,特别是对于更深的阶段。 总体而言,它分别为 Swin-T、Swin-S 和 Swin-B 带来了 13%、18% 和 18% 的加速。
基于所提出的自注意力模块 在四个网络阶段,在朴素/内核实现中,移位窗口方法分别比滑动窗口方法效率高 40.8×/2.5×、20.2×/2.5×、9.3×/2.1× 和 7.6×/1.8×。 总体而言,构建在移动窗口上的 Swin Transformer 架构分别比构建在滑动窗口上的 Swin-T、Swin-S 和 Swin-B 变体快 4.1/1.5、4.0/1.5、3.6/1.5 倍。 表 6 比较了它们在三个任务上的准确性,表明它们在视觉建模方面的准确性相似。
与作为最快的 Transformer 架构之一的 Performer [13] 相比(参见 [59]),所提出的基于移位窗口的自注意力计算和整体 Swin Transformer 架构略快(参见表 5),同时实现了 +2.3 % top-1 准确率与使用 Swin-T 在 ImageNet-1K 上的 Performer 相比(见表 6)。
===============================================================
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56iL5bqP5aqb56eD56eD,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-IFQeEsW2-1712880543190)]