参考文章:Bag of Tricks for Image Classification with Convolutional Neural Networks
学习率的递减:
在训练初期,我们希望以较大的学习率对模型参数进行调整,以加快训练速度;在训练末期,我们希望以较小的学习率对模型参数进行微调,以确保收敛至最优点。因此,学习率一般采用递减(多次递减/循环递减)的策略,递减方式有线性(Linear)、余弦(Cosine)、步进(Step)等。
学习率的热身:
网络在开始训练时,以一个较小的学习率经过少量的epoch后递增到设定学习率(lr0)的阶段称为热身(warm-up)阶段。warm-up策略可以解决训练初期的数值不稳定的问题和动量历史值不准确的问题。
学习率曲线:
(代码实现warm up时,实际上是将原始学习率策略的前几个epoch替换成warm up学习率策略,所以在warm up linear lr中存在一处拐点,影响不大)
代码仅实现warm-up策略和Linear、Cosine学习率策略
import numpy as np
import torch.nn as nn
from functools import partial
from torch.optim import lr_scheduler, Adam
import math
import matplotlib.pyplot as plt
def get_cosine_lr_scheduler(lr_max_ratio, lr_min_ratio, num_epochs, epoch): # 余弦学习率
return (math.cos(epoch * math.pi / (num_epochs - 1)) / 2) * (lr_max_ratio - lr_min_ratio