欢迎访问宙启技术站
智能推送

PyTorch中的学习率调度器使用方法

发布时间:2023-12-18 23:13:40

在PyTorch中,学习率调度器(Learning Rate Scheduler)用于自动调整模型的学习率,以提高模型的性能和训练效果。在训练过程中,随着训练的进行,学习率调度器会根据预定义的策略来动态地调整学习率的大小。

PyTorch中有多种学习率调度器可供选择,包括StepLR、MultiStepLR、ExponentialLR、CosineAnnealingLR等。下面我们以StepLR为例,详细介绍学习率调度器的使用方法。

StepLR是一种按照固定步长调整学习率的调度器,即每训练完固定步长的epoch后,将学习率乘以一个预先设定的因子。

首先,我们需要导入必要的库:

import torch
import torch.optim as optim
import torch.nn as nn
from torch.optim.lr_scheduler import StepLR

接下来,定义一个简单的神经网络模型:

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(10, 20)
        self.fc2 = nn.Linear(20, 2)
        
    def forward(self, x):
        x = self.fc1(x)
        x = self.fc2(x)
        return x

然后,我们可以定义训练函数,其中包括模型的训练、学习率调度器的更新等操作:

def train(model, optimizer, scheduler, train_loader, epochs):
    criterion = nn.CrossEntropyLoss()
    for epoch in range(epochs):
        scheduler.step()  # 更新学习率
        for batch_idx, (data, target) in enumerate(train_loader):
            optimizer.zero_grad()
            output = model(data)
            loss = criterion(output, target)
            loss.backward()
            optimizer.step()
                
            if batch_idx % 100 == 0:
                print('Epoch: {}, Batch: {}, Loss: {}'.format(epoch, batch_idx, loss.item()))

接下来,我们可以开始训练过程。首先,定义一个训练数据集和数据加载器:

train_data = torch.randn((1000, 10))
train_labels = torch.randint(0, 2, (1000,))
train_dataset = torch.utils.data.TensorDataset(train_data, train_labels)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True)

然后,定义模型、优化器和学习率调度器,并开始训练:

model = Net()
optimizer = optim.SGD(model.parameters(), lr=0.1)
scheduler = StepLR(optimizer, step_size=10, gamma=0.1)
train(model, optimizer, scheduler, train_loader, epochs=20)

在上述代码中,使用StepLR学习率调度器,每10个epoch将学习率乘以0.1。可以根据实际需求调整step_size和gamma的值。训练过程中,每100个batch打印一次训练损失。

使用学习率调度器可以有效改善模型的训练效果。通过在训练的不同阶段动态地调整学习率,可以避免模型陷入局部最优解,加快模型的收敛速度。不同的学习率调度器适用于不同的问题和模型,可以根据具体情况选择适合的学习率调度器。