想象你准备买一套二手房,只让验房师在晴天下午看上一眼,就敢签字付款吗?大概率不敢。聪明的做法是请同一位资深验房师,在不同时间、用不同工具反复查验:白天看采光、雨天看渗水、用湿度仪查墙体、用红外仪探管线。每一份报告都有视角局限,但把多份报告放在一起综合判断,你对房屋质量的信心会高得多。测试时增强(Test-Time Augmentation,简称 TTA)干的就是这件事:在模型推理阶段,对同一张输入图片做多种可逆变换——翻转、旋转、缩放、调亮度——让同一个模型“多角度观察”,再把所有预测结果融合起来,最终显著提升精度。故事里,模型就是那位验房师,变换就是不同的查验工具,融合就是把多份报告汇总成一份更可靠的结论。

岗位关联

对 AI 从业者来说,TTA 是推理阶段的“零成本”提分技巧:训练好的模型不用动,仅靠多视角融合就能在竞赛和工业场景中稳定提升准确率,是数据竞赛和模型优化必备的压箱底技能。

目录
  1. 可视化演示
  2. 一、TTA基本概念
  3. 二、常见变换策略
  4. 三、预测融合方法
  5. 四、代码实现要点
  6. 五、性能与权衡
  7. 六、实际应用场景
  8. 七、注意事项
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示测试时数据增强TTA的核心流程:输入变换、多路推理与预测融合,交互调节增强数量观察精度提升效果。

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

TTA流程:变换-推理-融合 输入经多种变换生成增强视图 多路预测融合提升最终精度 y = avg(f(x), f(t1(x)), ..., f(tn(x))) 滑块调节增强变换数量

一、TTA基本概念

验房师如果只在晴天下午看一次房,很可能漏掉雨季渗水的隐患——单次观察总带着视角偏差。模型也一样,一张图片只做一次前向推理,可能因为物体角度、光线、遮挡等因素,把狗认成猫。TTA 的思路就是让验房师换个时间、换个工具再验几次:对同一张输入图片施加几种可逆变换,让模型从多个“视角”分别给出判断。

TTA 全称 Test-Time Augmentation,中文叫测试时增强。它只在推理阶段生效,训练过程完全不受影响。工作流程很清晰:先对原始图片施加 N 种变换,生成 N 个副本;再让模型对每个副本分别做预测;最后把所有预测概率取平均,得到最终结果。这里的“变换”和训练时用的数据增强很像,但目的不同——训练增强是为了让模型见多识广、防止过拟合,而 TTA 是为了让单次预测更稳健。

用数学语言描述这个过程,就是下面的平均公式。假设原始图片是 x,第 i 种变换写作 Tᵢ(x),模型在当前权重 θ 下对类别 y 输出的概率是 p_θ(y|·),那么加总 N 个视角再除以 N,就是最终预测:

回到验房的比喻:单次预测像只信一份报告,TTA 则像把晴天、雨天、白天、夜晚的多份报告汇总,每一份都可能看走眼,但合在一起,错误的判断会被稀释,正确的判断会浮现出来。这就是 TTA 最核心的思想——用多视角的集体智慧对抗单次观察的偶然失误。

pfinal(y∣x)=1N∑i=1Npθ(y∣Ti(x))\displaystyle p_{\text{final}}(y|x) = \frac{1}{N}\sum_{i=1}^{N} p_{\theta}\bigl(y \mid T_i(x)\bigr)
这个公式的意思很朴素:把 N 份“验房报告”的结论做算术平均,谁的支持率高,最终就倾向谁。
  1. 输入变换$T_i(x)$ 表示第 $i$ 种变换(比如水平翻转)作用在原始图片 $x$ 上,得到一个“新视角”的副本。
  2. 单视角预测$p_\theta(y \mid T_i(x))$ 是模型在当前参数下,对这个副本输出类别 $y$ 的概率。
  3. 平均融合$\dfrac{1}{N}\sum_{i=1}^{N}(\cdot)$ 把全部 $N$ 个视角的概率相加后取平均,得到最终预测。

二、常见变换策略

验房师手上有放大镜、湿度仪、红外探墙仪,不同工具揭示房子的不同侧面。TTA 的“工具”就是各种图像变换:水平翻转、垂直翻转、旋转一定角度、多尺度缩放、颜色亮度扰动。选工具的原则是——变换不能破坏图片的核心语义,否则等于拿了一把会误报的仪器。

