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