如何让ReduceLROnPlateau在多模型训练时初始学习率一致?
问题原因与解决方法
问题根源
ReduceLROnPlateau回调会直接修改模型优化器的学习率变量(TensorFlow中为Variable类型),如果多个模型共享同一个优化器实例,或者循环中复用了上一次训练后已修改学习率的优化器,就会导致下一个模型的初始学习率继承上一次训练后的结果。
解决办法
1. 每个模型使用独立的优化器实例
在循环内为每个模型单独创建并编译优化器,确保每个模型的初始学习率都是全新的:
from tensorflow.keras.callbacks import ReduceLROnPlateau from tensorflow.keras.optimizers import Adam initial_lr = 0.01 for model in models: # 每次循环新建优化器实例 optimizer = Adam(learning_rate=initial_lr) model.compile(optimizer=optimizer, loss='你的损失函数', metrics=['你的指标']) reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=10) model.fit(dataset, epochs=10, validation_data=val_dataset, callbacks=[reduce_lr])
2. 复用模型/优化器时手动重置学习率
如果需要复用模型或优化器,在每次训练前手动将优化器的学习率重置为初始值:
from tensorflow.keras.callbacks import ReduceLROnPlateau initial_lr = 0.01 for model in models: # 重置优化器的学习率到初始值 model.optimizer.learning_rate.assign(initial_lr) reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=10) model.fit(dataset, epochs=10, validation_data=val_dataset, callbacks=[reduce_lr])
验证方法
训练时查看日志,确认每个模型的Epoch 1学习率都是你设置的初始值(比如示例中的0.01),即说明问题已解决。
内容的提问来源于stack exchange,提问作者Mateusz Dorobek
相关产品推荐
相关产品推荐

