想象这样一个场景:教堂穹顶的千年壁画正一片片剥落,你带着三维扫描仪,把整幅壁画连同灰尘的纹理都变成了数字模型——数亿个小立方体整整齐齐码在一起,每个小立方体都带着自己的颜色和密度。你的任务不是修复壁画,而是为修复师们绘制一张精确到每一块马赛克的「修复图纸」:哪块属于圣徒的衣袍,哪块属于天使的翅膀,哪块属于背后的云层。 在医学影像的世界里,这张图纸就是「分割结果」。CT或MRI扫描出的3D影像,本质上也是这样一堆小立方体(体素)组成的立体模型,而Swin-UNETR就是一支训练有素的壁画修复师团队:Swin Transformer编码器负责拿着聚光灯,一小块一小块仔仔细细地看完全部壁画;U-Net解码器则像总修复师,把小块的观察笔记拼成完整图纸。本文会带你跟着这支团队走完一整条修复流水线。

岗位关联

学会Swin-UNETR的编码器解剖,就掌握了3D医学影像分割的骨干工程——从部署一套SOTA分割模型,到参加BraTS赛事冲刺排名,你都能用得上。

目录
  1. 可视化演示
  2. 分割任务概述
  3. 编码器架构
  4. 注意力机制
  5. 层级特征提取
  6. 解码器结合
  7. 训练优化
  8. 应用效果
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示Swin-UNETR三大核心机制:窗口注意力(W-MSA)在局部窗口内计算自注意力、移位窗口(SW-MSA)实现跨窗口信息交互、编码器-解码器架构通过跳跃连接融合多尺度特征进行3D医学影像分割,动态展示Dice分数和注意力覆盖率。

本节配有交互动效(进入视口后自动加载,约 3KB)。

窗口注意力 W-MSA SW-MSA 编解码 Swin-UNETR

分割任务概述

你站在教堂中央,抬头仰视巨大的穹顶壁画。修复委托人递给你一张表格,上面列出了图中所包含的所有构件:圣徒衣袍、天使翅膀、云朵阴影、石柱纹理。你的第一项工作,就是把扫描仪生成的那堆立体小方块,逐块核对它们属于表格中的哪一类。在医学影像AI里,这份「逐块核对」的工作就是语义分割——只不过对象换成了病人的CT或MRI扫描,而「构件表格」换成了器官清单,比如肝脏、脾脏、肿瘤、血管。

CT和MRI是医学影像的两大主力。CT扫描像给身体拍了一张「密度地图」,骨骼和金属植入物在图像里闪闪发亮;MRI则更像「软组织对比图」,对肌肉、脂肪、脑组织的变化非常敏感。它们输出的数据,本质上都是一个三维数组——沿着身体的长、宽、厚三个方向均匀采样,得到一串串离散的小立方体。每个小立方体就是「体素」(三维空间的像素),里面存着一个数字,代表那一点组织的信号强度。

在数学上,分割任务可以被定义为一个逐体素分类问题。如果影像有 H×W×D 个体素,模型要做的事就是为每一个体素输出一个类别编号。这种「像素级精细标注」的能力,正是肿瘤定位、手术规划和放疗靶区勾画等临床场景的基石。

回到壁画场景:编号就是你在修复图纸上使用的颜色代码——编号0留白,编号1画上金色衣袍,编号2画上白色翅膀。分割模型的全部努力,就是让这个编号足够精准。

yi=f(xi),xi∈RC,  yi∈{1,2,…,K}y_i = f(x_i), \quad x_i \in \mathbb{R}^C,\; y_i \in \{1, 2, \dots, K\}
这个公式说的是:对每一个体素(一个小立方体),模型用一个函数把它从C维的灰度/信号特征,映射成K类器官标签之一。
  1. 体素特征每个小立方体用C个数值描述,CT看密度,MRI看软组织信号强度。
    xi∈RCx_i \in \mathbb{R}^C
  2. 分类标签模型的输出是K选1的编号,如0背景、1肝脏、2肿瘤。
    yi∈{1,2,…,K}y_i \in \{1, 2, \dots, K\}
  3. 统一映射同一个函数f作用在所有体素上,相当于给整幅壁画的所有马赛克统一发标签。
    yi=f(xi)y_i = f(x_i)

