当前位置:实例文章 » 其他实例» [文章]深度学习:Pytorch最全面学习率调整策略lr_scheduler

深度学习:Pytorch最全面学习率调整策略lr_scheduler

发布人:shili8 发布时间:2025-02-27 14:19 阅读次数:0

**深度学习:PyTorch 最全面的学习率调整策略(lr_scheduler)**

在深度学习中,学习率(learning rate)的选择是训练模型的关键因素之一。一个合适的学习率可以帮助模型快速收敛到最优解,而过高或过低的学习率可能导致模型收敛速度太慢或无法收敛。PyTorch 提供了多种学习率调整策略(lr_scheduler),以帮助我们选择合适的学习率。

**1.余弦退火(CosineAnnealing)**

余弦退火是一种常见的学习率调整策略,通过将学习率与余弦函数相关联来实现。余弦函数的值在某个范围内会随着时间的推移而变化,从而导致学习率的变化。

import torchclass CosineAnnealingLR(torch.optim.lr_scheduler._LRScheduler):
 def __init__(self, optimizer, T_max, eta_min=0, last_epoch=-1):
 self.T_max = T_max self.eta_min = eta_min super(CosineAnnealingLR, self).__init__(optimizer, last_epoch)

 def get_lr(self):
 return [self.eta_min + (base_lr - self.eta_min) *0.5 *
 (1 + math.cos(math.pi * self.last_epoch / self.T_max)) for base_lr in self.base_lrs]


**2. 多步学习率调整(MultiStepLR)**

多步学习率调整策略通过在训练过程中根据一定的条件改变学习率。例如,在每个epoch结束时,学习率会乘以一个因子。

class MultiStepLR(torch.optim.lr_scheduler._LRScheduler):
 def __init__(self, optimizer, milestones, gamma=1, last_epoch=-1):
 self.milestones = milestones self.gamma = gamma super(MultiStepLR, self).__init__(optimizer, last_epoch)

 def get_lr(self):
 return [base_lr * self.gamma ** bisect.bisect_right(self.milestones, self.last_epoch) for base_lr in self.base_lrs]


**3. 指数退火(ExponentialAnnealing)**

指数退火是一种学习率调整策略,通过将学习率与指数函数相关联来实现。指数函数的值在某个范围内会随着时间的推移而变化,从而导致学习率的变化。

class ExponentialAnnealingLR(torch.optim.lr_scheduler._LRScheduler):
 def __init__(self, optimizer, gamma=1, last_epoch=-1):
 self.gamma = gamma super(ExponentialAnnealingLR, self).__init__(optimizer, last_epoch)

 def get_lr(self):
 return [base_lr * self.gamma ** self.last_epoch for base_lr in self.base_lrs]


**4.余弦退火多步(CosineAnnealingMultiStep)**

余弦退火多步是一种学习率调整策略,通过将余弦函数与多步函数相关联来实现。这种策略可以结合两者的优点。

class CosineAnnealingMultiStepLR(torch.optim.lr_scheduler._LRScheduler):
 def __init__(self, optimizer, milestones, T_max, eta_min=0, last_epoch=-1):
 self.milestones = milestones self.T_max = T_max self.eta_min = eta_min super(CosineAnnealingMultiStepLR, self).__init__(optimizer, last_epoch)

 def get_lr(self):
 return [self.eta_min + (base_lr - self.eta_min) *0.5 *
 (1 + math.cos(math.pi * bisect.bisect_right(self.milestones, self.last_epoch) / self.T_max)) for base_lr in self.base_lrs]


**5. 自适应学习率(AdaptiveLR)**

自适应学习率是一种学习率调整策略,通过根据模型的收敛情况动态改变学习率来实现。

class AdaptiveLR(torch.optim.lr_scheduler._LRScheduler):
 def __init__(self, optimizer, patience=10, min_lr=1e-6, last_epoch=-1):
 self.patience = patience self.min_lr = min_lr super(AdaptiveLR, self).__init__(optimizer, last_epoch)

 def get_lr(self):
 if self.last_epoch < self.patience:
 return [base_lr for base_lr in self.base_lrs]
 else:
 return [min(base_lr, self.min_lr) for base_lr in self.base_lrs]


这些学习率调整策略可以根据具体的任务和模型选择合适的策略。例如,在训练过程中,余弦退火策略可能更适合,而在测试阶段,多步策略可能更合适。

**使用示例**

import torchfrom torchvision import datasets, transforms#1.余弦退火model = torch.nn.Sequential(
 torch.nn.Linear(784,128),
 torch.nn.ReLU(),
 torch.nn.Linear(128,10)
)

criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
scheduler = CosineAnnealingLR(optimizer, T_max=100)

for epoch in range(100):
 scheduler.step()
 # ...

#2. 多步学习率调整model = torch.nn.Sequential(
 torch.nn.Linear(784,128),
 torch.nn.ReLU(),
 torch.nn.Linear(128,10)
)

criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
scheduler = MultiStepLR(optimizer, milestones=[50,75])

for epoch in range(100):
 scheduler.step()
 # ...

#3. 指数退火model = torch.nn.Sequential(
 torch.nn.Linear(784,128),
 torch.nn.ReLU(),
 torch.nn.Linear(128,10)
)

criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
scheduler = ExponentialAnnealingLR(optimizer, gamma=0.1)

for epoch in range(100):
 scheduler.step()
 # ...

#4.余弦退火多步model = torch.nn.Sequential(
 torch.nn.Linear(784,128),
 torch.nn.ReLU(),
 torch.nn.Linear(128,10)
)

criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
scheduler = CosineAnnealingMultiStepLR(optimizer, milestones=[50,75], T_max=100)

for epoch in range(100):
 scheduler.step()
 # ...

#5. 自适应学习率model = torch.nn.Sequential(
 torch.nn.Linear(784,128),
 torch.nn.ReLU(),
 torch.nn.Linear(128,10)
)

criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
scheduler = AdaptiveLR(optimizer, patience=50)

for epoch in range(100):
 scheduler.step()
 # ...


这些示例展示了如何使用不同的学习率调整策略来训练模型。

其他信息

其他资源

Top