{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## TrainingPhase and General scheduler" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Creates a scheduler that lets you train a model with following different [`TrainingPhase`](/callbacks.general_sched.html#TrainingPhase)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "hide_input": true }, "outputs": [], "source": [ "from fastai.gen_doc.nbdoc import *\n", "from fastai.callbacks.general_sched import * \n", "from fastai.vision import *" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class TrainingPhase[source][test]

\n", "\n", "> TrainingPhase(**`length`**:`int`)\n", "\n", "
×

No tests found for TrainingPhase. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Schedule hyper-parameters for a phase of `length` iterations. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(TrainingPhase)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can then schedule any hyper-parameter you want by using the following method." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

schedule_hp[source][test]

\n", "\n", "> schedule_hp(**`name`**, **`vals`**, **`anneal`**=***`None`***)\n", "\n", "
×

No tests found for schedule_hp. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Adds a schedule for `name` between `vals` using `anneal`. " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(TrainingPhase.schedule_hp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "
Note: If you want to use discriminative values, you can pass an numpy array in `vals` (or a tuple\n", "of them for start and stop).
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "jekyll_note(\"\"\"If you want to use discriminative values, you can pass an numpy array in `vals` (or a tuple\n", "of them for start and stop).\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The basic hyper-parameters are named:\n", "- 'lr' for learning rate\n", "- 'mom' for momentum (or beta1 in Adam)\n", "- 'beta' for the beta2 in Adam or the alpha in RMSprop\n", "- 'wd' for weight decay\n", "\n", "You can also add any hyper-parameter that is in your optimizer (even if it's custom or a [`GeneralOptimizer`](/general_optimizer.html#GeneralOptimizer)), like 'eps' if you're using Adam. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's make an example by using this to code [SGD with warm restarts](https://arxiv.org/abs/1608.03983)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def fit_sgd_warm(learn, n_cycles, lr, mom, cycle_len, cycle_mult):\n", " n = len(learn.data.train_dl)\n", " phases = [(TrainingPhase(n * (cycle_len * cycle_mult**i))\n", " .schedule_hp('lr', lr, anneal=annealing_cos)\n", " .schedule_hp('mom', mom)) for i in range(n_cycles)]\n", " sched = GeneralScheduler(learn, phases)\n", " learn.callbacks.append(sched)\n", " if cycle_mult != 1:\n", " total_epochs = int(cycle_len * (1 - (cycle_mult)**n_cycles)/(1-cycle_mult)) \n", " else: total_epochs = n_cycles * cycle_len\n", " learn.fit(total_epochs)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracytime
00.1621460.1535320.94210000:02
10.1261120.1172670.96025500:02
20.1120450.1105860.96221800:02
30.0976030.0908380.96761500:02
40.0868830.0813750.97301300:02
50.0836730.0761600.97399400:02
60.0848350.0762110.97399400:02
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "path = untar_data(URLs.MNIST_SAMPLE)\n", "data = ImageDataBunch.from_folder(path)\n", "learn = Learner(data, simple_cnn((3,16,16,2)), metrics=accuracy)\n", "fit_sgd_warm(learn, 3, 1e-3, 0.9, 1, 2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learn.recorder.plot_lr()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class GeneralScheduler[source][test]

\n", "\n", "> GeneralScheduler(**`learn`**:[`Learner`](/basic_train.html#Learner), **`phases`**:`Collection`\\[[`TrainingPhase`](/callbacks.general_sched.html#TrainingPhase)\\], **`start_epoch`**:`int`=***`None`***) :: [`LearnerCallback`](/basic_train.html#LearnerCallback)\n", "\n", "
×

No tests found for GeneralScheduler. To contribute a test please refer to this guide and this discussion.

\n", "\n", "Schedule multiple [`TrainingPhase`](/callbacks.general_sched.html#TrainingPhase) for a [`Learner`](/basic_train.html#Learner). " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(GeneralScheduler)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Callback methods" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You don't call these yourself - they're called by fastai's [`Callback`](/callback.html#Callback) system automatically to enable the class's functionality." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

on_batch_end[source][test]

\n", "\n", "> on_batch_end(**`train`**, **\\*\\*`kwargs`**:`Any`)\n", "\n", "
×

No tests found for on_batch_end. To contribute a test please refer to this guide and this discussion.

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(GeneralScheduler.on_batch_end, doc_string=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Takes a step in the current phase and prepare the hyperparameters for the next batch." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

on_train_begin[source][test]

\n", "\n", "> on_train_begin(**`epoch`**:`int`, **\\*\\*`kwargs`**:`Any`)\n", "\n", "
×

No tests found for on_train_begin. To contribute a test please refer to this guide and this discussion.

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(GeneralScheduler.on_train_begin, doc_string=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Initiates the hyperparameters to the start values of the first phase. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Undocumented Methods - Methods moved below this line will intentionally be hidden" ] } ], "metadata": { "jekyll": { "keywords": "fastai", "summary": "Implementation of a flexible training API", "title": "callbacks.general_sched" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.2" } }, "nbformat": 4, "nbformat_minor": 2 }