以水平翻转为例子,自然界里绝大多数图像都有很强的左右对称先验:一只猫左右翻转后仍然是猫,一栋楼左右翻转后也仍然是楼。因此对模型来说,原始图和水平翻转图是“同一个物体、两个视角”。如果模型只看原始图时把猫认成狗,那多半是光照、遮挡等偶然因素干扰了判断;翻转后再看一次,相当于让模型抛开方向性干扰重新评估。两个视角的预测取平均,通常比单次预测更可靠,写成公式就是:

除了翻转,多尺度缩放也是常用手段:小图看到整体轮廓、大图看清局部纹理,两者互补;颜色扰动则模拟不同光照条件。需要注意:不是所有任务都适合所有变换。比如识别文字方向的车牌号,水平翻转会把“6“看成”9”,这种语义破坏性变换就要坚决排除。选对工具,TTA 才能发挥验房师的功力。

pflip(y∣x)=pθ(y∣x)+pθ(y∣flip(x))2\displaystyle p_{\text{flip}}(y|x) = \frac{p_{\theta}(y|x) + p_{\theta}\bigl(y|\text{flip}(x)\bigr)}{2}
一句话:原始图预测和翻转图预测各占一半权重,互相纠偏。
  1. 原始视角$p_\theta(y|x)$ 是模型对原始图片预测类别 $y$ 的概率,对应“晴天下午看房”。
  2. 对称平均加上翻转副本的预测 $p_\theta(y|\text{flip}(x))$,再除以 $2$,让两个方向相反的视角共同决定结论。

三、预测融合方法

验房报告拿到手后,怎么汇总?可以简单平均,也可以根据每位验房师的历史准确率给不同权重,还可以让大家举手投票。融合方式不同,最终结论的可靠度也不同。TTA 的融合阶段同样有讲究。

最基础的是简单平均法,把 N 个副本的 softmax 概率直接相加取平均。进阶一点是加权平均:某些变换对特定任务更有效,就给它的预测更大权重。还有一种思路是在 softmax 之前的 logit 空间做平均,因为 softmax 会把分数压成极端分布,提前平均能保留更多信息。投票法则适合类别数较少、概率差异不明显的场景。加权平均的公式如下:

理论上,加权平均能比简单平均更贴合任务特点:如果“多尺度”在这类图片上特别靠谱,就把它的权重调高,就像买房时更信任口碑最好的那位验房师。实际操作中,权重可以通过在验证集上网格搜索或按置信度自适应确定。融合没有绝对最优,多试几种,选验证集上最稳的那个即可。

pˉ(y∣x)=∑i=1Nwi⋅pi(y∣x)∑i=1Nwi\displaystyle \bar{p}(y|x) = \frac{\sum_{i=1}^{N} w_i \cdot p_i(y|x)}{\sum_{i=1}^{N} w_i}
权重 wᵢ 可以理解为每份“验房报告”的可信度,可信度高的报告权重更大。
  1. 权重设定$w_i$ 表示第 $i$ 个变换副本预测的可信程度,通常由验证集上该变换单独使用时的准确率决定。
  2. 加权求和分子部分把每个副本的概率 $p_i(y|x)$ 乘以对应权重后累加。
  3. 归一化分母把所有权重加起来做归一,保证融合后的概率之和仍然为 1。

四、代码实现要点

把验房流程做成一份标准化清单:先列好要用的工具清单,再按顺序逐项执行,最后汇总成报告。TTA 的工程实现同样是一套清晰的管线,核心技巧在于批量前向——不要对每个副本单独调用模型,而是把副本拼成一个更大的 batch 一次算完,能省下大量重复开销。

一个典型实现分四步:第一步定义变换函数列表,比如水平翻转、垂直翻转、旋转 90 度、缩放;第二步对输入 batch 里的每张图施加这些变换,生成副本;第三步把原始图和所有副本沿着 batch 维度拼接,一次性喂给模型;第四步把输出的多个概率结果拆开、融合。假设原始 batch 大小是 B,每张图生成 T 个变换副本,那么一次前向实际处理的图片数量是:

