📅  最后修改于: 2023-12-03 14:51:06.940000             🧑  作者: Mango
当我们训练一个神经网络时,我们需要选择一个合适的学习率,这将影响到我们模型的表现和收敛速度。在 PyTorch 中,我们可以通过以下几种方式来调整学习率。
PyTorch 中的优化器都提供了一个 lr
参数来控制学习率。我们只需要在创建优化器时设置该参数即可。例如:
import torch.optim as optim
optimizer = optim.SGD(net.parameters(), lr=0.1)
在训练过程中,我们可以通过以下方式更改学习率:
optimizer.param_groups[0]['lr'] = 0.01
其中 param_groups
是优化器的参数组列表,每个参数组都包含了一组参数以及对应的超参数。在上面的例子中,我们只有一个参数组。
PyTorch 还提供了一个学习率调度器,它可以根据训练过程中的一些规律来动态地调整学习率。常用的学习率调度器有 StepLR
、MultiStepLR
、ExponentialLR
等。例如:
from torch.optim.lr_scheduler import StepLR
scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
在每 30 次更新后,学习率将会乘以 0.1。
from torch.optim.lr_scheduler import MultiStepLR
scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)
在第 30 和 80 次更新后,学习率将会乘以 0.1。
from torch.optim.lr_scheduler import ExponentialLR
scheduler = ExponentialLR(optimizer, gamma=0.9)
每次更新后学习率都会乘以 0.9。
在每次调用 step()
方法时,调度器都会更新优化器的学习率。例如:
scheduler.step()
如果以上学习率调度器不能满足我们的需求,我们还可以自定义学习率调度器。例如,我们可以实现一个在前 5 次更新中学习率为 0.1,之后为 0.01 的调度器:
class MyScheduler:
def __init__(self, optimizer):
self.opt = optimizer
self.epoch = 0
def step(self):
self.epoch += 1
if self.epoch <= 5:
lr = 0.1
else:
lr = 0.01
for param_group in self.opt.param_groups:
param_group['lr'] = lr
在训练过程中,我们可以使用这个调度器:
scheduler = MyScheduler(optimizer)
for epoch in range(n_epochs):
for batch in dataloader:
scheduler.step()
# ...
以上就是在 PyTorch 中调整神经网络的学习率的介绍。通过调整学习率,我们可以让模型更快地收敛并达到更好的效果。