训练完全指南:原理、源码与配置实战)
人工智能计算机视觉预训练【免费下载链接】PaddleSegEasy-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点击查看免费下载在语义分割训练中多个损失函数叠加是提升精度的常用手段例如将CrossEntropyLoss与LovaszSoftmaxLoss组合使用。但在 PaddleSeg 的早期设计中每一个损失函数只能对应网络的一个 logit 输出——如果希望同一个网络输出同时被多种损失函数约束就必须修改网络代码。MixedLoss正是为解决这一痛点而生的通用损失包装器它允许将多个损失函数以模块化方式装入同一个类对多个损失结果进行加权计算从而在不改动任何网络结构的前提下实现混合损失训练。读完本文你将掌握MixedLoss的设计动机、源码级实现原理、YAML 配置文件写法以及它在单输出/多输出模型中的两种典型配置范式并了解它与训练主循环、配置校验器之间的底层联动关系。一、为什么需要 MixedLoss单一 logit 与多损失之间的矛盾PaddleSeg 的训练主循环遵循一个网络输出对应一个损失函数的映射约定。在 训练核心代码 的loss_computation中会先通过check_logits_losses强制校验len_logits len(logits_list) len_losses len(losses[types]) if len_logits ! len_losses: raise RuntimeError( The length of logits_list should equal to the types of loss config: {} ! {}. .format(len_logits, len_losses))也就是说模型输出的个数必须与loss.types中损失类的个数严格一致。这带来一个直接限制如果某个网络如单头的 DeepLabV3、PPMobileSeg只有一个输出却希望同时用交叉熵 Lovasz Softmax 两种损失约束它常规配置是无法直接表达的——除非修改网络代码新增一个输出分支。MixedLoss通过损失组合器的思路绕开了这一限制它把多个损失函数封装成一个整体对外仍然表现为一个损失类占用loss.types中的一个槽位内部则对每个子损失的结果乘以权重并逐项返回。网络代码因此完全不需要改动。二、源码级解析MixedLoss 的实现与约束MixedLoss的实现位于 paddleseg/models/losses/mixed_loss.py并注册进全局损失管理器。其核心代码如下manager.LOSSES.add_component class MixedLoss(nn.Layer): Weighted computations for multiple Loss. The advantage is that mixed loss training can be achieved without changing the networking code. def __init__(self, losses, coef): super(MixedLoss, self).__init__() if not isinstance(losses, list): raise TypeError(losses must be a list!) if not isinstance(coef, list): raise TypeError(coef must be a list!) len_losses len(losses) len_coef len(coef) if len_losses ! len_coef: raise ValueError( The length of losses should equal to coef, but they are {} and {}. .format(len_losses, len_coef)) self.losses losses self.coef coef def forward(self, logits, labels): loss_list [] for i, loss in enumerate(self.losses): output loss(logits, labels) loss_list.append(output * self.coef[i]) return loss_list2.1 类签名与参数class paddleseg.models.losses.MixedLoss(losses, coef)参数类型含义losseslist of nn.Layer由多个损失函数类组成的列表例如[CrossEntropyLoss(), LovaszSoftmaxLoss()]coeflist of float/int每个损失函数对应的权重比列表长度必须与losses一致需要特别注意一个细节原文档将coef描述为float|int这是指列表内每个元素的类型从源码看coef本身必须是一个list。构造时若传入单个标量会直接抛出TypeError(coefmust be a list!)。2.2 三大构造约束__init__中内置了三道防御性校验这是使用中高频踩坑点losses必须是 list否则抛TypeErrorcoef必须是 list否则抛TypeError两者长度必须相等否则抛ValueError并明确指出实际的长度数值。2.3 前向计算加权后逐项返回forward(logits, labels)的逻辑非常简洁遍历self.losses对每个子损失调用loss(logits, labels)得到标量损失再乘以对应权重self.coef[i]最后以一个损失列表loss_list的形式返回而非返回单一加总标量。这一点决定了它和训练主循环的配合方式MixedLoss返回的列表会被外层训练逻辑逐项取出、各自参与反向传播累加见下文第三节因此权重既可以在MixedLoss内部施加也可以由外层配置的coef再次加权。2.4 注册机制如何被 YAML 识别MixedLoss类上方标注了manager.LOSSES.add_component装饰器。在 paddleseg/cvlibs/manager.py 中LOSSES ComponentManager(losses)是全局损失组件管理器add_component以类的__name__即字符串MixedLoss为键注册。因此配置文件中type: MixedLoss的字符串才能被build_component反查并实例化。这也意味着只要自定义损失类同样用该装饰器注册就可以无缝嵌入MixedLoss的losses列表。三、配置文件实战两种典型用法MixedLoss完全通过 YAML 的loss字段声明无需任何 Python 代码改动。配置文件约定位于 configs 目录官方给出一致的两层结构loss: types: - type: MixedLoss losses: - type: CrossEntropyLoss - type: LovaszSoftmaxLoss coef: [0.8, 0.2] coef: [1]3.1 范式一单输出模型叠加多种损失以官方配置 pp_mobileseg_base_ade20k_512x512_80k.yml 为例loss: types: - type: MixedLoss losses: - type: CrossEntropyLoss - type: LovaszSoftmaxLoss coef: [0.8, 0.2] coef: [1]这里的模型PPMobileSeg只有一个主输出loss.types中也只有一个MixedLoss条目满足输出个数 损失类型个数的校验。语义是总损失 1.0 ×0.8 × 交叉熵 0.2 × Lovasz Softmax。外层coef: [1]是损失总权重一般保持[1]即可。3.2 范式二多输出模型逐输出混合以 ocrnet_hrnetw18_cityscapes_1024x512_160k_lovasz_softmax.yml 为例OCRNet 有两个 logit 输出主输出与辅助输出因此配置中出现了两个MixedLoss条目loss: types: - type: MixedLoss losses: - type: CrossEntropyLoss - type: LovaszSoftmaxLoss coef: [0.8, 0.2] - type: MixedLoss losses: - type: CrossEntropyLoss - type: LovaszSoftmaxLoss coef: [0.8, 0.2] coef: [1, 0.4]外层coef: [1, 0.4]分别对应主输出与辅助输出的总权重辅助输出通常权重更低。同一模式还出现在 mscale_ocrnet_hrnetv2_psa_cityscapes_1024x2048_150k.yml、deeplabv3p_resnet50_os8_cityscapes_1024x512_80k_rmiloss.ymlRMI Loss 混合以及fastscnn/ocrnet的 SCL 系列配置中说明这是 PaddleSeg 混合损失的标准写法。3.3 配置校验器的隐式补齐规则在 paddleseg/cvlibs/config_checker.py 的DefaultLossRule中除了强制要求loss必须同时包含types与coef两个键外还内置了一条隐式补齐规则if len_types ! len_coef: if len_types 1: loss_cfg[types] loss_cfg[types] * len_coef else: raise ValueError(...)即当types只有 1 个而coef有多个时校验器会自动把该损失类型复制多份以对齐输出数但若types数量大于 1 且与coef不等则直接报错。这解释了为什么单输出模型也可以写成types一项 coef: [1, 0.4]的形式。四、与训练主循环的联动损失如何真正生效MixedLoss并非独立生效它与 训练核心 的loss_computation存在专用分支。当某个损失类名为MixedLoss时elif loss_i.__class__.__name__ MixedLoss: mixed_loss_list loss_i(logits, labels) for mixed_loss in mixed_loss_list: loss_list.append(coef_i * mixed_loss)可以看到两条关键链路外层coef_i与内层权重是相乘关系MixedLoss.forward内部已乘以coef[i]返回列表后外层再乘以该输出对应的总权重coef_i例如 OCRNet 例子中的1或0.4列表逐项展开MixedLoss返回的每个加权子损失都会被展开追加到总loss_list最终由训练循环统一求和并反向传播因此不需要修改train.py即可生效。此外在配置构建阶段paddleseg/cvlibs/builder.py 的_build_loss会针对MixedLoss做一层特殊处理当模型使用内置数据集类非通用Dataset/SegDataset时会自动把数据集的IGNORE_INDEX同步进MixedLoss内部的每一个子损失配置确保混合损失中所有子损失的ignore_index一致。这意味着如果你在MixedLoss内嵌套了多个损失它们的ignore_index应保持一致否则可能触发校验断言。五、纯 Python 调用方式除了 YAML 配置MixedLoss也可以像普通nn.Layer一样在代码中直接组装import paddle from paddleseg.models.losses import MixedLoss, CrossEntropyLoss, LovaszSoftmaxLoss mixed_loss MixedLoss( losses[CrossEntropyLoss(), LovaszSoftmaxLoss()], coef[0.8, 0.2], ) logits paddle.randn([2, 19, 512, 512]) # 模拟网络输出 labels paddle.randint(0, 19, [2, 512, 512]) loss_list mixed_loss(logits, labels) # 返回 [0.8 * ce, 0.2 * lovasz]调用后返回的是加权后的损失列表你可自行决定是求和、取平均还是逐项用于多阶段反传。六、使用注意事项与常见错误losses与coef长度不匹配这是最高频错误。例如给 3 个损失只配 2 个权重会在构造阶段直接抛ValueError且报错信息中会同时打印两者的实际长度便于快速定位。coef误传为标量MixedLoss(losses[...], coef0.8)会抛TypeError必须写成coef[0.8]。子损失的ignore_index一致性_build_loss会自动用数据集的IGNORE_INDEX覆盖并校验每个子损失手动在子损失里写不同的ignore_index会触发断言失败。多输出模型务必逐输出配置当模型有多个 logit 输出时loss.types中需要为每个输出准备一个损失条目可以是多个MixedLoss外层coef与输出一一对应数量对不上时训练会在第一步就抛出RuntimeError。权重语义内层coef决定同一输出上多个损失的相对权重外层coef决定不同输出之间的相对权重两者是相乘关系不要混淆。七、更多相关资源全部损失函数索引docs/module/loss/losses_cn.md常用于组合的损失文档CrossEntropyLoss、LovaszSoftmaxLoss、DiceLoss、OhemCrossEntropyLoss、BCELoss官方混合损失配置示例configs/pp_mobileseg/pp_mobileseg_base_ade20k_512x512_80k.yml、configs/ocrnet/ocrnet_hrnetw18_cityscapes_1024x512_160k_lovasz_softmax.yml混合损失在医疗分割中的扩展实现带 deep supervision 支持contrib/MedicalSeg/medicalseg/models/losses/mixes_losses.py总体而言MixedLoss用最小的侵入代价解决了一输出多损失的配置难题对外它只是一个普通损失组件对内它完成了子损失实例化、加权与列表化返回配合训练主循环的专用分支与配置校验器的自动补齐规则构成了 PaddleSeg 中可组合、可扩展的混合损失训练基础设施。赞分享人工智能计算机视觉预训练【免费下载链接】PaddleSegEasy-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 损失函数 API 实战Lovasz-Softmax、Lovasz-Hinge 与 MixedLoss 源码级详解与配置指南PaddleSeg 损失函数 API 实战Lovasz Softmax、Lovasz Hinge 与 MixedLoss 源码级详解与配置指南 PaddleS人工智能计算机视觉预训练TVBoxOSC终极指南如何用安卓手机打造智能电视控制中心TVBoxOSC终极指南如何用安卓手机打造智能电视控制中心 TVBoxOSC是一个基于开源代码库构建的电视盒子智能控制解决方案。通过这款工具用户可以将安卓人工智能计算机视觉预训练SuperGradients 损失函数Loss完全指南内置损失、自定义损失与配置化训练SuperGradients 损失函数Loss完全指南内置损失、自定义损失与配置化训练 导读 在 SuperGradients 中损失函数Loss是深度学习计算机视觉预训练人工智能上一篇Rive渲染器终极指南打造跨平台交互式动画的完全教程下一篇SVG Wave 终极指南如何用这个免费工具快速制作惊艳的网页动态背景创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考