📜  在 PyTorch 中调整神经网络的学习率(1)

📅  最后修改于: 2023-12-03 14:51:06.940000             🧑  作者: Mango

在 PyTorch 中调整神经网络的学习率

当我们训练一个神经网络时,我们需要选择一个合适的学习率,这将影响到我们模型的表现和收敛速度。在 PyTorch 中,我们可以通过以下几种方式来调整学习率。

1. 简单的学习率调整

PyTorch 中的优化器都提供了一个 lr 参数来控制学习率。我们只需要在创建优化器时设置该参数即可。例如:

import torch.optim as optim

optimizer = optim.SGD(net.parameters(), lr=0.1)

在训练过程中,我们可以通过以下方式更改学习率:

optimizer.param_groups[0]['lr'] = 0.01

其中 param_groups 是优化器的参数组列表,每个参数组都包含了一组参数以及对应的超参数。在上面的例子中,我们只有一个参数组。

2. 学习率调度器

PyTorch 还提供了一个学习率调度器,它可以根据训练过程中的一些规律来动态地调整学习率。常用的学习率调度器有 StepLRMultiStepLRExponentialLR 等。例如:

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()
3. 自定义学习率调度器

如果以上学习率调度器不能满足我们的需求,我们还可以自定义学习率调度器。例如,我们可以实现一个在前 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 中调整神经网络的学习率的介绍。通过调整学习率,我们可以让模型更快地收敛并达到更好的效果。