尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Swin Transformer:从CNN到视觉Transformer的层级化高效注意力架构详解

Swin Transformer:从CNN到视觉Transformer的层级化高效注意力架构详解 1. 项目概述从卷积到注意力视觉任务的范式转移几年前当我们在处理图像分类、目标检测这些视觉任务时脑海里蹦出的第一个词大概率是“卷积神经网络”CNN。从AlexNet到VGG再到ResNetCNN凭借其强大的局部特征提取能力和平移不变性统治了计算机视觉领域近十年。我们习惯了设计各种精巧的卷积核研究如何堆叠更深的网络以及如何用池化层来降维和扩大感受野。这套方法论是如此根深蒂固以至于我们几乎认为这就是视觉模型的唯一解。然而Transformer架构在自然语言处理领域的巨大成功像一块投入平静湖面的巨石激起了跨领域的涟漪。Vision TransformerViT的横空出世首次证明了将图像切分为一个个图块Patch然后直接送入标准的Transformer编码器进行全局注意力计算完全可以在大规模数据集上取得媲美甚至超越顶尖CNN模型的性能。这无疑是一个震撼性的发现原来视觉任务不一定非要依赖卷积的归纳偏置局部性、平移等变性纯粹基于注意力机制的模型也能“看懂”图像。但ViT并非完美无缺。其核心问题在于计算复杂度。标准Transformer的自注意力机制计算量与序列长度的平方成正比。一张224x224的图像切成16x16的图块后序列长度将达到196。这个长度下的自注意力计算已经相当昂贵更不用说处理更高分辨率的密集预测任务如目标检测、语义分割了序列长度会轻松破千导致内存和计算完全无法承受。此外ViT缺乏CNN那种层次化构建特征图由浅入深由细到粗的天然能力而这对于多尺度理解至关重要。正是在这样的背景下Swin Transformer登场了。它没有全盘否定ViT而是在其基础上巧妙地引入了两个核心思想层级化结构和移位窗口自注意力。简单来说Swin Transformer像CNN一样构建了从小分辨率、大感受野到高分辨率、精细特征的多级特征图同时它通过将自注意力计算限制在局部、非重叠的窗口内并辅以窗口移位操作来实现跨窗口连接从而以线性复杂度实现了全局建模能力。这就像是在保持Transformer“全局视野”优势的同时为它装上了CNN的“层级望远镜”和“高效计算引擎”使其既能处理图像级别的分类又能高效处理像素级别的密集预测真正成为了一个通用的视觉骨干网络。如果你正在从CNN转向视觉Transformer或者困惑于如何将Transformer应用到自己的检测、分割项目中亦或是单纯对下一代视觉模型架构感到好奇那么深入理解Swin Transformer的设计哲学与实现细节将是你深度学习进阶路上不可或缺的一课。2. Swin Transformer核心设计思想拆解要理解Swin Transformer为何强大我们不能只停留在调用API的层面必须深入其设计动机弄明白每一个关键选择背后的“为什么”。这远比记住几个模块的名字重要得多。2.1 层级化特征图继承CNN的精华CNN的成功很大程度上得益于其层级化的特征提取过程。浅层网络捕捉边缘、颜色等低级特征中层网络组合这些低级特征形成纹理、部件深层网络则进一步抽象得到物体、场景等高级语义概念。同时特征图的空间分辨率逐层降低通道数逐层增加这对应着感受野的不断扩大和语义信息的不断浓缩。这种结构非常契合视觉任务的本质——从局部细节到全局语义的理解。原始的ViT是“平坦”的。它从一开始就将图像分割成固定大小的图块然后通过一个Transformer编码器进行处理所有图块在整个网络中始终保持相同的分辨率。虽然通过堆叠多层Transformer块模型也能建立远距离依赖但它缺乏这种显式的、多尺度的特征金字塔结构。这对于需要定位和精细边界的任务如目标检测中的小物体检测、实例分割中的边缘细化来说是一个天然的劣势。Swin Transformer的设计者敏锐地意识到了这一点。他们决定将CNN的层级化思想“嫁接”到Transformer上。Swin Transformer的整体架构类似于ResNet或FPN包含了多个阶段Stage。每个阶段开始时会通过一个“Patch Merging”层来对特征图进行下采样类似于CNN中的池化或步幅卷积从而降低分辨率、增加通道数、扩大感受野。这样模型就能自然地输出多尺度的特征图例如对于输入224x224的图像会得到分辨率为56x56 28x28 14x14 7x7的特征图完美适配需要多尺度特征的下游任务。注意这里的“层级化”是结构上的而非注意力机制上的。它通过合并相邻图块来实现下采样而不是通过注意力权重来隐式地汇聚信息。这种显式的设计使得特征图尺度变化清晰可控。2.2 移位窗口自注意力线性复杂度的全局建模这是Swin Transformer最具创新性的部分也是其名字的由来Swin即Shifted Window。它的目标很明确在保持Transformer强大全局建模能力的同时将计算复杂度从序列长度的平方O(n²)降低到线性O(n)。2.2.1 窗口自注意力局部计算的高效性首先Swin Transformer将特征图均匀地划分为多个不重叠的局部窗口例如每个窗口包含7x7个图块。自注意力计算只在每个窗口内部进行。假设特征图有h x w个图块每个窗口大小为M x M。那么序列长度就从hw降到了MM而窗口的数量是 (h/M) * (w/M)。因此对于所有窗口的计算复杂度是O((h/M)*(w/M) * (M*M)²) O(h*w * M²)由于M是固定的小常数如7复杂度就变成了与图块总数hw成线性关系。这相比全局自注意力的O((hw)²)是巨大的效率提升。这就像把一个大会议室里的全体讨论全局注意力改成了在多个小隔间里同时进行小组讨论窗口注意力。每个小组内部可以充分交流效率很高。2.2.2 窗口移位连接孤岛的桥梁但是只进行窗口内注意力有一个致命问题不同窗口之间的图块完全无法交互信息。这会导致模型感受野被限制在窗口大小内无法建立长距离依赖回到类似局部卷积的老路上。为了解决这个问题Swin Transformer在连续的Transformer块中交替使用两种窗口划分方式。假设第l层使用常规的窗口划分。那么在第l1层它会将窗口向右下角各循环移位⌊M/2⌋, ⌊M/2⌋个像素。这个简单的操作带来了神奇的效果经过移位后原来的一个窗口被拆散其内部的图块现在分散到了多个新的相邻窗口中。这样在第l1层计算窗口注意力时这些来自原窗口不同位置的图块就能与新窗口中的其他图块进行交互。通过这种“移位-计算-再移位回来”的交替模式信息得以在相邻的窗口之间流动。理论上只需要log(N)层N为总图块数信息就能传递到全局任何位置。这就好比小组讨论的成员在每轮会议后重新打乱分组几轮下来所有人都能间接地与所有人交流过。实操心得在代码实现时“移位”操作通常通过torch.roll实现但会引入不连续的边界。为了保持窗口数量规整以便并行计算通常会采用“掩码”机制。即在移位后的特征图上重新划分窗口但计算注意力时通过一个掩码矩阵让不属于原同一窗口的图块之间的注意力权重变为一个极大的负数如-100这样经过softmax后其权重就接近于0从而屏蔽了无效的连接。这是实现中的一个关键技巧。2.3 相对位置偏置注入空间感知在标准的Transformer中位置信息是通过绝对位置编码如正弦函数或可学习参数注入的。但在Swin Transformer的窗口注意力中由于窗口是相对固定的且模型需要处理可变尺寸的输入使用绝对位置编码可能不是最优的。Swin Transformer引入了一个相对位置偏置项B直接加到每个注意力头的计算中。对于窗口内的两个位置它们之间的相对坐标被限制在一个[-M1, M-1]的范围内M为窗口大小。作者为所有可能的相对位置对都设置了一个可学习的偏置参数。因此注意力公式变为Attention(Q, K, V) Softmax(QK^T / √d B) V其中B是一个形状为(M², M²)的矩阵更准确地说由于相对位置对称实际参数是一个(2M-1, 2M-1)的矩阵再根据相对坐标索引到B中。这种相对位置偏置比绝对位置编码更灵活能更好地让模型理解“左边”、“右上角”这种空间关系并且由于其参数化方式对于不同分辨率的输入具有更好的可扩展性。3. 模型架构与模块深度解析理解了核心思想我们再来拆解Swin Transformer的具体架构看看这些思想是如何落地成为一个个可计算的模块的。3.1 整体架构概览一个标准的Swin Transformer如Swin-T的流程可以概括如下图块划分输入图像(H, W, 3)经过一个“Patch Partition”模块被划分为不重叠的4x4大小图块。每个4x4x348维的图块通过一个线性嵌入层Patch Embedding投影到一个C维的向量。此时特征图形状为(H/4, W/4, C)。这相当于用一个大步幅stride4的卷积进行下采样。Stage 1特征图通过若干个如2个Swin Transformer Block。这些Block使用常规窗口划分W-MSA。这个阶段不进行下采样主要用于在初始分辨率上初步融合信息。Patch Merging这是下采样层。它将相邻的2x2局部区域共4个特征向量拼接起来然后通过一个线性层将通道数从4C投影到2C。这样空间尺寸减半H/4 - H/8通道数翻倍C - 2C。这类似于池化但保留了更多信息。Stage 2特征图通过若干个如2个Swin Transformer Block。这些Block采用移位窗口划分SW-MSA和常规窗口划分交替进行。此时特征图分辨率为(H/8, W/8)通道数为2C。重复下采样与Stage再次进行Patch Merging分辨率变为(H/16, W/16)通道数变为4C进入Stage 3如6个Block。再次下采样分辨率变为(H/32, W/32)通道数变为8C进入Stage 4如2个Block。输出最终我们可以得到类似CNN骨干网络输出的多级特征图通常称为C2, C3, C4, C5对应Stage 1-4的输出可以直接送入FPN等 Neck 网络用于下游检测、分割任务。对于分类任务通常会对Stage 4的输出进行全局平均池化再接一个分类头。3.2 Swin Transformer Block 详解这是模型的基本组成单元其结构是Transformer Block的变体。与标准Transformer Block多头自注意力MSA 前馈网络FFN不同Swin Transformer Block 将MSA替换为基于窗口的多头自注意力W-MSA或移位窗口多头自注意力SW-MSA并在每个注意力层和FFN层之前应用了LayerNorm采用了残差连接。具体顺序为输入 - LN1 - (W/SW-MSA) - 残差相加 - LN2 - FFN - 残差相加 - 输出其中FFN是一个两层MLP中间扩展层通常将维度放大4倍如输入维度为C则中间层为4C并使用GELU激活函数。一个关键细节是在Swin Transformer中连续的两个Block组成一个“组”。第一个Block使用W-MSA第二个Block使用SW-MSA。这种配对使用确保了窗口间的信息流通。3.3 Patch Merging 实现这个模块的代码实现非常简洁但有效。假设输入特征图X的形状为(B, H, W, C)。X被重塑并拆分为四个在空间上相邻的子特征图X0 X[:, 0::2, 0::2, :]左上X1 X[:, 1::2, 0::2, :]左下X2 X[:, 0::2, 1::2, :]右上X3 X[:, 1::2, 1::2, :]右下。将这四个(B, H/2, W/2, C)的张量在通道维度上拼接得到(B, H/2, W/2, 4C)。通过一个LayerNorm层。通过一个线性层全连接层将通道数从4C降为2C。输出形状即为(B, H/2, W/2, 2C)。这个过程完美实现了2倍下采样和通道数扩充同时最大限度地保留了局部空间信息。3.4 不同规格的Swin变体为了适应不同的计算预算Swin Transformer提供了TinySwin-T SmallSwin-S BaseSwin-B LargeSwin-L等变体。它们的主要区别在于初始通道数CSwin-T为96 Swin-S/B/L为96/128/192。各Stage的Block数量通常表示为[2, 2, 6, 2]Swin-T/S[2, 2, 18, 2]Swin-B[2, 2, 18, 2]Swin-L但C更大。每个注意力头的维度通常保持为32。窗口大小M默认设置为7。选择哪个版本取决于你的任务和硬件条件。对于研究或快速原型Swin-T是很好的起点对于追求SOTA性能Swin-L是必然选择。4. 从理论到实践代码实现与关键技巧纸上得来终觉浅绝知此事要躬行。理解了原理我们来看看如何用代码实现并分享一些官方代码和实际使用中的关键技巧。4.1 窗口划分与还原的高效实现这是Swin Transformer实现中最精巧的部分之一。直接使用循环来划分窗口效率极低。标准的做法是利用张量的reshape和permute操作。划分窗口def window_partition(x, window_size): 输入: x - (B, H, W, C) 输出: windows - (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().view(-1, window_size, window_size, C) return windows这段代码先将特征图在高度和宽度维度上分别拆分成window_size大小的块然后通过置换维度将窗口数量维度num_windows (H//window_size)*(W//window_size)提到最前面最后展平。这样就得到了一个窗口集合。还原窗口def window_reverse(windows, window_size, H, W): 输入: windows - (num_windows*B, window_size, window_size, C) 输出: x - (B, H, W, C) B int(windows.shape[0] / (H * W / window_size / window_size)) x windows.view(B, H // window_size, W // window_size, window_size, window_size, -1) x x.permute(0, 1, 3, 2, 4, 5).contiguous().view(B, H, W, -1) return x这是划分的逆过程将窗口集合重新拼回完整的特征图。4.2 移位窗口与掩码机制移位窗口的实现通常结合了torch.roll和掩码。以下是简化后的逻辑对输入特征进行循环移位shifted_x torch.roll(x, shifts(-self.shift_size, -self.shift_size), dims(1, 2))。这会将特征图左上角移出的部分补到右下角。在移位后的特征图上划分窗口attn_windows self.window_partition(shifted_x, self.window_size)。计算带掩码的注意力这是关键。由于移位现在一个窗口内可能包含原本不相邻的图块。我们需要阻止这些图块之间进行注意力计算。实现方法是生成一个掩码矩阵mask其形状与注意力权重矩阵QK^T相同。对于窗口中任意两个位置i和j如果它们在原始特征图中不属于同一个常规窗口则将mask[i, j]设为一个很大的负数如-100否则设为0。然后在计算softmax之前将mask加到QK^T上attn attn mask。这样无效连接的权重在softmax后就会趋近于0。计算注意力并还原窗口。将特征图循环移位回去x torch.roll(shifted_x, shifts(self.shift_size, self.shift_size), dims(1, 2))。注意事项掩码的生成需要仔细计算每个位置在移位前后的窗口归属。官方代码中通过计算每个位置的坐标并比较其所属的窗口ID来实现逻辑较为复杂但高效。在实际使用中我们通常直接调用已经封装好的模块但理解其原理对于调试和修改模型至关重要。4.3 相对位置偏置的实现相对位置偏置B是一个可学习的参数。由于窗口大小M固定所有可能的相对位置对(Δx, Δy)是有限的范围在[-(M-1), M-1]之间。因此我们可以初始化一个形状为(2M-1, 2M-1, num_heads)或(2M-1, 2M-1)所有头共享的偏置表relative_position_bias_table。在计算注意力时我们需要根据查询位置和键位置的坐标差从这个表中索引出对应的偏置值。具体步骤生成所有可能的相对坐标索引。通常先创建一个(2M-1, 2M-1)的网格每个点存储(Δx, Δy)。将二维的相对坐标(Δx, Δy)映射到一个一维的索引。常用公式是index (Δx M -1) * (2M-1) (Δy M -1)。这样就得到了一个(M*M, M*M)的索引矩阵relative_position_index它对于给定的窗口大小是固定的可以预先计算并缓存。在前向传播时使用relative_position_index作为索引从relative_position_bias_table中取出对应的偏置并reshape成(1, num_heads, M*M, M*M)的形状加到注意力权重上。这种实现方式非常高效因为偏置表参数少且索引操作是常数时间。4.4 实际训练与微调技巧学习率与优化器Swin Transformer通常使用AdamW优化器。初始学习率设置与batch size强相关常用公式是lr base_lr * batch_size / 256。例如在ImageNet-1K上Swin-T常用base_lr5e-4batch size1024则实际lr5e-4 * 1024/256 2e-3。同时会配合余弦退火Cosine Annealing学习率调度器。权重衰减AdamW中的权重衰减weight decay通常设为0.05这对于防止过拟合很重要。数据增强强数据增强是训练视觉Transformer成功的关键。MixUp, CutMix, RandAugment, Random Erasing等都是标配。这在一定程度上弥补了Transformer相对于CNN缺乏的归纳偏置让模型更依赖于数据本身。微调策略当你在下游任务如检测、分割上微调预训练的Swin Transformer时通常采用分层学习率。即骨干网络backbone使用较小的学习率如lr * 0.1而新添加的头部网络head使用较大的学习率。这有助于在适应新任务的同时不过度破坏预训练好的特征。分辨率调整Swin Transformer支持可变输入分辨率这得益于其相对位置偏置和基于窗口的注意力。在测试或处理不同尺寸输入时可以通过双线性插值来调整相对位置偏置表的大小。但注意预训练时使用的窗口大小如7在测试时最好保持不变否则需要重新生成注意力掩码。5. 应用场景与下游任务适配Swin Transformer作为一个通用的视觉骨干网络其设计初衷就是为了统一各种视觉任务。下面我们看看它在几个核心下游任务上是如何应用的。5.1 目标检测Mask R-CNN Swin Transformer这是最经典的应用组合之一。将Faster R-CNN或Mask R-CNN的CNN骨干如ResNet替换为Swin Transformer即可构成强大的检测器如Swin Transformer Mask R-CNN。具体适配特征提取Swin Transformer的四个Stage输出[C2, C3, C4, C5]多级特征图其空间步长分别为4, 8, 16, 32。这与FPN特征金字塔网络的输入要求完美匹配。FPN集成将Swin输出的多级特征直接送入FPN。FPN会自顶向下和横向连接这些特征生成[P2, P3, P4, P5, P6]等增强后的多尺度特征图用于RPN区域提议网络和RoI Heads。预训练权重直接加载在ImageNet-1K或ImageNet-22K上预训练好的Swin Transformer权重作为骨干网络初始化。性能提升得益于Swin Transformer更强的全局上下文建模能力和层级特征在COCO数据集上Swin-T Mask R-CNN就能轻松超越同参数量级的ResNet-50 Mask R-CNNSwin-L版本更是刷新了多项SOTA记录。5.2 语义分割UPerNet Swin Transformer语义分割需要高分辨率的精细预测。Swin Transformer的层级特征和高效注意力机制为此提供了有力支持。具体适配解码器选择UPerNetUnified Perceptual Parsing Network是一个强大的语义分割框架其解码器能有效融合来自骨干网络不同层级的特征。Swin Transformer的多级输出[C2, C3, C4, C5]可以很好地接入UPerNet的解码器。特征融合UPerNet解码器会将深层的高语义特征C5上采样并与浅层的高分辨率特征C2, C3, C4逐步融合最终输出与输入图像分辨率相同的分割图通常上采样4倍或8倍。注意力优势Swin Transformer的全局注意力机制使得模型在分割时能更好地利用图像整体的上下文信息来理解每个像素的类别这对于区分外观相似但语境不同的物体例如“道路”和“人行道”特别有帮助。5.3 图像分类直接池化与微调对于纯分类任务使用Swin Transformer最为直接。流程输入图像经过Swin Transformer网络前向传播。取最后一个StageStage 4的输出特征图其形状为(B, H/32, W/32, 8C)。对这个特征图进行全局平均池化Global Average Pooling得到一个(B, 8C)的向量。接一个全连接分类头Linear Layer将维度从8C映射到类别数K。使用交叉熵损失进行训练或微调。实操心得在ImageNet等大型数据集上从头训练Swin Transformer成本很高。对于大多数应用强烈建议使用在ImageNet-1K/22K上预训练好的官方权重进行微调。即使是微调使用更强的数据增强如RandAugment和适当的正则化如Label Smoothing也能带来显著的性能提升。5.4 其他视觉任务与多模态融合Swin Transformer的通用性使其可以轻松扩展到更多领域视频理解将Swin Transformer扩展到3D即为Swin Transformer 3D通过引入时间维度的窗口注意力可以高效处理视频片段在动作识别等任务上表现优异。多模态学习Swin Transformer可以作为视觉编码器与文本编码器如BERT结合用于图文检索如CLIP模型、视觉问答VQA、图像描述生成等任务。其层次化特征便于在不同语义层次上进行跨模态对齐。底层视觉如图像超分辨率、去噪、修复等。虽然这些任务通常需要更精细的像素级操作但Swin Transformer强大的长距离依赖建模能力有助于恢复图像的整体结构和连贯纹理。6. 常见问题、调参经验与避坑指南在实际使用Swin Transformer的过程中你一定会遇到各种各样的问题。这里我总结了一些常见的坑和解决思路很多都是官方论文和代码里不会明说的经验之谈。6.1 内存溢出OOM问题这是训练Swin Transformer尤其是较大版本Swin-B, Swin-L或处理高分辨率图像时最常见的问题。根本原因尽管窗口注意力降低了复杂度但Transformer模型本身参数量大激活值尤其是注意力矩阵仍然非常消耗内存。当图像分辨率很高时即使窗口内计算窗口数量也会变多导致内存激增。解决策略减小批次大小Batch Size这是最直接有效的方法。但可能会影响BN层的统计和优化稳定性此时可以尝试使用梯度累积Gradient Accumulation来模拟大batch size的效果。降低输入分辨率在可接受的性能损失下尝试用更低的分辨率进行训练和推理。Swin Transformer对分辨率有一定鲁棒性。使用混合精度训练AMPPyTorch的Automatic Mixed Precision可以显著减少GPU显存占用并加速训练。这是现代深度学习训练的标配。检查点技术Gradient Checkpointing这是一种用计算时间换内存空间的技术。它只保存部分层的激活值在反向传播时重新计算其他层的激活。PyTorch中可以通过torch.utils.checkpoint实现。这对深层Transformer模型非常有效。使用更小的模型变体如果Swin-B内存吃紧果断换用Swin-T或Swin-S。6.2 训练不稳定或收敛慢学习率设置不当这是首要怀疑对象。务必使用与论文或官方代码库推荐的学习率设置策略如带热身的余弦退火并根据你的实际batch size按线性缩放规则调整初始学习率。学习率太大容易震荡发散太小则收敛缓慢。权重衰减Weight DecayAdamW优化器中的权重衰减对Transformer模型至关重要通常设为0.05。它可以看作是一种正则化防止模型过拟合。如果训练损失下降但验证集性能很差可以尝试适当增大权重衰减。数据增强强度过强的数据增强如RandAugment的幅度过大可能导致模型难以学习初期收敛慢。可以尝试在训练初期使用较弱的数据增强随着训练进行再逐步增强。梯度裁剪Gradient Clipping虽然Adam优化器相对稳定但在训练非常深的网络或batch size很大时梯度爆炸仍有可能发生。设置一个梯度裁剪阈值如max_norm1.0是良好的实践。初始化与预训练权重尽量不要从头随机初始化训练Swin Transformer除非你有海量数据。务必使用在ImageNet上预训练好的权重进行初始化这是稳定训练和获得好性能的前提。6.3 下游任务微调效果不佳当你把预训练的Swin Transformer用到自己的检测或分割数据集上时可能发现效果不如预期。分层学习率Layer-wise LR这是微调Transformer的黄金法则。骨干网络Backbone的参数应该使用一个较小的学习率例如lr_backbone lr * 0.1因为它们在预训练中已经学到了通用的视觉特征微调时只需小幅调整。而新添加的任务特定头部Head参数可以使用较大的学习率。冻结部分层对于数据量很小的任务可以考虑冻结Swin Transformer的前几个Stage尤其是Stage 1和2只微调后面的层和任务头。浅层通常捕捉低级特征通用性更强深层则更任务相关。数据集域差异如果您的数据集如医学图像、卫星图像与ImageNet的自然图像域差异很大预训练权重的帮助可能有限。此时可能需要更长时间的训练或者在领域相关的数据上进行进一步的预训练领域自适应。任务头设计确保你的检测头或分割头设计是合理的、与特征图维度匹配的。一个设计不良的任务头会成为性能瓶颈。6.4 推理速度优化Swin Transformer的推理速度相比纯CNN模型仍有差距尤其是在高分辨率下。窗口注意力优化推理时可以预先计算好常规窗口和移位窗口的注意力掩码并缓存避免每次推理都重新生成。TensorRT/ONNX部署对于生产环境考虑使用NVIDIA TensorRT或ONNX Runtime进行模型优化和部署。它们可以对计算图进行融合、内核优化并利用FP16/INT8量化来大幅提升推理速度。知识蒸馏如果你对延迟要求极高可以考虑使用一个大Swin模型教师模型来蒸馏一个小得多的CNN或更小的Transformer模型学生模型在精度和速度之间取得平衡。选择性运行对于视频流等应用可以设计策略并非每一帧都运行完整的Swin Transformer而是结合光流或轻量级网络来判断是否需要关键帧进行深度分析。6.5 关于相对位置偏置的扩展性Swin Transformer预训练时是在固定分辨率如224x224上进行的其相对位置偏置表是基于固定的窗口大小如7和特征图大小学习的。当你在推理时输入不同分辨率如384x384的图像时需要处理这个偏置表。官方做法通常使用双线性插值F.interpolate将学习到的相对位置偏置表(2M-1, 2M-1)上采样到推理时所需的大小。由于相对坐标范围[-M1, M-1]不变只是索引的网格更密了插值是合理的近似。潜在问题如果推理分辨率与训练分辨率相差巨大这种插值近似可能引入误差。一种更严谨但复杂的方法是根据推理时的实际窗口位置动态计算偏置但这会牺牲效率。在实践中只要分辨率变化不是特别极端例如从224到512插值方法通常工作良好。我个人在多个视觉项目中使用Swin Transformer的经验是它确实是一个强大的“即插即用”骨干网络但其成功应用离不开对上述细节的精心把控。尤其是在资源有限的情况下如何平衡模型大小、输入分辨率、训练策略是获得最佳性价比的关键。记住没有放之四海而皆准的超参在你的特定数据和任务上做充分的消融实验和验证永远是王道。
返回列表