Skip to content

deeplabcut.pose_estimation_pytorch.runners.schedulers

Classes:

Name Description
LRListScheduler

You can achieve increased performance and faster training by using a learning

Functions:

Name Description
build_scheduler

Builds a scheduler from a configuration, if defined.

load_scheduler_state

Args:

LRListScheduler

Bases: _LRScheduler

You can achieve increased performance and faster training by using a learning rate that changes during training.

A scheduler makes the learning rate adaptive. Given a list of learning rates and milestones modifies the learning rate accordingly during training.

Methods:

Name Description
__init__

Args:

get_lr

Summary:

Source code in deeplabcut/pose_estimation_pytorch/runners/schedulers.py
class LRListScheduler(_LRScheduler):
    """You can achieve increased performance and faster training by using a learning
    rate that changes during training.

    A scheduler makes the learning rate adaptive. Given a list of learning rates and
    milestones modifies the learning rate accordingly during training.
    """

    def __init__(self, optimizer, milestones, lr_list, last_epoch=-1) -> None:
        """
        Args:
            optimizer: optimizer used for learning.
            milestones: number of epochs.
            lr_list: learning rate list.
            last_epoch: where to start the scheduler. (-1: start from beginning)

        Examples:
            input:
                last_epoch = -1
                verbose = False
                milestones = [10, 30, 40]
                lr_list = [[0.00001],[0.000005],[0.000001]]
        """
        self.milestones = milestones
        self.lr_list = lr_list
        super().__init__(optimizer, last_epoch)

    def get_lr(self):
        """Summary:
        Given a milestones, get the corresponding learning rate.

        Returns:
            lr: learning rate value

        Examples:
            input: LRListScheduler object
            output: learning rate (lr) = [0.001]
        """
        if self.last_epoch not in self.milestones:
            return [group["lr"] for group in self.optimizer.param_groups]
        return [lr for lr in self.lr_list[self.milestones.index(self.last_epoch)]]

__init__

__init__(optimizer, milestones, lr_list, last_epoch=-1) -> None

Parameters:

Name Type Description Default

optimizer

optimizer used for learning.

required

milestones

number of epochs.

required

lr_list

learning rate list.

required

last_epoch

where to start the scheduler. (-1: start from beginning)

-1

Examples:

input: last_epoch = -1 verbose = False milestones = [10, 30, 40] lr_list = [[0.00001],[0.000005],[0.000001]]

Source code in deeplabcut/pose_estimation_pytorch/runners/schedulers.py
def __init__(self, optimizer, milestones, lr_list, last_epoch=-1) -> None:
    """
    Args:
        optimizer: optimizer used for learning.
        milestones: number of epochs.
        lr_list: learning rate list.
        last_epoch: where to start the scheduler. (-1: start from beginning)

    Examples:
        input:
            last_epoch = -1
            verbose = False
            milestones = [10, 30, 40]
            lr_list = [[0.00001],[0.000005],[0.000001]]
    """
    self.milestones = milestones
    self.lr_list = lr_list
    super().__init__(optimizer, last_epoch)

get_lr

get_lr()

Summary: Given a milestones, get the corresponding learning rate.

Returns:

Name Type Description
lr

learning rate value

Examples:

input: LRListScheduler object output: learning rate (lr) = [0.001]

Source code in deeplabcut/pose_estimation_pytorch/runners/schedulers.py
def get_lr(self):
    """Summary:
    Given a milestones, get the corresponding learning rate.

    Returns:
        lr: learning rate value

    Examples:
        input: LRListScheduler object
        output: learning rate (lr) = [0.001]
    """
    if self.last_epoch not in self.milestones:
        return [group["lr"] for group in self.optimizer.param_groups]
    return [lr for lr in self.lr_list[self.milestones.index(self.last_epoch)]]

build_scheduler

build_scheduler(scheduler_cfg: dict | None, optimizer: Optimizer) -> torch.optim.lr_scheduler.LRScheduler | None

Builds a scheduler from a configuration, if defined.

Parameters:

Name Type Description Default

scheduler_cfg

dict | None

the configuration of the scheduler to build

required

optimizer

Optimizer

the optimizer the scheduler will be built for

required

Returns:

Type Description
LRScheduler | None

None if scheduler_cfg is None, otherwise the scheduler

Source code in deeplabcut/pose_estimation_pytorch/runners/schedulers.py
def build_scheduler(
    scheduler_cfg: dict | None, optimizer: torch.optim.Optimizer
) -> torch.optim.lr_scheduler.LRScheduler | None:
    """Builds a scheduler from a configuration, if defined.

    Args:
        scheduler_cfg: the configuration of the scheduler to build
        optimizer: the optimizer the scheduler will be built for

    Returns:
        None if scheduler_cfg is None, otherwise the scheduler
    """
    if scheduler_cfg is None:
        return None

    if scheduler_cfg["type"] == "LRListScheduler":
        scheduler = LRListScheduler
    else:
        scheduler = getattr(torch.optim.lr_scheduler, scheduler_cfg["type"])

    parsed_params = {}
    for param_name, param in scheduler_cfg["params"].items():
        if isinstance(param, list):
            param = [_parse_scheduler_param(p, optimizer) for p in param]
        else:
            param = _parse_scheduler_param(param, optimizer)

        parsed_params[param_name] = param

    return scheduler(optimizer=optimizer, **parsed_params)

load_scheduler_state

load_scheduler_state(scheduler: LRScheduler, state_dict: dict) -> None

Parameters:

Name Type Description Default

scheduler

LRScheduler

The scheduler for which to load the state dict.

required

state_dict

dict

The state dict to load

required

Raises:

Type Description
ValueError

if the state dict fails to load.

Source code in deeplabcut/pose_estimation_pytorch/runners/schedulers.py
def load_scheduler_state(
    scheduler: torch.optim.lr_scheduler.LRScheduler,
    state_dict: dict,
) -> None:
    """
    Args:
        scheduler: The scheduler for which to load the state dict.
        state_dict: The state dict to load

    Raises:
        ValueError: if the state dict fails to load.
    """
    try:
        scheduler.load_state_dict(state_dict)
    except Exception as err:
        raise ValueError("Failed to load state dict") from err

    param_groups = scheduler.optimizer.param_groups
    resume_lrs = scheduler.get_last_lr()

    if len(param_groups) != len(resume_lrs):
        raise ValueError(
            f"Number of optimizer parameter groups ({len(param_groups)}) did not match "
            f"number of learning rates to resume from ({len(scheduler.get_last_lr())})."
        )

    # Update the learning rate for the optimizer based on the scheduler
    for group, resume_lr in zip(param_groups, resume_lrs, strict=False):
        group["lr"] = resume_lr