一个工程上的小技巧是:如果显存放不下全部副本,可以分批前向,把每个小 batch 的预测结果先存下来,最后统一聚合。封装时建议把“变换、前向、融合”包成一个类,暴露一个 predict(x) 接口,这样训练好的模型接入 TTA 只需要改一行调用代码。后面 Python 演示里我们就会实现这样一个完整的 TTAWrapper 封装类——标准化清单写好了,验房就能又快又稳。

Ntotal=B×(1+T)\displaystyle N_{\text{total}} = B \times (1 + T)
原图加 T 个副本,总共 1+T 份,batch 规模直接翻倍。
  1. 批次扩展$B$ 是原始 batch 中的图片张数,$T$ 是每张图片额外生成的变换副本数量。
  2. 总前向量每张图有 $1+T$ 个版本(原图 + T 个副本),所以一次性前向的图片总量是 $B \times (1+T)$。

五、性能与权衡

多请几次验房、多用几台仪器,时间成本和费用自然上涨。TTA 的收益同样不是免费的:精度提升的代价是推理时间成倍增加、显存占用上升。理解这个权衡,才能判断“值不值得上 TTA”。

假设模型处理一个 batch 需要时间 T_infer,使用 T 个变换副本后,前向总量变成原来的 1+T 倍,推理耗时也近似线性增长:

另一个代价是显存:4 张变换副本意味着特征图占用也接近 4 倍,显存不够时可以改为串行推理,先算第一份、保存概率,再算第二份——时间不变但峰值显存可控。那么收益有多大?在图像分类竞赛中,TTA 通常能稳定提升 0.2~2 个百分点的准确率,代价是推理时间变为原来的 3~5 倍。对离线评测、Kaggle 提交这类不要求实时的场景,这几乎是“零成本”提分;但对自动驾驶、实时视频流这类延迟敏感场景,就要谨慎评估。

一句话权衡:精度红线优先、算力有余,就上 TTA;延迟敏感、算力紧张,则要控制副本数量,甚至只保留最有效的单一变换。验房虽好,也不能把整个预算都花在验房上。

Ttotal≈Tinfer×(1+T)\displaystyle T_{\text{total}} \approx T_{\text{infer}} \times (1 + T)
  1. 单次耗时$T_{\text{infer}}$ 是模型对一个 batch 做一次前向推理所需时间。
  2. 线性放大副本使数据量变为 $1+T$ 倍,总耗时近似随之放大;若显存允许并行计算,实际增速可能略低于理论值。

六、实际应用场景

不同类型的房子需要不同强度的验房:学区房值得请顶级团队反复查验,普通刚需房快速过一遍就好。TTA 的应用场景同样有轻重之分——在竞赛和医疗这类“精度优先”的领域,它是标配;在实时感知场景,则需要挑选轻量方案。

数据竞赛是最典型的应用场景。Kaggle 图像分类比赛的 Top 方案几乎都会在测试阶段使用 TTA:对测试集做水平翻转、多尺度缩放的副本推理,再融合预测,往往能在排行榜上提升 0.3~1 个百分点。医疗影像则更看重“稳”——肺结节 CT 检测中,单次预测漏掉一个可疑结节可能造成严重后果,对同一张切片做 90 度旋转和多尺度变换后融合多个分割结果,能有效降低假阴性率。目标检测和语义分割同样受益:对输入帧做翻转后,检测框或分割图按像素融合,道路边界识别会更平滑。

怎么衡量 TTA 带来的“确定性提升”?一个常用指标是预测的熵——熵越小,说明模型对结果越笃定。熵的定义是:

实际落地时,竞赛选手把 TTA 当提分包,医疗团队把它当安全网,自动驾驶工程师则用它做离线评测的鲁棒性验证。场景不同、力度不同,但背后的道理一致——多一份视角,多一分把握。

H[p]=−∑c=1Cpclog⁡pc\displaystyle H[p] = -\sum_{c=1}^{C} p_c \log p_c
熵衡量预测分布的集中程度:越接近“某一类概率为 1”,熵越接近 0。
  1. 类别概率$p_c$ 是模型预测第 $c$ 类的概率,$\log p_c$ 是它的自然对数。
  2. 逐类累加对全部 $C$ 个类别计算 $-p_c \log p_c$ 后求和。
  3. 熵的含义$H[p]$ 越小,说明概率越集中、模型越自信;TTA 融合后熵通常比单次预测更低,这就是“多份报告消除不确定性”的数学体现。

七、注意事项

