☰
PaddleSeg 模型训练技巧:损失权重、Backbone/Head 分层学习率与线性 Warmup 实战指南
2026/9/27 23:48:43 网站建设 项目流程
  • 人工智能
  • 计算机视觉
  • 预训练

【免费下载链接】PaddleSeg

Easy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleSeg
点击查看免费下载

本指南围绕 PaddleSeg(基于飞桨的端到端图像分割开发套件)的三大高频训练技巧展开:通过损失函数类别权重缓解类别不均衡、通过 Backbone 与 Head 分层学习率适配预训练微调、通过线性学习率热身(Warmup)稳定训练早期阶段。读完本文,你将掌握这三类技巧在 PaddleSeg 配置文件中的标准写法、底层生效原理,以及如何将它们组合应用到实际分割模型训练中。

一、损失函数类别权重:解决数据类别不均衡

在语义分割任务中,不同类别的像素数量往往差异悬殊(例如道路、天空等背景像素远多于小型前景目标)。若不加以处理,模型会倾向于把大量像素预测为高频类别,导致小目标类别精度低下。针对不同类别在损失函数中使用不同权重,是缓解类别不均衡最直接有效的手段之一。

PaddleSeg 中常见的语义分割损失函数,如CrossEntropyLoss和DiceLoss,都原生支持设置权重。

1.1 配置示例

假设背景和前景像素的标注值分别为 0 和 1,我们希望在损失中提高前景的贡献,可在loss配置的CrossEntropyLoss字段中设置weight,列表中下标与类别标注值一一对应,分别表示对应类别损失项的权重大小:

loss: types: - type: CrossEntropyLoss weight: [0.2, 0.8] coef: [1]

其中coef: [1]表示该损失项在总损失中的系数。特别注意:weight的长度必须等于类别数,否则训练启动时会直接报错。

1.2 源码级校验:weight 如何生效

查看 paddleseg/models/losses/cross_entropy_loss.py 的实现:CrossEntropyLoss.__init__接收weight参数(类型为tuple|list|ndarray|Tensor,默认None),非空时会被转换为float32的 Tensor;在前向计算中,若weight非空且其长度与 logit 的类别维度(NCHW 下的通道数)不一致,会抛出ValueError——这正是"权重长度必须等于类别数"约束的源码出处。

此外,CrossEntropyLoss还支持ignore_index(默认 255,指定忽略的标注值)、top_k_percent_pixels(默认 1.0,取值 [0.0, 1.0],小于 1.0 时仅对损失最高的前 k% 像素计算,用于困难样本挖掘)、avg_non_ignore(是否只对非忽略像素求平均)等参数,可在类别权重基础上进一步精细化训练策略。

DiceLoss同样支持权重。查看 paddleseg/models/losses/dice_loss.py:其__init__接收weight=None, ignore_index=255, smooth=1.0;前向计算中会断言num_class == len(self.weight),然后对每个类别分别计算 Dice 损失并乘以对应权重后取平均。因此权重写法与CrossEntropyLoss完全一致:

loss: types: - type: DiceLoss weight: [0.2, 0.8] coef: [1]

1.3 真实场景:多类别 Cityscapes 权重

仓库中的真实配置可以直接参考。以 configs/espnet/espnet_cityscapes_1024x512_120k.yml 为例,Cityscapes 共 19 个类别,配置中给出了一个完整的 19 维权重列表:

loss: types: - type: CrossEntropyLoss weight: [2.79834108, 6.92945723, 3.84068512, 9.94349362, 9.77098823, 9.51484, 10.30981624, 9.94307377, 4.64933892, 9.55759938, 7.86692178, 9.53126629, 10.3496365, 6.67234062, 10.26054204, 10.28785275, 10.28988296, 10.40546021, 10.13848367] coef: [1]

可以看到,对小类别(如摩托车、火车、卡车等)赋予了远高于常见类别的权重,这正是利用类别频率的倒数(或归一化后)作为权重的典型做法。configs/hrformer/ocrnet_hrformer_base_cityscapes_1024x512_80k.yml 中同样使用了带权重的CrossEntropyLoss。

实操建议:类别权重可以从训练集各类别像素占比的倒数归一化而来;weight列表的下标必须与数据集num_classes及标注值严格对应。

二、Backbone 与 Head 分层学习率

多数分割模型(如 HRNet、ResNet 系列)的 Backbone 会加载在 ImageNet 等大规模数据集上预训练的权重,其参数已具备良好的通用特征提取能力;而 Head 等模块是从零开始训练的。因此,Backbone 应使用更小的学习率进行"微调",Head 则可使用较大学习率快速收敛——这就是"Backbone 与 Head 使用不同学习率"技巧的动机。

2.1 文档中的配置方式