编码器架构

拿到了壁画的三维扫描数据之后,修复师团队开始分工。团队负责人没有让所有人同时盯着整幅壁画——那会让注意力过于分散,而是派出四组观察员,每组负责一个尺度层级,每一组内部又用「窗口」把壁画切成小块轮流细看。这套分工体系,就是Swin Transformer编码器。

编码器的输入端,首先把原始三维影像切成不重叠的小立方体块(patch)。Swin-UNETR使用的patch尺寸是2×2×2,也就是说,每个2×2×2的小块被压成一个「令牌」(token)——像是把一小团马赛克捏成一个代表符。接着,一个线性层把这个令牌从低维映射到高维特征空间,旅程正式启程。

随后,编码器经过四个stage,每个stage由若干Swin Block组成。每个stage结束后,特征图的分辨率减半、通道数翻倍:从原始96³体素,一路走到1/4、1/8、1/16、1/32分辨率,通道数也从48逐级涨到768。这正是Swin-UNETR能够同时兼顾「大范围上下文」和「局部细节」的骨架所在。

观察员们拿到了各自的「小块笔记」后,并不会立刻交差——他们还要经历接下来几道工序,把笔记逐步整合成有层次的结构理解。而这套工序的核心,就是注意力机制。

z0=Linear(Patch(x)),x∈R1×96×96×96\mathbf{z}_0 = \mathrm{Linear}(\mathrm{Patch}(\mathbf{x})), \quad \mathbf{x} \in \mathbb{R}^{1 \times 96 \times 96 \times 96}
这个公式是编码器的「报到仪式」:把3D影像切成小块,再用线性变换把每个小块变成模型能理解的令牌向量。
  1. 切片操作把96×96×96的影像切成48×48×48个互不重叠的2×2×2小块。
    Patch(x):R1×963→R483×8\mathrm{Patch}(\mathbf{x}): \mathbb{R}^{1 \times 96^3} \to \mathbb{R}^{48^3 \times 8}
  2. 线性嵌入每个8维的原始小块,乘以可学习矩阵变成高维向量,模型从此开始「阅读理解」。
    z0=Linear(xp),z0∈RN×48\mathbf{z}_0 = \mathrm{Linear}(x_p), \quad \mathbf{z}_0 \in \mathbb{R}^{N \times 48}

注意力机制

观察员领到的聚光灯,是Swin-UNETR最核心的工具。它一次只照亮壁画的一小块区域(比如2×2×2个令牌组成的窗口),在这个窗口内部,让每个令牌与窗口内其他令牌互相「打招呼」——互相确认彼此的笔触、颜色、纹理,判断自己与它们的关系。这种窗口内的自注意力,就是「W-MSA」。它像修复师在灯下眯着眼,把一小片壁画的每一笔都与其他每一笔做比对。

但只盯着窗口内部有个致命问题:窗口与窗口之间永远不会互相看到,壁画上横跨窗口边界的长线条(比如天使手中横贯壁画的长杖)就会被拦腰截断。于是Swin Transformer引入了「移动窗口」(SW-MSA):在下一层,所有窗口整体向右下偏移半个窗口的距离,让原先的边界变成了新窗口的内部。这样一来,信息就能跨窗口流动,聚光灯也照亮了衔接处。

为了让模型知道「窗口内谁和谁离得近」这个空间信息,Swin又在注意力计算里加入了相对位置偏置B。偏置好比是修复师的经验:笔触越靠近,越可能属于同一片衣袍;相隔越远,越可能是不同的装饰纹样。

