如何绘制learning rate与Loss的关系图以选取最优学习率
学习率-Loss关系可视化及最优学习率查找实现方案
1. 提取训练过程的对应数据
你定义的全局列表l_rates已经存储了每轮训练对应的学习率,model.fit()返回的历史对象中存储了每轮的训练损失,直接提取即可:
import matplotlib.pyplot as plt import numpy as np # 提取损失序列与对应学习率序列 loss_list = learning_rate_history.history['loss'] lr_list = l_rates
2. 绘制学习率-损失关系图
由于学习率是指数级增长的,使用对数X轴能更清晰展示拐点位置:
plt.figure(figsize=(10, 6)) # 对数X轴适配指数变化的学习率 plt.semilogx(lr_list, loss_list) plt.xlabel('学习率(对数刻度)') plt.ylabel('损失值Loss') plt.title('学习率与损失对应关系') plt.grid(True) plt.show()
绘制完成后肉眼即可定位损失从下降转为上升的拐点,对应X轴数值就是候选最优学习率。
3. 自动计算拐点最优学习率
如果需要代码自动定位拐点,可通过计算损失的梯度找到损失由降转升的位置:
# 计算损失序列的梯度 loss_gradient = np.gradient(loss_list) # 找到梯度首次转正的位置(损失首次从下降转为上升) inflection_point_index = np.argmax(loss_gradient > 0) best_lr = lr_list[inflection_point_index] print(f"拐点对应的最优学习率为:{best_lr}")
实际训练时建议取该最优学习率的1/10作为正式训练的初始学习率,泛化稳定性更好。
注意事项
- 如果训练数据噪声大导致损失曲线波动明显,可先对损失序列做滑动平均后再计算拐点,避免误判
- 你当前的学习率调度器逻辑符合学习率范围测试的需求,无需调整,500轮训练刚好将学习率放大1e6倍,覆盖了常规的学习率搜索区间
内容的提问来源于stack exchange,提问作者Adarsh Singh
相关产品推荐
相关产品推荐

