{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#export\n", "from local.test import *\n", "from local.basics import *" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from local.notebook.showdoc import *" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#default_exp callback.schedule" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Hyperparam schedule\n", "\n", "> Callback and helper functions to schedule any hyper-parameter" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from local.test_utils import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Annealing" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#export\n", "def annealer(f):\n", " \"Decorator to make `f` return itself partially applied.\"\n", " @functools.wraps(f)\n", " def _inner(start, end): return partial(f, start, end)\n", " return _inner" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is the decorator we will use for all of our scheduling functions, as it transforms a function taking `(start, end, pos)` to something taking `(start, end)` and return a function depending of `pos`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#export\n", "@annealer\n", "def SchedLin(start, end, pos): return start + pos*(end-start)\n", "@annealer\n", "def SchedCos(start, end, pos): return start + (1 + math.cos(math.pi*(1-pos))) * (end-start) / 2\n", "@annealer\n", "def SchedNo (start, end, pos): return start\n", "@annealer\n", "def SchedExp(start, end, pos): return start * (end/start) ** pos\n", "\n", "SchedLin.__doc__ = \"Linear schedule function from `start` to `end`\"\n", "SchedCos.__doc__ = \"Cosine schedule function from `start` to `end`\"\n", "SchedNo .__doc__ = \"Constant schedule function with `start` value\"\n", "SchedExp.__doc__ = \"Exponential schedule function from `start` to `end`\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#export\n", "def SchedPoly(start, end, power):\n", " \"Polynomial schedule (of `power`) function from `start` to `end`\"\n", " def _inner(pos): return start + (end - start) * pos ** power\n", " return _inner" ] }, { "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": [ "annealings = \"NO LINEAR COS EXP\".split()\n", "\n", "p = torch.linspace(0.,1,100)\n", "\n", "fns = [SchedNo, SchedLin, SchedCos, SchedExp]\n", "for fn, t in zip(fns, annealings):\n", " f = fn(2, 1e-2)\n", " plt.plot(p, [f(o) for o in p], label=t)\n", "f = SchedPoly(2,1e-2,0.5)\n", "plt.plot(p, [f(o) for o in p], label=\"POLY(0.5)\")\n", "plt.legend();" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

SchedLin[source]

\n", "\n", "> SchedLin(**`start`**, **`end`**, **`pos`**)\n", "\n", "Linear schedule function from `start` to `end`" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(SchedLin)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sched = SchedLin(0, 2)\n", "test_eq(L(map(sched, [0., 0.25, 0.5, 0.75, 1.])), [0., 0.5, 1., 1.5, 2.])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

SchedCos[source]

\n", "\n", "> SchedCos(**`start`**, **`end`**, **`pos`**)\n", "\n", "Cosine schedule function from `start` to `end`" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(SchedCos)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sched = SchedCos(0, 2)\n", "test_close(L(map(sched, [0., 0.25, 0.5, 0.75, 1.])), [0., 0.29289, 1., 1.70711, 2.])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

SchedNo[source]

\n", "\n", "> SchedNo(**`start`**, **`end`**, **`pos`**)\n", "\n", "Constant schedule function with `start` value" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(SchedNo)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sched = SchedNo(0, 2)\n", "test_close(L(map(sched, [0., 0.25, 0.5, 0.75, 1.])), [0., 0., 0., 0., 0.])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

SchedExp[source]

\n", "\n", "> SchedExp(**`start`**, **`end`**, **`pos`**)\n", "\n", "Exponential schedule function from `start` to `end`" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(SchedExp)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sched = SchedExp(1, 2)\n", "test_close(L(map(sched, [0., 0.25, 0.5, 0.75, 1.])), [1., 1.18921, 1.41421, 1.68179, 2.])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

SchedPoly[source]

\n", "\n", "> SchedPoly(**`start`**, **`end`**, **`power`**)\n", "\n", "Polynomial schedule (of `power`) function from `start` to `end`" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(SchedPoly)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sched = SchedPoly(0, 2, 2)\n", "test_close(L(map(sched, [0., 0.25, 0.5, 0.75, 1.])), [0., 0.125, 0.5, 1.125, 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": [ "p = torch.linspace(0.,1,100)\n", "\n", "pows = [0.5,1.,2.]\n", "for e in pows:\n", " f = SchedPoly(2, 0, e)\n", " plt.plot(p, [f(o) for o in p], label=f'power {e}')\n", "plt.legend();" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#export\n", "def combine_scheds(pcts, scheds):\n", " \"Combine `scheds` according to `pcts` in one function\"\n", " assert sum(pcts) == 1.\n", " pcts = tensor([0] + L(pcts))\n", " assert torch.all(pcts >= 0)\n", " pcts = torch.cumsum(pcts, 0)\n", " def _inner(pos):\n", " if pos == 1.: return scheds[-1](1.)\n", " idx = (pos >= pcts).nonzero().max()\n", " actual_pos = (pos-pcts[idx]) / (pcts[idx+1]-pcts[idx])\n", " return scheds[idx](actual_pos)\n", " return _inner" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`pcts` must be a list of positive numbers that add up to 1 and is the same length as `scheds`. The generated function will use `scheds[0]` from 0 to `pcts[0]` then `scheds[1]` from `pcts[0]` to `pcts[0]+pcts[1]` and so forth." ] }, { "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": [ "p = torch.linspace(0.,1,100)\n", "f = combine_scheds([0.3,0.2,0.5], [SchedLin(0.,1.), SchedNo(1.,1.), SchedCos(1., 0.)])\n", "plt.plot(p, [f(o) for o in p]);" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#hide\n", "test_close([f(0.), f(0.15), f(0.3), f(0.4), f(0.5), f(0.7), f(1.)],\n", " [0., 0.5, 1., 1., 1., 0.65451, 0.])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#export\n", "def combined_cos(pct, start, middle, end):\n", " \"Return a combined scheduler with cosine annealing from `start` to `middle` then `middle` to `end`\"\n", " #if isinstance(start, Iterable):\n", " # return [combine_scheds([pct,1-pct], [SchedCos(s, m), SchedCos(m, e)])\n", " # for s,m,e in zip(start,middle,end)]\n", " return combine_scheds([pct,1-pct], [SchedCos(start, middle), SchedCos(middle, end)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a useful helper function for the 1cycle policy. `pct` is used for the `start` to `middle` part, `1-pct` for the `middle` to `end`. Handles floats or collection of floats." ] }, { "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": [ "p = torch.linspace(0.,1,100)\n", "f = combined_cos(0.25,0.5,1.,0.)\n", "plt.plot(p, [f(o) for o in p]);" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#hide\n", "test_close([f(0.), f(0.1), f(0.25), f(0.5), f(1.)], [0.5, 0.67275, 1., 0.75, 0.])\n", "f = combined_cos(0.25, np.array([0.25,0.5]), np.array([0.5,1.]), np.array([0.,0.]))\n", "test_close([f(0.), f(0.1), f(0.25), f(0.5), f(1.)], \n", " [[0.25,0.5], [0.33638,0.67275], [0.5,1.], [0.375,0.75], [0.,0.]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ParamScheduler -" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#export\n", "@docs\n", "class ParamScheduler(Callback):\n", " \"Schedule hyper-parameters according to `scheds`\"\n", " run_after=TrainEvalCallback\n", "\n", " def __init__(self, scheds): self.scheds = scheds\n", " def begin_fit(self): self.hps = {p:[] for p in self.scheds.keys()}\n", "\n", " def _update_val(self, pct):\n", " for n,f in self.scheds.items(): self.opt.set_hyper(n, f(pct))\n", "\n", " def begin_batch(self):\n", " if not self.training: return\n", " self._update_val(self.pct_train)\n", "\n", " def after_batch(self):\n", " if self.training:\n", " for p in self.scheds.keys(): self.hps[p].append(self.opt.hypers[-1][p])\n", "\n", " def after_fit(self):\n", " if hasattr(self.learn, 'recorder'): self.recorder.hps = self.hps\n", "\n", " _docs = {\"begin_fit\": \"Initialize container for hyper-parameters\",\n", " \"begin_batch\": \"Set the proper hyper-parameters in the optimizer\",\n", " \"after_batch\": \"Record hyper-parameters of this batch\",\n", " \"after_fit\": \"Save the hyper-parameters in the recorder if there is one\"}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`scheds` is a dictionary with one key for each hyper-parameter you want to schedule, with either a scheduler or a list of schedulers as values (in the second case, the list must have the same length as the the number of parameters groups of the optimizer)." ] }, { "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", "
epochtrain_lossvalid_losstime
021.6410837.40837700:00
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "learn = synth_learner()\n", "sched = {'lr': SchedLin(1e-3, 1e-2)}\n", "learn.fit(1, cbs=ParamScheduler(sched))\n", "n = len(learn.dbunch.train_dl)\n", "test_close(learn.recorder.hps['lr'], [1e-3 + (1e-2-1e-3) * i/n for i in range(n)])" ] }, { "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", "
epochtrain_lossvalid_losstime
01.4272250.73183900:00
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#hide\n", "#test discriminative lrs\n", "def _splitter(m): return [[m.a], [m.b]]\n", "learn = synth_learner(splitter=_splitter)\n", "sched = {'lr': combined_cos(0.5, np.array([1e-4,1e-3]), np.array([1e-3,1e-2]), np.array([1e-5,1e-4]))}\n", "learn.fit(1, cbs=ParamScheduler(sched))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

ParamScheduler.begin_fit[source]

\n", "\n", "> ParamScheduler.begin_fit()\n", "\n", "Initialize container for hyper-parameters" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ParamScheduler.begin_fit)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

ParamScheduler.begin_batch[source]

\n", "\n", "> ParamScheduler.begin_batch()\n", "\n", "Set the proper hyper-parameters in the optimizer" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ParamScheduler.begin_batch)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

ParamScheduler.after_batch[source]

\n", "\n", "> ParamScheduler.after_batch()\n", "\n", "Record hyper-parameters of this batch" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ParamScheduler.after_batch)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

ParamScheduler.after_fit[source]

\n", "\n", "> ParamScheduler.after_fit()\n", "\n", "Save the hyper-parameters in the recorder if there is one" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(ParamScheduler.after_fit)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#export\n", "@patch\n", "def fit_one_cycle(self:Learner, n_epoch, lr_max=None, div=25., div_final=1e5, pct_start=0.25, wd=defaults.wd,\n", " moms=(0.95,0.85,0.95), cbs=None, reset_opt=False):\n", " \"Fit `self.model` for `n_epoch` using the 1cycle policy.\"\n", " if self.opt is None: self.create_opt()\n", " self.opt.set_hyper('lr', self.lr if lr_max is None else lr_max)\n", " lr_max = np.array([h['lr'] for h in self.opt.hypers])\n", " scheds = {'lr': combined_cos(pct_start, lr_max/div, lr_max, lr_max/div_final),\n", " 'mom': combined_cos(pct_start, *moms)}\n", " self.fit(n_epoch, cbs=ParamScheduler(scheds)+L(cbs), reset_opt=reset_opt, wd=wd)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The 1cycle policy was introduced by Leslie N. Smith et al. in [Super-Convergence: Very Fast Training of Neural Networks Using Large Learning Rates](https://arxiv.org/abs/1708.07120). It schedules the learning rate with a cosine annealing from `lr_max/div` to `lr_max` then `lr_max/div_final` (pass an array to `lr_max` if you want to use differential learning rates) and the momentum with cosine annealing according to the values in `moms`. The first phase takes `pct_start` of the training. You can optionally pass additional `cbs` and `reset_opt`." ] }, { "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", "
epochtrain_lossvalid_losstime
09.2154822.02621600:00
10.9110950.24021400:00
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#Integration test: training a few epochs should make the model better\n", "learn = synth_learner(lr=1e-2)\n", "xb,yb = learn.dbunch.one_batch()\n", "init_loss = learn.loss_func(learn.model(xb), yb)\n", "learn.fit_one_cycle(2)\n", "assert learn.loss < init_loss" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Scheduler test\n", "lrs,moms = learn.recorder.hps['lr'],learn.recorder.hps['mom']\n", "test_close(lrs, [combined_cos(0.25,1e-2/25,1e-2,1e-7)(i/20) for i in range(20)])\n", "test_close(moms, [combined_cos(0.25,0.95,0.85,0.95)(i/20) for i in range(20)])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#export\n", "@patch\n", "def plot_sched(self:Recorder, figsize=None):\n", " rows,cols = (len(self.hps)+1)//2, min(2, len(self.hps))\n", " figsize = figsize or (6*cols,4*rows)\n", " _, axs = plt.subplots(rows, cols, figsize=figsize)\n", " axs = axs.flatten() if len(self.hps) > 1 else L(axs)\n", " for p,ax in zip(self.hps.keys(), axs):\n", " ax.plot(self.hps[p])\n", " ax.set_ylabel(p)" ] }, { "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", "
epochtrain_lossvalid_losstime
03.6947072.37120900:00
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#hide\n", "#test discriminative lrs\n", "def _splitter(m): return [[m.a], [m.b]]\n", "learn = synth_learner(splitter=_splitter)\n", "learn.fit_one_cycle(1, lr_max=slice(1e-3,1e-2))\n", "#n = len(learn.dbunch.train_dl)\n", "#est_close(learn.recorder.hps['lr'], [1e-3 + (1e-2-1e-3) * i/n for i in range(n)])" ] }, { "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", "
epochtrain_lossvalid_losstime
06.0013884.60113000:00
15.1733024.19650900:00
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "learn = synth_learner()\n", "learn.fit_one_cycle(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_sched()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#export\n", "@patch\n", "def fit_sgdr(self:Learner, n_cycles, cycle_len, lr_max=None, cycle_mult=2, cbs=None, reset_opt=False, wd=defaults.wd):\n", " \"Fit `self.model` for `n_cycles` of `cycle_len` using SGDR.\"\n", " if self.opt is None: self.create_opt()\n", " self.opt.set_hyper('lr', self.lr if lr_max is None else lr_max)\n", " lr_max = np.array([h['lr'] for h in self.opt.hypers])\n", " n_epoch = cycle_len * (cycle_mult**n_cycles-1)//(cycle_mult-1)\n", " pcts = [cycle_len * cycle_mult**i / n_epoch for i in range(n_cycles)]\n", " scheds = [SchedCos(lr_max, 0) for _ in range(n_cycles)]\n", " scheds = {'lr': combine_scheds(pcts, scheds)}\n", " self.fit(n_epoch, cbs=ParamScheduler(scheds)+L(cbs), reset_opt=reset_opt, wd=wd)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This schedule was introduced by Ilya Loshchilov et al. in [SGDR: Stochastic Gradient Descent with Warm Restarts](https://arxiv.org/abs/1608.03983). It consists of `n_cycles` that are cosine annealings from `lr_max` (defaults to the `Learner` lr) to 0, with a length of `cycle_len * cycle_mult**i` for the `i`-th cycle (first one is `cycle_len`-long, then we multiply the length by `cycle_mult` at each epoch). You can optionally pass additional `cbs` and `reset_opt`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#slow\n", "learn = synth_learner()\n", "with learn.no_logging(): learn.fit_sgdr(3, 1)\n", "test_eq(learn.n_epoch, 7)\n", "iters = [k * len(learn.dbunch.train_dl) for k in [0,1,3,7]]\n", "for i in range(3):\n", " n = iters[i+1]-iters[i]\n", " #The start of a cycle can be mixed with the 0 of the previous cycle with rounding errors, so we test at +1\n", " test_close(learn.recorder.lrs[iters[i]+1:iters[i+1]], [SchedCos(learn.lr, 0)(k/n) for k in range(1,n)])\n", "\n", "learn.recorder.plot_sched()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## LRFind -" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#export\n", "@docs\n", "class LRFinder(ParamScheduler):\n", " \"Training with exponentially growing learning rate\"\n", " run_after=Recorder\n", "\n", " def __init__(self, start_lr=1e-7, end_lr=10, num_it=100, stop_div=True):\n", " if is_listy(start_lr):\n", " self.scheds = {'lr': [SchedExp(s, e) for (s,e) in zip(start_lr,end_lr)]}\n", " else: self.scheds = {'lr': SchedExp(start_lr, end_lr)}\n", " self.num_it,self.stop_div = num_it,stop_div\n", "\n", " def begin_fit(self):\n", " super().begin_fit()\n", " self.learn.save('_tmp')\n", " self.best_loss = float('inf')\n", "\n", " def begin_batch(self):\n", " self._update_val(self.train_iter/self.num_it)\n", "\n", " def after_batch(self):\n", " super().after_batch()\n", " if self.smooth_loss < self.best_loss: self.best_loss = self.smooth_loss\n", " if self.smooth_loss > 4*self.best_loss and self.stop_div: raise CancelFitException()\n", " if self.train_iter >= self.num_it: raise CancelFitException()\n", "\n", " def begin_validate(self): raise CancelValidException()\n", "\n", " def after_fit(self):\n", " self.learn.load('_tmp')\n", " os.remove(self.path/self.model_dir/'_tmp.pth')\n", "\n", " _docs = {\"begin_fit\": \"Initialize container for hyper-parameters and save the model\",\n", " \"begin_batch\": \"Set the proper hyper-parameters in the optimizer\",\n", " \"after_batch\": \"Record hyper-parameters of this batch and potentially stop training\",\n", " \"after_fit\": \"Save the hyper-parameters in the recorder if there is one and load the original model\",\n", " \"begin_validate\": \"Skip the validation part of training\"}" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#slow\n", "with tempfile.TemporaryDirectory() as d:\n", " learn = synth_learner(path=Path(d))\n", " init_a,init_b = learn.model.a,learn.model.b\n", " with learn.no_logging(): learn.fit(20, cbs=LRFinder(num_it=100))\n", " assert len(learn.recorder.lrs) <= 100\n", " test_eq(len(learn.recorder.lrs), len(learn.recorder.losses))\n", " #Check stop if diverge\n", " if len(learn.recorder.lrs) < 100: assert learn.recorder.losses[-1] > 4 * min(learn.recorder.losses)\n", " #Test schedule\n", " test_eq(learn.recorder.lrs, [SchedExp(1e-7, 10)(i/100) for i in range_of(learn.recorder.lrs)])\n", " #No validation data\n", " test_eq([len(v) for v in learn.recorder.values], [1 for _ in range_of(learn.recorder.values)])\n", " #Model loaded back properly\n", " test_eq(learn.model.a, init_a)\n", " test_eq(learn.model.b, init_b)\n", " test_eq(learn.opt.state_dict()['state'], [{}, {}])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

LRFinder.begin_fit[source]

\n", "\n", "> LRFinder.begin_fit()\n", "\n", "Initialize container for hyper-parameters and save the model" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(LRFinder.begin_fit)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

LRFinder.begin_batch[source]

\n", "\n", "> LRFinder.begin_batch()\n", "\n", "Set the proper hyper-parameters in the optimizer" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(LRFinder.begin_batch)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

LRFinder.after_batch[source]

\n", "\n", "> LRFinder.after_batch()\n", "\n", "Record hyper-parameters of this batch and potentially stop training" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(LRFinder.after_batch)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "

LRFinder.begin_validate[source]

\n", "\n", "> LRFinder.begin_validate()\n", "\n", "Skip the validation part of training" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(LRFinder.begin_validate)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#export\n", "@patch\n", "def plot_lr_find(self:Recorder, skip_end=5):\n", " \"Plot the result of an LR Finder test (won't work if you didn't do `learn.lr_find()` before)\"\n", " lrs = self.lrs if skip_end==0 else self.lrs [:-skip_end]\n", " losses = self.losses if skip_end==0 else self.losses[:-skip_end]\n", " fig, ax = plt.subplots(1,1)\n", " ax.plot(lrs, losses)\n", " ax.set_ylabel(\"Loss\")\n", " ax.set_xlabel(\"Learning Rate\")\n", " ax.set_xscale('log')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#export\n", "@patch\n", "def lr_find(self:Learner, start_lr=1e-7, end_lr=10, num_it=100, stop_div=True, show_plot=True):\n", " \"Launch a mock training to find a good learning rate\"\n", " n_epoch = num_it//len(self.dbunch.train_dl) + 1\n", " cb=LRFinder(start_lr=start_lr, end_lr=end_lr, num_it=num_it, stop_div=stop_div)\n", " with self.no_logging(): self.fit(n_epoch, cbs=cb)\n", " if show_plot: self.recorder.plot_lr_find()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First introduced by Leslie N. Smith in [Cyclical Learning Rates for Training Neural Networks](https://arxiv.org/pdf/1506.01186.pdf), the LR Finder trains the model with exponentially growing learning rates from `start_lr` to `end_lr` for `num_it` and stops in case of divergence (unless `stop_div=False`) then plots the losses vs the learning rates with a log scale. \n", "\n", "A good value for the learning rates is then either:\n", "- when the slope is the steepest\n", "- one tenth of the minimum before the divergence" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEKCAYAAAAVaT4rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3deXzdVZ3/8dcnudnTbE1aSppuYSu0tIVALSBUQAVkWERERAVBEFxQHGdAnd+M4zxQBhhHxRkdkALK4sgiAoMsshYoS7oApS3QhbbplrRJsyd3O78/7k2apkmaNPd7l9z38/HII/d+7/d+zyf3tp977ud7vueYcw4REUkfGYkOQERE4kuJX0QkzSjxi4ikGSV+EZE0o8QvIpJmlPhFRNKML9EBDEd5ebmbNm1aosMQEUkpS5cu3emcq+i/PSUS/7Rp06itrU10GCIiKcXMNg60XaUeEZE0o8QvIpJmlPhFRNKMEr+ISJpR4hcRSTOeJX4zqzKzF8xstZm9Z2bfiW4vM7NnzezD6O9Sr2IQEZF9ednjDwJ/75ybCXwM+KaZHQncADznnDsUeC56X0RE+mjuCPDMe9tpaO2O+bE9S/zOuW3OuWXR263AaqASOBe4J7rbPcB5XsUgIpKq1ja0cdUflvLe1uaYHzsuNX4zmwbMA94AJjrntkHkwwGYMMhzrjKzWjOrbWhoiEeYIiJJwx8MA5Dti32a9jzxm1kh8DDwXedcy3Cf55y73TlX45yrqajY54pjEZExLRCKJP6cVEv8ZpZFJOnf55x7JLp5h5lNij4+Caj3MgYRkVTU0+PPykyhxG9mBtwJrHbO/bzPQ48Bl0ZvXwr8xasYRERSlT/kXanHy0naTgS+DLxrZiui234I3AT8ycyuADYBF3oYg4hISuop9XjR4/cs8TvnXgFskIdP86pdEZGxoLvn5G4qlXpEROTApezJXREROTApeXJXREQOXEqP4xcRkZHz8uSuEr+ISBLaU+oZbIzMgVPiFxFJQt2hMNm+DCKXRMWWEr+ISBIKBJ0nQzlBiV9EJCn5QyFPTuyCEr+ISFIKBJ0n9X1Q4hcRSUr+aI3fC0r8IiJJyB8Mq8YvIpJO/KGwJ2P4QYlfRCQp+YNhT+bpASV+EZGkFFCPX0QkvfiDOrkrIpJWNKpHRCTN+IMpWOoxs0VmVm9mK/tsm2tmr5vZCjOrNbPjvWpfRCSVpWqP/27gjH7bbgb+1Tk3F/jn6H0REeknEErBcfzOuZeBxv6bgaLo7WJgq1fti4ikMi8v4PJssfVBfBd42sxuJfKhc8JgO5rZVcBVAFOmTIlPdCIiSWIsjeq5BrjOOVcFXAfcOdiOzrnbnXM1zrmaioqKuAUoIpIMAiGXeid3B3Ep8Ej09oOATu6KiAxgLPX4twKnRG+fCnwY5/ZFRJKecy4yqsejaZk9q/Gb2QPAQqDczOqAfwGuBH5pZj6gi2gNX0RE9giEHIBnPX7PEr9z7uJBHjrWqzZFRMYCfyiy0PpYKfWIiMh+BIKRxD9WTu6KiMh+qMcvIpJm/Orxi4ikl54evxZiERFJEz09/pSbq0dERA5MIKRSj4hIWunt8avUIyKSHjSqR0QkzWhUj4hImulJ/BrVIyKSJnrm6lGPX0QkTfhDIUA1fhGRtBEIejs755hO/Lc8vYYzf7k40WGIiIxId+84fm/m4x/Tid8fDLNhZ1uiwxARGZHek7uZmZ4cf0wn/qLcLLoCYbqDoUSHIiIybL1X7vrU4x+xorwsAFq7ggmORERk+FJ2rh4zW2Rm9Wa2st/2b5vZ+2b2npnd7FX7AMXRxN/SGfCyGRGRmPIHw2QY+FIt8QN3A2f03WBmnwDOBY52zh0F3Oph+xTlRVaWbFGPX0RSSCAU9mwMP3iY+J1zLwON/TZfA9zknOuO7lPvVfsQqfEDNKvHLyIppDsY9mwoJ8S/xn8Y8HEze8PMXjKz4wbb0cyuMrNaM6ttaGg4oMaKVOoRkRQUCIU9q+9D/BO/DygFPgb8A/AnMxvwtLVz7nbnXI1zrqaiouKAGuvp8bd0KfGLSOrwj7Eefx3wiIt4EwgD5V411lvj71SNX0RShz80thL/o8CpAGZ2GJAN7PSqsbysTLIyTT1+EUkpXp/c9Xl1YDN7AFgIlJtZHfAvwCJgUXSIpx+41DnnPIyBotws1fhFJKX4g97W+D1L/M65iwd56EtetTmQorwsjeoRkZTiDzmyxlCpJ+6Kcn0axy8iKcUfDJEzhkb1xF1Rnko9IpJaxtqonrgrysvSyV0RSSmBkPNsSmZIh8Sfm6XhnCKSUtTjH6WiPJ96/CKSUlJ2rp5kUZSbhT8YpiugOflFJDWMtbl64k7z9YhIqvGHwuQo8R+43jn5Ve4RkRShUs8oFeVGrlFr1gleEUkRXl+5O/YTv3r8IpJiAqGwrtwdjd6pmVXjF5EUEA47AiGnHv9o7JmaWYlfRJKfPxRdaF09/gO3ZzEW1fhFJPkFehK/evwHLjcrkxxfhnr8IpIS/EH1+GNC8/WISKoIhCJLlGg45ygV5fo0X4+IpAT1+GNEPX4RSRX+UGR6mZRM/Ga2yMzqo8ss9n/s+2bmzMyzhdb7KsrVKlwikhr8wUipJztFp2W+Gzij/0YzqwI+CWzysO29FGsxFhFJESk9nNM59zLQOMBD/wn8I+DZIuv9RaZmVo1fRJJfz3DOMXNy18zOAbY4596OZ7uRxVgCOBe3zxoRkQPSe3LXw8Tv8+zI/ZhZPvAj4FPD3P8q4CqAKVOmjKrtorwsgmFHZyBEfnbc/mQRkREba6N6qoHpwNtm9hEwGVhmZgcNtLNz7nbnXI1zrqaiomJUDe+Zr0flHhFJbv44lHri1v11zr0LTOi5H03+Nc65nV633TNfT3NngIOKc71uTkTkgPX0+FNyIRYzewBYAhxuZnVmdoVXbe2PFmMRkVQRj5O7nvX4nXMX7+fxaV613Z+mZhaRVDHWavwJo8VYRCRVpPQ4/mTSs/yiTu6KSLLr6fGPmXH8idLT49e0DSKS7Hp6/Cl5cjeZZGVmkJ+dqRq/iCQ99fhjqChXM3SKSPILhMJkZhiZGak5SVtSKcrTnPwikvz8wbCn0zXAMBO/mVWbWU709kIzu9bMSjyNLMbU4xeRVBAIObI8nJIZht/jfxgImdkhwJ1Epl6437OoPKDFWEQkFXQHw2T7Mj1tY7iJP+ycCwLnA79wzl0HTPIurNgrztNiLCKS/CKlnuTo8QfM7GLgUuCJ6LYsb0LyhtbdFZFUEAiFPb14C4af+L8KLABudM5tMLPpwL3ehRV7RXlZtHYFCIc1J7+IJC9/0PvEP6y5epxzq4BrAcysFBjnnLvJy8BirSg3i7CDdn+Qcbkp9WVFRNJIIBT2dAw/DH9Uz4tmVmRmZcDbwF1m9nNPI4uxnqmZtQSjiCQzfxKVeoqdcy3AZ4G7nHPHAqd7F1bsaYZOEUkF3cEk6fEDPjObBHyePSd3U0pxfiTxN3X4ExyJiMjgAqGwp/P0wPAT/0+Ap4F1zrm3zGwG8KF3YcVeWUE2AE3t6vGLSPKKx5W7wz25+yDwYJ/764ELvArKCz2Jv1E9fhFJYsl0cneymf3ZzOrNbIeZPWxmk/fznEXR/Vf22XaLma0xs3eix4vbtA+l+dHE36bELyLJKx7DOYd79LuAx4CDgUrg8ei2odwNnNFv27PALOfc0cAHwA+GHekoZWVmUJTrU41fRJKaP4lO7lY45+5yzgWjP3cDFUM9wTn3MtDYb9sz0akfAF4HhvzWEGtlBdnsalfiF5Hk5Q+5pOnx7zSzL5lZZvTnS8CuUbZ9OfDXUR5jRMoKsmlS4heRJOYPhpJmVM/lRIZybge2AZ8jMo3DATGzHwFB4L4h9rnKzGrNrLahoeFAm9qLevwikuySZlpm59wm59w5zrkK59wE59x5RC7mGjEzuxQ4G7jEOTfoxDnOududczXOuZqKiiGrSsOmHr+IJLtkunJ3IN8b6RPM7AzgeuAc51zHKNo+IKUF2TS2+xni80ZEJGFCYUco7MjOTI75+Acy5HcRM3sAWAIcbmZ1ZnYF8GtgHPCsma0ws9+Oov0RG1+QjT8Upt0fimezIiLDEghFF1r3eVvqGdYFXIMYstvsnLt4gM13jqK9UesZy9/U7qcwZzR/uohI7HUHI4k/oVfumlkrAyd4A/I8ichD4wsjiX9Xu5+qsvwERyMisreeHn9C5+N3zo3ztPU469vjFxFJNv449fi9PXqS6ZmvR0M6RSQZ9Sb+JB7Vk3L2zNCpxC8iyaf35K56/LFTmOMjK9PU4xeRpNStHn/smZku4hKRpNV7clc9/tgqzde0DSKSnFTj98j4wmxNzSwiSckfp+GcaZf4S/Mj0zaIiCQbndz1yPgCJX4RSU4ax++R0oJsmjsDvZ+sIiLJwh+KTJSQ7fFcPWmX+MdHx/Lv7ggkOBIRkb3t6fEn7+ycKak0mvhV7hGRZKNRPR4pU+IXkSS15+SuSj0x1Tttg4Z0ikiSUY/fI5qoTUSSlV/DOb2hqZlFJFlpOKdHsjIzKMr1qcYvIknHHwqTlWlkZKRojd/MFplZvZmt7LOtzMyeNbMPo79LvWp/KGW6iEtEktDujgDFeVmet+Nlj/9u4Ix+224AnnPOHQo8F70fd0r8IpKMmtr9veVoL3mW+J1zLwON/TafC9wTvX0PcJ5X7Q9FiV9EklFjh7/3WiMvxbvGP9E5tw0g+nvCYDua2VVmVmtmtQ0NDTENQolfRJJRU7u/d3YBLyXtyV3n3O3OuRrnXE1FRUVMj11akE1jhx/nXEyPKyIyGo3tY7PHv8PMJgFEf9fHuX0gMl+PPxim3R9KRPMiIvsIhx1NHX7KUrnGP4jHgEujty8F/hLn9gGN5ReR5NPSFSDsSO0ev5k9ACwBDjezOjO7ArgJ+KSZfQh8Mno/7sYX6updEUkuPfkoHjV+n1cHds5dPMhDp3nV5nCpxy8iyaYnH8Wjx+9Z4k9m4wtygMgn7Ac7Wvn182sJhML88KyZVJXlJzg6EUlHPSMN41HjT8vEX1oQuTLutuc/ZFNjB/lZmZgZn/7Fy/zwrJlcMn8KZt5eMi0i0ldv4i9M4Rp/MivM8VGU66O+pZuvn1zN4utP5enrTuaYKaX806MrufSut+gOasSPiMRPY4d6/J4yMx795okU52UxvjCnd/sfrjie219ez8/+uobnV9dz5uxJCYxSRNJJU7uf3KwM8rK9XXYR0rTHDzCjonCvpA+RD4QrTppOWUE2//futgRFJiLpqLE90Hv+0Wtpm/gH48vM4IxZB/Hc6no6dYGXiMRJY3t37/lHrynxD+Ds2ZPoDIR48f2EXFgsImmosSMQl5k5QYl/QMdPL2N8QTZPqNwjInHS1O7vXRrWa0r8A+gp9zyvco+IxEmjEn/ifUblHhGJk+5giLbuYFyGcoIS/6COn15GeaHKPSLivd0dASA+0zWAEv+gfJkZfPoob8s9a+tb2bq705Nji0jqaIzjBG2gxD+kzxwdKff8bfWOmB/bHwxzwW+WcPrPX+IPSz4iHNaiMCLpqjGOE7SBEv+Q5k8fz9Tx+fz6+bWEYpyYX1nbQHNngMqSPP7fX97jy4veYG19G4FQOKbtiEjy652nR4k/8TIzjH/89BG8v6OVh5fWxfTYT7yzjaJcH09cexI/PX82Kzbt5vSfv8ShP/orc3/yDGfftpi3Puq/Vr2IjEVN0Xl64jWOPy3n6hmJs2YfxNyqEv7j2fc5e84k8rNH/5J1B0M8u2oHnz7qIHJ8mXxx/hROObyCF9bUs7Otm11tfl76oIFL7niDmz93NOfNq4zBXyIiyWpXW0/ij8+Vu0r8+2Fm/OgzM7nwt0u4c/EGvn3aoaM+5qtrd9LaFeQzfSaBqyzJ40sfm9p7f3eHn6vvXcp3/3cF63e2c93ph2qqaJExqqnDT3FeFr7M+BRhElLqMbPrzOw9M1tpZg+YWW4i4hiu46aV8akjJ/Lbl9bR0No96uP1lHlOPKR80H1K8rP5/eXzufDYyfzquQ8585eL+Z+X1rG9uWvU7YtIconnxVuQgMRvZpXAtUCNc24WkAl8Id5xjNT1Zx5BVzDMJb97ncvvfosrf1/Lvz2xCn9wZCdje8o8nzrqILJ9Q7/82b4Mbv7c0dz8uaPJzcrkZ39dw4KbnuMri97khffrNRJIZIxo6ohv4k9UqccH5JlZAMgHtiYojmGrrijkx393JA8v20JDazf+YJhnV+2gOC+La0dQ/hmozDMUM+PzNVV8vqaKDTvb+fPyLfzvW5v46l1vUV1RwBUnzeALx1WRkaEykEiq2tXmZ3Jp/JZ9jXvid85tMbNbgU1AJ/CMc+6Z/vuZ2VXAVQBTpkyJb5CD+PKCaXx5wbTe+9+6fxm/fn4tZ80+iEMmjBvWMYZT5hnM9PICvvfJw/jWJw7hyXe3cecrG/jhn99l6cYm/v2C2XGrD4pIbDV1+Dl6cnHc2ktEqacUOBeYDhwMFJjZl/rv55y73TlX45yrqaioiHeYw/Ljc44iPyeT6x9+d8iyS2tXgDXbW/jbqh3DLvMMJduXwXnzKnnsWydy3emH8fCyOr51//IBl4vsCoT48WPvcdyNf+OPb27CucHjDITCbNjZzuptLby9eTcrNu8mOILrCroCIdZsb6G1K7DPcX+3eD1n37aYax9Yzp2vbGDpxqaYXxshkoqcczS1ByiL0yIskJhSz+nABudcA4CZPQKcANybgFhGpbwwh//3mSP5+wff5t43NvKVPt8G/MEwf125jT8s2Ujtxqa9nvfZGA3PNDO+c/qhjMv18ZMnVvG1e2r56fmzmVyah5nx4Y5Wvv3ActZsb6W6ooAbHnmXR1ds4WefPZpp4/Np7gywo6Wb5ZuaePH9hkgZqju4VxtTyvK5+pRqLji2khzfniXh6lu7eGdzM+/U7Wbl1hY+rG+lrqkT5yA/O5Nz5hzMxcdPobUryI8ff4+19W3MrizmzQ2NPPZ2pLJXVZbH106awYU1k4ccJuucY1NjB6+v34VhzJ1SwiEVhb3lreaOAFubO8nMMHJ8GeT4MinJzyI3a+8l7IKhMLva/WRmGLlZmeT4MmjvDrKzrZudbZEa62ETh/fNTSRW2rqD+ENhyuK0CAuADdUD9KRBs/nAIuA4IqWeu4Fa59xtgz2npqbG1dbWxifAEXLO8ZVFb7JsYxOfP64KfzBMVyDMSx80sLOtm6nj8/nsvMlUTyhgcmk+U8ryPTmJ82DtZq5/+B3CDkryszjq4CKWbmyiINvHrRfO4ZTDKvjf2s389MnVdPpDZGTYXiemJxXncsphFRw7tZTCHB/Zvgxau4Lc9eoG3q5rZmJRDodOGMe25k52tHTTFv2AyDA4ZEIhh00cxyETCpk6Pp/X10WSe2cg8g1kSlk+/3z2kZw2cwJmxvbmLt7YsIt7XvuIZZt2U5yXxcLDKyjI8ZGXlUm2L4OuQIiuQJjWrgDLNjaxtd9opnE5PipL89i6u5OWrr0/rHqUF2ZzcEkeub5MtuzuZHtL136/ZZx6xASuPe1Q5laVjObtEBm2Tbs6OPmWF7jlc0dzYU1VTI9tZkudczX7bI934o8G86/ARUAQWA58zTk36DjJZE78AJsbO/jynW+ws81Pji+DbF8GR04q4ssLpnLyoRVxO/G6tr6V19c3snJLM+9uaWZyaR7/du4sJhTtGS1b39LF717ZgAEV43KYUJTL4RPHcdjEwgGvE3DO8eraXdyxeD0tXQEmFecysSiXqtJ8Zk8u5qiDiwbsrbd2BXj87W0Ew2E+X1O1T++7x9KNjdzx8gZWbm2mKxCi0x/CHwqT68skJyuT/OxMZlUWsaC6nAUzxpNhsHzTbpZtamJbcxeVJXlMKcvn4JI8IFJu6gqG2NXmZ1tzJ1t2d9HlD1FZmsfk0jwmFOXinOv9YMnPzqRiXA7lhTms2LybOxavZ3dHgBOqxzOnqoQpZZEP67zsTIzIt6yq0rx91mtu6w7y6PItTC8vYP70Mp1vkWFbsXk35/3Xq9x5aQ2nzZwY02MnVeIfqWRP/DJ2tHUH+cOSjTy4dDObGzsIhPb9/5Hty+Di46q4emE1E8fl8uflW7jpqTW913iUF2Zz5qxJzK4sxuFwDvKyMznq4CKmlxeSqRFY0sfza3Zw+d21/PkbJzBvSmlMjz1Y4teVuyJ9FOb4uGZhNdcsrCYUdmxr7mRzYyddwRA4CDvHs6t2cN8bm3jgzc1MHZ/Ph/VtzKkq4b++eAy72rp54p1tPLh0M394feM+x8/PzuTISUVMLMqlKC+LkvwsZpQXcNy0MqaOz9fV2WmosT0yGCIdxvGLJL3MDGNyaf4+46tPmzmRb516CL95cR3LN+3m1gvn8Nl5lb0lvTNnT6LTH6IxOvGWAa1dwd4S3KptLazZ3kJzZ5DmTn/vt4qKcTkcM6WEow4uZuakImZVFjGpOC+uf7PEX1Ocp2QGJX6RAzK5NJ8bz5896ON52ZlUZu+dtA8/aBwXHDt5r23hsGNtQxtvfdTIWxsaWbF5N8+s2kFPBfaimip+eNZMiuM0eZfEX2OHn6xMY1xO/NKxEr9IAmVkGIdNHMdhE8dxyfzIJH3t3UHWbG/lqZXbWPTqRzy3pp6fnHsUZ846SKWgMaixzU9pfnZc31slfpEkU5Dj49ippRw7tZRz51Zy/cPv8I37llFWkM2k4lwmFecyu7KEy06cRnGevgmkusY4z9MDSvwiSW1WZTF/+eaJ/Km2jpVbm9ne3EVdUyd/W13PXa9t4JsLD+HLC6YOOlxWkl9TnGfmBCV+kaTny8zgi/P3nq9q5ZZmbn76fW58cjWLXt3A5SdO56LjqyjK1TeAVFPf2h3XeXpASy+KpKRZlcX8/vLjuf/K+VSV5XPjk6tZ8NPn+PFj77G5sSPR4ckwdQdD1DV1MKO8IK7tqscvksJOqC7nhOpyVm5p5s5XNnDv6xv5/ZKPOGv2JL5+cjWz49yTlJHZuKuDsIPqCYVxbVc9fpExYFZlMf950Vxeuf5Urjx5Bi+938Df/foVLl30Jusa2hIdngxiXX3kvamuUOIXkQN0UHEuPzhzJq/+4FSuP+MIlm1s4oxfvMzPnlzdO7GeJI+eD+XpcS71KPGLjEFFuVlcs7Ca57+/kPPmVvI/L6/n1Ftf5KGldVqyM4msa2jn4OJcCuJ48RYo8YuMaRXjcrjlwjn8+RsnMKkkj+8/+Dbn/fervPVRY6JDEyI9/njX90GJXyQtzJtSyp+vOYFfXDSX+pZuLvztEv7xobf3WS1N4sc5x7r6trjX90GJXyRtZGQY582r5IXvL+SahdU8tLSOM36xmCXrdiU6tLS0o6Wbdn+I6or41vdBiV8k7eRlZ3L9GUfw4NUnkJVpXHzH6/zk8VV0BfZds1m803NiVz1+EYmbY6eW8uR3Ps5XFkxl0asbOOtXi1m+qWn/T5SY6E386VLjN7MSM3vIzNaY2WozW5CIOETSXX62j5+cO4t7r5hPlz/EBb95jVueXkN3UL1/r61vaKcwx8eEcTn73znGEtXj/yXwlHPuCGAOsDpBcYgIcNKh5Tx13clccMxk/uuFdZxz26u8U7c70WGNaesa2qiuKEjIVNtxT/xmVgScDNwJ4JzzO+f0L0wkwYpys7jlwjncddlx7O70c/5/v8bNT61R7d8jiRrRA4np8c8AGoC7zGy5mf3OzPY5rW1mV5lZrZnVNjQ0xD9KkTT1iSMm8Mx1p3D+vEr++8V1nPWrxbyxXiN/Yqm9O8jW5i5mJGBEDyQm8fuAY4DfOOfmAe3ADf13cs7d7pyrcc7VVFRUxDtGkbRWnJfFrRfO4Z7Lj8cfDHPR7a9zw8Pv0Nyhcf+xsGFnO5CYET2QmMRfB9Q5596I3n+IyAeBiCSZUw6r4JnrTubrJ8/gwaV1nHzLC/zmxXV0+lX+GY1EjuiBBCR+59x2YLOZHR7ddBqwKt5xiMjw5Gf7+MFZM3ni2ydx7NRS/v2pNZxyywvc+/pGAqFwosNLSevq28gwmDo+PyHtJ2pUz7eB+8zsHWAu8NMExSEiwzRzUhGLLjuOP319AVPK8vmnR1fyyZ+/xF9WbNHEbyO0rqGdKWX55PgSs2RmQhZicc6tAGoS0baIjM7x08t48OoFvPB+PTc/9T7f+eMKfvPiOj537GQ+fdRBVJXt24utb+3i3iUbefGDBg6fOI7jp5dRM60MfzDMhp1trN8ZGdN+1uxJlBfGf1x7vEWGciamzANgziX/J3VNTY2rra1NdBgi0k847Hj8na385sV1rNneCkS+GRx1cBHlhTmUF2azZnsrj63YSiAcZl5VCet3trN7kJPEvgxj4eEVXHDMZD555ER8mWNvcoFQ2DHzn5/ishOm8cOzZnralpktdc7t08nW0osicsAyMoxz51Zy7txKNu5q59lVO3h21Q5eXbuTnW3dBEKOvKxMvnB8FV89cTrTywsIhx0f1rexdGMTBTmZzCgvZHpFAVt3d/LIsi08unwLf1u9jMqSPC4/aToXHVdFYZznq/fSX1duwx8Mc0iCTuyCevwi4hHnHC1dQbIyjfzs4SfuUNjx/Jp67li8njc3NDIu18cVJ03nax+fkfIfAM+t3sHV9y5ldmUx935t/ohelwMxWI9fiV9EktbyTU389qV1PP3eDsoKsvnGwmq+9LGp5GYl5qToaLz0QQNX3lPLEZPGce/X5lOUm+V5m0r8IpKy3t68m1ufeZ/FH+5kfEE2nz+uii8eP2XAE8nJJBgKs3zzbl56v4E7Fq+nuqKQ+6+cT0l+dlzaV+IXkZS3ZN0u7np1A39bvQMHnFhdzvzpZRwztZQ5VSW9pSDnHHVNnSzb1MSyjU3savczc1IRsyqLmXVwEeOHGDnU0hXg3bpmNjd28PHDKqgsyet9zDnH8s27ae4IMKeqhLKCfRO4c463Pmri/jc28tzqelq7g2QYnHhIOb/8wrwBn+MVJX4RGTO27u7kj29u4smV21lb39a7PcPAzDAgGL22ID87k7KCbOqaOnv3W3h4BV89cTofP6QcgKWbmvi/d7bxytqdrGtooyctmsEJ1eN7T17/ZcXWvY4zvTMiJEMAAAhwSURBVLyAWZXFlOVnMS43i8wM48l3t/FhfRvjcn2cNWsSCw+v4IRDyinO8760058Sv4iMSc0dAZZvbuK9rS10B0KEHYSdY1JJHsdMKeHwiePwZWbQ0hVg1dYWXlu3iwfe3ERDazfTywvo8AfZ0dJNti+DE6rHc8yUyLeHg4pyefLdbTyyvI7NjZ1kGJx0aAXnzDmYyaV5LN+0m2WbmlizvYWWziCtXQHCDuZUlXDJ/Cn83dEHk5ed2HMRSvwiIlH+YJgn393GA29uojgvi88cPYlTj5jAuAFOuIbDjve2tnBQcS4VQyya4pyjOxhOqhPPSvwiImlmsMQ/9i6LExGRISnxi4ikGSV+EZE0o8QvIpJmlPhFRNKMEr+ISJpR4hcRSTNK/CIiaSYlLuAyswZgY/RuMdA8xO3+v8uBnSNssu9xh/NY/237i3GgeEcaZyxjHCger2M8kDj1fscmxv3Fpvd7dDEOFK/X7/dgcZY45yr22dM5l1I/wO1D3R7gd+1o2hjOY/237S/GWMQZyxgHisfrGGP1Wur9Ht37HcvXUu934t7v4bznfX9SsdTz+H5u9/892jaG81j/bfuLse/tA40zljEOFo+XMQ72+EhfS73fo3u/+97W+5267/dA2wc9RkqUekbDzGrdAHNVJJtUiFMxxk4qxKkYYyfZ4kzFHv9I3Z7oAIYpFeJUjLGTCnEqxthJqjjHfI9fRET2lg49fhER6UOJX0QkzSjxi4ikmbRO/Gb2cTP7rZn9zsxeS3Q8AzGzDDO70cxuM7NLEx3PYMxsoZktjr6eCxMdz2DMrMDMlprZ2YmOZSBmNjP6Gj5kZtckOp7BmNl5ZnaHmf3FzD6V6HgGYmYzzOxOM3so0bH0Ff03eE/09bskETGkbOI3s0VmVm9mK/ttP8PM3jeztWZ2w1DHcM4tds5dDTwB3JOMMQLnApVAAKiLdYwxjNMBbUCuF3HGKEaA64E/xTq+WMXonFsd/Tf5ecCT4X8xivNR59yVwGXARUka43rn3BWxjm0gI4z3s8BD0dfvnHjEt4+RXvWWLD/AycAxwMo+2zKBdcAMIBt4GzgSmE0kuff9mdDneX8CipIxRuAG4OvR5z6UrK8lkBF93kTgviSN8XTgC0SS1dnJGGP0OecArwFfTNb3u8/z/gM4Jslj9OT/zSji/QEwN7rP/V7HNtCPjxTlnHvZzKb123w8sNY5tx7AzP4InOuc+xkw4Fd7M5sCNDvnWpIxRjOrA/zRu6FYxxirOPtoAnKSMUYz+wRQQOQ/X6eZPemcCydTjNHjPAY8Zmb/B9wfq/hiGaeZGXAT8Ffn3LJkjDGeRhIvkW/Ek4EVJKjqkrKJfxCVwOY+9+uA+ft5zhXAXZ5FtK+RxvgIcJuZfRx42cvA+hlRnGb2WeDTQAnwa29D6zWiGJ1zPwIws8uAnbFM+kMY6eu4kEgpIAd40tPI9jbSf5ffJvINqtjMDnHO/dbL4KJG+lqOB24E5pnZD6IfEPE0WLy/An5tZp9hdFNPHLCxlvhtgG1DXqHmnPsXj2IZzIhidM51EPlwireRxvkIkQ+peBrx+w3gnLs79qEMaqSv44vAi14FM4SRxvkrIgksnkYa4y7gau/C2a8B43XOtQNfjXcwfaXsyd1B1AFVfe5PBrYmKJbBpEKMkBpxKsbYSYU4UyHGvpI23rGW+N8CDjWz6WaWTeRE3mMJjqm/VIgRUiNOxRg7qRBnKsTYV/LGm4gzyjE6i/4AsI09wxyviG4/C/iAyNn0HynGsRGnYkyvOFMhxlSOV5O0iYikmbFW6hERkf1Q4hcRSTNK/CIiaUaJX0QkzSjxi4ikGSV+EZE0o8QvKcnM2uLc3u/M7MgYHStkZivMbKWZPW5mJfvZv8TMvhGLtkVAi61LijKzNudcYQyP53POBWN1vP201Ru7md0DfOCcu3GI/acBTzjnZsUjPhn71OOXMcPMKszsYTN7K/pzYnT78Wb2mpktj/4+PLr9MjN70MweB56xyCpiL1pk9as1ZnZfdPphottrorfbLLIq2ttm9rqZTYxur47ef8vMfjLMbyVLiMziiJkVmtlzZrbMzN41s3Oj+9wEVEe/JdwS3fcfou28Y2b/GsOXUdKAEr+MJb8E/tM5dxxwAfC76PY1wMnOuXnAPwM/7fOcBcClzrlTo/fnAd8lMmf/DODEAdopAF53zs0hMlX2lX3a/2W0/f1OxmVmmcBp7Jm/pQs43zl3DPAJ4D+iHzw3AOucc3Odc/9gkaUODyUy3/tc4FgzO3l/7Yn0GGvTMkt6Ox04MtpJBygys3FAMXCPmR1KZBrfrD7PedY519jn/pvOuToAM1sBTANe6deOn8gqTwBLgU9Gby8Azovevh+4dZA48/oceynwbHS7AT+NJvEwkW8CEwd4/qeiP8uj9wuJfBDEc70GSWFK/DKWZAALnHOdfTea2W3AC86586P18hf7PNze7xjdfW6HGPj/SMDtOTk22D5D6XTOzTWzYiIfIN8kMrf9JUAFcKxzLmBmHxFZw7g/A37mnPufEbYrAqjUI2PLM8C3eu6Y2dzozWJgS/T2ZR62/zqREhNEpuAdknOuGbgW+L6ZZRGJsz6a9D8BTI3u2gqM6/PUp4HLzaznBHGlmU2I0d8gaUCJX1JVvpnV9fn5HpEkWhM94bmKPasv3Qz8zMxeJbIAtle+C3zPzN4EJgHN+3uCc245kUW4vwDcRyT+WiK9/zXRfXYBr0aHf97inHuGSClpiZm9CzzE3h8MIkPScE6RGDGzfCJlHGdmXwAuds6du7/nicSbavwisXMskUW0DdgNXJ7geEQGpB6/iEiaUY1fRCTNKPGLiKQZJX4RkTSjxC8ikmaU+EVE0owSv4hImvn/d7vmYoLrhzYAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#slow\n", "with tempfile.TemporaryDirectory() as d:\n", " learn = synth_learner(path=Path(d))\n", " learn.lr_find()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Export -" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Converted 00_test.ipynb.\n", "Converted 01_core.ipynb.\n", "Converted 01a_utils.ipynb.\n", "Converted 01b_dispatch.ipynb.\n", "Converted 01c_transform.ipynb.\n", "Converted 02_script.ipynb.\n", "Converted 03_torch_core.ipynb.\n", "Converted 03a_layers.ipynb.\n", "Converted 04_dataloader.ipynb.\n", "Converted 05_data_core.ipynb.\n", "Converted 06_data_transforms.ipynb.\n", "Converted 07_data_block.ipynb.\n", "Converted 08_vision_core.ipynb.\n", "Converted 09_vision_augment.ipynb.\n", "Converted 10_pets_tutorial.ipynb.\n", "Converted 11_vision_models_xresnet.ipynb.\n", "Converted 12_optimizer.ipynb.\n", "Converted 13_learner.ipynb.\n", "Converted 13a_metrics.ipynb.\n", "Converted 14_callback_schedule.ipynb.\n", "Converted 14a_callback_data.ipynb.\n", "Converted 15_callback_hook.ipynb.\n", "Converted 15a_vision_models_unet.ipynb.\n", "Converted 16_callback_progress.ipynb.\n", "Converted 17_callback_tracker.ipynb.\n", "Converted 18_callback_fp16.ipynb.\n", "Converted 19_callback_mixup.ipynb.\n", "Converted 21_vision_learner.ipynb.\n", "Converted 22_tutorial_imagenette.ipynb.\n", "Converted 23_tutorial_transfer_learning.ipynb.\n", "Converted 30_text_core.ipynb.\n", "Converted 31_text_data.ipynb.\n", "Converted 32_text_models_awdlstm.ipynb.\n", "Converted 33_text_models_core.ipynb.\n", "Converted 34_callback_rnn.ipynb.\n", "Converted 35_tutorial_wikitext.ipynb.\n", "Converted 36_text_models_qrnn.ipynb.\n", "Converted 37_text_learner.ipynb.\n", "Converted 38_tutorial_ulmfit.ipynb.\n", "Converted 40_tabular_core.ipynb.\n", "Converted 41_tabular_model.ipynb.\n", "Converted 42_tabular_rapids.ipynb.\n", "Converted 50_data_block_examples.ipynb.\n", "Converted 60_medical_imaging.ipynb.\n", "Converted 65_medical_text.ipynb.\n", "Converted 90_notebook_core.ipynb.\n", "Converted 91_notebook_export.ipynb.\n", "Converted 92_notebook_showdoc.ipynb.\n", "Converted 93_notebook_export2html.ipynb.\n", "Converted 94_notebook_test.ipynb.\n", "Converted 95_index.ipynb.\n", "Converted 96_data_external.ipynb.\n", "Converted 97_utils_test.ipynb.\n", "Converted notebook2jekyll.ipynb.\n" ] } ], "source": [ "#hide\n", "from local.notebook.export import notebook2script\n", "notebook2script(all_fs=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 2 }