一盏是「普通窗口聚光灯」,一盏是「移动后的聚光灯」,两盏灯在相邻的神经层里交替使用。壁画上再长的线条,也逃不过它们的接力照亮。

Attention(Q,K,V)=SoftMax(QKTdk+B)V\mathrm{Attention}(Q, K, V) = \mathrm{SoftMax}\left(\frac{QK^T}{\sqrt{d_k}} + B\right)V
这是Swin自注意力的完整配方:令牌之间互相打分,分数加上位置先验,归一化后加权汇总成新特征。
  1. 生成查询键值每个令牌乘以可学习矩阵得到Q、K、V,分别代表「我想找什么」「我是什么标签」「我携带的内容」。
    Q=XWQ,  K=XWK,  V=XWVQ = XW^Q,\; K = XW^K,\; V = XW^V
  2. 点积打分Q与K做点积,得到令牌间的相关分数,再除以√d_k防止数值过大导致梯度问题。
    QKTdk\frac{QK^T}{\sqrt{d_k}}
  3. 叠加位置偏置加上可学习的相对位置偏置B,让模型知道令牌在窗口内的方位关系。
    QKTdk+B\frac{QK^T}{\sqrt{d_k}} + B
  4. 归一化加权SoftMax把分数变成权重,与V相乘并累加,得到融合了窗口内全部信息的输出。
    SoftMax(⋅)V\mathrm{SoftMax}(\cdot) V

层级特征提取

观察员的观察笔记越记越厚。负责人开始要求他们「退后几步看全貌」:把2×2×2个相邻令牌的笔记合并成一份「概括笔记」——分辨率缩一半,但每个概括笔记携带的信息维度翻一倍。这个过程叫Patch Merging,就像是把四张详细的局部素描叠影成一张更宏观的构图稿。

经过四轮这样的退后,编码器手里握有了四种尺度的笔记:最细的1/4尺度笔记保留了大量边缘和纹理;中间的1/8、1/16尺度开始出现「这是一片翅膀」这样的语义块;最粗的1/32尺度则几乎是一张完整的构图缩略图,每一个令牌都能「看到」几乎整幅壁画。这四份笔记合在一起,就是计算机视觉里常说的「特征金字塔」。

每一层的语义也发生着质变:浅层特征回答「这个笔触是红色还是蓝色」,深层特征回答「这块区域属于天使还是云朵」。修复工作最怕「只缘身在此山中」——只盯着局部会迷失方向,只看全局又看不清裂纹。而Swin的多尺度笔记,正好让团队既有全局方位感,又不放过任何细节。

当壁画的结构笔记和细节笔记都齐备之后,下一步就是把分散在四位观察员手里的笔记,交回给总修复师做最终拼装。

Cl+1=2Cl,Dl2×Hl2×Wl2C_{l+1} = 2 C_l, \quad \frac{D_l}{2} \times \frac{H_l}{2} \times \frac{W_l}{2}
Patch Merging的规则:每合并一次,特征图的长宽厚全部减半,而通道数翻倍——信息不丢失,只是换个更紧凑的记法。
  1. 相邻拼接把8个相邻的2×2×2令牌内容拼接成一个长向量,分辨率降为原来一半。
    Dl2×Hl2×Wl2×(8Cl)\frac{D_l}{2} \times \frac{H_l}{2} \times \frac{W_l}{2} \times (8 C_l)
  2. 线性压缩用线性层把8倍通道压缩到2倍,相当于去冗余、留精华。
    Cl+1=2ClC_{l+1} = 2 C_l

解码器结合

总修复师面前摆开了两份材料:一份是观察员们交来的多尺度笔记,一份是当初的三维扫描原始数据。他需要的是一张完整的修复图纸——和壁画同样大小的标签图,而不是一堆分散的笔记。于是,U-Net解码器登场了。

