Module ktrain.lroptimize.sgdr
Expand source code
from ..imports import *
class SGDRScheduler(keras.callbacks.Callback):
"""Cosine annealing learning rate scheduler with periodic restarts.
# Usage
```python
schedule = SGDRScheduler(min_lr=1e-7,
max_lr=1e-1,
steps_per_epoch=np.ceil(epoch_size/batch_size),
lr_decay=0.9,
cycle_length=1,
mult_factor=2)
model.fit(X_train, Y_train, epochs=100, callbacks=[schedule])
```
# Arguments
min_lr: The lower bound of the learning rate range for the experiment.
max_lr: The upper bound of the learning rate range for the experiment.
steps_per_epoch: Number of mini-batches in the dataset. Calculated as `np.ceil(epoch_size/batch_size)`.
lr_decay: Reduce the max_lr after the completion of each cycle.
Ex. To reduce the max_lr by 20% after each cycle, set this value to 0.8.
cycle_length: Initial number of epochs in a cycle.
mult_factor: Scale epochs_to_restart after each full cycle completion.
# References
Original paper: http://arxiv.org/abs/1608.03983
Blog Post: http://www.jeremyjordan.me/nn-learning-rate/
"""
def __init__(
self,
min_lr,
max_lr,
steps_per_epoch,
lr_decay=0.9,
cycle_length=10,
mult_factor=2,
):
super(keras.callbacks.Callback, self).__init__()
self.min_lr = min_lr
self.max_lr = max_lr
self.lr_decay = lr_decay
self.batch_since_restart = 0
self.next_restart = cycle_length
self.steps_per_epoch = steps_per_epoch
self.cycle_length = cycle_length
self.mult_factor = mult_factor
self.history = {}
def clr(self):
"""Calculate the learning rate."""
fraction_to_restart = self.batch_since_restart / (
self.steps_per_epoch * self.cycle_length
)
lr = self.min_lr + 0.5 * (self.max_lr - self.min_lr) * (
1 + np.cos(fraction_to_restart * np.pi)
)
return lr
def on_train_begin(self, logs={}):
"""Initialize the learning rate to the minimum value at the start of training."""
logs = logs or {}
K.set_value(self.model.optimizer.lr, self.max_lr)
def on_batch_end(self, batch, logs={}):
"""Record previous batch statistics and update the learning rate."""
logs = logs or {}
self.history.setdefault("lr", []).append(K.get_value(self.model.optimizer.lr))
for k, v in logs.items():
self.history.setdefault(k, []).append(v)
self.batch_since_restart += 1
K.set_value(self.model.optimizer.lr, self.clr())
# print(K.eval(self.model.optimizer.lr))
def on_epoch_end(self, epoch, logs={}):
"""Check for end of current cycle, apply restarts when necessary."""
# print(K.eval(self.model.optimizer.lr))
if epoch + 1 == self.next_restart:
self.batch_since_restart = 0
self.cycle_length = np.ceil(self.cycle_length * self.mult_factor)
self.next_restart += self.cycle_length
self.max_lr *= self.lr_decay
# no longer needed as kauto completes cycles/epochs
# self.best_weights = self.model.get_weights()
def on_train_end(self, logs={}):
"""Set weights to the values from the end of the most recent cycle for best performance."""
# no longer needed as kauto completes cycles/epochs
# self.model.set_weights(self.best_weights)
pass
def on_epoch_begin(self, epoch, logs={}):
"""Initialize the learning rate to the minimum value at the start of training."""
logs = logs or {}
Classes
class SGDRScheduler (min_lr, max_lr, steps_per_epoch, lr_decay=0.9, cycle_length=10, mult_factor=2)
-
Cosine annealing learning rate scheduler with periodic restarts.
Usage
```python schedule = SGDRScheduler(min_lr=1e-7, max_lr=1e-1, steps_per_epoch=np.ceil(epoch_size/batch_size), lr_decay=0.9, cycle_length=1, mult_factor=2) model.fit(X_train, Y_train, epochs=100, callbacks=[schedule]) ```
Arguments
min_lr: The lower bound of the learning rate range for the experiment. max_lr: The upper bound of the learning rate range for the experiment. steps_per_epoch: Number of mini-batches in the dataset. Calculated as `np.ceil(epoch_size/batch_size)`. lr_decay: Reduce the max_lr after the completion of each cycle. Ex. To reduce the max_lr by 20% after each cycle, set this value to 0.8. cycle_length: Initial number of epochs in a cycle. mult_factor: Scale epochs_to_restart after each full cycle completion.
References
Original paper: <http://arxiv.org/abs/1608.03983> Blog Post: <http://www.jeremyjordan.me/nn-learning-rate/>
Expand source code
class SGDRScheduler(keras.callbacks.Callback): """Cosine annealing learning rate scheduler with periodic restarts. # Usage ```python schedule = SGDRScheduler(min_lr=1e-7, max_lr=1e-1, steps_per_epoch=np.ceil(epoch_size/batch_size), lr_decay=0.9, cycle_length=1, mult_factor=2) model.fit(X_train, Y_train, epochs=100, callbacks=[schedule]) ``` # Arguments min_lr: The lower bound of the learning rate range for the experiment. max_lr: The upper bound of the learning rate range for the experiment. steps_per_epoch: Number of mini-batches in the dataset. Calculated as `np.ceil(epoch_size/batch_size)`. lr_decay: Reduce the max_lr after the completion of each cycle. Ex. To reduce the max_lr by 20% after each cycle, set this value to 0.8. cycle_length: Initial number of epochs in a cycle. mult_factor: Scale epochs_to_restart after each full cycle completion. # References Original paper: http://arxiv.org/abs/1608.03983 Blog Post: http://www.jeremyjordan.me/nn-learning-rate/ """ def __init__( self, min_lr, max_lr, steps_per_epoch, lr_decay=0.9, cycle_length=10, mult_factor=2, ): super(keras.callbacks.Callback, self).__init__() self.min_lr = min_lr self.max_lr = max_lr self.lr_decay = lr_decay self.batch_since_restart = 0 self.next_restart = cycle_length self.steps_per_epoch = steps_per_epoch self.cycle_length = cycle_length self.mult_factor = mult_factor self.history = {} def clr(self): """Calculate the learning rate.""" fraction_to_restart = self.batch_since_restart / ( self.steps_per_epoch * self.cycle_length ) lr = self.min_lr + 0.5 * (self.max_lr - self.min_lr) * ( 1 + np.cos(fraction_to_restart * np.pi) ) return lr def on_train_begin(self, logs={}): """Initialize the learning rate to the minimum value at the start of training.""" logs = logs or {} K.set_value(self.model.optimizer.lr, self.max_lr) def on_batch_end(self, batch, logs={}): """Record previous batch statistics and update the learning rate.""" logs = logs or {} self.history.setdefault("lr", []).append(K.get_value(self.model.optimizer.lr)) for k, v in logs.items(): self.history.setdefault(k, []).append(v) self.batch_since_restart += 1 K.set_value(self.model.optimizer.lr, self.clr()) # print(K.eval(self.model.optimizer.lr)) def on_epoch_end(self, epoch, logs={}): """Check for end of current cycle, apply restarts when necessary.""" # print(K.eval(self.model.optimizer.lr)) if epoch + 1 == self.next_restart: self.batch_since_restart = 0 self.cycle_length = np.ceil(self.cycle_length * self.mult_factor) self.next_restart += self.cycle_length self.max_lr *= self.lr_decay # no longer needed as kauto completes cycles/epochs # self.best_weights = self.model.get_weights() def on_train_end(self, logs={}): """Set weights to the values from the end of the most recent cycle for best performance.""" # no longer needed as kauto completes cycles/epochs # self.model.set_weights(self.best_weights) pass def on_epoch_begin(self, epoch, logs={}): """Initialize the learning rate to the minimum value at the start of training.""" logs = logs or {}
Ancestors
- keras.callbacks.Callback
Methods
def clr(self)
-
Calculate the learning rate.
Expand source code
def clr(self): """Calculate the learning rate.""" fraction_to_restart = self.batch_since_restart / ( self.steps_per_epoch * self.cycle_length ) lr = self.min_lr + 0.5 * (self.max_lr - self.min_lr) * ( 1 + np.cos(fraction_to_restart * np.pi) ) return lr
def on_batch_end(self, batch, logs={})
-
Record previous batch statistics and update the learning rate.
Expand source code
def on_batch_end(self, batch, logs={}): """Record previous batch statistics and update the learning rate.""" logs = logs or {} self.history.setdefault("lr", []).append(K.get_value(self.model.optimizer.lr)) for k, v in logs.items(): self.history.setdefault(k, []).append(v) self.batch_since_restart += 1 K.set_value(self.model.optimizer.lr, self.clr()) # print(K.eval(self.model.optimizer.lr))
def on_epoch_begin(self, epoch, logs={})
-
Initialize the learning rate to the minimum value at the start of training.
Expand source code
def on_epoch_begin(self, epoch, logs={}): """Initialize the learning rate to the minimum value at the start of training.""" logs = logs or {}
def on_epoch_end(self, epoch, logs={})
-
Check for end of current cycle, apply restarts when necessary.
Expand source code
def on_epoch_end(self, epoch, logs={}): """Check for end of current cycle, apply restarts when necessary.""" # print(K.eval(self.model.optimizer.lr)) if epoch + 1 == self.next_restart: self.batch_since_restart = 0 self.cycle_length = np.ceil(self.cycle_length * self.mult_factor) self.next_restart += self.cycle_length self.max_lr *= self.lr_decay # no longer needed as kauto completes cycles/epochs # self.best_weights = self.model.get_weights()
def on_train_begin(self, logs={})
-
Initialize the learning rate to the minimum value at the start of training.
Expand source code
def on_train_begin(self, logs={}): """Initialize the learning rate to the minimum value at the start of training.""" logs = logs or {} K.set_value(self.model.optimizer.lr, self.max_lr)
def on_train_end(self, logs={})
-
Set weights to the values from the end of the most recent cycle for best performance.
Expand source code
def on_train_end(self, logs={}): """Set weights to the values from the end of the most recent cycle for best performance.""" # no longer needed as kauto completes cycles/epochs # self.model.set_weights(self.best_weights) pass