PaddleSeg 训练文档(docs/train/train_tricks_cn.md)给出的写法是在optimizer配置字段中设置backbone_lr_mult:Backbone 模块的学习率为learning_rate * backbone_lr_mult,其余模块的学习率保持为learning_rate。示例配置如下:

optimizer: type: sgd momentum: 0.9 weight_decay: 4.0e-5 backbone_lr_mult: 0.1 lr_scheduler: type: PolynomialDecay learning_rate: 0.01 end_lr: 0 power: 0.9

上例中 Backbone 实际学习率为0.01 × 0.1 = 0.001,而 Head 等模块的学习率为0.01。

2.2 当前仓库源码中的落地机制:custom_cfg + lr_mult

从当前仓库源码结构看,PaddleSeg 优化器实现分组学习率的核心机制位于 paddleseg/optimizers/optimizer.py。BaseOptimizer支持通过custom_cfg为不同参数组指定不同的学习率倍率与权重衰减倍率,其 docstring 中的示例即为:

optimizer: type: SGD weight_decay: 4.0e-5 custom_cfg: - name: backbone lr_mult: 0.1 - name: norm weight_decay_mult: 0.0 grad_clip_cfg: name: ClipGradByValue max: 1.0

_collect_params方法(paddleseg/optimizers/optimizer.py)的实现逻辑是:遍历model.named_parameters(),将参数名中包含custom_cfg中name字段的参数归入对应参数组,该组的learning_rate设置为lr_mult(默认 1.0);未被任何规则匹配的参数归入最后一组,使用全局学习率。同时,若同时指定了weight_decay_mult,该组的权重衰减为weight_decay * weight_decay_mult。因此{'name': 'backbone', 'lr_mult': 0.1}的效果与文档中的backbone_lr_mult: 0.1完全等价——Backbone 参数组的学习率 = 全局学习率 × 0.1。

需要说明的是:文档中提到的backbone_lr_mult是面向用户的概念化写法,而当前仓库optimizer的实际解析字段是custom_cfg列表中的lr_mult;在新版本配置中推荐直接使用custom_cfg写法,并可借助训练启动时打印的 "Parameter groups for optimizer" 日志核对各参数组的学习率分配是否如预期。

2.3 模型内部的分层学习率机制

除优化器层面的分组外,PaddleSeg 部分模型还在模型内部通过paddle.ParamAttr(learning_rate=...)实现"局部倍率"。例如:

  • paddleseg/models/setr.py:SETR系列通过lr_multiple(默认 10)放大 Head 部分参数的学习率,实现_param.optimize_attr['learning_rate'] = self.lr_multiple;
  • paddleseg/models/rtformer.py:RTFormer通过lr_mult(默认 10)放大 DAPPM 与 Head 模块的学习率;
  • paddleseg/models/backbones/top_transformer.py:TopTransformer骨干网络各模块的lr_mult默认为 1.0。

对应地,仓库中 TopFormer 系列配置文件将 Backbone 的学习率倍率设为 0.1,例如 configs/topformer/topformer_base_ade20k_512x512_160k.yml:

model: type: TopFormer num_classes: 150 backbone: type: TopTransformer_Base lr_mult: 0.1 pretrained: https://paddleseg.bj.bcebos.com/dygraph/backbone/topformer_base_imagenet_pretrained.zip

而 SegNeXt 等模型则给 Head 设置 10 倍的放大倍率,例如 configs/segnext/segnext_mscan_b_cityscapes_1024x1024_160k.yml 中的lr_mult: 10.0。这两类机制(优化器custom_cfg分组 / 模型内部ParamAttr倍率)可结合使用,共同实现精细的分层学习率控制。

三、线性学习率热身 Warmup

线性学习率热身(Linear Warmup)是在正常调整学习率之前,先从一个小值线性增大到初始学习率的过渡过程。训练初期模型权重随机(或刚加载预训练权重尚未稳定),过大的学习率容易导致损失震荡甚至发散;Warmup 让学习率"缓起步",帮助训练稳定进入正常节奏。

3.1 配置示例

在 PaddleSeg 中,只需在lr_scheduler配置字段中同时设置warmup_iters与warmup_start_lr即可开启线性 Warmup。warmup_iters表示 Warmup 持续的训练轮数,warmup_start_lr表示开始时的最小学习率:

lr_scheduler: type: PolynomialDecay learning_rate: 0.01 end_lr: 0 power: 0.9 warmup_iters: 1500 warmup_start_lr: 1.0e-6

在PolynomialDecay基础上叠加 Warmup 后,学习率曲线为:前 1500 轮从1.0e-6线性升至0.01,随后按多项式衰减至end_lr = 0。

3.2 源码级解析:builder 如何组装 Warmup