解码器的工作方式是「由粗到细逐级还原」:最粗的1/32尺度笔记先通过反卷积上采样放大一倍,再与编码器同层的1/16尺度笔记拼接在一起。这里的拼接就是「跳跃连接」(Skip Connection)——它像一份「原始草图」,用编码器侧的高分辨率特征为解码器校准位置、补回细节纹理。每一级都重复这个「放大→拼接→融合」的过程,直到特征图恢复到原始分辨率。

最后,一个1×1×1卷积把特征映射成每个体素在K个类别上的得分,SoftMax之后就是最终的分割概率图。为了方便梯度传导,Swin-UNETR还会在多个解码层级同时计算损失,这种「深监督」策略就像师傅在每一道工序都抽查一次质量,而不是只验收最后成品。

总修复师捧着拼接好的图纸走完四个还原阶段,一张跟原始壁画同样尺寸、每一个马赛克都有明确归属的修复图纸终于成型。剩下的事情,就是让整支团队接受考核,不断打磨手艺。

Fldec=Conv([Up(Fl+1),  Flenc])F_l^{dec} = \mathrm{Conv}\left(\left[\mathrm{Up}(F_{l+1}),\; F_l^{enc}\right]\right)
解码器的核心一步:上采样拉大,与跳跃连接送来的同尺寸特征拼接,再用卷积融合成更细腻的特征图。
  1. 上采样放大把低分辨率的解码特征通过反卷积放大到与编码器同层一致。
    Up(Fl+1)\mathrm{Up}(F_{l+1})
  2. 跳跃拼接与编码器同层特征沿通道方向拼接,高分辨率细节被重新注入。
    [ ⋅ , Flenc][\,\cdot\,,\,F_l^{enc}]
  3. 卷积融合用卷积把拼接后的通道压缩,让两种信息充分混合。
    Conv(⋅)\mathrm{Conv}(\cdot)

训练优化

修复师团队要接受严格考核。考官手里也有一份专家绘制的标准答案图纸,团队画出的图纸与标准答案重叠得越多,得分越高。这个「重叠率」在医学影像分割里就是Dice系数——你预测的器官区域与医生标注的真实区域之间的重合程度。完全重合是1分,毫无交集是0分。

Swin-UNETR训练时最常用的损失函数是Dice损失与交叉熵损失的组合。Dice损失从「区域重叠」角度打分,交叉熵从「每个体素是否归类正确」角度打分,二者互补——前者关心完整性,后者关心精确性。配合AdamW优化器、余弦退火学习率,模型在BraTS数据集上通常训练数万步即收敛。

数据增强方面,团队采用了「随机裁剪96³小块、随机翻转、随机旋转、灰度缩放」等策略。这就像让修复师们反复练习不同光线、不同角度下的壁画局部,练得多了,自然不怕真实世界的千变万化。最终评估时,Dice和HD95(表面距离)是公认的两大硬指标。

考场的模拟训练日复一日。当团队在验证集上的Dice分数稳定不再上升时,负责人一声令下:上真实战场。

LDice=1−2∑i=1Npigi∑i=1Npi2+∑i=1Ngi2\mathcal{L}_{Dice} = 1 - \frac{2\sum_{i=1}^{N} p_i g_i}{\sum_{i=1}^{N} p_i^2 + \sum_{i=1}^{N} g_i^2}
Dice损失就是「1减去重叠率」:重叠率越高,损失越小;当预测与真实完全重合时,损失为0。
  1. 预测与真实p_i是模型预测的概率,g_i是真实标签(0或1),逐个体素对比。
    pi∈[0,1],gi∈{0,1}p_i \in [0,1],\quad g_i \in \{0,1\}
  2. 交集两倍分子是2倍的点积和,近似于两集合交集大小的两倍。
    2∑i=1Npigi2\sum_{i=1}^{N} p_i g_i
  3. 分母归一分母是预测平方和与真实标签之和,近似两集合大小的总和。
    ∑i=1Npi2+∑i=1Ngi2\sum_{i=1}^{N} p_i^2 + \sum_{i=1}^{N} g_i^2
  4. 取反成损失用1减去Dice系数,让「重叠越大、损失越小」成为优化方向。
    LDice=1−Dice\mathcal{L}_{Dice}=1-\mathrm{Dice}

