torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)
是 PyTorch 中的学习率调度器类之一,用于根据自定义的函数 lr_lambda
调整优化器的学习率
用法:
torch.optim.lr_scheduler.LambdaLR(optimizer,lr_lambda,last_epoch=-1)
参数说明:
optimizer
:优化器对象,例如torch.optim.SGD
或torch.optim.Adam
lr_lambda
:一个函数对象,用于计算学习率的倍率因子, 该函数接受一个整数参数last_epoch
(可选):表示最后一个训练轮数的索引,默认值为 -1,表示从零开始计数
示例:
import torch.optim as optim
import torch.optim.lr_scheduler as lr_scheduler
# 创建优化器
optimizer = optim.SGD(model.parameters(), lr=0.1)
# 定义学习率调度器的函数
def lr_lambda(epoch):
if epoch < 10:
return 0.1
else:
return 0.01
# 创建学习率调度器
scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda)
# 在训练循环中更新学习率
for epoch in range(num_epochs):
# 执行训练步骤
train(...)
# 更新学习率
scheduler.step()
在上述示例中,首先创建了一个优化器 optimizer
,然后定义了一个函数 lr_lambda
,该函数根据训练轮数 epoch
返回学习率的倍率因子
接下来,使用 lr_scheduler.LambdaLR
创建了一个学习率调度器 scheduler
,将优化器和函数 lr_lambda
作为参数传递给调度器
在训练循环中,先执行训练步骤,然后调用 scheduler.step()
来更新优化器的学习率
这样,学习率调度器会根据函数 lr_lambda
的返回值自动调整优化器的学习率
在示例中,前 10 轮训练的学习率为 0.1,之后的训练轮数学习率为 0.01
可以根据自己的需求自定义函数 lr_lambda
,以实现不同的学习率调度策略
注意:
不知道有没有小伙伴好奇为什么在创建学习率调度器scheduler的时候,lr_ scheduler. LambdaLR (optimizer,lr_lambda)其中的 lr_lambda 不写成 lr_lambda(x) ???
这是因为在调用 lr_scheduler.LambdaLR(optimizer, lr_lambda)
时,lr_lambda
参数指定了一个函数对象,即自定义的函数 lr_lambda, 当学习率调度器需要计算新的学习率时,它会调用函数 lr_lambda ,并将当前的步数作为参数传递给 lr_lambda
(x)
具体而言,在学习率调度器中,存在一个内部的计数器,用于追踪当前的步数
每当调用 scheduler.step()
方法时,计数器会增加,然后将当前的步数作为参数传递给学习率函数 lr_lambda
,也就是函数 lr_lambda(x)
, 函数 lr_lambda(x)
根据当前的步数 x
来计算学习率的倍率因子,并返回该值
如果将 lr_lambda
设置为 lr_lambda(x)
,即函数调用的结果,那么在创建调度器时就会立即执行函数调用,将结果传递给 lr_lambda
参数, 这样做的问题是,调度器无法在运行时动态地调用函数来计算学习率,因为它只获得了一个静态的函数调用结果,而不是函数对象, 这将导致学习率调度器无法正确地根据训练进度调整学习率