本节摘要:交叉熵把分割当像素分类,Dice 直接盯重叠。像素准确率在背景巨大时会说谎,交并比与 Dice 才接近第 1.3 节的伤害。优化器把梯度变成更新,学习率过大边界会抖,过小则在多数类里磨洋工。损失是训练看的,指标是验收看的,两者口径必须写清是否含背景、是否忽略空类。
阅读完本节,你应当能够:
多类交叉熵:每个像素一张类别彩票,惩罚概率没分给真类。实现简单,和分类头天然一对。问题是像素数被背景支配,模型预测全背景也能让平均交叉熵看起来还行。类别权重按第 2.4 节的占比取反比,能把病灶像素的声音放大。忽略 id 必须排除,否则 255 会当一类。
二值交叉熵配 Sigmoid,适合单前景。原文简化 U-Net 就用它。多类不要把多个 Sigmoid 当互斥分类,除非真的允许一像素多标签(极少见)。互斥用 Softmax 加交叉熵。
Dice 损失看重叠:二倍交比上两面积之和。前景小的时候,它直接打在重叠上,比交叉熵痛。平滑项避免空前景除零。多类可对每类算 Dice 再平均,是否含背景要与验证指标一致——含背景会让分数虚高。
实践里二者相加很常见:交叉熵管分类校准,Dice 管重叠。权重从 1:1 试起。不要同时开五种区域损失却不消融,你将不知道是谁在干活。
# 概念:Dice 在批次与类别上平均,eps 防除零 inter = (prob * target).sum(dim=(0, 2, 3)) union = prob.sum(dim=(0, 2, 3)) + target.sum(dim=(0, 2, 3)) dice = (2 * inter + eps) / (union + eps) loss_dice = 1 - dice.mean()
像素准确率:对的格子除以总格子。原文列它为常用,但第 1.3 节已说明它容易被背景灌满。交并比:交除并以,一类一个,再宏平均成 mIoU。Dice 与交并比单调相关,Dice 更看重叠。精确率召回率 F1 在缺陷像素级可用,但要声明按像素还是按条缺陷。
空类:某张验证图没有「火车」这一类时,该类交并比是 0/0。惯例是跳过或记为 1(都没有就算对)。两种惯例数字不同,脚本注释必须写死。公开论文数字不要抄进合同,口径不同。
| 量 | 训练损失里用 | 报告里用 | 小心 |
|---|---|---|---|
| 交叉熵 | 常用 | 很少单独当门槛 | 被背景淹没 |
| Dice 损失 | 小前景常用 | Dice 系数作门槛 | 是否含背景 |
| 像素准确率 | 可监控 | 不宜当唯一门槛 | 说谎 |
| mIoU | 可监控 | 语义分割主流 | 空类口径 |
| 精确召回 | 少直接当损失 | 质检分级 | 像素还是实例 |
⚠️ 常见坑:训练用含背景的 Dice,报告用不含背景的 mIoU,还抱怨「训练很好验收很差」。
💡 关键直觉:损失是给优化器的耳朵,指标是给产品的尺子。耳朵和尺子量的不是同一寸,人会疯。
随机梯度下降加动量,方向稳,微调分类骨干时很多人喜欢小学习率的它。Adam 自适应每维学习率,从头训小分割网省心,原文示例用它。AdamW 把权重衰减解耦,长期训练更干净。学习率过大:损失 NaN 或震荡;过小:交叉熵微降、Dice 不动,像在磨背景。
策略:按步衰减、余弦、有热身。分割验证曲线常抖,因为小批次里偶尔没有少数类。用滑动平均或更大验证批次看趋势。早停看验证 Dice 或 mIoU,不看训练交叉熵。
反向传播本身就是链式求导。分割图大,梯度在浅层可能变小。检查有没有把损失在像素维求了两次平均,导致有效学习率极小。梯度裁剪防止偶发 NaN。冻结骨干前几层,先训头,再整体解冻,是接预训练的稳妥顺序。