应用效果

修复师团队终于走出集训营,迎来真实教堂的验收。医学影像界的「验收现场」是BraTS(脑肿瘤分割挑战赛)——一个汇聚全球顶尖算法的年度盛事,提供带专家标注的多模态MRI数据。Swin-UNETR一登场就交出了亮眼成绩:在BraTS 2021验证集上,整体肿瘤Dice达到约0.847,超越原来的UNETR约2个百分点,跻身榜单前列。

这项成绩很大程度上要归功于「多模态输入」的设计。BraTS为每个病人提供了四种MRI模态——T1、T1ce(增强)、T2和FLAIR,Swin-UNETR将四种模态按通道方向拼接成4通道输入,就像修复师既看素描底稿又看彩色照片,能捕捉到单一模态下难以察觉的病灶差异。这种多模态融合能力,也延续到CT多期增强扫描等场景中。

从比赛到临床,Swin-UNETR的价值正在快速落地。放射科医生手动勾画一个肝脏肿瘤通常需要十几分钟,而模型推理只需数秒;在放疗靶区勾画、脑肿瘤随访、器官移植体积评估等任务中,它都能充当医生的「第二双眼睛」。当然,临床部署还要经过严谨的验证与审批,但技术的齿轮已经开始转动。

壁画修复师团队捧回了奖杯,但这远不是终点。医院影像科里还有无数幅「壁画」等待标注——每一次Swin-UNETR的部署,都是对「分块细看、逐级拼装」这套方法论的一次实战检验。

Diceavg=1K∑k=1K2∣Pk∩Gk∣∣Pk∣+∣Gk∣\mathrm{Dice}_{avg} = \frac{1}{K}\sum_{k=1}^{K} \frac{2|P_k \cap G_k|}{|P_k| + |G_k|}
平均Dice是大赛的最终计分方式:先对每个类别分别算重叠率,再对所有类别取平均。
  1. 逐类重叠率对第k个类别,统计预测集合P_k与真实集合G_k的重叠体素。
    2∣Pk∩Gk∣∣Pk∣+∣Gk∣\frac{2|P_k \cap G_k|}{|P_k| + |G_k|}
  2. 取平均把K个类别的Dice相加除以K,得到不分器官的统一得分。
    1K∑k=1KDicek\frac{1}{K}\sum_{k=1}^{K} \mathrm{Dice}_k

AI 应用场景

脑肿瘤MRI自动分割

阶段:模型推理(编码器-解码器前向传播)

解决的问题:医生手动在MRI上逐层勾画肿瘤边界,耗时且主观差异大。Swin-UNETR接受四种模态MRI拼接输入,一次推理输出肿瘤核心、水肿带、增强肿瘤的完整三维标签图,把十几分钟的手工劳动压缩到几秒。

具体案例:某三甲医院放射科引入Swin-UNETR,对300例胶质瘤患者的多模态MRI进行自动分割。模型输出的肿瘤区域与专家标注的Dice达到0.85以上,医生只对可疑边界做局部修正即可写入报告,平均每例节约8分钟。

腹部CT多器官分割

阶段:数据预处理 + 模型微调

解决的问题:肝脏、脾脏、肾脏等腹部器官在CT上对比度接近,边界模糊,传统阈值法极易误分割。Swin-UNETR的窗口注意力天然擅长捕捉局部边界纹理,配合层级特征能感知器官整体形态。

具体案例:科研团队用公开的CT-ORG数据集微调Swin-UNETR,将96×96×96的随机裁剪策略改为自适应窗宽窗位增强,在肝脏分割上Dice达到0.96,术后用于肝移植患者的剩余肝体积快速评估。

放疗靶区勾画辅助