查看 paddleseg/cvlibs/builder.py 中lr_scheduler的构建逻辑:

  1. 若lr_cfg中存在warmup_iters,则将其与warmup_start_lr一起从配置中弹出(pop),并将end_lr取为learning_rate;
  2. 若存在warmup_iters却未设置warmup_start_lr,会触发断言"When use warmup, please set warmup_start_lr and warmup_iters in lr_scheduler"——即两个字段必须成对出现;
  3. 当调度器类型为PolynomialDecay时,其decay_steps会被自动设置为iters - warmup_iters(即实际衰减阶段迭代数 = 总迭代数减去 Warmup 迭代数,确保总迭代数不变);
  4. 最终用paddle.optimizer.lr.LinearWarmup包裹原调度器,warmup_steps=warmup_iters、start_lr=warmup_start_lr、end_lr=learning_rate,返回组合后的学习率调度器。

该机制对所有paddle.optimizer.lr下的调度器类型(PolynomialDecay、CosineAnnealingDecay、OneCycleLR等)均适用,因为LinearWarmup是飞桨提供的学习率装饰器。

3.3 真实配置中的 Warmup 参数

仓库中大量官方配置开启了 Warmup,参数值随任务规模而异:

配置文件warmup_iters总迭代 iterswarmup_start_lr
configs/lraspp/lraspp_mobilenetv3_cityscapes_1024x512_80k.yml100080000未显式设置(随 lr_scheduler 默认)
configs/topformer/topformer_base_ade20k_512x512_160k.yml15001600001.0e-6
configs/mobileseg/mobileseg_mobilenetv2_cityscapes_1024x512_80k.yml100080000未显式设置
configs/mscale_ocrnet/mscale_ocrnet_hrnetv2_psa_cityscapes_1024x2048_150k.yml5000150000未显式设置

可见 Warmup 迭代数通常取总迭代数的 1%~3% 左右,warmup_start_lr常见取值为1.0e-6量级。

实操建议:长训练(如 16 万迭代)可适当延长 Warmup 轮数;若加载了预训练权重,Warmup 轮数可适当减少。Warmup 应与lr_scheduler的其他参数配合,避免与过大初始学习率叠加造成前期震荡。

四、三技巧组合:一份完整的实战配置

三类技巧相互独立、可自由组合。下面给出一个整合了类别权重、Backbone 分层学习率与线性 Warmup 的完整训练配置骨架(以带预训练 Backbone 的模型为例):

# 数据集与模型部分(按实际任务填写) num_classes: 2 loss: types: - type: CrossEntropyLoss weight: [0.2, 0.8] # 类别权重,长度必须等于 num_classes coef: [1] optimizer: type: sgd momentum: 0.9 weight_decay: 4.0e-5 custom_cfg: # Backbone 组学习率 = learning_rate * 0.1 - name: backbone lr_mult: 0.1 lr_scheduler: type: PolynomialDecay learning_rate: 0.01 end_lr: 0 power: 0.9 warmup_iters: 1500 # 线性 Warmup 轮数 warmup_start_lr: 1.0e-6 # Warmup 起始学习率

保存该配置后,即可通过 tools/train.py 启动训练(单卡示例):

export CUDA_VISIBLE_DEVICES=0 python tools/train.py \ --config your_config.yml \ --do_eval \ --use_vdl \ --save_interval 500 \ --save_dir output

训练启动时,PaddleSeg 会打印优化器参数分组信息(各组的参数名与lr_mult),以及完整的学习率调度器配置,可据此核对上述技巧是否生效。训练流程、恢复训练与模型微调等更多基础操作,可参考 模型训练指南(英文版见 docs/train/train.md);本文介绍的配置字段的英文对照说明见 docs/train/train_tricks.md。

总结

  • 类别权重:CrossEntropyLoss/DiceLoss的weight列表按类别下标设置权重,长度必须等于类别数,是缓解类别不均衡的利器;
  • 分层学习率:通过optimizer.custom_cfg的lr_mult(或文档中的backbone_lr_mult概念)让预训练 Backbone 以小学习率微调;部分模型还支持模型内部ParamAttr级倍率;
  • 线性 Warmup:在lr_scheduler中成对设置warmup_iters与warmup_start_lr,由LinearWarmup装饰器实现平稳起步,PolynomialDecay的衰减步数会自动扣除 Warmup 轮数。

这三项技巧均为配置级改动,无需修改任何代码,可直接套用到 PaddleSeg 任意分割模型的训练配置中。

  • 人工智能
  • 计算机视觉
  • 预训练

【免费下载链接】PaddleSeg

Easy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleSeg
点击查看免费下载

相关推荐

上一篇:OpenUSD 第三方插件体系:Hydra 渲染代理与文件格式插件的构建、注册与实战
下一篇:抖音无水印批量下载教程:从单条作品到整个主页,照着这篇跑通 douyin-downloader

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询