第 5 章换网络不换这套损失与指标,除非实例任务加上框损失与掩码损失(Mask R-CNN 那一节)。第 6 章早停、类别权重、难例挖掘都是在本节旋钮上加调度。把评估函数写成与训练无关的纯函数,训练脚本和上线回归测试共用,避免两套 IoU。
优化器不是个性选择。没有预训练、数据少、网小,Adam 起步快。已有在大数据上训好的骨干,小学习率加动量往往更不把预训练冲坏。记录学习率、有效批次、是否冻结,比记录「用了哪种时髦优化器名字」更有复现价值。
训练 Dice 是否含背景、报告 mIoU 是否含背景、空类是跳过还是记 1、是按图宏平均还是先堆像素。四项写成四行贴在显示器边。有人改评估函数忘改训练监控,曲线会「突然变好」。版本管理评估函数,和管模型权重一样严。
类别权重:频率的倒数再开方,往往比直接倒数温和,避免极稀类梯度爆炸。权重上限封顶。缺陷按等级拆类后,致命类权重大于外观类,这是伤害函数,不是统计函数。统计只提供初值。
学习率与有效批次耦合。批次减半,有人把学习率也减,有人用累积保持有效批次不变。分割里我优先保持有效批次,方便对比。Adam 的默认动量参数多数时候别乱拧,先拧学习率。SGD 微调骨干时动量 0.9 常见。余弦到接近零后继续训,可能在噪声上爬,早停更重要。
类别极不平衡且交叉熵加 Dice 仍前景灭,可以试。先不要和五种区域损失一起上。每次只加一种,看少数类召回。上了就写进配置,评估口径不变。
原文列的 PA、IoU、Dice、精确、召回、F1,全部可以算,但签字只选与伤害匹配的一两个。质检条级 F1 依赖连通域,后处理核一变数字就变,所以先冻后处理再报条级。医学体积误差有时比 Dice 更贴近医生,体积从掩码像素计数来,分辨率契约又回来了。
训练 Dice 含不含背景、报告 mIoU 含不含背景、空类跳过还是记 1、按图平均还是堆像素。改评估函数要改版本。类别权重用频率开方倒数并封顶,伤害与统计冲突听伤害。Adam 起步、微调骨干用更小学习率加动量。早停看验证重叠。
Focal 只在交叉熵加 Dice 仍前景灭时单加一种。条级 F1 依赖连通域,先冻后处理再报。体积误差把像素换成物理单位,分辨率契约必须在。两次平均损失会导致有效学习率极小,像学不动。梯度裁剪防偶发 NaN。评估纯函数训练与报告共用,禁止两套 IoU。
四行口径改则升版本。权重开方封顶,听伤害。早停看验证重叠。两次平均会让有效学习率塌掉。条级指标冻后处理。体积换物理单位。评估函数共用。Adam 与微调骨干的学习率不要抄同一数字。空类跳过还是记 1 必须在函数注释第一行,评审只看这一行就能判断两份报告能否对比。
口径四行做成评估函数的关键字参数,默认值与契约文件一致。改默认必须升版本。权重表引用验收卡日期。早停监控字段名与报告字段名同一字符串。损失实现禁止像素维平均两次,单测用已知全对掩码损失应接近零。条级指标函数拒绝在后处理未冻时调用。物理单位换算因子进契约。共用评估包禁止复制。空类策略注释第一行。Adam 与骨干学习率两个键。Focal 开关默认关。签字指标列表在契约「sign_metrics」字段,像素准确率可以算但不进该列表。有人把准确率加进签字,评审打回。体积误差与 Dice 同时报时声明是否含同一忽略。
反例档案:训练含背景 Dice,报告不含,两边吵架。关键字参数与契约默认绑死后消停。第二份:损失平均两次,看起来学不动,其实学习率被除小。全对掩码单测接近零抓住它。准确率进签字列表被评审打回。空类策略第一行注释成为对比两份报告的钥匙。
口令卡:四行关键字、权重引卡片、早停同名字、禁止两次平均、全对近零单测、条级冻后处理、物理因子进契约、sign_metrics 不含准确率、空类第一行、Focal 默认关。Adam 与骨干两键。忽略口径与体积同声明。
提交门禁:全对掩码损失近零、无两次平均、sign_metrics 无准确率、空类注释存在、权重表有卡片日期、早停字段名与报告相同。条级调用检查后处理冻结标志。Focal 关。物理因子在契约。两套 IoU 文件搜索应为零。口径版本与评估包同一发布。
全对掩码损失不近零,评估包不准发布。两次平均单测失败不准发布。签字指标含准确率不准发布。空类策略无第一行注释不准发布。权重表无验收卡日期不准发布。早停字段与报告字段字符串不同不准发布。仓库里出现两套 IoU 实现不准发布。Focal 默认必须关闭。物理单位因子必须在契约。
现场抽问:全对损失近零吗?两次平均单测过了吗?签字有没有准确率?空类第一行在吗?权重日期对得上卡片吗?早停名字和报告一样吗?仓库有几套 IoU?Focal 默认关了吗?物理因子在契约哪一键?
失败演练己:签字列表塞进准确率,应打回。两套 IoU 文件并存,应打回。全对损失不近零仍发布评估包,应打回。早停字段改名未改报告,应打回。权重表没卡片日期,应打回。Focal 默认开,应打回。
打回条件自动化:准确率进签字、双 IoU、全对不近零、字段改名、无日期、Focal 默认开。评估包发布前跑这张表。
评估包发布前必须跑打回表。表不过,报告里的交并比一律视为未校准口径,不得进合同附件。
损失与验收指标不是同一个函数。交叉熵好训,Dice 好看,合同写哪把尺子,验证曲线就必须画哪把。类别权重来自试标直方图,不来自经验系数。优化器先用稳定默认,曲线不降先查标签与学习率数量级,再换自适应算法。早停盯验证 Dice,不盯训练损失,关早停的实验作废不得进周报。
下一章把玩具头换成 FCN、U-Net、DeepLab、Mask R-CNN 和提示模型,环与损失继续用本章的。