阶段:训练 + 推理 + 临床质控

解决的问题:放疗医生勾画靶区需要同时参考CT定位像与MRI融合像,过程繁琐。Swin-UNETR通过跳跃连接保留的高频细节,能保持靶区边缘的精细结构,避免过度勾画损伤周围组织。

具体案例:某肿瘤医院将Swin-UNETR嵌入放疗计划系统,对鼻咽癌患者自动勾画大体肿瘤体积。模型生成的靶区与医生最终确认版的重叠率超过0.9,物理师仅需微调边缘即可进入计划优化环节。

Python 演示

python65 行
import torchimport torch.nn as nn  class SwinBlock3D(nn.Module):    """简化版 3D Swin Transformer Block (W-MSA + SW-MSA 核心机制)"""     def __init__(self, dim, window_size=2, num_heads=2):        super().__init__()        self.window_size = window_size        self.num_heads = num_heads        self.norm1 = nn.LayerNorm(dim)        self.norm2 = nn.LayerNorm(dim)        self.qkv = nn.Linear(dim, dim * 3)        self.mlp = nn.Sequential(            nn.Linear(dim, dim * 2), nn.GELU(), nn.Linear(dim * 2, dim)        )     def _window_partition(self, x, w):        B, D, H, W, C = x.shape        x = x.view(B, D // w, w, H // w, w, W // w, w, C)        x = x.permute(0, 1, 3, 5, 2, 4, 6, 7).contiguous()        return x.view(-1, w, w, w, C)     def _window_reverse(self, windows, w, D, H, W):        B = windows.shape[0] // (D // w * H // w * W // w)        C = windows.shape[-1]        x = windows.view(B, D // w, H // w, W // w, w, w, w, C)        x = x.permute(0, 1, 4, 2, 5, 3, 6, 7).contiguous()        return x.view(B, D, H, W, C)     def _window_attn(self, x):        B, D, H, W, C = x.shape        windows = self._window_partition(x, self.window_size)        Bw, wD, wH, wW, Cw = windows.shape        tokens = windows.reshape(Bw, wD * wH * wW, Cw)        qkv = self.qkv(tokens)        qkv = qkv.reshape(Bw, wD * wH * wW, 3, self.num_heads, C // self.num_heads)        qkv = qkv.permute(2, 0, 3, 1, 4)        q, k, v = qkv[0], qkv[1], qkv[2]        attn = (q @ k.transpose(-2, -1)) * (C // self.num_heads) ** -0.5        attn = attn.softmax(dim=-1)        out = (attn @ v).transpose(1, 2).reshape(Bw, wD, wH, wW, Cw)        return self._window_reverse(out, self.window_size, D, H, W)     def forward(self, x):        B, D, H, W, C = x.shape        shortcut = x        x = self.norm1(x)        x = shortcut + self._window_attn(x)  # W-MSA 窗口内注意力        shortcut = x        x = torch.roll(x, shifts=(1, 1, 1), dims=(1, 2, 3))  # 循环移位        x = self.norm2(self._window_attn(x))        x = torch.roll(x, shifts=(-1, -1, -1), dims=(1, 2, 3))  # 还原位置        return shortcut + x  # SW-MSA 移动窗口注意力  if __name__ == "__main__":    block = SwinBlock3D(dim=16, window_size=2, num_heads=2)    x = torch.randn(1, 4, 4, 4, 16)    y = block(x)    assert tuple(y.shape) == tuple(x.shape)    print("输入形状:", tuple(x.shape))    print("输出形状:", tuple(y.shape))    print("Swin Block 前向传播成功: 形状不变, 注意力计算正常")
目的:用纯PyTorch实现一个最简3D Swin Transformer Block,演示W-MSA与SW-MSA两个核心机制在真实张量上的运作。
  1. self._window_partition(x, self.window_size)把特征图切成多个不重叠的窗口,就像修复师把壁画分成2×2×2的小区域。
  2. torch.roll(x, shifts=(1, 1, 1), dims=(1, 2, 3))对三个空间维度做循环移位,让窗口边界移动半个窗口,实现SW-MSA。
  3. qkv = qkv.reshape(Bw, wD * wH * wW, 3, self.num_heads, C // self.num_heads)把令牌映射成多头的Q、K、V,聚光灯开始逐头扫描。
  4. attn = (q @ k.transpose(-2, -1)) * (C // self.num_heads) ** -0.5点积打分并除以√d,得到窗口内令牌两两的相关性。
  5. ctx.fillRect(ox + pos.x * cell, oy + pos.y * cell, WIN * cell, WIN * cell)Canvas里高亮当前移动窗口(呼应代码中的窗口划分)。

常见误区

误区Swin Transformer就是ViT的降配版,为了省计算才把全局注意力切成窗口,性能肯定不如ViT。

正解窗口限制不是为了妥协,而是刻意设计的「由局部到全局」归纳偏置。医学影像里器官边界、纹理本身就是局部强相关的,窗口注意力天然匹配这种特性;再加上移动窗口跨窗交流,长程依赖也没有丢失。Swin-UNETR的实际表现不仅不输ViT版UNETR,在BraTS上还明显胜出。

为何常见:大家习惯用「计算量」衡量模型优劣,而忽略了「先局部后全局」的视觉先验对特定任务的价值。

误区模型编码器的输出就是分割结果,直接把最后一个stage的特征图当标签图用。

正解编码器输出的1/32低分辨率特征图只是一个「高度抽象的语义描述」,远不是与原始影像同尺寸的标签图。真正产出分割结果的是解码器:它通过四级上采样逐步把分辨率拉回96³,并与跳跃连接的特征融合,最后经过1×1×1卷积分类。编码器提供理解,解码器负责还原。

为何常见:看结构图时注意力都集中在编码器的高光部分,忽略了U型网络后半段的还原作用。

误区Dice是越接近1越好,所以训练时盯着Dice无脑冲高就万事大吉。

正解Dice对类别不平衡很敏感,小目标(如细长血管)稍有偏差Dice就剧烈波动;单一指标还可能掩盖过拟合。实际工程中要结合HD95表面距离、体积误差一起看,还要在独立测试集上验证。训练时Dice损失也常与交叉熵搭配,避免梯度不稳定。

为何常见:Dice是比赛榜单上的主排名指标,容易让人把「排行榜高分」误解成「临床可用」。

面试题

Q1. Swin-UNETR的编码器主体结构是什么?

单选题 · easy

  • A.纯卷积网络
  • B.Swin Transformer← 正确答案
  • C.循环神经网络
  • D.视觉Transformer

答案:B。Swin-UNETR最核心的改动就是把编码器从UNETR的ViT换成了层级化Swin Transformer,利用窗口注意力和移动窗口机制处理3D医学影像。A是U-Net类结构,C不用于图像编码,D虽然是Transformer但是非层级全局注意力。

Q2. 医学影像中的「体素」是什么?

单选题 · easy

  • A.三维像素← 正确答案
  • B.特征向量
  • C.类别标签
  • D.损失数值

答案:A。体素是三维空间中体积像素的简称,就像二维图片的像素是「小方块」,体素是「小立方体」。CT/MRI影像就是由这些带灰度值的小立方体堆叠而成的三维数组。特征向量、类别标签是模型处理的产物,损失数值是训练时计算的标量。

Q3. Swin Transformer中W-MSA和SW-MSA交替出现的根本目的是什么?

单选题 · mid

  • A.减少网络计算量
  • B.实现跨窗口信息流通← 正确答案
  • C.增加网络层数
  • D.替代卷积下采样

答案:B。W-MSA把注意力限制在窗口内,效率高但窗口间信息隔离;SW-MSA把窗口整体偏移半个窗口,让原本的边界变成新窗口的内部,信息因此跨窗口流动。计算量减少是窗口注意力的好处,但不是移动窗口交替的目的。

Q4. Swin-UNETR编码器中,每经过一个Stage后特征图的变化规律是?

单选题 · mid

  • A.保持不变
  • B.缩小为一半← 正确答案
  • C.放大为两倍
  • D.随机波动

答案:B。每个Stage末尾的Patch Merging会把相邻2×2×2的令牌合并,使空间分辨率减半、通道数翻倍。这是模仿卷积网络的金字塔式下采样策略,让模型逐步扩大感受野并提取语义更强的特征。扩大分辨率是解码器的上采样所做的。

Q5. Swin-UNETR在BraTS任务中使用的输入模态包括哪些?

多选题 · mid

  • A.T1加权成像← 正确答案
  • B.T1ce增强成像← 正确答案
  • C.T2加权成像← 正确答案
  • D.PET代谢成像

答案:ABC。BraTS挑战赛标配四种MRI模态:T1、T1ce、T2和FLAIR,Swin-UNETR把它们拼接成多通道输入。PET是核医学成像,不在BraTS多模态范围中,属于干扰项。

Q6. 相对位置编码在Swin注意力中的作用是什么?

单选题 · hard

  • A.感知窗口内令牌相对方位← 正确答案
  • B.加速模型收敛速度
  • C.压缩模型参数量
  • D.替换SoftMax归一化

答案:A。窗口自注意力本身对令牌顺序不敏感,如果不加位置信息,模型无法区分「左右相邻」与「上下相隔」。Swin在注意力分数上叠加可学习的相对位置偏置B,让模型感知窗口内各令牌的相对空间方位,这对医学影像中器官的连续形态建模至关重要。

Q7. 关于Swin-UNETR解码器中的跳跃连接,下列说法正确的是?

多选题 · mid

  • A.连接编码器与解码器的同层特征← 正确答案
  • B.帮助解码器恢复空间细节← 正确答案
  • C.用来替代编码器的特征提取
  • D.与编码器结构完全无关

答案:AB。跳跃连接将编码器侧高分辨率、富含细节的特征直接传给解码器同层,与上采样后的低分辨率特征拼接,弥补下采样损失的空间信息。它是对编码器输出的补充而非替代,且依赖编码器的分层设计才存在。

Q8. Dice损失衡量的核心是什么?

单选题 · easy

  • A.分类准确率高低
  • B.预测与真实区域重叠度← 正确答案
  • C.模型训练速度快慢
  • D.网络参数量多少

答案:B。Dice系数本质是集合相似度:预测区域与真实标注的交集乘2,除以二者面积之和。完全重叠为1,完全不重叠为0。Dice损失用1减去该系数,让优化方向直接对齐「区域重合最大化」,这正是分割任务的目标。

Q9. Swin-UNETR训练时常用的优化策略包括?

多选题 · hard

  • A.随机裁剪为96立方← 正确答案
  • B.使用深度监督训练← 正确答案
  • C.AdamW优化器调参← 正确答案
  • D.完全不做数据增强

答案:ABC。Swin-UNETR使用96³随机裁剪控制显存并增强多样性,配合随机翻转、旋转、灰度缩放;解码器在多个层级都计算损失,即深度监督,缓解梯度消失;优化器采用AdamW配合学习率预热与余弦退火。不做数据增强会严重过拟合。

Q10. 为什么SW-MSA的实际计算比W-MSA更复杂?

单选题 · extreme

  • A.需要更大的窗口
  • B.掩码处理移位后不规则窗口← 正确答案
  • C.引入了更多网络层
  • D.使用更大的图像块

答案:B。SW-MSA对特征图做了循环移位后,窗口仍然保持规则大小,但每个窗口内可能包含来自移位前不同位置的令牌,注意力计算时必须用掩码(mask)屏蔽掉不应互相注意的跨区域令牌。窗口尺寸、网络层数并不改变,因此B正确。