# CosineAnnealingWarmRestarts

Source: https://www.tensorplay.cn/docs/generated/tensorplay.optim.lr_scheduler.CosineAnnealingWarmRestarts.html

# CosineAnnealingWarmRestarts

class tensorplay.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer: [Optimizer](tensorplay.optim.optimizer.Optimizer.html#tensorplay.optim.optimizer.Optimizer), T_0: [int](https://docs.python.org/3/library/functions.html#int), T_mult: [int](https://docs.python.org/3/library/functions.html#int) = 1, eta_min: [float](https://docs.python.org/3/library/functions.html#float) = 0.0, last_epoch: [int](https://docs.python.org/3/library/functions.html#int) = -1)[[source]](../_modules/tensorplay/optim/lr_scheduler.html#CosineAnnealingWarmRestarts)

Set the learning rate of each parameter group using a cosine annealing schedule.

The \(\eta_{max}\) is set to the initial lr, \(T_{cur}\)
is the number of epochs since the last restart and \(T_{i}\) is the number
of epochs between two warm restarts in SGDR:

\[\eta_t = \eta_{min} + \frac{1}{2}(\eta_{max} - \eta_{min})\left(1 +
\cos\left(\frac{T_{cur}}{T_{i}}\pi\right)\right)\]

When \(T_{cur}=T_{i}\), set \(\eta_t = \eta_{min}\).
When \(T_{cur}=0\) after restart, set \(\eta_t=\eta_{max}\).

It has been proposed in
[SGDR: Stochastic Gradient Descent with Warm Restarts](https://arxiv.org/abs/1608.03983).

Parameters:

- optimizer ([Optimizer](tensorplay.optim.optimizer.Optimizer.html#tensorplay.optim.optimizer.Optimizer)) – Wrapped optimizer.

- T_0 ([int](https://docs.python.org/3/library/functions.html#int)) – Number of iterations until the first restart.

- T_mult ([int](https://docs.python.org/3/library/functions.html#int) , optional ) – A factor by which \(T_{i}\) increases after a restart. Default: 1.

- eta_min ([float](https://docs.python.org/3/library/functions.html#float) , optional ) – Minimum learning rate. Default: 0.

- last_epoch ([int](https://docs.python.org/3/library/functions.html#int) , optional ) – The index of the last epoch. Default: -1.

Example

```
>>> # xdoctest: +SKIP
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.05)
>>> scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(
...     optimizer, T_0=20
... )
>>> for epoch in range(100):
>>>     train(...)
>>>     validate(...)
>>>     scheduler.step()
```

get_last_lr() &#x2192; [list](https://docs.python.org/3/library/stdtypes.html#list)[[float](https://docs.python.org/3/library/functions.html#float) | TensorBase]

Get the most recent learning rates computed by this scheduler.

Returns:

A [list](https://docs.python.org/3/library/stdtypes.html#list) of learning rates with entries
for each of the optimizer’s
param_groups, with the same types as
their group["lr"]s.

Return type:

[list](https://docs.python.org/3/library/stdtypes.html#list)[[float](https://docs.python.org/3/library/functions.html#float) | Tensor]

Note

The returned Tensors are copies, and never alias
the optimizer’s group["lr"]s.

get_lr() &#x2192; [list](https://docs.python.org/3/library/stdtypes.html#list)[[float](https://docs.python.org/3/library/functions.html#float) | TensorBase][[source]](../_modules/tensorplay/optim/lr_scheduler.html#CosineAnnealingWarmRestarts.get_lr)

Compute the next learning rate for each of the optimizer’s
param_groups.

Computes learning rates for the optimizer’s
param_groups following:

\[\texttt{eta\_min} + \frac{1}{2}(\texttt{base\_lr} -
\texttt{eta\_min})\left(1 + \cos\left(\pi \cdot
\frac{\texttt{T\_cur}}{\texttt{T\_i}}\right)\right)\]

Where T_cur is the number of epochs since the last restart and
T_i is the number of epochs between two restarts. Both
T_cur and T_i are updated in [step()](#tensorplay.optim.lr_scheduler.CosineAnnealingWarmRestarts.step), and
T_i becomes T_mult times larger after each restart.

Returns:

A [list](https://docs.python.org/3/library/stdtypes.html#list) of learning rates for each of
the optimizer’s param_groups with the
same types as their current group["lr"]s.

Return type:

[list](https://docs.python.org/3/library/stdtypes.html#list)[[float](https://docs.python.org/3/library/functions.html#float) | Tensor]

Note

If you’re trying to inspect the most recent learning rate, use
[get_last_lr()](#tensorplay.optim.lr_scheduler.CosineAnnealingWarmRestarts.get_last_lr) instead.

Note

The returned Tensors are copies, and never alias
the optimizer’s group["lr"]s.

load_state_dict(state_dict: [dict](https://docs.python.org/3/library/stdtypes.html#dict)[[str](https://docs.python.org/3/library/stdtypes.html#str), [Any](https://docs.python.org/3/library/typing.html#typing.Any)]) &#x2192; [None](https://docs.python.org/3/library/constants.html#None)

Load the scheduler’s state.

Parameters:

state_dict ([dict](https://docs.python.org/3/library/stdtypes.html#dict)) – scheduler state. Should be an object returned
from a call to [state_dict()](#tensorplay.optim.lr_scheduler.CosineAnnealingWarmRestarts.state_dict).

state_dict() &#x2192; [dict](https://docs.python.org/3/library/stdtypes.html#dict)[[str](https://docs.python.org/3/library/stdtypes.html#str), [Any](https://docs.python.org/3/library/typing.html#typing.Any)]

Return the state of the scheduler as a [dict](https://docs.python.org/3/library/stdtypes.html#dict).

It contains an entry for every variable in self.__dict__ which
is not the optimizer.

step(epoch=None) &#x2192; [None](https://docs.python.org/3/library/constants.html#None)[[source]](../_modules/tensorplay/optim/lr_scheduler.html#CosineAnnealingWarmRestarts.step)

Step could be called after every batch update.

Example

```
>>> # xdoctest: +SKIP("Undefined vars")
>>> scheduler = CosineAnnealingWarmRestarts(optimizer, T_0, T_mult)
>>> iters = len(dataloader)
>>> for epoch in range(20):
>>>     for i, sample in enumerate(dataloader):
>>>         inputs, labels = sample['inputs'], sample['labels']
>>>         optimizer.zero_grad()
>>>         outputs = net(inputs)
>>>         loss = criterion(outputs, labels)
>>>         loss.backward()
>>>         optimizer.step()
>>>         scheduler.step(epoch + i / iters)
```

This function can be called in an interleaved way.

Example

```
>>> # xdoctest: +SKIP("Undefined vars")
>>> scheduler = CosineAnnealingWarmRestarts(optimizer, T_0, T_mult)
>>> for epoch in range(20):
>>>     scheduler.step()
>>> scheduler.step(26)
>>> scheduler.step()  # scheduler.step(27), instead of scheduler(20)
```