再好的验房仪器也有失灵时刻:湿度仪在雨天的读数偏高,放大镜看不清墙体内部的管线。TTA 同样有“水土不服”的边界,踩坑之前先记住三个高频雷区。

第一个雷区是 BatchNorm 的推理行为。在 eval 模式下,BatchNorm 层不再使用当前 batch 的统计量,而是使用训练阶段累积的全局统计量。当你对输入做翻转、缩放时,副本的特征分布与训练集分布产生偏移,而全局统计量来不及“适应”这种偏移,可能导致输出不稳定。BatchNorm 在推理时的计算方式是:

第二个雷区是 Dropout 随机性。如果模型没有正确切换到 eval 模式,Dropout 仍在随机丢弃神经元,每次前向本身就是一次“随机采样”,TTA 融合的副本之间混入了额外的噪声,结果自然不稳定。第三个雷区是变换选择不当:对 OCR 文字识别做翻转、对方向敏感的任务做旋转,都会破坏语义。正确姿势是在验证集上先做小范围实验,选出真正有效的变换组合,再推广到测试集。好工具要用在对的地方,验房如此,TTA 亦如此。

x^=x−μglobalσglobal2+ϵ γ+β\displaystyle \hat{x} = \frac{x - \mu_{\text{global}}}{\sqrt{\sigma_{\text{global}}^2 + \epsilon}}\, \gamma + \beta
推理时 BN 用的是训练期统计量,TTA 变换可能让输入分布“跑偏”。
  1. 中心化$x$ 减去训练集全局均值 $\mu_{\text{global}}$,把特征中心移到训练分布的中心。
  2. 标准化缩放除以全局标准差 $\sigma_{\text{global}}$ 加上极小常数 $\epsilon$ 后的平方根,保证数值稳定。
  3. 仿射变换乘以可学习的缩放参数 $\gamma$ 并加上偏移 $\beta$;由于统计量来自训练集,变换副本的分布一旦偏移,输出就可能失真。

AI 应用场景

竞赛提分包:Kaggle 图像分类

阶段:模型推理与调优

解决的问题:比赛后期验证集分数停滞,单次推理受图像方向、尺度偏移影响大,亟需不改变训练就能稳定提分的手段。

具体案例:在 Kaggle 经典猫狗分类等比赛中,Top 方案普遍对测试集做水平翻转加多尺度(256/288/320)的 TTA 融合,准确率提升 0.3~1 个百分点。提交前用 TTAWrapper 跑一遍测试集,是许多选手的标配操作。

医疗影像:肺结节检测

阶段:模型部署与临床验证

解决的问题:漏诊代价极高,CT 切片存在扫描角度差异,单次预测不稳定,需要降低假阴性率。

具体案例:对同一 CT 切片执行多尺度缩放与 90 度旋转的 TTA,融合多个分割结果后再做阈值判断。实践表明,TTA 能将肺结节检测的召回率提升 2~3 个百分点,同时保持误报率不显著上升。

自动驾驶:在线语义分割

阶段:车载模型推理

解决的问题:相机安装角度、光照变化导致单帧分割结果抖动,道路边界忽胖忽瘦。

具体案例:对输入帧做水平翻转 TTA,将两个视角的分割图按像素投票融合,道路区域边缘更平滑、车道线断裂更少。由于车载算力有限,通常只保留翻转这一种变换,平衡延迟与精度。

Python 演示

