Skip to content

Instantly share code, notes, and snippets.

@pouannes
Last active December 19, 2018 17:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pouannes/a937dbb3247e8582d184d9b7db585723 to your computer and use it in GitHub Desktop.
Save pouannes/a937dbb3247e8582d184d9b7db585723 to your computer and use it in GitHub Desktop.
docs_src/callbacks.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "# List of callbacks"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-12-19T17:01:49.315444Z",
"end_time": "2018-12-19T17:01:49.320535Z"
},
"hide_input": true,
"trusted": true
},
"cell_type": "code",
"source": "from fastai.gen_doc.nbdoc import *\nfrom fastai.vision import *\nfrom fastai.text import *\nfrom fastai.callbacks import * \nfrom fastai.basic_train import * \nfrom fastai.train import * \nfrom fastai import callbacks",
"execution_count": 5,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "fastai's training loop is highly extensible, with a rich *callback* system. See the [`callback`](/callback.html#callback) docs if you're interested in writing your own callback. See below for a list of callbacks that are provided with fastai, grouped by the module they're defined in.\n\nEvery callback that is passed to [`Learner`](/basic_train.html#Learner) with the `callback_fns` parameter will be automatically stored as an attribute. The attribute name is snake-cased, so for instance [`ActivationStats`](/callbacks.hooks.html#ActivationStats) will appear as `learn.activation_stats` (assuming your object is named `learn`)."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## [`Callback`](/callback.html#Callback)\n\nThis sub-package contains more sophisticated callbacks that each are in their own module. They are (click the link for more details):"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### [`LRFinder`](/callbacks.lr_finder.html#LRFinder)\n\nUse Leslie Smith's [learning rate finder](https://www.jeremyjordan.me/nn-learning-rate/) to find a good learning rate for training your model. Let's see an example of use on the MNIST dataset with a simple CNN."
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-12-19T17:01:50.595809Z",
"end_time": "2018-12-19T17:01:50.731571Z"
},
"trusted": true
},
"cell_type": "code",
"source": "path = untar_data(URLs.MNIST_SAMPLE)\ndata = ImageDataBunch.from_folder(path)\ndef simple_learner(): return Learner(data, simple_cnn((3,16,16,2)), metrics=[accuracy])\nlearn = simple_learner()",
"execution_count": 6,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "The fastai librairy already has a Learner method called `lr_find` that uses `LRFinder` to plot the loss as a function of the learning rate"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-12-19T17:01:51.507907Z",
"end_time": "2018-12-19T17:01:52.921581Z"
},
"trusted": true
},
"cell_type": "code",
"source": "learn.lr_find()",
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"text": "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n",
"name": "stdout"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-12-19T17:01:53.033769Z",
"end_time": "2018-12-19T17:01:53.362186Z"
},
"trusted": true
},
"cell_type": "code",
"source": "learn.recorder.plot()",
"execution_count": 8,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEKCAYAAADjDHn2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvDW2N/gAAIABJREFUeJzt3Xt8VPWd//HXZ2ZyJ1cSIIFACBcBBVQCgtRbqxSrVVtbq72s2lbbbq3b7aPd1l/30e7qdttuu7u9bLetsrXdba3XXrzVa70jclFBCKhcJYDcAknIfWa+vz/mBIaQZALMZDIz7+fjMQ9nvuecOZ/EYd453+8532POOURERAbiS3YBIiIy/CksREQkJoWFiIjEpLAQEZGYFBYiIhKTwkJERGJSWIiISEwKCxERiUlhISIiMQWSXUC8lJeXu5qammSXISKSUlatWrXPOVcRa720CYuamhpWrlyZ7DJERFKKmW0bzHrqhhIRkZgUFiIiEpPCQkREYlJYiIhITAoLERGJSWEhIiIxKSxERCSmtLnO4kS1dQX5xbObjmrLDviYMLKA2ooCJpYXkJ8d/19TdyiM3wyfz+L+3iIi8ZbxYdHeFeKnz2w8qq33bclHFeYwviyf8WX5jC3NI9vvw+czfGa0d4fYebCdXU3t7DrYQVcojN9n+M3I8vuoKMxhdFEuY4pz6A45Nu45xMY9h9h+oA3nICfgIy/bz4icAJXFuVSV5FFZnEfYOXY3d7CnuZPG1i6yAz4KciLrFeZmUZKfRWl+NiX5WWT7fZiBYfh9RkFOgBE5AUbkBhhZkM3oolyyA5lxEOmco7kjSGd3iJBzhMIO5yDgj/xuAj6fF9LgMyPgN3IC/mSXLTLsmev9zZii6urqXLyu4G7vCrF1fytb9rWyee8htu1vY/uBNrY3trOzqf2oMDGLhElVSR5VxXnkBHyEnCPsoKM7xJ6WTnY3dbD3UCd+M2orCpg8agS15QX4fJGw6egK0dTeza6mDnY2tfNuUwc+M0YX5TK6KIeygmy6gmFaO0Mc6gzS3NHNwbZuDnUGB/Xz9NQ4pjgPnIvssztMZzBEKOwOP46sb5hFQjPsIl+2uVl+JozMjzzKCsjL9hF2kXVC4TBtXSHauiL1hcMu8sXs9xHwGR3dkWWtXUG6gmFys/zkZvnIDfjJyfKTE/CRk+Ujxx95z5BzhMMOR+QL3Wfg9xlmkRDuORjrCEZ+jvbuEPtaOtl+oJ3tjW2D/r30yM3yUZafTUl+NmUFRz8KcwOHw7ckL4sJ5QVUFuXqiFDShpmtcs7VxVxPYXF8wmHnhUHkS9TvixxBxNLzZewfxJdMOOwiRwo28LrdoTAH27rpDoVxRP6qDoXd4VBp6ehm/6EudhxsZ+fBdt5tjoRQXpafvGw/2X4ffn/kCzi6LueOfFGbRf57qCPItsZWtu1vY1dTxzG1BLwjmoJsP36/EQw5gl4I5QZ85HvLsvy+I1/yXSE6g5HQ6gyG6QqGMYu8V8++w+7I77z3R9Xvi/wsuVk+SvOzGV+WT3VZPmNL8sjL9h8+wsMi7xEMO4KhMCF35HfVHQrT1N5NY2s3B9u6aGzrorE18mjp6Dt08rL8TCwvYMroEUwbU8S0ykJmVBYxuig35v9bkeFmsGGR8d1Qx8vnM3wc/1+VgwmJ6H0MRk8311DrDIYIhtzhIPGZxaWbyzk3YEA6LzBCXmoEvKONROkKhjnUGaS1M8ihziAHWrvYvK+VzXtb2bzvECu2NPLn13ceXr+yOJczJ5QyZ3wps6tLmFheQGl+VkJrFBkqCgs5bjkBPzkJ+OTE+lLt6R47kbA+EdkBH2WBSHdUj7Mnlx+1TlNbNxvebWbdzmZe236QV7cd4JE1uw4vL8wJMKE8n9ryEUwZNYIpo0cwZXQhteUFChFJKQoLkZNQnJ/FWbUjOat25OG2XU3trNvRzLbGNt7Z38qW/W2s2naAB1cfOQopzc+irqaMeTVlnDmhlGljCilIRAKLxIk+nSJxVlkcOaOtt9bOIJv2HmL9rmZWbD3Aiq2NPFm/G4ichDChLJ8ZVUUsmjGGi2eO0VlaMqxogFskiXY3d7CmoYn1u5pZv6uZ1dsPsrOpg/IR2Vw9dzyfmD++z+ARiRedDSWSgsJhx4sb9/G/L2/l6Q178JlxycxKbjinlpnjipNdnqQhnQ0lkoJ8PuPcqRWcO7WC7Y1t/GbpVu5esZ0HV+/krIllfPnCqSyYNDL2G4nEmY4sRIa55o5u7lm+nTtf2sLOpg6uO7uGry+eRl62xjTk5A32yCIz5oAQSWFFuVnccG4tf/3q+Vy/sIZfL93KJT95gdfeOZDs0iSDKCxEUkRulp9vf/BU7rrhLDqDYa78+VK+80g9rcc5vYnIiVBYiKSYsyeV85cvn8PH5o7njhe2cNF/PHf4FFyRRFFYiKSgotwsvvvhmTzwhQUU5mZxw/+u5G9/t4q2Lh1lSGIoLERS2JwJZTx883v42vtP4bG17/LJJa9wsK0r2WVJGlJYiKS4LL+PL14wmf/+xJms3dHMx365jN3Nx84MLHIyFBYiaWLxaZX8+vq5NBxo48qfL2XLvtZklyRpRGEhkkbOnlzO3TcuoK0rxFW/fJm3d7ckuyRJEwoLkTQzc1wx99w4HwM+dvsy6nc2J7skSQMKC5E0NGV0Ifd8bgG5AR/X3LGM1dsPJrskSXEKC5E0NbG8gHs+t4CivACfWPKKxjDkpCgsRNJYdVk+d9+4AOcc3310fbLLkRSmsBBJc2NL8vjbCybzRP1ulm7al+xyJEUpLEQywGfeM5GxJXn8y8PrCYXTY6ZpGVoKC5EMkJvl5x8Wn0L9rmYeeLUh2eVIClJYiGSIy2ZXccb4En74+JuaqVaOm8JCJEOYGf94yQz2tHTyy+c2JbscSTEKC5EMMmdCKZfMquR/XtxCU1t3ssuRFKKwEMkwXzx/Mq1dIX77yrZklyIpRGEhkmFmVBVx3tQK7nxpCx3doWSXIykioWFhZovN7E0z22hm3+hnnavMrN7M1pnZXVHtITN73Xs8mMg6RTLN58+bxL5DXTozSgYtkKg3NjM/8DPgIqABWGFmDzrn6qPWmQLcAix0zh0ws1FRb9HunDs9UfWJZLL5tWXMHlfMHc9v5uq54/H7LNklyTCXyCOLecBG59xm51wXcDdwea91bgB+5pw7AOCc25PAekTEY2Z8/rxJbN3fxmNr3012OZICEhkWY4HtUa8bvLZoU4GpZvaSmS0zs8VRy3LNbKXXfkUC6xTJSItOHcPE8gJ+8dwmnNNV3TKwRIZFX8e1vT+RAWAKcD5wDbDEzEq8ZeOdc3XAx4EfmdmkY3ZgdqMXKCv37t0bv8pFMoDfZ9xwTi1v7Gji5U37k12ODHOJDIsGoDrq9ThgZx/r/Nk51+2c2wK8SSQ8cM7t9P67GXgWOKP3Dpxztzvn6pxzdRUVFfH/CUTS3IfPHEtxXhb3rdJAtwwskWGxAphiZhPNLBu4Guh9VtOfgAsAzKycSLfUZjMrNbOcqPaFQD0iEle5WX7ef+ponqzfrdNoZUAJCwvnXBC4CXgcWA/c65xbZ2a3mtll3mqPA/vNrB54Bviac24/MB1YaWarvfbvRZ9FJSLxc8msKg51Bnn+LXXlSv8SduosgHPuUeDRXm3finrugK94j+h1lgIzE1mbiEScPWkkpflZPLxmF4tOHZPscmSY0hXcIhkuy+9j8WljeGq9uqKkfwoLEeGSmVW0dYV49k1d6iR9U1iICPNryxhZkM1Da3YluxQZphQWIkLA64r66/o9tHXpxkhyLIWFiABw6awq2rtDPLNBZ0XJsRQWIgLAvIlllI/I4eE1va+dFVFYiIjH7zM+MHMMf92wR/folmMoLETksItPq6QzGOaFt9UVJUdTWIjIYXNrSinJz+KJdbuTXYoMMwoLETks4PfxvmmjeWr9brpD4WSXI8OIwkJEjrLo1NE0dwRZvqUx2aXIMKKwEJGjnDulgtwsH0+s0x305AiFhYgcJS/bz7lTKniifrfuoCeHKSxE5BiLTh3DrqYO1u5oTnYpMkwoLETkGO+bNgqfwRP16oqSCIWFiByjtCCbeRPLdAqtHKawEJE+LZoxhjd3t7B1X2uyS5FhQGEhIn26aMZoAJ6s19GFKCxEpB/VZfnMqCziL2t1jwtRWIjIAC6ZVcmr7xxk58H2ZJciSaawEJF+XTqrEoBH39DRRaZTWIhIvyaMLGDm2GLdblUUFiIysEtmVbJ6+0G2N7YluxRJIoWFiAzokpmRrqhH1BWV0RQWIjKg6rJ8ZleX6HarGU5hISIxfXBWJWt3NOsCvQymsBCRmD6grqiMp7AQkZiqSvKYM6GUh1arKypTKSxEZFAunVXJhndb2LjnULJLkSRQWIjIoFwyq5KAz/j98neSXYokgcJCRAZlVGEul8yq5N4V2znUGUx2OTLEFBYiMmjXL5xIS2eQ+1duT3YpMsQUFiIyaKdXl3Dm+BLuXLqVcFj3584kCgsROS6ffs9Etu1v468b9iS7FBlCCgsROS6LTx1DVXEudy7dkuxSZAgpLETkuAT8Pj61oIaXNu5nw7vNyS5HhojCQkSO2zXzqsnN8nHni1uTXYoMEYWFiBy3kvxsPnzmOP70+g5aOrqTXY4MAYWFiJyQj8wZR2cwzOPrdie7FBkCCgsROSFnVJdQXZbHn1/fkexSZAgkNCzMbLGZvWlmG83sG/2sc5WZ1ZvZOjO7K6r9WjN723tcm8g6ReT4mRmXzx7LSxv3saelI9nlSIIlLCzMzA/8DLgYmAFcY2Yzeq0zBbgFWOicOxX4stdeBnwbOAuYB3zbzEoTVauInJgrzqgi7OAR3aM77SXyyGIesNE5t9k51wXcDVzea50bgJ855w4AOOd6rvJ5P/Ckc67RW/YksDiBtYrICZg8qpAZlUX86XVNXZ7uEhkWY4HoCWQavLZoU4GpZvaSmS0zs8XHsS1mdqOZrTSzlXv37o1j6SIyWFecUcXq7Qd1F700l8iwsD7aek8mEwCmAOcD1wBLzKxkkNvinLvdOVfnnKurqKg4yXJF5ER8cHYVZvBnHV2ktUSGRQNQHfV6HND709QA/Nk51+2c2wK8SSQ8BrOtiAwDlcV5zKsp48+rd+CcJhdMV4kMixXAFDObaGbZwNXAg73W+RNwAYCZlRPpltoMPA4sMrNSb2B7kdcmIsPQFWeMZfPeVtbu0PQf6SphYeGcCwI3EfmSXw/c65xbZ2a3mtll3mqPA/vNrB54Bviac26/c64RuI1I4KwAbvXaRGQYuvi0MWT5jQdX65qLdGXpcthYV1fnVq5cmewyRDLW3/xqOe/sb+WZr56PWV/DjjIcmdkq51xdrPV0BbeIxMVF00exdX8bm/bqrKh0NKiwMLNJZpbjPT/fzG72zloSEQHgvdNHA/D0es0VlY4Ge2TxABAys8nA/wATgbsG3kREMsnYkjxmVBbxlMIiLQ02LMLegPWHgB855/4eqExcWSKSii6cMZpV2w7Q2NqV7FIkzgYbFt1mdg1wLfCw15aVmJJEJFVdOH0UYQfP6P7caWewYXE9sAD4jnNui5lNBH6buLJEJBWdVlXM6KIcdUWlocBgVnLO1QM3A3gXyRU6576XyMJEJPX4fMZ7p43mwdd30BkMkRPwJ7skiZPBng31rJkVeVOHrwbuNLP/SGxpIpKKLpoxitauEMs26zradDLYbqhi51wz8GHgTufcHODCxJUlIqnq7Enl5Gb5eKpeXVHpZLBhETCzSuAqjgxwi4gcIzfLzzlTKnh6/W5NLJhGBhsWtxKZx2mTc26FmdUCbyeuLBFJZRdOH8XOpg7W72pJdikSJ4MKC+fcfc65Wc65L3ivNzvnrkxsaSKSqt4zJXJ/mZc3709yJRIvgx3gHmdmfzSzPWa228weMLNxiS5ORFLT2JI8xpfls0xhkTYG2w11J5F7UVQRub3pQ16biEif5teW8crm/YTCGrdIB4MNiwrn3J3OuaD3+DWg+5iKSL8WTBpJc0eQ9bt0Q6R0MNiw2GdmnzQzv/f4JKDjSxHp1/zakQDqikoTgw2LTxM5bfZdYBfwESJTgIiI9KmyOI+akRq3SLRb/vAGN//+tYTvZ7BnQ73jnLvMOVfhnBvlnLuCyAV6IiL9ml87kle2NGrcIoGWbd5PZzCU8P2czJ3yvhK3KkQkLS2YNJIWjVskTHNHN1v2tTJzbHHC93UyYaGb7IrIgM6aGBm3eHmTuqISYd2OSAifNszDQseVIjKgMcW5TCwvGHDcYndzB/+3bJumBjkBa3c0AQzJkcWAU5SbWQt9h4IBeQmpSETSyvzakTy8eiehsMPvO7ZD4kdPvc3vl7/DvJoyThlTmIQKU9cbO5qoKs5l5IichO9rwCML51yhc66oj0ehc25Q98IQkcw2v7aMls4g63Y2HbOsvSvEw6t3AvDypn1DXVrKe2NH05B0QcHJdUOJiMS0YIDrLZ6of5eWziDZAR9LNa5xXHoGt2eNU1iISBoYVZRLbUUBL248NgzuW9nAuNI8rji9imWaGuS4DOXgNigsRGQIXDqzkuff2nvU0cWOg+28tGkfH5kzjoWTy2nuCFK/U6fYDtZQDm6DwkJEhsAXzp9MdVke/++Pbxy+gOwPqxpwDq48cxwLJkW6qpZq3GLQ1gzh4DYoLERkCORl+7nt8tPYvLeVXzy7Gecc97/awILakVSX5TOqMJcpo0Zo3OI4rB3CwW1QWIjIEDn/lFF8cHYVP3tmI/eu3M62/W18ZM6R2+KcPWkkK7Y20hUMJ7HK1DCUV273UFiIyJD51qUzyM3y8Y0/vEFBtp+LZ445vGzBpHLaukKsaTiYxApTQ8/g9swhOhMKFBYiMoQqCnO45QPTcQ4umVVJfvaRy7Xm15ZhhrqiBmGoB7chxhXcIiLx9rG6atq6Qrz/1NFHtZfkZ3NqVRFLN+3j5vdNSVJ1qWGoB7dBRxYiMsR8PuMz75nIuNL8Y5adPamcV7cdpKM78VNup7KhHtwGhYWIDCMLJo2kKxRm1bYDyS5l2ErG4DaoG0pEhpG5NWUEfMbzb+9l4eTyZJeTFPsPdfLdv2xg5dZGxo8soLa8gNqKAkJhx56WTjbtOQTAaUM4uA0KCxEZRkbkBDh3agVLXthCdWk+n5w/IdklxY1zjs5gmNwsf5/Lw2HHfau2892/bKC1M8h5UyvY1dTByq2NtHVFuuUCPqOiMIf5tWXMrSkbyvIVFiIyvPzkmjP40l2v8o9/WsvWfa3c8oHpfU5tnmruW9XAN//4Bn+zoIab3zuF4vwsIBIiL27cx0+f3sjyrY3MrSnlXz80kymjCw8v39PSSbbfR3FeFr4k/S4UFiIyrIzICXDH39Rx28P1LHlxC1v2tXL+tFGEw46wc9RWjOC8qRXJLvO4vbxpP4bxq5e28IdXG/jyhVPJ8vv49dItvLX7EOUjsvn+lTP56JzqowLBzBhdlJvEyiMUFiIy7AT8Pv758tOYWF7AbY+s5+kNe44s8xlLb3kvowqT/wV6POp3NvOeKeV8ddEp/Msj9Xz7wXUAnFpVxA8/OpsPzq4kJ9B3F9VwkNCwMLPFwI8BP7DEOfe9XsuvA34A7PCa/ss5t8RbFgLe8Nrfcc5dlshaRWT4uW7hRD48Zxyd3WF8BruaOrj0py9y38oGvnjB5GSXN2gd3SE27T3ERTNGM6OqiN999iyWbW4ky2/MmVCK2fDvZktYWJiZH/gZcBHQAKwwswedc/W9Vr3HOXdTH2/R7pw7PVH1iUhqKMrNAu8gYuSIHM6eNJLfL3+Hz583KWXGMjbuOUQw7JhRVQREupZ6ZtpNFYm8zmIesNE5t9k51wXcDVyewP2JSAb4+FnjaTjQzvNv7012KYPWc5+O6ZVFSa7kxCUyLMYC26NeN3htvV1pZmvM7H4zq45qzzWzlWa2zMyuSGCdIpJCFs0YQ/mIbH637J1klzJo9buayc/2M6Hs2KvWU0Uiw6Kv48Pe90x8CKhxzs0CngJ+E7VsvHOuDvg48CMzm3TMDsxu9AJl5d69qfNXhoicuOyAj6vqqvnrht3sPNie7HIGpX5nM9Mri5J22ms8JDIsGoDoI4VxwM7oFZxz+51znd7LO4A5Uct2ev/dDDwLnNF7B865251zdc65uoqK1DuVTkROzDXzxuOAu1dsj7lusjnnWL+rmRkp3AUFiQ2LFcAUM5toZtnA1cCD0SuYWWXUy8uA9V57qZnleM/LgYVA74FxEclQ1WX5nDulgntWvEMwNLxvltRwoJ2WzmBKj1dAAsPCORcEbgIeJxIC9zrn1pnZrWbWcxrszWa2zsxWAzcD13nt04GVXvszwPf6OItKRDLYJ84az+7mTp5avyf2ykm0zhvc7jkTKlUl9DoL59yjwKO92r4V9fwW4JY+tlsKzExkbSKS2t47bRRVxbnc8cJm3n/q6GF7rUL9rmZ8Bqd403ekKk1RLiIpKeD38YXzJ7Fq2wFe2jh87663flcztRUjyMsevldnD4bCQkRS1lVzqxlTlMuPn34L53qfbJl463Y2ceF/PMfr2/u/b3jPmVCpTmEhIikrJ+DnC+dPYsXWA7ychHt31+9sZuOeQ1x353Le2t1yzPKmtm52HGxP+TOhQGEhIinuY3OrGV2Uw4+efnvI993cEQQiF5V96n9eYXtj21HL63elx+A2KCxEJMXlZvn5/HmTWL6lcciPLprbuwG464b5dHSH+cSSV9jT3HF4+eGw0JGFiEjyXTNvPBWFOfz46beGdL8tHUFG5ASYXlnEr6+fy75DnXz450t5aeM+IDK4XT4ih4rCnCGtKxEUFiKS8nqOLpZtbmTVtsYh229zRzdFuZErEM4YX8pvP3sWWX4fn1jyCl+/fw2vvXMgLbqgQGEhImnimnnVFOdlseSFLUO2z+b2borysg6/PnN8KX/5u3P4/HmTuP/VBjbtbU2LLihQWIhImsjPDvDxs8bz+Lp3jxloTpSWjiCFuUdf25yb5ecbF0/jz19cyOJTx3DZ7KohqSXRFBYikjauXVCDz4w7X9o6JPuLdENl9bnstLHF/OJTc9QNJSIy3IwpzuXSWZXcs+Idmju6E76/5o6ju6HSmcJCRNLKZ95TS2tXiHuWJ3768r66odKVwkJE0srMccWcNbGMXy/dmtDpy51zkQHufrqh0o3CQkTSzmfPqWXHwXYeW/duwvbR2hUi7KAoT0cWIiIp6X3TRlEzMp9fPLeJcDgxEwy2eGMihTqyEBFJTT6f8XcXTmHtjmb++NqOhOyjuT0yL5S6oUREUtjls8cyu7qE7z+2gdbOYNzfv+dsK3VDiYikMJ/P+PYHZ7CnpZNfPLcp7u+vbigRkTRx5vhSLj+9ituf30zDgfhe1X2kG0pHFiIiKe/ri6dhBt9/7M24vu+RbigdWYiIpLyqkjw+d+4kHlq9M64z0rZ4Nz7SRXkiImnic+fVUj4im5/+dWPc3rO5vZucgI+cgD9u7zmcKSxEJO3lZwe47uwann1zL+u9u9edrEyaFwoUFiKSIT45fwL52X7ueH5zXN6vuT2YMYPboLAQkQxRkp/N1XPH8+Dqnew42H7S79fc0Z0xp82CwkJEMshnzpmIA3714snfTa+5I6huKBGRdDS2JI/LZlfx++Xv0NR2cve7aGnvVjeUiEi6uvHcWtq6Qvz2lW0n9T7NHUF1Q4mIpKvplUWcN7WCO1/aQmcwdMLvEzkbSkcWIiJp67qFNew71MUzG/ae0PYd3SG6guGMmXEWFBYikoHOmVxORWEOD7zacELb91y9rTELEZE0FvD7uOL0Kp7ZsIfG1q7j3j7T5oUChYWIZKgPnzmOYNjx0Oqdx71tc7sXFuqGEhFJb9Mri5heWcQfTqArKtMmEQSFhYhksCvPHMvqhiY27mk5ru3UDSUikkEuO70Kn8EfXj2++3Rn2v23QWEhIhlsVGEu506t4I+v7SAcdoPeriXD7r8NCgsRyXBXnjmOXU0dLNu8f9DbNHd04/cZeVmZcS8LUFiISIa7aMZoCnMCLHlxC84N7uiiZ3pyM0twdcNHQsPCzBab2ZtmttHMvtHH8uvMbK+Zve49Phu17Foze9t7XJvIOkUkc+Vm+bn5fVP464Y93D7Ie120ZNiNjwAS1uFmZn7gZ8BFQAOwwswedM7V91r1HufcTb22LQO+DdQBDljlbXsgUfWKSOb67DkTeX37Qb7/2AZOG1vMwsnlA64fmUQwc8YrILFHFvOAjc65zc65LuBu4PJBbvt+4EnnXKMXEE8CixNUp4hkODPj3z4yi0kVI7jprldpONA24PrN7d0ZdSYUJDYsxgLbo143eG29XWlma8zsfjOrPs5tRUTioiAnwC8/NYdgyPH5366io7v/GWlbOoIKizjqa+Sn9+jRQ0CNc24W8BTwm+PYFjO70cxWmtnKvXtPbPZIEZEetRUj+OFVs1m7o5n7V/V/ZXfklqrqhoqXBqA66vU44KhJWJxz+51znd7LO4A5g93W2/5251ydc66uoqIiboWLSOZaNGM008YUct/K7f2u09yeeQPciQyLFcAUM5toZtnA1cCD0SuYWWXUy8uA9d7zx4FFZlZqZqXAIq9NRCShzIyr6qpZ3dDEhnebj1keDIVp7QqpGypenHNB4CYiX/LrgXudc+vM7FYzu8xb7WYzW2dmq4Gbgeu8bRuB24gEzgrgVq9NRCThrjhjLFl+494Vx3ZFHerMvEkEIYGnzgI45x4FHu3V9q2o57cAt/Sz7a+AXyWyPhGRvpQVZHPRjNH88bUGvnHxNLIDR/6uPjwvlLqhRETkqrpqDrR18/T63Ue1H55xNsOOLBQWIiJ9OGdKBWOKcrm310B3Jk5PDgoLEZE++X3GR+aM47m39vJuU8fh9p5uqEwbs1BYiIj04yNzxhF28EDU3fSOdEPpyEJERICa8gLOmljGPSu2H77fRc8tVdUNJSIih31y/gTeaWzj6Q17gMgFeQAjctQNJSIinotPG8PYkjzueCEyfXlzRzeFOQH8vsy5lwUoLEREBhTw+7h+YQ3LtzSypuFgZBLBDOuCAoWFiEhMV82tZkROgCUvbKG5PfM5LqQ0AAAIjElEQVQmEQSFhYhITEW5WVw9t5pH3tjF23sOZdyZUKCwEBEZlOsW1uCcY8u+VorydGQhIiJ9GFeaz8UzIxNlF+rIQkRE+nPDObVA5l29DQmedVZEJJ2cXl3C1xdP4+xJI5NdypBTWIiIHIcvnD8p2SUkhbqhREQkJoWFiIjEpLAQEZGYFBYiIhKTwkJERGJSWIiISEwKCxERiUlhISIiMZlzLtk1xIWZ7QUOAk19LC7u1T7Q657nfbWVA/uOs7Te+xrs8hOpOfr5ydQ8UF0DLY/VNhxr7qtdn4/YMuXzkYo199U+0OspzrnimJU459LmAdw+mPaBXvc876dtZbxqSkTNfdV/IjWfaN2x2oZjzfp86PORbjWfzOdjoEe6dUM9NMj2gV4/NEBbPGuKtfxEao5+fjI1D2b7vpbHahuONffVrs9HbJny+UjFmvtqH+zno19p0w01FMxspXOuLtl1HA/VPHRSsW7VPDRSsebe0u3IItFuT3YBJ0A1D51UrFs1D41UrPkoOrIQEZGYdGQhIiIxZWRYmNmvzGyPma09gW3nmNkbZrbRzH5iZha17Etm9qaZrTOzf4tv1Ymp28z+ycx2mNnr3uMDw73mqOVfNTNnZuXxqzhhv+fbzGyN9zt+wsyq4llzAuv+gZlt8Gr/o5mVpEDNH/X+DYbNLG7jBCdTaz/vd62Zve09ro1qH/BznzQncjpXqj+Ac4EzgbUnsO1yYAFgwF+Ai732C4CngBzv9agUqfufgK+m0u/aW1YNPA5sA8qHe81AUdQ6NwO/SIXfNbAICHjPvw98PwVqng6cAjwL1CW7Vq+Oml5tZcBm77+l3vPSgX6uZD8y8sjCOfc80BjdZmaTzOwxM1tlZi+Y2bTe25lZJZF/9C+7yP/V/wWu8BZ/Afiec67T28eeFKk7oRJY838C/wDEfdAtETU755qjVi1IobqfcM4FvVWXAeNSoOb1zrk341nnydTaj/cDTzrnGp1zB4AngcXJ/LcaS0aGRT9uB77knJsDfBX47z7WGQs0RL1u8NoApgLnmNkrZvacmc1NaLVHnGzdADd53Qy/MrPSxJV62EnVbGaXATucc6sTXWiUk/49m9l3zGw78AngWwmsNVo8Ph89Pk3kL91Ei2fNiTaYWvsyFtge9bqn/uHycx1D9+AGzGwEcDZwX1T3YE5fq/bR1vMXYoDI4eR8YC5wr5nVen8dJESc6v45cJv3+jbg34l8KSTEydZsZvnAN4l0jwyJOP2ecc59E/immd0C3AR8O86lHl1MnOr23uubQBD4XTxrPKaQONacaAPVambXA3/ntU0GHjWzLmCLc+5D9F9/0n+u/igsInzAQefc6dGNZuYHVnkvHyTyxRp9GD4O2Ok9bwD+4IXDcjMLE5kPZu9wrts5tztquzuAhxNYL5x8zZOAicBq7x/oOOBVM5vnnHt3mNbc213AIyQ4LIhT3d7g66XA+xL5x48n3r/rROqzVgDn3J3AnQBm9ixwnXNua9QqDcD5Ua/HERnbaCD5P1ffkj1okqwHUEPUQBWwFPio99yA2f1st4LI0UPP4NMHvPbPA7d6z6cSOcS0FKi7MmqdvwfuHu4191pnK3Ee4E7Q73lK1DpfAu5Pkc/1YqAeqEhEvYn8fBDnAe4TrZX+B7i3EOmNKPWelw32c5+MR9ILSMoPDb8HdgHdRJL8M0T+Wn0MWO394/hWP9vWAWuBTcB/ceTCxmzgt96yV4H3pkjd/we8Aawh8hdb5XCvudc6W4n/2VCJ+D0/4LWvITIXz9gU+XxsJPKHz+veI65ncSWo5g9579UJ7AYeT2at9BEWXvunvd/vRuD64/ncJ+OhK7hFRCQmnQ0lIiIxKSxERCQmhYWIiMSksBARkZgUFiIiEpPCQtKamR0a4v0tMbMZcXqvkEVmqV1rZg/FmvHVzErM7G/jsW+R3nTqrKQ1MzvknBsRx/cLuCMT6yVUdO1m9hvgLefcdwZYvwZ42Dl32lDUJ5lFRxaSccyswsweMLMV3mOh1z7PzJaa2Wvef0/x2q8zs/vM7CHgCTM738yeNbP7LXKvh9/13HPAa6/znh/yJg9cbWbLzGy01z7Je73CzG4d5NHPyxyZSHGEmT1tZq9a5L4Hl3vrfA+Y5B2N/MBb92veftaY2T/H8dcoGUZhIZnox8B/OufmAlcCS7z2DcC5zrkziMwK+69R2ywArnXOvdd7fQbwZWAGUAss7GM/BcAy59xs4Hnghqj9/9jbf8x5f7x5kd5H5Ap7gA7gQ865M4ncR+XfvbD6BrDJOXe6c+5rZrYImALMA04H5pjZubH2J9IXTSQomehCYEbUTKFFZlYIFAO/MbMpRGb6zIra5knnXPS9DJY75xoAzOx1InMGvdhrP10cmZhxFXCR93wBR+5RcBfww37qzIt671VE7nkAkTmD/tX74g8TOeIY3cf2i7zHa97rEUTC4/l+9ifSL4WFZCIfsMA51x7daGY/BZ5xzn3I6/9/Nmpxa6/36Ix6HqLvf0vd7sigYH/rDKTdOXe6mRUTCZ0vAj8hcj+MCmCOc67bzLYCuX1sb8B3nXO/PM79ihxD3VCSiZ4gcj8JAMysZ4rpYmCH9/y6BO5/GZHuL4CrY63snGsicivWr5pZFpE693hBcQEwwVu1BSiM2vRx4NPefRcws7FmNipOP4NkGIWFpLt8M2uIenyFyBdvnTfoW09kenmAfwO+a2YvAf4E1vRl4CtmthyoBJpibeCce43IzKZXE7kBUZ2ZrSRylLHBW2c/8JJ3qu0PnHNPEOnmetnM3gDu5+gwERk0nTorMsS8u/21O+ecmV0NXOOcuzzWdiLJpDELkaE3B/gv7wymgyTwNrYi8aIjCxERiUljFiIiEpPCQkREYlJYiIhITAoLERGJSWEhIiIxKSxERCSm/w/5P8aOKQ2+pwAAAABJRU5ErkJggg==\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "In this example, a learning rate around 2e-2 seems like the right fit"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-12-19T17:01:59.124739Z",
"end_time": "2018-12-19T17:01:59.127542Z"
},
"trusted": true
},
"cell_type": "code",
"source": "lr = 2e-2",
"execution_count": 9,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### [`OneCycleScheduler`](/callbacks.one_cycle.html#OneCycleScheduler)\n\nTrain with Leslie Smith's [1cycle annealing](https://sgugger.github.io/the-1cycle-policy.html) method. Let's train our simple learner using the one cycle policy."
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-12-19T17:02:00.292469Z",
"end_time": "2018-12-19T17:02:08.573328Z"
},
"trusted": true
},
"cell_type": "code",
"source": "learn.fit_one_cycle(3, lr)",
"execution_count": 10,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<IPython.core.display.HTML object>",
"text/html": "Total time: 00:08 <p><table style='width:300px; margin-bottom:10px'>\n <tr>\n <th>epoch</th>\n <th>train_loss</th>\n <th>valid_loss</th>\n <th>accuracy</th>\n </tr>\n <tr>\n <th>1</th>\n <th>0.111205</th>\n <th>0.056460</th>\n <th>0.979882</th>\n </tr>\n <tr>\n <th>2</th>\n <th>0.040632</th>\n <th>0.023650</th>\n <th>0.987733</th>\n </tr>\n <tr>\n <th>3</th>\n <th>0.021217</th>\n <th>0.020044</th>\n <th>0.991659</th>\n </tr>\n</table>\n"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "The learning rate and the momentum were changed during the epochs as follows (more info on the [dedicated documentation page](https://docs.fast.ai/callbacks.one_cycle.html))."
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-12-19T17:02:10.549162Z",
"end_time": "2018-12-19T17:02:10.733212Z"
},
"trusted": true
},
"cell_type": "code",
"source": "learn.recorder.plot_lr(show_moms=True)",
"execution_count": 11,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 864x288 with 2 Axes>",
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### [`MixUpCallback`](/callbacks.mixup.html#MixUpCallback)\n\nData augmentation using the method from [mixup: Beyond Empirical Risk Minimization](https://arxiv.org/abs/1710.09412). It is very simple to add mixup in fastai :"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-12-19T17:02:13.653761Z",
"end_time": "2018-12-19T17:02:13.660217Z"
},
"trusted": true
},
"cell_type": "code",
"source": "learn = Learner(data, simple_cnn((3, 16, 16, 2)), metrics=[accuracy]).mixup()",
"execution_count": 12,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-12-19T17:02:14.277579Z",
"end_time": "2018-12-19T17:02:23.533832Z"
},
"trusted": true
},
"cell_type": "code",
"source": "learn.fit_one_cycle(3, lr)",
"execution_count": 13,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<IPython.core.display.HTML object>",
"text/html": "Total time: 00:09 <p><table style='width:300px; margin-bottom:10px'>\n <tr>\n <th>epoch</th>\n <th>train_loss</th>\n <th>valid_loss</th>\n <th>accuracy</th>\n </tr>\n <tr>\n <th>1</th>\n <th>0.359284</th>\n <th>0.148368</th>\n <th>0.965162</th>\n </tr>\n <tr>\n <th>2</th>\n <th>0.315967</th>\n <th>0.090522</th>\n <th>0.991168</th>\n </tr>\n <tr>\n <th>3</th>\n <th>0.305872</th>\n <th>0.084860</th>\n <th>0.990186</th>\n </tr>\n</table>\n"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### [`CSVLogger`](/callbacks.csv_logger.html#CSVLogger)\n\nLog the results of training in a csv file. Simply pass the CSVLogger callback to the Learner."
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-12-19T17:02:28.760214Z",
"end_time": "2018-12-19T17:02:28.766141Z"
},
"trusted": true
},
"cell_type": "code",
"source": "learn = Learner(data, simple_cnn((3, 16, 16, 2)), metrics=[accuracy, error_rate], callback_fns=[CSVLogger])",
"execution_count": 14,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-12-19T17:02:29.256292Z",
"end_time": "2018-12-19T17:02:37.887856Z"
},
"scrolled": true,
"trusted": true
},
"cell_type": "code",
"source": "learn.fit(3)",
"execution_count": 15,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<IPython.core.display.HTML object>",
"text/html": "Total time: 00:08 <p><table style='width:375px; margin-bottom:10px'>\n <tr>\n <th>epoch</th>\n <th>train_loss</th>\n <th>valid_loss</th>\n <th>accuracy</th>\n <th>error_rate</th>\n </tr>\n <tr>\n <th>1</th>\n <th>0.125326</th>\n <th>0.103473</th>\n <th>0.963690</th>\n <th>0.036310</th>\n </tr>\n <tr>\n <th>2</th>\n <th>0.077392</th>\n <th>0.059223</th>\n <th>0.977920</th>\n <th>0.022080</th>\n </tr>\n <tr>\n <th>3</th>\n <th>0.065756</th>\n <th>0.081031</th>\n <th>0.969578</th>\n <th>0.030422</th>\n </tr>\n</table>\n"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "You can then read the csv."
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-12-19T17:02:38.014240Z",
"end_time": "2018-12-19T17:02:38.027150Z"
},
"trusted": true
},
"cell_type": "code",
"source": "learn.csv_logger.read_logged_file()",
"execution_count": 16,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 16,
"data": {
"text/plain": " epoch train_loss valid_loss accuracy error_rate\n0 1 0.125326 0.103473 0.963690 0.036310\n1 2 0.077392 0.059223 0.977920 0.022080\n2 3 0.065756 0.081031 0.969578 0.030422",
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>epoch</th>\n <th>train_loss</th>\n <th>valid_loss</th>\n <th>accuracy</th>\n <th>error_rate</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>1</td>\n <td>0.125326</td>\n <td>0.103473</td>\n <td>0.963690</td>\n <td>0.036310</td>\n </tr>\n <tr>\n <th>1</th>\n <td>2</td>\n <td>0.077392</td>\n <td>0.059223</td>\n <td>0.977920</td>\n <td>0.022080</td>\n </tr>\n <tr>\n <th>2</th>\n <td>3</td>\n <td>0.065756</td>\n <td>0.081031</td>\n <td>0.969578</td>\n <td>0.030422</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### [`GeneralScheduler`](/callbacks.general_sched.html#GeneralScheduler)\n\nCreate your own multi-stage annealing schemes with a convenient API. To illustrate, let's implement a 2 phase schedule."
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-12-19T17:02:39.690478Z",
"end_time": "2018-12-19T17:02:39.696033Z"
},
"trusted": true
},
"cell_type": "code",
"source": "def fit_odd_shedule(learn, lr, mom):\n n = len(learn.data.train_dl)\n phases = [TrainingPhase(n, lr, mom, lr_anneal=annealing_cos), TrainingPhase(n*2, lr, mom, lr_anneal=annealing_poly(2))]\n sched = GeneralScheduler(learn, phases)\n learn.callbacks.append(sched)\n total_epochs = 3\n learn.fit(total_epochs)",
"execution_count": 17,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-12-19T17:02:40.329973Z",
"end_time": "2018-12-19T17:02:49.158050Z"
},
"trusted": true
},
"cell_type": "code",
"source": "learn = Learner(data, simple_cnn((3,16,16,2)), metrics=accuracy)\nfit_odd_shedule(learn, 1e-3, 0.9)",
"execution_count": 18,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<IPython.core.display.HTML object>",
"text/html": "Total time: 00:08 <p><table style='width:300px; margin-bottom:10px'>\n <tr>\n <th>epoch</th>\n <th>train_loss</th>\n <th>valid_loss</th>\n <th>accuracy</th>\n </tr>\n <tr>\n <th>1</th>\n <th>0.178648</th>\n <th>0.161728</th>\n <th>0.944553</th>\n </tr>\n <tr>\n <th>2</th>\n <th>0.142739</th>\n <th>0.132620</th>\n <th>0.957802</th>\n </tr>\n <tr>\n <th>3</th>\n <th>0.135239</th>\n <th>0.129183</th>\n <th>0.960255</th>\n </tr>\n</table>\n"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2018-12-19T17:02:50.794571Z",
"end_time": "2018-12-19T17:02:50.894112Z"
},
"trusted": true
},
"cell_type": "code",
"source": "learn.recorder.plot_lr()",
"execution_count": 19,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### [`MixedPrecision`](/callbacks.fp16.html#MixedPrecision)\n\nUse fp16 to [take advantage of tensor cores](https://docs.nvidia.com/deeplearning/sdk/mixed-precision-training/index.html) on recent NVIDIA GPUs for a 200% or more speedup."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### [`HookCallback`](/callbacks.hooks.html#HookCallback)\n\nConvenient wrapper for registering and automatically deregistering [PyTorch hooks](https://pytorch.org/tutorials/beginner/former_torchies/nn_tutorial.html#forward-and-backward-function-hooks). Also contains pre-defined hook callback: [`ActivationStats`](/callbacks.hooks.html#ActivationStats)."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### [`RNNTrainer`](/callbacks.rnn.html#RNNTrainer)\n\nCallback taking care of all the tweaks to train an RNN."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### [`TerminateOnNaNCallback`](/callbacks.tracker.html#TerminateOnNaNCallback)\n\nStop training if the loss reaches NaN."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### [`EarlyStoppingCallback`](/callbacks.tracker.html#EarlyStoppingCallback)\n\nStop training if a given metric/validation loss doesn't improve."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### [`SaveModelCallback`](/callbacks.tracker.html#SaveModelCallback)\n\nSave the model at every epoch, or the best model for a given metric/validation loss."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### [`ReduceLROnPlateauCallback`](/callbacks.tracker.html#ReduceLROnPlateauCallback)\n\nReduce the learning rate each time a given metric/validation loss doesn't improve by a certain factor."
},
{
"metadata": {
"cell_style": "center"
},
"cell_type": "markdown",
"source": "## [`train`](/train.html#train) and [`basic_train`](/basic_train.html#basic_train)"
},
{
"metadata": {
"cell_style": "center"
},
"cell_type": "markdown",
"source": "### [`Recorder`](/basic_train.html#Recorder)\n\nTrack per-batch and per-epoch smoothed losses and metrics."
},
{
"metadata": {
"cell_style": "center"
},
"cell_type": "markdown",
"source": "### [`ShowGraph`](/train.html#ShowGraph)\n\nDynamically display a learning chart during training."
},
{
"metadata": {
"cell_style": "center"
},
"cell_type": "markdown",
"source": "### [`BnFreeze`](/train.html#BnFreeze)\n\nFreeze batchnorm layer moving average statistics for non-trainable layers."
},
{
"metadata": {
"cell_style": "center"
},
"cell_type": "markdown",
"source": "### [`GradientClipping`](/train.html#GradientClipping)\n\nClips gradient during training."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"gist": {
"id": "a937dbb3247e8582d184d9b7db585723",
"data": {
"description": "docs_src/callbacks.ipynb",
"public": true
}
},
"jekyll": {
"keywords": "fastai",
"summary": "Callbacks implemented in the fastai library",
"title": "callbacks"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.7.1",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"toc": {
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"base_numbering": 1,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"window_display": false,
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"library": "var_list.py",
"delete_cmd_prefix": "del ",
"delete_cmd_postfix": "",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"library": "var_list.r",
"delete_cmd_prefix": "rm(",
"delete_cmd_postfix": ") ",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
]
},
"_draft": {
"nbviewer_url": "https://gist.github.com/a937dbb3247e8582d184d9b7db585723"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment