在Alexeyab版Darknet中实现ReduceLrOnPlateau遇学习率不更新问题
检查学习率更新的目标变量
确认你在network.c中更新的是net->learning_rate而非自定义结构体的临时变量。Darknet的detector模块默认打印的是net->learning_rate,如果你的调度逻辑只修改了reduce_lr_params->current_lr这类自定义变量,就会出现日志显示触发调整但打印旧值的情况。确保更新代码是net->learning_rate *= reduce_factor;这类直接修改网络核心变量的逻辑。核对学习率更新与打印的时机顺序
查看detector.c中打印学习率的代码(如printf("Learning Rate: %g\n", net->learning_rate);)是否在你执行ReduceLrOnPlateau逻辑之前。如果打印在前、更新在后,本次输出会是旧值,下次迭代才会显示新值。调整执行顺序,将调度检查逻辑放在打印动作之前。排查是否存在多学习率策略冲突
Alexeyab版Darknet默认带step、poly等学习率策略,检查你的配置文件是否同时启用了多个调度器。如果配置中还保留policy=step这类参数,默认调度逻辑会在你的更新后再次修改net->learning_rate,导致被覆盖。确保配置文件仅设置policy=REDUCEONPLATEAU,并在parser.c解析时禁用其他策略的初始化逻辑。验证损失记录与更新后的变量同步
在network.c中执行学习率更新后,立即添加一行printf("Updated LR: %g\n", net->learning_rate);,对比detector的打印值。如果这里输出新值但detector显示旧值,说明是打印时机或变量传递问题;如果这里也输出旧值,说明你的更新逻辑本身未生效,需检查损失判断逻辑是否正确触发了更新。确认结构体与网络实例的绑定
检查darknet.h的network结构体是否添加了reduce_lr_params rlop;成员,且初始化时正确将该结构体与当前训练的网络实例绑定。避免更新的是独立的结构体实例,而非目标网络实例的成员变量。
内容的提问来源于stack exchange,提问作者ririririri