python71 行
import torchimport torch.nn.functional as F  class SimpleCNN(torch.nn.Module):    def __init__(self, num_classes=3):        super().__init__()        self.net = torch.nn.Sequential(            torch.nn.Conv2d(1, 8, 3, padding=1),            torch.nn.ReLU(),            torch.nn.AdaptiveAvgPool2d(1),            torch.nn.Flatten(),            torch.nn.Linear(8, num_classes)        )     def forward(self, x):        return self.net(x)  class TTAWrapper:    def __init__(self, model, tfuncs=None):        self.model = model        self.tfuncs = tfuncs or []     @torch.no_grad()    def predict(self, x, agg='mean'):        preds = []        for fn in self.tfuncs:            x_t = fn(x)            logits = self.model(x_t)            probs = F.softmax(logits, dim=1)            preds.append(probs)        stack = torch.stack(preds)        if agg == 'mean':            return stack.mean(dim=0)        if agg == 'max':            return stack.max(dim=0).values        raise ValueError('unknown agg')  def identity(x):    return x  def hflip(x):    return torch.flip(x, dims=[3])  def vflip(x):    return torch.flip(x, dims=[2])  def rot90(x):    return torch.rot90(x, k=1, dims=[2, 3])  def main():    torch.manual_seed(42)    model = SimpleCNN(num_classes=3)    model.eval()    x = torch.randn(2, 1, 32, 32)    tta = TTAWrapper(model, [identity, hflip, vflip, rot90])    probs = tta.predict(x)    print('融合后的概率分布:')    print(probs)    print('最终预测类别:', probs.argmax(dim=1).tolist())    print('概率和(每行应=1):', probs.sum(dim=1).tolist())  if __name__ == '__main__':    main()
目的:实现一个完整的 TTA 推理封装——对输入 batch 依次施加原图、水平翻转、垂直翻转、旋转 90 度四种视角,把各自的预测概率平均融合,输出最终分类结果。
  1. for fn in self.tfuncs:遍历每种变换工具,相当于安排不同的验房手段。
  2. x_t = fn(x)对同一批图像施加一种变换,生成“新视角”副本。
  3. logits = self.model(x_t)模型对副本做一次前向推理,得到原始得分。
  4. probs = F.softmax(logits, dim=1)把得分转成每类概率,方便后续融合。
  5. preds.append(probs)把该副本的概率结果收集到列表。
  6. stack = torch.stack(preds)将所有副本概率堆叠成一个新张量。
  7. return stack.mean(dim=0)沿副本维度取平均,这就是 TTA 的核心融合。
  8. model.eval()切换推理模式,关闭 Dropout 等训练时行为。
  9. probs.argmax(dim=1)取概率最大的类别作为最终预测标签。

常见误区

误区很多初学者以为 TTA 属于训练流程,训练时把增强开大一点、多跑几个 epoch,就等于做了 TTA。

正解训练时的数据增强是让模型“见多识广”、防止过拟合;TTA 是推理阶段对输入做变换并融合预测,用来降低单次视角偏差。两者目标不同、阶段不同,不能互相替代。训练增强做得再多,推理时依然只看了图片一眼;只有推理时多变换几次,预测才更稳。

为何常见:两者都叫“增强”,名字过于相似,加上训练代码里增强写得多,让人误以为是一回事。

误区看到别人用 TTA 在竞赛里提了分,就盲目堆 8 种变换,结果测试集反而掉点。

正解TTA 的前提是变换不破坏语义,且模型对该变换敏感度适中。对文字识别做翻转、对 BatchNorm 模型做剧烈颜色扰动,都可能引入域偏移,导致精度不升反降。正确姿势是在验证集上先评估每种变换的贡献,再决定组合。

为何常见:竞赛分享帖只展示成功案例,很少展示 TTA 失效的边界条件,容易让人产生“万能”错觉。

误区认为 TTA 就是把几次 softmax 概率相加除以次数,没有其他玩法。

正解融合方式很多样:可以先平均 logit 再过 softmax(保留更多信息)、可以按置信度或验证集准确率加权平均、也可以做硬投票。不同任务适合不同融合方式,logit 平均在不少分类任务上优于概率平均。

为何常见:入门教程大多只演示最简单的概率平均,覆盖面窄,容易让人形成单一认知。

误区模型准确率很低,认为加上 TTA 就能“救回来”几个点。

正解TTA 本质是减小预测方差、抵消单次视角的偶然误差;如果模型整体能力不足(偏差大),多视角平均也只是把“稳定的错误”平均出来,收益十分有限。先把模型训练到位,再谈 TTA 锦上添花。

为何常见:人们习惯把“提升精度”归功于某个技巧,却忽略了精度瓶颈到底来自偏差还是方差。

面试题

Q1. TTA 在哪个阶段执行?

单选题 · easy

  • A.模型训练开始时
  • B.模型训练过程中
  • C.模型推理阶段← 正确答案
  • D.数据标注过程中

答案:C。TTA 全称 Test-Time Augmentation,Test-Time 就是测试/推理期。它只对输入做变换并融合预测,不改训练过程,也不涉及数据标注。就像验房发生在看房阶段,而不是建房阶段。

Q2. 下列哪项不属于常见 TTA 变换?

