PaddlePaddle 模型训练技巧
一、损失函数使用权重
损失函数中,针对不同类别使用不同的权重,可以有效解决数据类别不均衡的问题。语义分割常见的损失函数,比如 CrossEntropyLoss 和 DiceLoss,都支持设置权重。
举例如下,如果背景和前景像素分别标注为 0 和 1,则可以在 CrossEntropyLoss 字段中设置 weight,分别表示对应下标类别的权重大小。注意,weight 的长度需要等于类别数。coef 是损失函数外部参数。
loss:types:- type: CrossEntropyLossweight: [0.2, 0.8]coef: [1]
二、模型 Backbone 和 Head 使用不同的学习率
很多分割模型 Backbone 是加载大规模数据集上预训练的权重,所以 Backbone 模块的学习率可以比 Head 模块的学习率更小一些。在 optimizer 配置字段中设置 backbone_lr_mult,可以设置模型 Backbone 和Head 使用不同学习率。举例如下,backbone 模块的学习率是 learning_rate * backbone_lr_mult,其他模块的学习率是 learning_rate。
optimizer:type: sgdmomentum: 0.9weight_decay: 4.0e-5backbone_lr_mult: 0.1lr_scheduler:type: PolynomialDecaylearning_rate: 0.01end_lr: 0power: 0.9
三、线性学习率热身 Warmup
线性学习率热身 (Warmup) 是对学习率进行初步调整,在正常调整学习率之前,先从小逐步增大学习率。在 lr_scheduler 配置字段中设置 warmup_iters 和 warmup_start_lr,开启线性学习率热身 Warmup。warmup_iters 表示 Warmup 的轮数,warmup_start_lr 表示最开始学习率,更多信息请参考文档。
lr_scheduler:type: PolynomialDecaylearning_rate: 0.01end_lr: 0power: 0.9warmup_iters: 1500warmup_start_lr: 1.0e-6