mirror of
https://github.com/hanzoai/mugen.git
synced 2026-11-03 01:48:40 +00:00
49 lines
1.7 KiB
Python
49 lines
1.7 KiB
Python
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
# All rights reserved.
|
|
#
|
|
# This source code is licensed under the license found in the
|
|
# LICENSE file in the root directory of this source tree.
|
|
|
|
import math
|
|
|
|
from torch.optim import Optimizer
|
|
from torch.optim.lr_scheduler import _LRScheduler
|
|
|
|
|
|
class CosineLRScheduler(_LRScheduler):
|
|
"""Cosine LR scheduler.
|
|
|
|
Args:
|
|
optimizer (Optimizer): Torch optimizer.
|
|
warmup_steps (int): Number of warmup steps.
|
|
total_steps (int): Total number of steps.
|
|
lr_min_ratio (float): Minimum learning rate.
|
|
cycle_length (float): Cycle length.
|
|
"""
|
|
def __init__(self, optimizer: Optimizer, total_steps: int, warmup_steps: int,
|
|
lr_min_ratio: float = 0.0, cycle_length: float = 1.0):
|
|
self.warmup_steps = warmup_steps
|
|
assert self.warmup_steps >= 0
|
|
self.total_steps = total_steps
|
|
assert self.total_steps >= 0
|
|
self.lr_min_ratio = lr_min_ratio
|
|
self.cycle_length = cycle_length
|
|
super().__init__(optimizer)
|
|
|
|
def _get_sched_lr(self, lr: float, step: int):
|
|
if step < self.warmup_steps:
|
|
lr_ratio = step / self.warmup_steps
|
|
lr = lr_ratio * lr
|
|
elif step <= self.total_steps:
|
|
s = (step - self.warmup_steps) / (self.total_steps - self.warmup_steps)
|
|
lr_ratio = self.lr_min_ratio + 0.5 * (1 - self.lr_min_ratio) * \
|
|
(1. + math.cos(math.pi * s / self.cycle_length))
|
|
lr = lr_ratio * lr
|
|
else:
|
|
lr_ratio = self.lr_min_ratio
|
|
lr = lr_ratio * lr
|
|
return lr
|
|
|
|
def get_lr(self):
|
|
return [self._get_sched_lr(lr, self.last_epoch) for lr in self.base_lrs]
|