单选题 · easy

  • A.水平翻转图像
  • B.垂直翻转图像
  • C.调整图像亮度
  • D.增加网络层数← 正确答案

答案:D。增加网络层数属于模型结构修改,不是对输入图像的变换。TTA 的变换对象是输入样本,包括翻转、旋转、缩放、颜色调整等;模型结构在 TTA 中始终保持不变。

Q3. TTA 融合最常用的策略是?

单选题 · mid

  • A.选择最大概率项
  • B.对概率取平均加权← 正确答案
  • C.只保留第一次预测
  • D.随机挑一个结果

答案:B。TTA 的经典融合是平均各副本的预测概率,必要时按权重加权。选择单个最大概率或随机挑选都浪费了多视角信息,只保留第一次预测等于没做 TTA。平均就像综合多份验房报告,而不是只信其中一份。

Q4. 使用 N 个变换副本推理后,耗时大约为?

单选题 · mid

  • A.与原来完全一样
  • B.缩短为原来的N分之一
  • C.增加到原来的N加一倍← 正确答案
  • D.增加到原来的N倍

答案:C。每张图除原图外还有 N 个副本,共 1+N 份输入,所以推理耗时约为原来的 N+1 倍(“增加到原来的N加一倍”即 1+N 倍)。TTA 的精度收益正是用这份额外计算量换来的。

Q5. 关于 TTA 的核心原理理解正确的是?

单选题 · mid

  • A.增强训练数据多样性
  • B.减少模型参数量
  • C.综合多视角预测结果← 正确答案
  • D.加快模型推理速度

答案:C。TTA 在推理时生成多个变换副本、分别预测再融合,本质是综合多视角减少单次预测的偶然误差。它不改变训练数据和模型参数量,反而因多次前向增加了推理耗时。

Q6. 下列任务中适合使用 TTA 的有?

多选题 · easy

  • A.图像分类任务← 正确答案
  • B.语义分割任务← 正确答案
  • C.目标检测任务← 正确答案
  • D.数据库索引优化

答案:ABC。TTA 广泛应用于图像分类、语义分割、目标检测等视觉任务,按需对输入做翻转、缩放并融合预测。数据库索引优化与图像推理无关,不属于 TTA 的适用场景。

Q7. 推理时 BatchNorm 层默认使用?

单选题 · hard

  • A.当前批量统计量
  • B.训练累积全局统计量← 正确答案
  • C.全部置为一的计算值
  • D.随机生成的噪声统计量

答案:B。eval 模式下的 BN 层使用训练阶段移动平均得到的全局统计量进行归一化。这会导致 TTA 变换副本的分布与训练分布不一致时输出不稳定;而 LayerNorm 等结构没有该问题,对 TTA 更友好。

Q8. 在 logit 空间做平均的好处是?

单选题 · hard

  • A.完全绕过所有模型计算
  • B.避免概率饱和信息损失← 正确答案
  • C.让模型输出更随机混乱
  • D.直接缩小模型的体积

答案:B。softmax 会把 logit 压成近乎 one-hot 的极端分布,概率平均容易丢失细微差异。先平均 logit 再做 softmax 保留了更多类别间相对信息,在不少任务上效果更好。它不能绕过模型计算,也与模型体积无关。

Q9. 关于 TTA 的局限性描述正确的有?

多选题 · hard

  • A.推理时间成倍增加← 正确答案
  • B.无脑使用可能不升反降← 正确答案
  • C.不能修正模型偏差← 正确答案
  • D.不需要任何计算代价

答案:ABC。TTA 增加推理时间,这是明确的代价;变换选择不当或模型 BN 统计量不匹配时精度可能下降;它属于方差优化手段,不能修正模型本身的欠拟合偏差。因此 A、B、C 正确,D 错误。

Q10. 哪种结构对 TTA 变换最友好?

单选题 · extreme

  • A.带批归一化的卷积网络
  • B.带层归一化的注意力模型← 正确答案
  • C.带批归一化的全连接网络
  • D.带实例归一化的循环网络

答案:B。LayerNorm 不依赖 batch 统计量,对单样本推理和变换后的分布偏移更鲁棒,因此 ViT 这类注意力模型做 TTA 通常更稳定。BN 结构在 eval 模式下依赖训练集全局统计量,变换副本可能造成分布失配,故 A、C 不友好;循环网络也非视觉 TTA 主流结构。