Creates a scheduler that lets you train a model with following different TrainingPhase.
from fastai.gen_doc.nbdoc import *
from fastai.callbacks.general_sched import *
from fastai.vision import *
show_doc(TrainingPhase)
class TrainingPhase[source][test]
TrainingPhase(length:int)
No tests found for TrainingPhase. To contribute a test please refer to this guide and this discussion.
Schedule hyper-parameters for a phase of length iterations.
You can then schedule any hyper-parameter you want by using the following method.
show_doc(TrainingPhase.schedule_hp)
schedule_hp[source][test]
schedule_hp(name,vals,anneal=*None*)
No tests found for schedule_hp. To contribute a test please refer to this guide and this discussion.
Adds a schedule for name between vals using anneal.
The phase will make the hyper-parameter vary from the first value in vals to the second, following anneal. If an annealing function is specified but vals is a float, it will decay to 0. If no annealing function is specified, the default is a linear annealing for a tuple, a constant parameter if it's a float.
jekyll_note("""If you want to use discriminative values, you can pass an numpy array in `vals` (or a tuple
of them for start and stop).""")
The basic hyper-parameters are named:
You can also add any hyper-parameter that is in your optimizer (even if it's custom or a GeneralOptimizer), like 'eps' if you're using Adam.
Let's make an example by using this to code SGD with warm restarts.
def fit_sgd_warm(learn, n_cycles, lr, mom, cycle_len, cycle_mult):
n = len(learn.data.train_dl)
phases = [(TrainingPhase(n * (cycle_len * cycle_mult**i))
.schedule_hp('lr', lr, anneal=annealing_cos)
.schedule_hp('mom', mom)) for i in range(n_cycles)]
sched = GeneralScheduler(learn, phases)
learn.callbacks.append(sched)
if cycle_mult != 1:
total_epochs = int(cycle_len * (1 - (cycle_mult)**n_cycles)/(1-cycle_mult))
else: total_epochs = n_cycles * cycle_len
learn.fit(total_epochs)
path = untar_data(URLs.MNIST_SAMPLE)
data = ImageDataBunch.from_folder(path)
learn = Learner(data, simple_cnn((3,16,16,2)), metrics=accuracy)
fit_sgd_warm(learn, 3, 1e-3, 0.9, 1, 2)
| epoch | train_loss | valid_loss | accuracy | time |
|---|---|---|---|---|
| 0 | 0.162146 | 0.153532 | 0.942100 | 00:02 |
| 1 | 0.126112 | 0.117267 | 0.960255 | 00:02 |
| 2 | 0.112045 | 0.110586 | 0.962218 | 00:02 |
| 3 | 0.097603 | 0.090838 | 0.967615 | 00:02 |
| 4 | 0.086883 | 0.081375 | 0.973013 | 00:02 |
| 5 | 0.083673 | 0.076160 | 0.973994 | 00:02 |
| 6 | 0.084835 | 0.076211 | 0.973994 | 00:02 |
learn.recorder.plot_lr()
show_doc(GeneralScheduler)
class GeneralScheduler[source][test]
GeneralScheduler(learn:Learner,phases:Collection[TrainingPhase],start_epoch:int=*None*) ::LearnerCallback
No tests found for GeneralScheduler. To contribute a test please refer to this guide and this discussion.
Schedule multiple TrainingPhase for a Learner.
You don't call these yourself - they're called by fastai's Callback system automatically to enable the class's functionality.
show_doc(GeneralScheduler.on_batch_end, doc_string=False)
on_batch_end[source][test]
on_batch_end(train, ****kwargs**:Any)
No tests found for on_batch_end. To contribute a test please refer to this guide and this discussion.
Takes a step in the current phase and prepare the hyperparameters for the next batch.
show_doc(GeneralScheduler.on_train_begin, doc_string=False)
on_train_begin[source][test]
on_train_begin(epoch:int, ****kwargs**:Any)
No tests found for on_train_begin. To contribute a test please refer to this guide and this discussion.
Initiates the hyperparameters to the start values of the first phase.