{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Training modules overview" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [], "source": [ "from fastai.basic_train import *\n", "from fastai.gen_doc.nbdoc import *\n", "from fastai.callbacks import *" ] }, { "cell_type": "markdown", "metadata": { "hide_input": false }, "source": [ "The fastai library structures its training process around the [`Learner`](/basic_train.html#Learner) class, whose object binds together a PyTorch model, a dataset, an optimizer, and a loss function; the entire learner object then will allow us to launch training.\n", "\n", "[`basic_train`](/basic_train.html#basic_train) defines this [`Learner`](/basic_train.html#Learner) class, along with the wrapper around the PyTorch optimizer that the library uses. It defines the basic training loop that is used each time you call the [`fit`](/basic_train.html#fit) method (or one of its variants) in fastai. This training loop is very bare-bones and has very few lines of codes; you can customize it by supplying an optional [`Callback`](/callback.html#Callback) argument to the [`fit`](/basic_train.html#fit) method.\n", "\n", "[`callback`](/callback.html#callback) defines the [`Callback`](/callback.html#Callback) class and the [`CallbackHandler`](/callback.html#CallbackHandler) class that is responsible for the communication between the training loop and the [`Callback`](/callback.html#Callback)'s methods. The [`CallbackHandler`](/callback.html#CallbackHandler) maintains a state dictionary able to provide each [`Callback`](/callback.html#Callback) object all the information of the training loop it belongs to, putting any imaginable tweaks of the training loop within your reach.\n", "\n", "[`callbacks`](/callbacks.html#callbacks) implements each predefined [`Callback`](/callback.html#Callback) class of the fastai library in a separate module. Some modules deal with scheduling the hyperparameters, like [`callbacks.one_cycle`](/callbacks.one_cycle.html#callbacks.one_cycle), [`callbacks.lr_finder`](/callbacks.lr_finder.html#callbacks.lr_finder) and [`callback.general_sched`](/callbacks.general_sched.html#callbacks.general_sched). Others allow special kinds of training like [`callbacks.fp16`](/callbacks.fp16.html#callbacks.fp16) (mixed precision) and [`callbacks.rnn`](/callbacks.rnn.html#callbacks.rnn). The [`Recorder`](/basic_train.html#Recorder) and [`callbacks.hooks`](/callbacks.hooks.html#callbacks.hooks) are useful to save some internal data generated in the training loop.\n", "\n", "[`train`](/train.html#train) then uses these callbacks to implement useful helper functions. Lastly, [`metrics`](/metrics.html#metrics) contains all the functions and classes you might want to use to evaluate your training results; simpler metrics are implemented as functions while more complicated ones as subclasses of [`Callback`](/callback.html#Callback). For more details on implementing metrics as [`Callback`](/callback.html#Callback), please refer to [creating your own metrics](/metrics.html#Creating-your-own-metric)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Walk-through of key functionalities\n", "\n", "We'll do a quick overview of the key pieces of fastai's training modules. See the separate module docs for details on each. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Setup\n", "Import required [modules](/index.html#imports) and prepare [data](/basic_data.html#Get-your-data-ready-for-training): " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from fastai.vision import *\n", "\n", "path = untar_data(URLs.MNIST_SAMPLE)\n", "data = ImageDataBunch.from_folder(path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*`URLs.MNIST_SAMPLE` is a small subset of the classic MNIST dataset containing the images of just 3's and 7's for the purpose of demo and documentation here. Common [`datasets`](/datasets.html#datasets) can be downloaded with [`untar_data`](/datasets.html#untar_data) - which we will use to create an [`ImageDataBunch`](/vision.data.html#ImageDataBunch) object*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Basic training with [`Learner`](/basic_train.html#Learner)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can create a minimal CNN using [`simple_cnn`](/layers.html#simple_cnn) (see [`models`](/vision.models.html#vision.models) for details on creating models):" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = simple_cnn((3,16,16,2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The [`Learner`](/basic_train.html#Learner) class plays a central role in training models; when you create a [`Learner`](/basic_train.html#Learner) you need to specify at the very minimum the [`data`](/vision.data.html#vision.data) and `model` to use." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "learn = Learner(data, model)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These are enough to create a [`Learner`](/basic_train.html#Learner) object and then use it to train a model using its [`fit`](/basic_train.html#fit) method. If you have a CUDA-enabled GPU, it will be used automatically. To call the [`fit`](/basic_train.html#fit) method, you have to at least specify how many epochs to train for." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Total time: 00:03

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_loss
10.1249810.097195
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "learn.fit(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Viewing metrics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To see how our training is going, we can request that it reports various kinds of [`metrics`](/metrics.html#metrics) after each epoch. You can pass it to the constructor, or set it later. Note that metrics are always calculated on the validation set." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Total time: 00:02

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracy
10.0815630.0627980.976938
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "learn.metrics=[accuracy]\n", "learn.fit(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Extending training with callbacks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can use [`callback`](/callback.html#callback)s to modify training in almost any way you can imagine. For instance, we've provided a callback to implement Leslie Smith's 1cycle training method." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Total time: 00:02

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracy
10.0559550.0454690.984298
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cb = OneCycleScheduler(learn, lr_max=0.01)\n", "learn.fit(1, callbacks=cb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The [`Recorder`](/basic_train.html#Recorder) callback is automatically added for you, and you can use it to see what happened in your training, e.g.:" ] }, { "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(show_moms=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Extending [`Learner`](/basic_train.html#Learner) with [`train`](/train.html#train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Many of the callbacks can be used more easily by taking advantage of the [`Learner`](/basic_train.html#Learner) extensions in [`train`](/train.html#train). For instance, instead of creating OneCycleScheduler manually as above, you can simply call [`Learner.fit_one_cycle`](/train.html#fit_one_cycle):" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Total time: 00:03

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracy
10.0405350.0350620.986752
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "learn.fit_one_cycle(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Applications" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that if you're training a model for one of our supported *applications*, there's a lot of help available to you in the application modules:\n", "\n", "- [`vision`](/vision.html#vision)\n", "- [`text`](/text.html#text)\n", "- [`tabular`](/tabular.html#tabular)\n", "- [`collab`](/collab.html#collab)\n", "\n", "For instance, let's use [`cnn_learner`](/vision.learner.html#cnn_learner) (from [`vision`](/vision.html#vision)) to quickly fine-tune a pre-trained Imagenet model for MNIST (not a very practical approach, of course, since MNIST is handwriting and our model is pre-trained on photos!)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Total time: 02:06

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracy
10.1636590.1127670.958783
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "learn = cnn_learner(data, models.resnet18, metrics=accuracy)\n", "learn.fit_one_cycle(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Open This Notebook\n", "\n", "" ] } ], "metadata": { "jekyll": { "keywords": "fastai", "summary": "Overview of fastai training modules, including Learner, metrics, and callbacks", "title": "training" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 2 }