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

Python中使用utils.lr_schedulerWarmupMultiFactorScheduler()进行学习率的预热和衰减

发布时间:2023-12-16 05:40:27

在Python中,可以使用utils.lr_scheduler.WarmupMultiFactorScheduler()来实现学习率的预热和衰减。这个调度器提供了一种在训练开始时逐渐增加学习率,然后按照一定的因子进行衰减的方法。

下面是一个使用WarmupMultiFactorScheduler()的示例代码:

import torch
import torch.optim as optim
import torch.optim.lr_scheduler as lr_scheduler
import torch.utils.data as data
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import utils

# 定义超参数
lr_init = 0.1  # 初始学习率
lr_decay = 0.1  # 学习率衰减因子
num_epochs = 100  # 迭代次数
warmup_epochs = 5  # 预热迭代次数

# 加载训练数据集
train_transform = transforms.Compose([
    transforms.RandomResizedCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))
])

train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=train_transform)
train_loader = data.DataLoader(train_dataset, batch_size=128, shuffle=True, num_workers=2)

# 定义模型
model = torchvision.models.resnet18(num_classes=10)

# 定义损失函数和优化器
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=lr_init, momentum=0.9, weight_decay=5e-4)

# 定义学习率调度器
scheduler = utils.lr_scheduler.WarmupMultiFactorScheduler(optimizer, warmup_epochs=warmup_epochs, warmup_lr_init=0.01,
                                                         warmup_lr_end=lr_init, warmup_strategy='linear', last_epoch=-1,
                                                         factor=lr_decay, epochs=[30, 60, 90])

# 开始训练
for epoch in range(num_epochs):
    # 在预热期间使用预热学习率
    if epoch < warmup_epochs:
        scheduler.step(epoch)  # 更新学习率
    else:
        scheduler.step()  # 更新学习率,不再使用预热学习率

    # 训练模型
    model.train()
    for images, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

    # 打印学习率和损失函数值
    print("Epoch [{}/{}], Lr: {:.6f}, Loss: {:.4f}".format(epoch+1, num_epochs, optimizer.param_groups[0]['lr'], loss.item()))

在上述例子中,我们使用了CIFAR-10数据集和ResNet-18模型进行训练。在定义学习率调度器部分,我们创建了一个WarmupMultiFactorScheduler实例,并将其与优化器和预热超参数一起传递给调度器。然后,在每个训练周期中,我们适当调用scheduler.step()函数来更新学习率。在预热期间,我们使用预热学习率进行训练,之后使用衰减学习率进行训练。

总结起来,WarmupMultiFactorScheduler提供了一种在训练开始时逐渐增加学习率,然后按照一定的因子进行衰减的方法。这有助于减小训练初期学习率过大导致的震荡问题,提高模型训练的稳定性和收敛性。