{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Basic training functionality" ] }, { "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.vision import *\n", "from fastai.distributed import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[`basic_train`](/basic_train.html#basic_train) wraps together the data (in a [`DataBunch`](/basic_data.html#DataBunch) object) with a PyTorch model to define a [`Learner`](/basic_train.html#Learner) object. Here the basic training loop is defined for the [`fit`](/basic_train.html#fit) method. The [`Learner`](/basic_train.html#Learner) object is the entry point of most of the [`Callback`](/callback.html#Callback) objects that will customize this training loop in different ways. Some of the most commonly used customizations are available through the [`train`](/train.html#train) module, notably:\n", "\n", " - [`Learner.lr_find`](/train.html#lr_find) will launch an LR range test that will help you select a good learning rate.\n", " - [`Learner.fit_one_cycle`](/train.html#fit_one_cycle) will launch a training using the 1cycle policy to help you train your model faster.\n", " - [`Learner.to_fp16`](/train.html#to_fp16) will convert your model to half precision and help you launch a training in mixed precision." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class Learner[source]

\n", "\n", "> Learner(**`data`**:[`DataBunch`](/basic_data.html#DataBunch), **`model`**:[`Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module), **`opt_func`**:`Callable`=***`'Adam'`***, **`loss_func`**:`Callable`=***`None`***, **`metrics`**:`Collection`\\[`Callable`\\]=***`None`***, **`true_wd`**:`bool`=***`True`***, **`bn_wd`**:`bool`=***`True`***, **`wd`**:`Floats`=***`0.01`***, **`train_bn`**:`bool`=***`True`***, **`path`**:`str`=***`None`***, **`model_dir`**:`str`=***`'models'`***, **`callback_fns`**:`Collection`\\[`Callable`\\]=***`None`***, **`callbacks`**:`Collection`\\[[`Callback`](/callback.html#Callback)\\]=***``***, **`layer_groups`**:`ModuleList`=***`None`***, **`add_time`**:`bool`=***`True`***)\n", "\n", "Trainer for `model` using `data` to minimize `loss_func` with optimizer `opt_func`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner, title_level=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The main purpose of [`Learner`](/basic_train.html#Learner) is to train `model` using [`Learner.fit`](/basic_train.html#Learner.fit). After every epoch, all *metrics* will be printed and also made available to callbacks.\n", "\n", "The default weight decay will be `wd`, which will be handled using the method from [Fixing Weight Decay Regularization in Adam](https://arxiv.org/abs/1711.05101) if `true_wd` is set (otherwise it's L2 regularization). If `bn_wd` is `False`, then weight decay will be removed from batchnorm layers, as recommended in [Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour](https://arxiv.org/abs/1706.02677). If `train_bn`, batchnorm layer learnable params are trained even for frozen layer groups.\n", "\n", "To use [discriminative layer training](#Discriminative-layer-training), pass a list of [`nn.Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) as `layer_groups`; each [`nn.Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) will be used to customize the optimization of the corresponding layer group.\n", "\n", "If `path` is provided, all the model files created will be saved in `path`/`model_dir`; if not, then they will be saved in `data.path`/`model_dir`.\n", "\n", "You can pass a list of [`callback`](/callback.html#callback)s that you have already created, or (more commonly) simply pass a list of callback functions to `callback_fns` and each function will be called (passing `self`) on object initialization, with the results stored as callback objects. For a walk-through, see the [training overview](/training.html) page. You may also want to use an [application](applications.html) specific model. For example, if you are dealing with a vision dataset, here the MNIST, you might want to use the [`create_cnn`](/vision.learner.html#create_cnn) method:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": false }, "outputs": [], "source": [ "path = untar_data(URLs.MNIST_SAMPLE)\n", "data = ImageDataBunch.from_folder(path)\n", "learn = create_cnn(data, models.resnet18, metrics=accuracy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model fitting methods" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

lr_find[source]

\n", "\n", "> lr_find(**`learn`**:[`Learner`](/basic_train.html#Learner), **`start_lr`**:`Floats`=***`1e-07`***, **`end_lr`**:`Floats`=***`10`***, **`num_it`**:`int`=***`100`***, **`stop_div`**:`bool`=***`True`***, **`wd`**:`float`=***`None`***)\n", "\n", "Explore lr from `start_lr` to `end_lr` over `num_it` iterations in `learn`. If `stop_div`, stops when loss diverges. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.lr_find)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Runs the learning rate finder defined in [`LRFinder`](/callbacks.lr_finder.html#LRFinder), as discussed in [Cyclical Learning Rates for Training Neural Networks](https://arxiv.org/abs/1506.01186). " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n" ] } ], "source": [ "learn.lr_find()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Min numerical gradient: 1.32E-02\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learn.recorder.plot()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

fit[source]

\n", "\n", "> fit(**`epochs`**:`int`, **`lr`**:`Union`\\[`float`, `Collection`\\[`float`\\], `slice`\\]=***`slice(None, 0.003, None)`***, **`wd`**:`Floats`=***`None`***, **`callbacks`**:`Collection`\\[[`Callback`](/callback.html#Callback)\\]=***`None`***)\n", "\n", "Fit the model on this learner with `lr` learning rate, `wd` weight decay for `epochs` with `callbacks`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.fit)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Uses [discriminative layer training](#Discriminative-layer-training) if multiple learning rates or weight decay values are passed. To control training behaviour, use the [`callback`](/callback.html#callback) system or one or more of the pre-defined [`callbacks`](/callbacks.html#callbacks)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Total time: 00:04

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracy
10.1296070.0820840.973013
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "learn.fit(1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

fit_one_cycle[source]

\n", "\n", "> fit_one_cycle(**`learn`**:[`Learner`](/basic_train.html#Learner), **`cyc_len`**:`int`, **`max_lr`**:`Union`\\[`float`, `Collection`\\[`float`\\], `slice`\\]=***`slice(None, 0.003, None)`***, **`moms`**:`Point`=***`(0.95, 0.85)`***, **`div_factor`**:`float`=***`25.0`***, **`pct_start`**:`float`=***`0.3`***, **`final_div`**:`float`=***`None`***, **`wd`**:`float`=***`None`***, **`callbacks`**:`Optional`\\[`Collection`\\[[`Callback`](/callback.html#Callback)\\]\\]=***`None`***, **`tot_epochs`**:`int`=***`None`***, **`start_epoch`**:`int`=***`1`***)\n", "\n", "Fit a model following the 1cycle policy. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.fit_one_cycle)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use cycle length `cyc_len`, a per cycle maximal learning rate `max_lr`, momentum `moms`, division factor `div_factor`, weight decay `wd`, and optional callbacks [`callbacks`](/callbacks.html#callbacks). Uses the [`OneCycleScheduler`](/callbacks.one_cycle.html#OneCycleScheduler) callback. Please refer to [What is 1-cycle](/callbacks.one_cycle.html#What-is-1cycle?) for a conceptual background of 1-cycle training policy and more technical details on what do the method's arguments do." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Total time: 00:04

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracy
10.0888840.0663790.978410
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "learn.fit_one_cycle(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### See results" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

predict[source]

\n", "\n", "> predict(**`item`**:[`ItemBase`](/core.html#ItemBase), **\\*\\*`kwargs`**)\n", "\n", "Return predicted class, label and probabilities for `item`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.predict)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`predict` can be used to get a single prediction from the trained learner on one specific piece of data you are interested in." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Image (3, 28, 28), Category 3)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.data.train_ds[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each element of the dataset is a tuple, where the first element is the data itself, while the second element is the target label. So to get the data, we need to index one more time." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data = learn.data.train_ds[0][0]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAAcABwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+f+vc/wDgnb+xNcft+ftLWPwEk+NfhT4eaaNNuNU17xf4xv1gtNPsLcKZnBYqHkww2oWQHnLKATXhlfoV+z5/wSO/Ya8EfCzwl+0p/wAFKv8Agq58NfB/hvxHZWup23w9+F923iPxPPayosnkzJAjCxl2kgny51jJAY7soADQ+IP/AAQ5/Zii+FPx0+K/7PP/AAVn8DfE1Pgx4Wm8Qy6b4X8FX0sd1aCZ4oopr/zPskE8jKqokckxYlmA2ruP5y1+oP8AwWN/aB+Hvh/9i/4cfBL/AIJXPpmhfseeJNYv1kbSre+t9Y8R+KbIWzXg15rxVlnZFmtpYQpaIo6DgwJHD+X1AH2L/wAE3/2W/wDgkp+0B8OtZ1D9vn/gopr3wc8WWmtSR6Votn4Gnv7W604QwFbg3McbgSNK8yeUQCFhDc7uPr7w98Bv+DQj9mayfWPiR+1v8WPjtqCWCv8A2Lpmm39nBPJkAiPyLW02NlSQslzgK/JJwa/HyigD6/8A+CnP/BUXRP20NB8Lfs1fs2/s9aH8JPgH8Nbm4f4e+ArCCOe8WWYnzr27u2BkeaUksyByoJ+ZpWHmn5AoooA//9k=\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABHNCSVQICAgIfAhkiAAAAlhJREFUSIntVj1rKlEQPUZDUoiF0SR2FomWIRGRRLCwDhK2EdE/YJE/INhaWiVNSCWI1TZRi4BVTBMswoJFwEZsJGyz2gjKvec1j+Vp1u/3AoE3MLB775w5d2bP7qwNAPGNtvOdZD+P8ODgABcXF2thHJuSxWIxFAoFhEIh3N3dQdd17O3tIZVKAQBUVUU+n7fEcl2/vb3lYDCgEMJ0KeXU/fPzsyV2owrPzs7gdDoBAJ1OB09PT9B1Haqq4vLyEqVSCZ+fn5bYjQhfX18xGo1QqVTQarUwmUwAAPv7+8hkMgCAdrs9F792S63c5XKx2+1SSsn393ceHR3Ni92OyOFw0OPxsNvtUghBTdPo8/kWYTYn8/l8LBaLpmg0TePx8fEy3GZEmUyGhmGYqnx4eFhW2foqTafTUBQFV1dXODw8nNr7+PhAv99fKc9SMdzf31NKaTpJ9no9NptN1mo1qqpKkszlcqt0aHFAJBLheDymEILD4ZDNZpPX19f0er1TcalUisPhkCcnJ9s/w3g8zkQisTBZNBqlEIKJROLvi8bK397eKIRgNpul3W6fG7f1eAqHw1BVFeFwGABwfn6OnZ3FaVeuwu/3MxqN8vHxkS8vL+aXRUrJwWDAbDa7NIft9wUA4ObmBoFA4MuJFEWBy+WC1+uF2+2GzWYDacJgGAaSySQajcZKXTHZZ0eM1diZXSuXy3S73St3aerFr1arCAaDOD09tTxZp9OBEAK6rqNer6PRaEDTNEgpV6oMAKZaCgC7u7umAGbtz1G0qX0h/Nf2s/7a/hNa2S/tek2pzxDJXQAAAABJRU5ErkJggg==\n", "text/plain": [ "Image (3, 28, 28)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Category 3, tensor(0), tensor([9.9979e-01, 2.0649e-04]))" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pred = learn.predict(data)\n", "pred" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first two elements of the tuple are, respectively, the predicted class and label. Label here is essentially an internal representation of each class, since class name is a string and cannot be used in computation. To check what each label corresponds to, run:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['3', '7']" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.data.classes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So category 0 is 3 while category 1 is 7." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "probs = pred[2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The last element in the tuple is the predicted probabilities. For a categorization dataset, the number of probabilities returned is the same as the number of classes; `probs[i]` is the probability that the `item` belongs to `learn.data.classes[i]`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAAcABwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+f+vSvC/7Gf7YHjjwBF8V/BX7KXxK1jwtO4SDxLpfgXULjT5GIJAW4jhMZOFY4Dfwn0rz7RdQt9J1m01S70e21GK2uY5ZdPvTIIblVYExSeU6PsYDadjK2CcMDgj9d9T+GP8Awd8+HfHui+J/DV58Wre21sQPoFr4N8VabN4asraSONYUS3tZ3sLS2SN0A3qkaBS2flZgAfkHdWtzY3Mlle28kM0MhSaGVCrIwOCpB5BB4INR19xf8HB/7Q/gv9ob/goEkvhrxF4f8S6x4L+HWg+FfHnj7wysQtPF/iK0tydQ1NTCqo376U24KjaVtV2/Livh2gAr7N/4IZftP/tK/Cz/AIKW/BX4bfC/x1rdx4f8Z/ELTPDXi3wi081zp2o6LqFzFbX6TWmTG6rbs8m4r+7MSyfwV8ZV7r+zr/wUA+KP7Knhu8T4HfDbwJo3jG40S60iz+KMegyHxDptncpLHOtrL532eGV4ppIjciA3ARsCUYGADiv2svBHgX4Z/tT/ABL+HHwvvRc+GfD/AMQNZ03w7crdLOJbGC+mit38xflkzGiHcOGzkda8/pWZnYu7EknJJPWkoA//2Q==\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABHNCSVQICAgIfAhkiAAAAdJJREFUSIntVbGq4kAUvW9ZUZCQIqjBzlohhWAsLEQLwdZUNn6AkEbQD7AJthZWFnYWWgj+gKRIpRZiK1hpIYoY1BSZ86q12SUm8T2L5V04zcyZOffMvZf5ICLQG+PXO8V+BH8EfcVvN6RCoUC1Wo1yuRwlEgmaTqd0Op1ot9vRZDIhwzA8icIJqqrCsizYtg3GGGzbfoAxBsuysNlsIMuy4z1/8EEOg8/zPK3XaxqPx9Tv9x/roVCIKpUKxeNxKpVKJAgCzedzymQyrznUNA35fN4xY0mSHo7dOHz6pM8gSRIYY9B13RX/5S4tFosEgDqdjuszjhlxHAdRFBEMBv/a43ke+/0e2+0WHMe5cvh0LGazGUmSRIvFgo7HI41GI7rf70REpGkaRSIRqtfrdLlcvsZht9sFY+yfOBwOUBTFa92dCYFAALFYDNlsFo1GA+12G6ZpwrZt9Ho9P43mvTNlWcb1esX5fIYgCN8vSERoNptgjKFarb5HkIjAGMNyufR05uU5BOCJ////h0Q+69dqtQDgPU0TjUZxu91gGAbC4fDXCyaTSaiqClEUUS6Xoes6TNNEOp328zruiIqiYDAYYLVaYTgcIpVK+SqF44//HfEJXkMk1eKRk3QAAAAASUVORK5CYII=\n", "text/plain": [ "Image (3, 28, 28)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.data.valid_ds[0][0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You could always check yourself if the probabilities given make sense." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

get_preds[source]

\n", "\n", "> get_preds(**`ds_type`**:[`DatasetType`](/basic_data.html#DatasetType)=***``***, **`with_loss`**:`bool`=***`False`***, **`n_batch`**:`Optional`\\[`int`\\]=***`None`***, **`pbar`**:`Union`\\[`MasterBar`, `ProgressBar`, `NoneType`\\]=***`None`***) → `List`\\[`Tensor`\\]\n", "\n", "Return predictions and targets on `ds_type` dataset. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.get_preds)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It will run inference using the learner on all the data in the `ds_type` dataset and return the predictions; if `n_batch` is not specified, it will run the predictions on the default batch size. If `with_loss`, it will also return the loss on each prediction." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is how you check the default batch size." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "64" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.data.batch_size" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[tensor([[9.9366e-01, 6.3430e-03],\n", " [9.9828e-01, 1.7193e-03],\n", " [9.9993e-01, 7.1130e-05],\n", " ...,\n", " [1.5793e-04, 9.9984e-01],\n", " [9.0569e-03, 9.9094e-01],\n", " [9.8014e-01, 1.9864e-02]]), tensor([0, 0, 0, ..., 1, 1, 1])]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preds = learn.get_preds()\n", "preds" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first element of the tuple is a tensor that contains all the predictions." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[9.9366e-01, 6.3430e-03],\n", " [9.9828e-01, 1.7193e-03],\n", " [9.9993e-01, 7.1130e-05],\n", " ...,\n", " [1.5793e-04, 9.9984e-01],\n", " [9.0569e-03, 9.9094e-01],\n", " [9.8014e-01, 1.9864e-02]])" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preds[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "While the second element of the tuple is a tensor that contains all the target labels." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([0, 0, 0, ..., 1, 1, 1])" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preds[1]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor(0)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preds[1][0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For more details about what each number mean, refer to the documentation of [`predict`](/basic_train.html#predict).\n", "\n", "Since [`get_preds`](/basic_train.html#get_preds) gets predictions on all the data in the `ds_type` dataset, here the number of predictions will be equal to the number of data in the validation dataset." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2038" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(learn.data.valid_ds)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2038, 2038)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(preds[0]), len(preds[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get predictions on the entire training dataset, simply set the `ds_type` argument accordingly." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[tensor([[9.9973e-01, 2.6554e-04],\n", " [9.9962e-01, 3.8422e-04],\n", " [9.9988e-01, 1.1570e-04],\n", " ...,\n", " [9.9922e-01, 7.8436e-04],\n", " [4.4838e-04, 9.9955e-01],\n", " [1.3715e-04, 9.9986e-01]]), tensor([0, 0, 0, ..., 0, 1, 1])]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.get_preds(ds_type=DatasetType.Train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To also get prediction loss along with the predictions and the targets, set `with_loss=True` in the arguments." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[tensor([[9.9366e-01, 6.3430e-03],\n", " [9.9828e-01, 1.7193e-03],\n", " [9.9993e-01, 7.1130e-05],\n", " ...,\n", " [1.5793e-04, 9.9984e-01],\n", " [9.0569e-03, 9.9094e-01],\n", " [9.8014e-01, 1.9864e-02]]),\n", " tensor([0, 0, 0, ..., 1, 1, 1]),\n", " tensor([6.3632e-03, 1.7209e-03, 7.1049e-05, ..., 1.5783e-04, 9.0983e-03,\n", " 3.9189e+00])]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.get_preds(with_loss=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the third tensor in the output tuple contains the losses." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

validate[source]

\n", "\n", "> validate(**`dl`**=***`None`***, **`callbacks`**=***`None`***, **`metrics`**=***`None`***)\n", "\n", "Validate on `dl` with potential `callbacks` and `metrics`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.validate)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Return the calculated loss and the metrics of the current model on the given data loader `dl`. The default data loader `dl` is the validation dataloader." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can check the default metrics of the learner using:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'[]'" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "str(learn.metrics)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0.06637867, tensor(0.9784)]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.validate()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0.06637867, tensor(0.9784)]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.validate(learn.data.valid_dl)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0.039573476, tensor(0.9860)]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.validate(learn.data.train_dl)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

show_results[source]

\n", "\n", "> show_results(**`ds_type`**=***``***, **`rows`**:`int`=***`5`***, **\\*\\*`kwargs`**)\n", "\n", "Show `rows` result of predictions on `ds_type` dataset. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.show_results)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the text number on the top is the ground truth, or the target label, the one in the middle is the prediction, while the image number on the bottom is the image data itself." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "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Z1ZZZZVs7uSTT87m/uEf/iGbg8Fo5MiR2dyQIUNq45MnT86esUGLvnb11Vdnc2uuuWY212rD5EC13nrrZXMrr7xyNme7FvSft956K5sbbBu06H/PPfdcNrfuuuvWxp9//vm21/Hwww/Xxvfaa6/smeuvvz6bW2655WrjX//617NnjjjiiGyO9+ZJHgAAAIACGPIAAAAAFMCQBwAAAKAAhjwAAAAABTDkAQAAACiAIQ8AAABAAcrbYdpLvvOd72Rz//iP/1gbv+aaa3qpmu65+eabu31m3Lhx2dyMGTOyuY033rjb94LBao011sjmllhiidp4bq0lNM0zzzzT3yX0ipRSt+JA94wdOzabmzx5clvvdcIJJ7T1etBb5s2b198ltKzh1VdfzeYWXXTR2viSSy650DVRz5M8AAAAAAUw5AEAAAAogCEPAAAAQAEMeQAAAAAKYMgDAAAAUABDHgAAAIACWKHeRd/+9rf7u4TGaLUm9sYbb+zDSqD9FlkkP/veY489srkxY8Z0+16PPvpoNrftttt2+3pAe+TWvUZEjBgxojZ+5513Zs888sgjC10TNNWwYcN6lFt++eVr47/97W+zZ1ZdddWuF9YFiy++eDa31FJLZXMvv/xyW+uAgWDChAnZ3PDhw/uwEt6LJ3kAAAAACmDIAwAAAFAAQx4AAACAAhjyAAAAABTAkAcAAACgAIY8AAAAAAWwQp1an/zkJ7O5qqqyueOOO643yoE+s/POO2dz//Ef/9HWe82aNSubu+2222rjd999d1trAP7WFVdckc1tueWWtfEpU6Zkz8ybN2+ha4L+tMYaa2RzZ511Vja3ySab9EY5bXPYYYdlc1tttVU2d91119XGf/SjH2XPvPjii12uC3rbMsssk839+7//e218/Pjxba3hvvvua+v1eIcneQAAAAAKYMgDAAAAUABDHgAAAIACGPIAAAAAFMCQBwAAAKAAqdWmpLbfLKW+u1kfGj58eG186aWXzp5ptWnjtddeW+iaumrEiBG18XvvvTd7plV96623Xjb3wgsvdL2wAlRVlfq7hq4qtTdzJkyYkM212qA1ZMiQbt/r2WefzeaWXXbZbO7ll1+ujR977LHZM5dddlk2t/vuu2dz3/72t7O5EulNIlr30qGHHprN5b5v2n777bNnWm3r4h16s/+NGjWqNv7nP/85e2b06NG9Vc6Ac9NNN2Vz3/ve97K5q6++ujfKaRu92VwrrLBCNvfDH/4wm/viF7+YzfXk+92euOOOO7K5adOmZXNnnHFGNvfYY48tVE0DTa43PckDAAAAUABDHgAAAIACGPIAAAAAFMCQBwAAAKAAhjwAAAAABTDkAQAAACjA0P4uoATXXnttbXzcuHHZMzNmzMjm5s6dm83l1sm9+uqr2TOtHHPMMbXx3ArNiIhvfOMb2dxgW5POwLTaaqtlcy+++GI296c//Smbu+CCC2rjf/jDH7JnerJ2ttXnh+uuuy6bGzlyZDZ3+umn18bvu+++rhcG/Wjs2LHZ3BFHHFEb/8IXvtDWGs4555xs7vXXX8/mNthgg2zuqaeeWqiaYCC6+eabs7kbb7wxm7vwwgtr462+b33f+96Xze2www7ZXM5mm22Wzf3oRz/K5rbbbrva+EsvvdTtGhhc9tlnn2zuy1/+clvvVVU9206fUu2W75b/Vm6V+9KXvpTNbbvttrXxBx98MHumRJ7kAQAAACiAIQ8AAABAAQx5AAAAAApgyAMAAABQAEMeAAAAgAIY8gAAAAAUIPV0FVqPbpZS392sD5188sm18VYrG5sit4651Tq+3Bp3/q+qqur3BTZQqb052Nx///3Z3GOPPdbtc+1evdkUenNg2n///bO5E044oa33mjNnTjaX+75p8cUXz55ZZpllelTH5MmTa+P//d//nT1z/fXX9+heTaA3myv3dzEi4pvf/GY2d9ttt3X7mr/73e+yZ1544YVsricWWST/37sPP/zwbO6oo45qax3HHntsbfy73/1uW+/TU3qzubbccsts7uijj+7RNS+++OLa+A033NCj633lK1+pje+1117ZM0suuWSP7vXII4/Uxtdbb73smXZ/XulLud70JA8AAABAAQx5AAAAAApgyAMAAABQAEMeAAAAgAIY8gAAAAAUwHatNlh00UVr48stt1z2zKqrrprNbbHFFtlcbkPHgQcemD3T6qeT/+IXv6iN77vvvtkzdI1NBPS1VhuBnnnmmWwu93mg3RuLmkJvDkyttvtMmjQpm8ttCbnsssuyZ84666yuF9ZphRVWyOY+8YlPZHNHHHFENrf66qvXxu+4447smQ033DCbazq9OTCNHj06m3vxxRezuZdffrk3ymmbMWPGZHMPPvhgW+81ZcqU2nirbbd9SW/SG3bZZZdsLrdxLiJizTXX7Pa9Wn2eevrpp7t9vaawXQsAAACgYIY8AAAAAAUw5AEAAAAogCEPAAAAQAEMeQAAAAAKYMgDAAAAUAAr1Aux2WabZXNXX311NvfGG2/UxldbbbXsmVarmHmHdZMsjMUXX7w2/q1vfSt75vvf/342N3z48Gxuu+22q41feeWV2TMDmd4cmFr9HV5jjTWyuRkzZvRGOW0zduzYbO64446rjW+00UbZM62+H2j612+9SZP05Qr1iRMn1sZ//etft/U+PaU36Wv77LNPNnfqqad2+3pWqAMAAAAw4BjyAAAAABTAkAcAAACgAIY8AAAAAAUw5AEAAAAogCEPAAAAQAGG9ncBtMdNN92UzR155JHZ3DHHHFMbz61Ujog4++yzu1wXkLfUUktlc7vvvntt/Nhjj82eef3117O5VqsoS12VTlleeOGFbK7pa9Jbeeihh7K52bNn18Z322237JlW69WvuOKKLtfFwPbVr341mxs3blw2d88999TGTzvttOyZN998s+uFNcwii+T/e/f48ePbeq9XXnklm7vuuuvaei8Y6J588sm2Xm+ttdbK5gbyCvUcT/IAAAAAFMCQBwAAAKAAhjwAAAAABTDkAQAAACiAIQ8AAABAAQx5AAAAAApghfogcNxxx2VzuRXqhx56aPaMFerQHhtuuGE2d8YZZ3T7er///e+zuSlTpnT7egA02wYbbFAb//73v589s9JKK3X7Pttss002d+WVV2ZzP/vZz7p9r3YbPXp0Nrf33ntnc8cff3xb6/jVr36Vzc2ePbut94KB4NOf/nQ21+7PHffee29br9d0nuQBAAAAKIAhDwAAAEABDHkAAAAACmDIAwAAAFAAQx4AAACAAtiuRa2qqvq7BCjC+9///mzuhhtuyOYeeeSR2vjpp5+ePZPblgcMTFtttVVt/M4778yeueKKK3qpGpoo9zWmJxu0Wtl5552zuZ122imbW3rppbO5W265pdt1rL766tncrrvuWhtfZZVVsmfWWmutbtfQyh133JHNnXzyyW29F4PL1KlTa+OttsddcMEF2dxVV13V7RpGjhyZzY0fPz6b+/KXv1wbX3bZZbNnFlmkZ8+i/PGPf6yNv/TSSz263kDlSR4AAACAAhjyAAAAABTAkAcAAACgAIY8AAAAAAUw5AEAAAAogCEPAAAAQAGsUAdog+222642fuSRR2bPzJw5M5vLrYK9//77u1UX0GynnHJKNjdu3Lja+Pe+973eKocB5vrrr6+Nn3baadkzX//619taQ0opm/vxj3/c1ns1xc0331wb33fffbNn7r333t4qh0Fg+PDhtfFPfepT2TOtcgPZ3Llzs7mddtqpNv7KK6/0VjmN5EkeAAAAgAIY8gAAAAAUwJAHAAAAoACGPAAAAAAFMOQBAAAAKIAhDwAAAEABUlVVfXezlPruZnTJ22+/XRu//fbbs2c22mij3iqnKFVV5XeKNoze7JpVVlklm/vTn/5UG99vv/2yZ84555w+CCSNAAAgAElEQVSFronu05sD0/rrr5/NLbbYYtncrbfe2hvl/I2NN944mzvwwAOzud122y2bu+OOO2rjH/7wh7te2ACiN9tniSWWyOZOOOGEbO5rX/tab5TTWG+++WY2d9JJJ2VzP/jBD2rjL7744kLX1ER6s/+tvvrqtfErrrgie6bV961NkPt3aETEXXfdlc3tsssu2dxDDz20MCUNOLne9CQPAAAAQAEMeQAAAAAKYMgDAAAAUABDHgAAAIACGPIAAAAAFMB2rUHg8MMPz+aOOeaY2vjee++dPXP22WcvdE2DgU0E/W/TTTetjS+55JLZMwcccEA295vf/Caby233abVB64033sjm6D16c2CaOnVqNtdq08aDDz7Y7XullP8rkvu+adVVV82eGTZsWDY3bdq0bO7MM8+sjV966aXZMwOZ3uwbiy66aDaX+7u67777Zs+MGDEimzvkkEO6XlgvOeWUU7K53//+99lcqX3WE3qzuVZaaaVsbtKkSdncuuuum83tvvvutfEbb7wxe+aee+7J5q677rra+KxZs7JnbrnllmyOd9iuBQAAAFAwQx4AAACAAhjyAAAAABTAkAcAAACgAIY8AAAAAAUw5AEAAAAogBXqhRg9enQ2N3v27Gzu9ttvr41vs8022TMvvfRS1wsbxKyb7H/nn39+bXzu3LnZMzNnzszmfv3rX2dzra5Js+jNgWn11VfP5i6//PJsbpVVVun2vXqyQr3V19rzzjsvm/vRj36Uzb344ovZXIn0JjST3oRmskIdAAAAoGCGPAAAAAAFMOQBAAAAKIAhDwAAAEABDHkAAAAACmDIAwAAAFAAK9R70Qc/+MFs7pOf/GQ2d+6552ZzG220UW38O9/5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a+W2226rjX/605/OnpkzZ07b6+grerM8q6yySjaX+/zx1a9+tUf3yvXmBRdckD1z9tlnZ3Otzg02tmsBAAAAFMyQBwAAAKAAhjwAAAAABTDkAQAAACiAIQ8AAABAAQx5AAAAAApghXoXtVopPmHChNr45MmTe3SvVqvGTzzxxNr4T37ykx7dK6fVn/fhhx/O5vbcc89s7txzz12omgYa6yaba9KkSdncaaed1oeVNMOtt95aG2+1xvall17qrXJ6nd5sri233DKb++lPf5rNjRs3Lptr9/rygWzq1Km18YkTJ/ZtIRl6s28MHTo0mxsyZEht/NBDD82euf3227O5Sy65JJtr979BFl100dr4Iovk/5v2vffem821+l747rvvro1vu+222TNPPPFENtd0erO5cuvJIyJ23XXXbG6jjTbK5kaOHFkbb/X1tFU/T5kypTbeqr5W/x7edNNNs7nBxgp1AAAAgIIZ8gAAAAAUwJAHAAAAoACGPAAAAAAFMOQBAAAAKIAhDwAAAEAB8jsUB6Gerg3PmT59ejY3bdq0bK7d69CB/+v000/P5h544IFsbocddsjm7rvvvm5fr5VvfOMbtfGllloqe2bdddfN5lp9ftt4441r4z/4wQ+yZw455JBsDnrq17/+dTY3ZsyYPquj1dfvW265pTb+5z//ubfK+Rv77bdfNrf++utnc//0T/9UG2/KCnX6xptvvtnt3FFHHdVb5bRNboXzN7/5zeyZ0aNH9+hel156aW18IK9Jp/vGjx+fze2///618QsvvDB7Zp111snm1l577dr4lltumT3Taq35jBkzsrmf/vSntfFZs2Zlz1xwwQXZXM4mm2zS7TN0jSd5AAAAAApgyAMAAABQAEMeAAAAgAIY8gAAAAAUwJAHAAAAoAC2ay1g880379G58847rzZ+8MEHZ8888sgjPbpXX5k8eXJ/lwC95u23387mrr766h7l2q0n92q1lSG3CSQiv7Voiy22yJ4ZPnx4NvfCCy9kc9DKoosums2df/752dyVV16Zzc2cObM2fvfdd2fPtPo73GozUbvlNo+MGDGiR9ebM2fOwpQDjbb88svXxo877rgeXe+VV17J5lp9TaUsrb63OvPMM7O53DbUVt9bpZSyudymrNNOOy17ptUmr8svvzyba7dRo0bVxnM9GxExZcqU3ipnUPAkDwAA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KIAhDwAAAEABDHkAAAAACmDIAwAAAFAAQx4AAACAAlihTlude+652dyHP/zh2nirFZUDmXWTg8tiiy1WG7/uuuuyZzbddNNsLneu1brlt956K5vjHXqz3vLLL9/tM3Pnzs3m3n777YUppyg9WZMekV+VPn369OyZHXfcMZt79tlns7km0JsMFIccckht/Nhjj23rfaxQ7z69Wb7x48dncz//+c9r4yNHjsye+bu/+7ts7umnn+56Yf3ACnUAAACAghnyAAAAABTAkAcAAACgAIY8AAAAAAUw5AEAAAAogCEPAAAAQAGG9ncBlGWPPfbI5h5++OHa+EEHHZQ985Of/GSha4K+8Prrr9fGJ06cmD1z7bXXZnMf+9jHauOHH3549sy//Mu/ZHMQEbHBBhtkc1dccUU29/zzz9fGW633femll7pe2AAyduzY2vjJJ5+cPZPr54j8mvSIiOeee642PmnSpOyZpq9Jh4FiiSWWyOZa9XRPzJgxozbe9PXN0FuWXnrpbG7vvffu9rkJEyZkz5TYZ57kAQAAACiAIQ8AAABAAQx5AAAAAApgyAMAAABQAEMeAAAAgAIY8gAAAAAUwAp1+swhhxxSGz/++OOzZ6xQZ6BbbLHFsrmhQ7v/KXiRRczm6bkrr7wym5s1a1Y2l1s9OpDXpI8cOTKba7Vq9bjjjquNDxs2rEd13HLLLdncQQcdVBu/5557enQvBo9Wfx9HjBiRzT366KO9UU6/WmWVVbK5T3/609ncgQcemM194AMf6HYdM2fOzOZ23HHH2vicOXO6fR8owdSpU7O5XXbZJZs7++yza+MXXnjhQtc0kPjXAgAAAEABDHkAAAAACmDIAwAAAFAAQx4AAACAAhjyAAAAABTAdi363corr9zfJUCXjBkzJpvbYIMNauO5rXIREcsss0y3a7Bpg4UxatSobK7VpsMnn3yyN8r5G616oqfbsD71qU/VxjfddNPsmaWXXjqby3n11VezufPPPz+b22+//bK5efPmdbsOiIg4+uijs7nNNtssm8tttDn99NMXuqZ2GDduXDb3jW98oza+3nrr9eh6rbz55pvdikdEHHPMMdmcr+2ULPc19eabb86eWWeddbK50047LZvbd999u15YwTzJAwAAAFAAQx4AAACAAhjyAAAAABTAkAcAAACgAIY8AAAAAAUw5AEAAAAoQKqqqu9ullLf3awP5VaAP/LII31cSbOde+653T6zxx579EIlfaOqqtTfNfx/9u483Mq66h//5w7EiZxnTTQ1cYwiUtNHNGcpJ9Q0G0zMOUtUijI1Nac0xac05Uqz0iwnssREFLPMIa1IMacnZynFIRQUEO7vH9av5/l1r+3Zh3P2vs9nv17XxR+s9/XZ9yc765zDuvY5q6ta2ZurrbZamJ122mmV9XHjxoVnpk6d2vQd3vWueL49YsSIMLvwwgvDrNH/ru44//zzK+vHH398eGbBggU9eodcdXJvNvoYefHFF8PsT3/6U9PPuuuuu8Jsiy22qKxvvfXW4ZlFF1206Tt016xZs8Lsuuuuq6yffvrp4ZlHHnlkoe/UCTq5N3tao4/HL3/5yy28Sd81Z86cMNt///0r6z//+c976zptpTdZGNdee21lfffddw/PTJgwIcxGjx4dZk8//XTXL5aBqDe9kwcAAAAgA4Y8AAAAABkw5AEAAADIgCEPAAAAQAYMeQAAAAAyYMgDAAAAkAEr1HtAtMbtS1/6Unjm6quvDrNjjz12oe/Um6KV8SmldO6554bZPvvsU1lfc801wzN9eQ29dZPV1l133TCL1gzPnDkzPNNoXekaa6xRWV9qqaXCM0OHDg2znvbtb387zL761a9W1ufNm9db1+kYndybjz32WJits846Pfmo2njppZcq62effXZ45uKLLw6zRp+PWDid3Js9bb311guzH/7wh2E2bNiwynpR1OP/mldeeSXM7r///sr6cccd161nLViwIMymTZvWrdfsq/QmKaW05JJLhtmee+4ZZj/60Y8q69Fq9ZRS2nvvvbt+sQ5mhToAAABAxgx5AAAAADJgyAMAAACQAUMeAAAAgAwY8gAAAABkwHatXrTvvvuGWaPfGB5toWqk0bau7ujOHd5JtDWs0YahvswmgmorrbRSmN11112V9bXWWquXbtNzLr300sr6mWeeGZ5ptD1u7ty5C30nqnVyb6666qphFm2/SCml4cOHV9b79evXrXtE33u89dZb4ZnDDjsszGbMmBFm0da+Rx99NDxDe3Ryb9bF5z73ucr6aqutFp455ZRTuvWsaPPd2LFjwzNPP/10mN1yyy3dugfvTG+SUuNtWLvvvnuYnXHGGU3VU0pp9uzZXb9YB7NdCwAAACBjhjwAAAAAGTDkAQAAAMiAIQ8A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TpxYWW+0BTD6vNcX6E36ikGDBlXWG31/sfjii4fZEkssUVl/8803m7tYL7FdCwAAACBjhjwAAAAAGTDkAQAAAMiAIQ8AAABABgx5AAAAADJgyAMAAACQgf7tvkDOGq1KXHfddcPs1ltvDbOnn366sv73v/+96xf7X6LVrePGjQvPNFrtfN5553XrHtAbfvvb31bWP/KRj4RnDjvssN66zn/ozgr1vffeOzwTrXnsrkbrYxdZZJEefRZ90yabbBJmt99+e5gtvfTSlfW5c+eGZy655JIw+8Y3vhFmL7/8cpj1pOOPPz7MNtxww25lW2yxRWX9rrvu6vrFgG755Cc/GWY77LBDZX3zzTfvreuQiX79+oVZo39/fe9736usP/jggwt9p5z84x//qKy/9dZbLb5Je3knDwAAAEAGDHkAAAAAMmDIAwAAAJABQx4AAACADBjyAAAAAGTAkAcAAAAgA1aot8laa60VZnfffXeYRSvUG61d72nbb799y54FC2POnDmV9XvvvTc80yirg29+85th9qtf/SrM1l577d64Dh1i4MCBlfVGH4/RmvRGBgwYEGZHHXVUmI0YMSLMRo0aVVn/9a9/3fWLdcGLL74YZo3+O1133XVhduGFF1bWt9pqq/DMrFmzwgxSSmm77bYLs0svvbTp17vpppvC7KGHHgqza665prIerUBOqec/vjfZZJMwO+OMM8Js0qRJlfU//OEPC30n8rDIIotU1u+5557wzCuvvBJmVqV3zc4771xZf/e7393im7SXd/IAAAAAZMCQBwAAACADhjwAAAAAGTDkAQAAAMiAIQ8AAABABgx5AAAAADJghXovmj17do+/5pprrllZ/9znPtfjz+ppCxYsqKxHa66B/9RoVfSqq67awpvQScaMGVNZb/Tx2Eprr712mN18882V9Ysvvjg8c/rpp4dZtOJ27ty54Znu2nTTTSvrjXr98ccf7/F70PesuOKKYdbo43uNNdZo+lmf//znmz6TUkrnnXdeZX3atGnhmQsuuCDMXnrppcp6tMq60R1SSmn69OlhdsIJJ1TW58+fH56hs/TvX/3P7CFDhoRndt999966Tla22mqrMLvooouafr1JkyaFWV/9d6p38gAAAABkwJAHAAAAIAOGPAAAAAAZMOQBAAAAyIAhDwAAAEAGbNfqRaeddlqYXXrppWFWFEVvXKftnnrqqcr6lVde2eKb0OkGDx4cZksttVTL7rHNNtuE2fbbb19Z33LLLcMziy666MJe6f944403wmzGjBk9+izqbYkllmj6TKNtU1dccUVl/aabbgrP7L333mG27777hlm0Weeoo44KzzTK7rjjjsp6o55YbbXVwgx6wyabbBJmw4YNa+FNmrfxxhuH2SWXXNKjz/rb3/4WZtEGrZRSuv/++3v0HpBSSp/5zGfC7Be/+EULb9IaW2+9dZgdcsghYTZy5Mgwi74XfvDBB8Mzxx57bJiVZRlmdeadPAAAAAAZMOQBAAAAyIAhDwAAAEAGDHkAAAAAMmDIAwAAAJABQx4AAACADFih3ot++MMfhtlmm20WZoceemiY1X29eqNVlGeffXYLb0KnePe73x1mw4cPr6yPHz8+PLPiiisu9J26qlE/t3Jl42OPPVZZb7RG+tZbb+2t61BDF110UWX9r3/9a3hm4sSJYfbkk082fYdGr9fIbrvtVllfbLHFuvV6jVa+9rQFCxY0VYd/6emvIY1er7tfy6Jz3b179Hp/+ctfwjMHHXRQmN1zzz3dugd011577RVmF1xwQWV90qRJvXWd/9Doe+4ddtghzHbeeefK+korrRSeede7eva9KBdffHGYTZs2rUefVQfeyQMAAACQAUMeAAAAgAwY8gAAAABkwJAHAAAAIAOGPAAAAAAZMOQBAAAAyEDRyjW9RVG07mF92OGHHx5mX//61yvrK6+8cm9d5z9cccUVYXbGGWeEWaMVljkqy7Le++7/l7r35hJLLBFml156aZjtvffevXGdHtPKFeovvvhimH3zm9+srH/nO9/p0TvUhd7sLMsvv3xlffTo0eGZr3zlK711nabceuutlfUdd9yxxTdpDb3Zc/r16xdm5513XpgdddRRvXGdHvPII4+E2UknnVRZv/7668Mz8+bNW+g7dQK92bzoe7yTTz45PBP9O4//a8aMGWF20EEHVdZvvPHG8Ewr5yE9LepN7+QBAAAAyIAhDwAAAEAGDHkAAAAAMmDIAwAAAJABQx4AAACADNiuBb3EJoKeM3jw4DCLts+k1Nqtc93Rne1ajTaB3H///WG21157hdkLL7wQZjnSm7yTTTfdNMx23333yvoee+wRnhkyZEiYvfnmm00/a/LkyeGZvkxvtsYiiywSZtHH3J577hme2W+//cLsnnvuCbMHHnigsv673/0uPHPNNdeE2axZs8KMhaM3e06j/hs7dmyYNdrKVXcPPvhgZb27vT5lypQwmz9/ftcvlgHbtQAAAAAyZsgDAAAAkAFDHgAAAIAMGPIAAAAAZMCQBwAAACADhjwAAAAAGbBCHXqJdZOt8e1vfzvMjj766B591syZM8PsrLPOqqzvuOOO4ZlbbrklzKLPzdEaypRSuvHGG8OMf9ObUE96E+pJb0I9WaEOAAAAkDFDHgAAAIAMGPIAAAAAZMCQBwAAACADhjwAAAAAGTDkAQAAAMiAFerQS6ybhHrSm1BPehPqSW9CPVmhDgAAAJAxQx4AAACADBjyAAAAAGTAkAcAAAAgA4Y8AAAAABkw5AEAAADIgCEPAAAAQAYMeQAAAAAyYMgDAAAAkAFDHgAAAIAMGPIAAAAAZMCQBwAAACADhjwAAAAAGTDkAQAAAMiAIQ8AAABABgx5AAAAADJgyAMAAACQAUMeAAAAgAwY8gAAAABkoCjLst13AAAAAGAheScPAAAAQAYMeQAAAAAyYMgDAAAAkAFDHgAAAIAMGPIAAAAAZMCQBwAAACADhjwAAAAAGTDkyVhRFD8uimJ6URQzi6J4tCiKg9t9J0BvQl3pTagffQn1pDfrqyjLst13oJcURbFRSunxsiznFEUxOKV0e0ppRFmW97f3ZtDZ9CbUk96E+tGXUE96s768kydjZVlOK8tyzr/++s8/67TxSkDSm1BXehPqR19CPenN+jLkyVxRFBcWRTE7pfRwSml6Smlim68EJL0JdaU3oX70JdST3qwnP67VAYqi6JdS2iKltE1K6ayyLOe190ZASnoT6kpvQv3oS6gnvVk/3snTAcqynF+W5W9TSmuklA5v932At+lNqCe9CfWjL6Ge9Gb9GPJ0lv7Jz0lCHelNqCe9CfWjL6Ge9GZNGPJkqiiKlYqi2K8oioFFUfQrimKnlNL+KaXb2n036GR6E+pJb0L96EuoJ71Zb34nT6aKolgxpXRNSun96e1h3lMppQvKshzf1otBh9ObUE96E+pHX0I96c16M+QBAAAAyIAf1wIAAADIgCEPAAAAQAYMeQAAAAAyYMgDAAAAkAFDHgAAAIAMGPJkrCiKHxdFMb0oiplFUTxaFMXB7b4ToDehrvQm1I++hHrSm/VlhXrGiqLYKKX0eFmWc4qiGJxSuj2lNKIsy/vbezPobHoT6klvQv3oS6gnvVlf3smTsbIsp5VlOedff/3nn3XaeCUg6U2oK70J9aMvoZ70Zn0Z8mSuKIoLi6KYnVJ6OKU0PaU0sc1XApLehLrSm1A/+hLqSW/Wkx/X6gBFUfRLKW2RUtompXRWWZbz2nsjICW9CXWlN6F+9CXUk96sH+/k6QBlWc4vy/K3KaU1UkqHt/s+wNv0JtST3oT60ZdQT3qzfgx5Okv/5OckoY70JtST3oT60ZdQT3qzJgx5MlUUxUpFUexXFMXAoij6FUWxU0pp/5TSbe2+G3QyvQn1pDehfvQl1JPerDe/kydTRVGsmFK6JqX0/vT2MO+plNIFZVmOb+vFoMPpTagnvQn1oy+hnvRmvRnyAAAAAGTAj2sBAAAAZMCQBwAAACADhjwAAAAAGTDkAQAAAMhA/1Y+rCgKv+WZjlGWZdHuO3SV3qST6E2oJ70J9aQ3oZ6i3vROHgAAAIAMGPIAAAAAZMCQBwAAACADhjwAAAAAGTDkAQAAAMiAIQ8AAMD/a+/+Y7Wuy/+Bvw8cIUIURZaEExBs6cJDBUKAzAIZGE5AfgwZuhGgC3CtaDIRwlrZj6GwkegISE3bDHRBCKJIZEMXhpiIdooFDTE7AhMlJJHz/ee7+dnn+77u7zn3Oee+7/M6j8ef13PX/X5t8Do/Lt7jAkiAIQ8AAABAAgx5AAAAABJgyAMAAACQAEMeAAAAgAQY8gAAAAAkwJAHAAAAIAGGPAAAAAAJMOQBAAAASIAhDwAAAEACDHkAAAAAEmDIAwAAAJAAQx4AAACABBjyAAAAACTAkAcAAAAgAYY8AAAAAAkw5AEAAABIgCEPAAAAQAIMeQAAAAASYMgDAAAAkABDHgAAAIAEVJf7AACV5OKLLw6zgQMHhtmiRYty60OGDCnqHDfeeGNufePGjUV9HlSSfv365db/9re/hT1PP/10mC1evDjM9uzZ0/CDAUCZrF69OsxmzpyZW2/XLn5n4+zZs2G2fv36MNu6dWtufcuWLUU969///neY0TK8yQMAAACQAEMeAAAAgAQY8gAAAAAkwJAHAAAAIAGGPAAAAAAJMOQBAAAASEBVfX196R5WVVW6h0GZ1dfXV5X7DA3V1u5mdXV1mBVa0zxy5MiWOE6uAwcO5NZnz54d9uzcubOljpMUd7P8ohXqtbW1RX3eqVOnwqxPnz65dStdK4+7CZXJ3SyNbdu2hdnXvva13HpVVfxHU8rf80+fPh1mq1atyq0/+uijRT2rrq4uzI4cOVLUZ7ZW0d30Jg8AAABAAgx5AAAAABJgyAMAAACQAEMeAAAAgAQY8gAAAAAkwHatMpkxY0aYDR48OMz69++fWy/0P4lPnTo1zHbv3p1bv+uuu8Ke7du3hxmfsImg/Nq1y59jv/jii2HPwIEDm/UMmzdvDrO//vWvYTZv3rzc+o4dO8KecePGhdnZs2fDrK1xN8sv2q5VaEPc9OnTw+z5558Ps/379+fWv/CFL4Q9lIe7SUsYNWpUmH35y18Os5tuuinMop8VCv08fvfdd4fZL3/5yzCrBO5mafTo0SPMVq5cmVsfP3582FPi3/NLdo5Dhw6F2Te+8Y3c+u9///tmPUOlsF0LAAAAIGGGPAAAAAAJMOQBAAAASIAhDwAAAEACDHkAAAAAEmDIAwAAAJAAK9TLZNeuXWF20UUXhdnf//733PqYMWPCnmL+jN97770wmzx5cphZr/4J6yabT7du3cKsY8eOYbZ27drc+nXXXdfkM/1va9asya3PmTOnqM/bsGFDbr3QqszRo0eHmbv5CXez/Lp27ZpbnzJlStjzi1/8IswWLVoUZvfcc09uvdDq5FdeeSXMaDnuZttSU1PTqHqWZdmCBQvC7LOf/WxuPfp6k2WF1z4Xo9DnvfTSS2E2dOjQZj1Hc3M3K9f8+fPDrNDvgLfcckuY7d+/P7c+adKksKdTp05FnaO5ffzxx7n1iRMnhj2bN29uqeO0OCvUAQAAABJmyAMAAACQAEMeAAAAgAQY8gAAAAAkwJAHAAAAIAGGPAAAAAAJsEK9TDp37hxmhdYvfvjhh7n1Cy64IOzp27dvmN1///259auvvjrseeCBB8Ks0Bq/tsa6ycbr0aNHbn3jxo1hT7QqMcuybNCgQU0+0/+0Y8eOMLv++utz6//973+Letb3v//93HqhVdHr1q0Ls1mzZhV1jhS5m+kptLr15MmTufVNmzaFPRMmTAizs2fPNvxgNIq72TpdfvnlYXbbbbeF2bx583Lr55xzTlHn+M9//pNbX7FiRdhz8803h1mvXr0afYZCP8PfcccdYbZy5cpGP6uU3M30RD+3ZlmWHTx4MLdeV1cX9nzmM58Js7179zb4XE0V3cFbb7017PnVr37VUsdpcVaoAwAAACTMkAcAAAAgAYY8AAAAAAkw5AEAAABIgCEPAAAAQAKqy32Atira9lGsaKNAlmXZ1KlTw2zAgAGNftbbb7/d6B5oiK5du+bW+/XrF/acd955zXqGNWvWhNnChQvDrNgtWpHqal+eoaEKbQqNvt/ecMMNYU+HDh3CLNpyCSn41Kc+lVt/7LHHwp5C2+iK2eJbaIPdk08+GWZLlizJrR8+fDjsue6668KsmO1au3btCrMHH3yw0Z8HTVFoU12XLl3C7Lvf/W5uvdB2rWuvvTbMCm2da27R15y29r3bmzwAAAAACTDkAQAAAEiAIQ8AAABAAgx5AAAAABJgyAMAAACQAEMeAAAAgATY0ZuIV199Ncz69OnT6M9bt25dmC1btqzRnwcN8cYbb+TWa2trw56BAweG2XvvvZdbv+uuu8KeSllxevvtt5f7CNBqFFqN+txzz+XWx48fH/Z8+tOfLupZ0Np17tw5t15TU9Psz4rWsj/88MNhz/bt28Ns2LBhufXf/va3Yc/ll18eZoXs2LEjt75w4cKw58yZM0U9C4p15ZVXhll0/4pVaE16tNa8WIVWuc+fPz+3vn79+mY9Q6XzJg8AAABAAgx5AAAAABJgyAMAAACQAEMeAAAAgAQY8gAAAAAkwJAHAAAAIAFWqLegQqvLC61nPXz4cJhFK6Hvv//+hh/sf1i7dm1u/dSpU0V9HrSESZMmhdmdd94ZZitXrsytv/nmm00+0/8WrWPu2LFj2DN58uQwO/fccxt9hg0bNjS6B1K3devW3PqNN94Y9uzatSvM3nnnndz6sWPHwp558+aF2VtvvRVmUGpHjx7Nrffr1y/sufvuu8PsZz/7WZidPn264Qf7vwYNGhRmjz76aG69d+/ejX5OlmVZbW1tmN1yyy259SNHjhT1LKDhdu7cGWZtbVV6xJs8AAAAAAkw5AEAAABIgCEPAAAAQAIMeQAAAAASYMgDAAAAkABDHgAAAIAEVNXX15fuYVVVpXtYCY0aNSq3/sQTT4Q9hVamzp49O8xeeumlhh+Msqqvr68q9xkaKtW7WYzu3buH2U9+8pMwi9apVlU171+DdevWhdncuXPDrJhVtalyN8myLFuzZk1RfRMnTsytd+7cOez58MMPw+yLX/ximB04cKDhB0uAu9m2XHLJJbn1Qt9rb7rppjDr0KFDbr3Q7zrR2vUsy7K1a9eG2R/+8IcwS5G72Tp16tQpzBYuXBhmvXr1atZnFbq3za2mpia3/vrrr5fsDKUU3U1v8gAAAAAkwJAHAAAAIAGGPAAAAAAJMOQBAAAASIAhDwAAAEACbNdqBr/73e9y6wMHDgx7Cm3IefbZZ8Ns9+7dufX3338/7KE8bCJIzwsvvBBmQ4cOLeFJ8i1btizMli9fHmZHjhxpieNULHeTljBixIgwi35OyLIsq62tDbPRo0fn1o8dO9bwg7Ui7mbr9KUvfSnM+vfvH2bf+973cuvFbPbJsnib5eTJk8OejRs3htlHH31U1DlS5G7y/9O+ffsw+/znP59bL3T/iv06UFdXl1sfOXJk2LN///6inlUJbNcCAAAASJghDwAAAEACDHkAAAAAEmDIAwAAAJAAQx4AAACABBjyAAAAACTACvUyeeWVV8LsqquuCrMDBw7k1vfu3Rv2rF69OswKrWunaaybTE+huzRz5swSnqTx3nzzzTAbO3Zsbv2f//xnSx2nrNxNSm3nzp1hds0114TZ4MGDc+u7d+9u8pkqkbvZOi1evDjMli5dWrJz/OhHP8qt33PPPWHPmTNnWuo4SXE3aQm9e/cOs23btoVZ3759w6xdu/x3WG6//faw56GHHgqzSmeFOgAAAEDCDHkAAAAAEmDIAwAAAJAAQx4AAACABBjyAAAAACTAkAcAAAAgAVaol0n37t3DbMCAAWG2aNGi3PqIESPCnhMnToTZ448/nlv/5je/GfbQMNZNpmfatGlhdsUVV+TW58yZE/Y88cQTYRbd21mzZoU9F1xwQZhVV1eHWW1tbW79jjvuCHueffbZMKt07ial9oMf/CDMou/rWZZlV199dW795ZdfbvKZKpG72ToV+pn25ptvDrP77ruvWc/x7rvv5tZnz54d9mzcuLFZz5Aqd7P5dOnSJcwuu+yyMKurq8utHzlypMlnqkTjxo0Ls/Xr14fZOeeck1s/fvx42HPttdeG2b59+8KsElihDgAAAJAwQx4AAACABBjyAAAAACTAkAcAAAAgAYY8AAAAAAmwXSsRixcvDrM777wzzDp37pxb/9Of/hT2jB8/PszefvvtMGtrbCKg1EaPHh1mq1atCrPevXvn1pctWxb2rFixIszeeuutMKsE7ialZrtWw7ibbct5552XW7/hhhvCngULFoRZtJ022kqUZVnWv3//MHvnnXfCrK1xNxsv2qK1bt26sKfQ71iHDh3Krfft27dxB0vAiy++GGbR981CM4+xY8eGWaVvk7VdCwAAACBhhjwAAAAACTDkAQAAAEiAIQ8AAABAAgx5AAAAABJgyAMAAACQgOpyH4DmUWg966ZNm8Js9erVufWBAweGPWvXrg2zQivooFL89Kc/DbPjx4+H2b333tsSx2k227ZtC7NCd/OZZ57JrX/nO98Je7p27Rpmc+bMCTMAyLIsO3HiRG79scceC3u+8pWvhFlNTU1uvVu3bmGPFeq0lMsuuyy3XmhNeiG9evXKrd96661hz8MPP1zUsyrdhg0bwixaoV7IjBkzwqzSV6hHvMkDAAAAkABDHgAAAIAEGPIAAAAAJMCQBwAAACABhjwAAAAACTDkAQAAAEiAFeptwN69e8NsyZIlufVCq+lGjx7d5DNBKfTt2ze3Pnv27LCnS5cuYfb666+H2ebNm3PrH3/8cdhTSrW1tWG2Z8+e3Pqll14a9lx00UVNPhO0FV27di33ESAJffr0aXTP4cOHwyz6/gdNVVdXl1s/dOhQ2BOtSS9k7NixYZbqCvXmdvDgwXIfodl5kwcAAAAgAYY8AAAAAAkw5AEAAABIgCEPAAAAQAIMeQAAAAASYMgDAAAAkAAr1Nu4LVu25NY3bdoU9kyaNKmljgPN6sCBA7n17du3hz0TJkwIs6eeeirMlixZklv/4Q+VeWnwAAAG4klEQVR/GPaUUseOHcOse/fujf68mpqaphwH2pQxY8aU+wjQapx//vlhVsyK6X/84x9hduzYsUZ/HjTEkSNHcusjR44Me7Zt2xZmffv2za1PnTo17Dlx4kSYzZkzJ8wqQadOncLsq1/9api1a5f/DsvZs2fDnhdeeKHhB2slvMkDAAAAkABDHgAAAIAEGPIAAAAAJMCQBwAAACABhjwAAAAACbBdq42L/ufyfv36lfgkUDpTpkwJs9/85jdhNn78+DBbunRpbr3QBoD169eH2bp163LrI0aMCHuizQtZlmVz584NsyuvvDLMIvv27Wt0D6Rs+vTpYXbJJZeE2XPPPRdmb7zxRpPOBJVs2LBhufWHHnoo7Lniiisa/ZxC32uh1A4ePBhmhTYxvvzyy7n1QtvoJk6cGGaFtq4+8sgjufV333037Dlz5kyYvf/++7n1AQMGhD0LFiwIs6FDh4ZZtEXr1KlTYU90vtbMmzwAAAAACTDkAQAAAEiAIQ8AAABAAgx5AAAAABJgyAMAAACQAEMeAAAAgARU1dfXl+5hVVWlexgNsmLFitz6/Pnzw57jx4+HWbdu3Zp8plTU19dXlfsMDeVufuLiiy8Osy1btoTZVVdd1azniFZRtm/fPuypqirdX7khQ4aE2e7du0t2jmK4m+XXs2fP3PqFF15Y1Oddc801zXaGLMuy4cOHN/rzBg8eHGZHjx4Ns+uvvz7MXn311UafozVzN9uW2tra3Hq/fv2K+rytW7fm1idMmBD2nD59uqhntTXuZvn9+te/zq1PmTIl7Cnl7/kfffRRmEXfAwv9zN3c55g7d27Ys3bt2mY/R6lEd9ObPAAAAAAJMOQBAAAASIAhDwAAAEACDHkAAAAAEmDIAwAAAJAAQx4AAACABFSX+wA0j/PPPz/MHnjggTAbN25cbn3Tpk1hz4IFCxp+MGhl/vWvf4XZ17/+9TCbM2dObn3WrFlhT48ePcKsurp0X5737t2bW1++fHnY8+c//7mljkMr0q5d/G9FS5cuDbNvfetbufVzzz037Cm06vj5558Ps+hODx06NOy59NJLwyzy5JNPhtmPf/zjMPvLX/7S6GdBa7Fo0aIw6927d2690NrnBx98MMy+/e1v59atSScF06ZNy63v2bMn7Ln33ntb6jj/jw4dOoRZS6xKj9x222259UceeaRkZ6gE3uQBAAAASIAhDwAAAEACDHkAAAAAEmDIAwAAAJAAQx4AAACABFQV+h/sm/1hVVWle1iiLrzwwtz6U089FfYMHz48zOrq6nLro0aNCnv27dsXZnyivr6+qtxnaCh3s+XU1NSE2cyZM8NsyJAhufWePXuGPRs2bAizDz74IMyi7QuFelozd7P5DBo0KMyeeeaZMLvvvvty66+99lrY88c//jHMjh49Gma0Hu5m+UU//02fPj3sGTZsWJhFG7SyLMvat2+fW588eXLYU+jrysmTJ8OMpnE3K1d0j7Isy2bMmBFmY8aMCbNJkyY1+hxVVfFfkWjesH79+rDn0KFDYbZq1aowO3jwYJilKLqb3uQBAAAASIAhDwAAAEACDHkAAAAAEmDIAwAAAJAAQx4AAACABBjyAAAAACTACvUy6dChQ5gVWh3585//PLdeXV0d9jz++ONhtnz58tz6/v37wx4axrpJqEzuJlQmd7P8du7cmVsfPnx42FPM6uQsy7Knn346tz5t2rSw54MPPggzWo67CZXJCnUAAACAhBnyAAAAACTAkAcAAAAgAYY8AAAAAAkw5AEAAABIgCEPAAAAQAKsUC+TLl26hNmmTZvC7LXXXsutR6vQsyzLDhw40PCD0Wysm4TK5G5CZXI3y+9zn/tcbn379u1hT8+ePcNsy5YtYTZlypTc+smTJ8MeysPdhMpkhToAAABAwgx5AAAAABJgyAMAAACQAEMeAAAAgAQY8gAAAAAkwJAHAAAAIAFWqEMLsW4SKpO7CZXJ3YTK5G5CZbJCHQAAACBhhjwAAAAACTDkAQAAAEiAIQ8AAABAAgx5AAAAABJgyAMAAACQAEMeAAAAgAQY8gAAAAAkwJAHAAAAIAGGPAAAAAAJMOQBAAAASIAhDwAAAEACqurr68t9BgAAAACayJs8AAAAAAkw5AEAAABIgCEPAAAAQAIMeQAAAAASYMgDAAAAkABDHgAAAIAEGPIAAAAAJMCQBwAAACABhjwAAAAACTDkAQAAAEiAIQ8AAABAAgx5AAAAABJgyAMAAACQAEMeAAAAgAQY8gAAAAAkwJAHAAAAIAGGPAAAAAAJMOQBAAAASIAhDwAAAEACDHkAAAAAEmDIAwAAAJAAQx4AAACABBjyAAAAACTg/wA+2uuKAptYGQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learn.show_results()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "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0E7OZvduvfXWxvW//Mu/HOJOeq/0a3HhhRcW95x55pnF2kBHudfI2RxZDjnkkMb1448/vrjn8ssvL9a+/OUvN67fddddxT1/+MMfirVOVltttcb1Aw44oLjnZz/7WbE2c+bMAfUxVEpn05s8AAAAABUQ8gAAAABUQMgDAAAAUAEhDwAAAEAFhDwAAAAAFTBdaxCUpmhdccUVxT3rrbfeoPbQabrWQH6Pf/e73xVrO++8c7Fm8tarTCIYGttss02xNmfOnMb1V155pbhnqaXK2XenfXvttVfjeqfz1+ncHnzwwV3vOfHEE4u1iy66qFgbaZzNwbPBBhsUa5dddlmx1mnqY8n1119frP3+97/v+nq0j7PZvdJzaSj/fj+cPf3008Vap7/vzp49e0m001rO5shS+rftd77zneKeLbbYouv7dJquddttt3V9vYiIiRMnNq6/8Y1vLO6ZN29esfbud7+7cf2mm27qrrElxHQtAAAAgIoJeQAAAAAqIOQBAAAAqICQBwAAAKACQh4AAACACgh5AAAAACowutcN1GDSpEmN64M9Jn0ojR8/vljrNCLPCHWGWmnUeER5tGynUeiddNr33e9+t+s9AxnX3mnP+eefX6yttdZaxdoJJ5xQrEFEefTojBkzinve+ta3FmuXXHJJ1z28+OKLxdpLL71UrB166KGN66effnrXPUDbHHbYYY3rU6dOLe4ZO3Zssfbggw82ru+2227FPeuuu26xdvTRRxdrJW9+85uLtRVXXLHr63Wy0korFWsf+MAHirWRNkKdkaX077ntttuuuGennXYq1vbYY4/G9be85S3FPZMnTy7Wcs7F2kD84he/KNY6jXlvM2/yAAAAAFRAyAMAAABQASEPAAAAQAWEPAAAAAAVEPIAAAAAVEDIAwAAAFCBNNgjyDreLKWhu9kQ2mijjRrXL7roouKeTiPjxowZ03UPKaVibSC/x/fff3+xNpxHww+lnHP5N6Vlaj2bpTHknc7EQM9Sad9g32ug/ZXGSEeMvBHqzmb31lhjjcb1b3zjG8U9m2++ebHWabz6YCuNXv/hD39Y3NNpTOwRRxzRuD5z5szinrlz5xZrvMrZHDx77713sbbhhhsWa0899VTj+lA+J3bZZZdi7cILLyzWRo0aNah9HH/88cVaaXR9rZxNloR//ud/LtaOO+64Yq3T33dL49+PPvro4p7LL7+8WHvmmWeKtTYonU1v8gAAAABUQMgDAAAAUAEhDwAAAEAFhDwAAAAAFRDyAAAAAFTAdK0e2XPPPYu11VdfvevrdZoAYLpWb5hE0Hvz589vXC9N3YqIWGqpcvY9kH2Dfa+B9rf00ksXayONszk0VlpppWJt6623blzfddddi3u22mqrYm2LLbZY9MaWkKeffrpYK03kiog4++yzi7Xnn39+sXoabpzNkaX0d+EvfelLxT0bb7xxsdZp+mTJSy+9VKx9/vOfL9ZOOumkru81nDmbLI6xY8c2rnealjdp0qRi7Z577inWJkyY0Lj+0EMPFfcMZ6ZrAQAAAFRMyAMAAABQASEPAAAAQAWEPAAAAAAVEPIAAAAAVEDIAwAAAFABI9Qr0en3sdNY5ZK5c+cWa+uss07X1xuJjJtsr0MOOaRYmzx5crFWGvscUR7d2ulsdhr3WtrXac+cOXOKte22265YG2mczeFp1KhRxdoGG2xQrO22226N63vssUdxz1vf+tZibamlBvf/j+28887F2pVXXjmo92o7Z3N4WnPNNYu1gw8+uFjbf//9G9dL45aXhOOOO65Y+9znPjdkfbSds8niOOeccxrXP/KRjxT3PPHEE8Vap+f3tddeu8h91cAIdQAAAICKCXkAAAAAKiDkAQAAAKiAkAcAAACgAkIeAAAAgAoIeQAAAAAqYIT6MHPkkUc2rk+dOrW4ZyC/x/fff3+xtt5663V9vZHIuMnhqdMo2AsuuKBY22abbRrXX3nlleKeTqOYS/v++7//u7hnzz33LNbmzp1brI00ziavZ4cddijWzjzzzMb1gT4bX3zxxWLt7W9/e+P6//7v/w7oXm3nbLbXLrvsUqydeOKJxdpaa621JNrpyvnnn1+s7bPPPsVap7M50jibvJ4PfehDxdrZZ5/duL7CCisU9+y///7F2re+9a1Fb6xyRqgDAAAAVEzIAwAAAFABIQ8AAABABYQ8AAAAABUQ8gAAAABUQMgDAAAAUIHRvW6A7qy00kq9bgGq1mnU+AMPPFCspdQ8XbTTmPRO15szZ07jeqcx6cDguOaaa4q1t73tbY3rt99+e3HP2muvXayNGTOm63vVOkKd9rr00kuLtaOPPnoIO+ne888/X6wZkw6Lbo011ijWzj333GJtueWWa1w/66yzinuMSV883uQBAAAAqICQBwAAAKACQh4AAACACgh5AAAAACog5AEAAACogOlaAIso59x17ZVXXinuKU3QijBFC9rqmWeeaVyfMmVKcc8ll1wyoHsdcsghjeszZswY0PVgSdhll12KtWOOOaZY22mnnRrXl1122cXuaWHrrrtusTZp0qRi7YorrhjUPuD1rLbaasXa73//+8b1l19+edD7WHHFFRvXp02bVtwzduzYYm327NmN64cddlhXfS2K0q9h6dcvYsn8GvaaN3kAAAAAKiDkAQAAAKiAkAcAAACgAkIeAAAAgAoIeQAAAAAqIOQBAAAAqIAR6gCL6Oabby7Wdt9998b1pZYqZ+lrr712sbbmmms2rs+dO7e4B+id7bbbbtCveccddwz6NWGw3XnnncXabrvtVqyVRqgvs8wyxT1bbbVVsfbZz362cX2HHXYo7pkwYUKxdtBBBxVr3/3udxvXX3rppeKeGsc0M7guueSSYq00Avyxxx4r7vnWt741oD722GOPxvV99tmnuCfnXKydd955jeubbbZZd431GzduXLF2+umnN65PmjSpuOeWW24ZUB9t5k0eAAAAgAoIeQAAAAAqIOQBAAAAqICQBwAAAKACQh4AAACACgh5AAAAACqQOo07G/SbpTR0NxvG1lprrWLtnnvuaVzvNKb5lVde6bqHTmOa11lnna6vNxLlnFOve1hUzubi+8Y3vtG4PmXKlOKeTuf2xhtvbFxfEmOaRxpnkyXhoosuKtZ23XXXAV2z9OfHySefPKDrtZ2z2XsTJ05sXL/22muHuJPufepTn2pcL42Djhj8Z+r3v//9Yu3jH/94sfbMM88Mah+DzdkcGrNnzy7Wtt5668b1lMq/NYP97/zhfK8DDzywWDvjjDO6vl5blM6mN3kAAAAAKiDkAQAAAKiAkAcAAACgAkIeAAAAgAoIeQAAAAAqYLpWC40aNapYO/XUUxvX99tvv+Kegfwe33///cXaeuut1/X1RiKTCIiIOOSQQ4q14447rlgrnduBThvoNEGkNMmrVs4mS8IDDzxQrI0bN25A1yxNU7nlllsGdL22czZ775prrmlcv+yyy4p7TjvttGLt5ZdfXuyeFlen87fJJpsUa3/3d39XrH3mM59pXF966aWLe975zncWa6Wpto888khxz0Cm5w6Uszk0Vl111WKtND2u03/f++yzz2L3tLDBnnj1i1/8oljbcssti7WZM2cWa1/+8pcb12+99dbinvnz5xdrbWe6FgAAAEDFhDwAAAAAFRDyAAAAAFRAyAMAAABQASEPAAAAQAWEPAAAAAAVMEK9hVZbbbVi7Wc/+1nj+hprrFHcY4R6bxg3yevpNLKxNBp1qaXK2XyncaoPPvhgsbbHHns0rt90003FPcOZs8nimDx5cuP6hRdeWNzTaezsCSecUKwddthhjetDOTp5KDmbQ2OLLbYo1i6++OLG9XXWWae4p/TfaUTE8ccfv+iNDSNHHXVU4/oRRxwxqPfZe++9i7Xzzz9/UO/VibM5PC2zzDLF2uzZs4u10p8R+++/f3HPWWedteiNMWiMUAcAAAComJAHAAAAoAJCHgAAAIAKCHkAAAAAKiDkAQAAAKiAkAcAAACgAqN73QB/asyYMcXauHHjhrATYEnabrvtirWDDz64cX333Xcv7uk0Xn2ttdYq1nbdddfG9VpHqMPiOOWUUxrXO41J7+Scc84p1modlU5vbbvttsVap1HpJXvttVexVusI9a985SuN66uvvnpxzz777NP1fU499dRi7cknnyzWrrrqqq7vRX2++MUvFmtve9vbirWcm6fQG5M+fHiTBwAAAKACQh4AAACACgh5AAAAACog5AEAAACogJAHAAAAoAJCHgAAAIAKGKEO0CM33nhj17XddtutuKfTuOVO49WnTJnSuH7ooYcW90DNjjrqqGJtlVVW6fp6d9xxR7H28MMPd309aJNx48YVaxMmTCjWZs+evSTaGRLz5s1rXH/kkUcG9T4PPfRQsXbfffcN6r0YnsaOHVus/e3f/u2ArnnBBRcMtB1awps8AAAAABUQ8gAAAABUQMgDAAAAUAEhDwAAAEAFhDwAAAAAFTBda5hJKTWud5qc02niTkmn6wFL3oUXXti4XvozIKLzue20b6+99lr0xqASK620UrHWabJc6ZzNnTu3uGennXYq1h5//PFiDZaE//iP/yjWPvGJTzSub7HFFsU9q6++erF22WWXFWulKZJf/epXi3s6Kf199+677y7u2WCDDQZ0r/HjxzeuH3jggQO6XslVV11VrHWa2sfI8aY3valY23rrrQd0zU5T3Rge/EseAAAAoAJCHgAAAIAKCHkAAAAAKiDkAQAAAKiAkAcAAACgAkIeAAAAgAoYoT7M5Jwb1zuNSS/t6WQgY9eB7myzzTbFWmnsZafz3OncdhqvPpA/I2C4mzlzZrG2zDLLdH29U045pVi7//77u74eLClPP/10sXbmmWc2rn/zm98c0L1WXnnlYm2nnXbqav31vPzyy43rN9xwQ3HP9ttvP6B7DbYLL7ywcf3www8f4k4YbubPn1+szZs3r1hbbrnlirWU0mL1tKhWXHHFAe175plnBrmT+niTBwAAAKACQh4AAACACgh5AAAAACog5AEAAACogJAHAAAAoAJCHgAAAIAKGKHeQi+88EKx9tBDDzWur7HGGkuqHWAxdBqTPnv27GKtNNa801jLTmPSH3g1BRD1AAAgAElEQVTggQHVYDjodC722GOPxvXttttuQPeaM2dO4/q//uu/Duh60Cb/9V//1bj+93//98U9f/M3f1OsrbDCCovd06IaPbr5nzVDOSb96KOPLtZOOOGEYq006rrTvwkgIuLBBx8s1r71rW8Va5/+9KeLtXHjxjWuD/Tfm29605sa10899dTinksvvbRYO/HEEwfUx0jiTR4AAACACgh5AAAAACog5AEAAACogJAHAAAAoAJCHgAAAIAKpNIElyVys5SG7maVOvLIIxvXp06dWtzT6fe49Fn7f/nLXxb3bLvttsUar8o5l8e9tIyzufguvPDCxvWtt966uGettdYq1l555ZXG9U4TtEp7IiL++q//uli76aabirUaOZv1efvb316s3XzzzY3rnSZyvfjii8XaZptt1rh+1113FfewaJzN4anTlJ5OU+fuuOOOxvXHH3+8uGe55ZYr1krPx05/PhxzzDHF2q9+9atireS2224r1ko/3+HA2RyeVlxxxWLt7LPPLtZ22WWXxvX777+/uKfTvzff+MY3Nq53mgy2ww47FGuladMjUelsepMHAAAAoAJCHgAAAIAKCHkAAAAAKiDkAQAAAKiAkAcAAACgAkIeAAAAgAoYoV6JSy65pFh7//vfX6wdfvjhjevHHnvsYvc00hk3ObLMmTOncb3TCPVOI5xL1+t01k844YRijVc5m8NTp/Ny9dVXF2udxrCWfO5znyvWvvGNb3R9PRaNswnt5GzWZ+zYscXaBRdc0Lg+adKk4p5OmcKdd97ZuP7e9763uGfu3LnFGq8yQh0AAACgYkIeAAAAgAoIeQAAAAAqIOQBAAAAqICQBwAAAKACQh4AAACAChihDkuIcZMj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6F7f/va3G9dPPPHEAV0PXk9pNPj06dO73jPUpk2b1rg+0HHynX5encbGQ606jX1eccUVi7X77ruvcT3nPKA+nn322WLtq1/96oCuCUPpgx/8YLF23nnnDWEn3es09nmHHXYo1q655pol0Q4Mqg022KBYO+WUU4q1973vfV3f68knnyzWvva1rzWuz58/v+v7sGi8yQMAAABQASEPAAAAQAWEPAAAAAAVEPIAAAAAVEDIAwAAAFABIQ8AAABABYxQHwHWXnvtYq00Kn2gY9IvvfTSYu2www4b0DWh04jv0qjx16u13UBHpZdcd911g3o9GO46jUl/4oknhqyPd7zjHcXab37zmyHrAwbqDW94w5Dd6/bbby/WNtxww8b15ZZbrrhn9OjyP4U23njjYs0IdYbahAkTGtdPOumk4p7111+/WFt55ZUXu6dFvd4JJ5zQuP7JT36yuOeXv/zlYvc0knmTBwAAAKACQh4AAACACgh5AAAAACog5AEAAACogJAHAAAAoAKma40A48aNK9YGMkXrlVdeKdauvvrqYu3pp5/u+l7weobzBK2c86Beb/r06cXacP51gsXxZ3/2Z43rP/7xj4t7UkrF2lJLNf//sU7Pxn333bdYM0GL4e7cc88t1u68885BvVen6Vo33nhj4/omm2wyqD1AL3z2s59tXN9yyy2Lex544IFi7Uc/+lGxdswxxzSub7rppsU9p5xySrFWmiI5c+bM4p4///M/L9b++Mc/Fmv08SYPAAAAQAWEPAAAAAAVEPIAAAAAVEDIAwAAAFABIQ8AAABABYQ8AAAAABVIgz3Ct+PNUhq6m40wq622WrE2d+7cYm3UqFFd3+v4448v1g499NCur1ernHN5Bm/LOJtLzrXXXlusbb/99l1fb9asWcXaxIkTu77eSORs1mfllVcu1i655JLG9Xe+853FPUsvvXSxVhqvPn78+OKeRx99tFjrNHp9pHE2eT2f+cxnirWvf/3rjetjxowp7nnuueeKtbXXXrtYe/LJJ4u1Gjmbvbf77rs3rj/88MPFPb/+9a+LtU7PpYHYaqutirXSqPRVVlmluGfSpEnF2lVXXbXojVWudDa9yQMAAABQASEPAAAAQAWEPAAAAAAVEPIAAAAAVEDIAwAAAFABIQ8AAABABUb3ugG6Uxp5/qEPfajrPZ08//zzxdp//ud/dn09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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learn.show_results(ds_type=DatasetType.Train)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

pred_batch[source]

\n", "\n", "> pred_batch(**`ds_type`**:[`DatasetType`](/basic_data.html#DatasetType)=***``***, **`batch`**:`Tuple`=***`None`***, **`reconstruct`**:`bool`=***`False`***) → `List`\\[`Tensor`\\]\n", "\n", "Return output of the model on one batch from `ds_type` dataset. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.pred_batch)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the number of predictions given equals to the batch size." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "64" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.data.batch_size" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "64" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preds = learn.pred_batch()\n", "len(preds)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since the total number of predictions is too large, we will only look at a part of them." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[9.9366e-01, 6.3430e-03],\n", " [9.9828e-01, 1.7193e-03],\n", " [9.9993e-01, 7.1130e-05],\n", " [1.0000e+00, 5.2653e-07],\n", " [9.9839e-01, 1.6092e-03],\n", " [1.0000e+00, 9.6659e-07],\n", " [9.5156e-01, 4.8442e-02],\n", " [9.9854e-01, 1.4628e-03],\n", " [9.9937e-01, 6.2854e-04],\n", " [8.3490e-01, 1.6510e-01]])" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preds[:10]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAAcABwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+f+vc/wDgnb+xNcft+ftLWPwEk+NfhT4eaaNNuNU17xf4xv1gtNPsLcKZnBYqHkww2oWQHnLKATXhlfoV+z5/wSO/Ya8EfCzwl+0p/wAFKv8Agq58NfB/hvxHZWup23w9+F923iPxPPayosnkzJAjCxl2kgny51jJAY7soADQ+IP/AAQ5/Zii+FPx0+K/7PP/AAVn8DfE1Pgx4Wm8Qy6b4X8FX0sd1aCZ4oopr/zPskE8jKqokckxYlmA2ruP5y1+oP8AwWN/aB+Hvh/9i/4cfBL/AIJXPpmhfseeJNYv1kbSre+t9Y8R+KbIWzXg15rxVlnZFmtpYQpaIo6DgwJHD+X1AH2L/wAE3/2W/wDgkp+0B8OtZ1D9vn/gopr3wc8WWmtSR6Votn4Gnv7W604QwFbg3McbgSNK8yeUQCFhDc7uPr7w98Bv+DQj9mayfWPiR+1v8WPjtqCWCv8A2Lpmm39nBPJkAiPyLW02NlSQslzgK/JJwa/HyigD6/8A+CnP/BUXRP20NB8Lfs1fs2/s9aH8JPgH8Nbm4f4e+ArCCOe8WWYnzr27u2BkeaUksyByoJ+ZpWHmn5AoooA//9k=\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABHNCSVQICAgIfAhkiAAAAlhJREFUSIntVj1rKlEQPUZDUoiF0SR2FomWIRGRRLCwDhK2EdE/YJE/INhaWiVNSCWI1TZRi4BVTBMswoJFwEZsJGyz2gjKvec1j+Vp1u/3AoE3MLB775w5d2bP7qwNAPGNtvOdZD+P8ODgABcXF2thHJuSxWIxFAoFhEIh3N3dQdd17O3tIZVKAQBUVUU+n7fEcl2/vb3lYDCgEMJ0KeXU/fPzsyV2owrPzs7gdDoBAJ1OB09PT9B1Haqq4vLyEqVSCZ+fn5bYjQhfX18xGo1QqVTQarUwmUwAAPv7+8hkMgCAdrs9F792S63c5XKx2+1SSsn393ceHR3Ni92OyOFw0OPxsNvtUghBTdPo8/kWYTYn8/l8LBaLpmg0TePx8fEy3GZEmUyGhmGYqnx4eFhW2foqTafTUBQFV1dXODw8nNr7+PhAv99fKc9SMdzf31NKaTpJ9no9NptN1mo1qqpKkszlcqt0aHFAJBLheDymEILD4ZDNZpPX19f0er1TcalUisPhkCcnJ9s/w3g8zkQisTBZNBqlEIKJROLvi8bK397eKIRgNpul3W6fG7f1eAqHw1BVFeFwGABwfn6OnZ3FaVeuwu/3MxqN8vHxkS8vL+aXRUrJwWDAbDa7NIft9wUA4ObmBoFA4MuJFEWBy+WC1+uF2+2GzWYDacJgGAaSySQajcZKXTHZZ0eM1diZXSuXy3S73St3aerFr1arCAaDOD09tTxZp9OBEAK6rqNer6PRaEDTNEgpV6oMAKZaCgC7u7umAGbtz1G0qX0h/Nf2s/7a/hNa2S/tek2pzxDJXQAAAABJRU5ErkJggg==\n", "text/plain": [ "Image (3, 28, 28)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "item = learn.data.train_ds[0][0]\n", "item" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(tensor([[[[0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.]],\n", " \n", " [[0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.]],\n", " \n", " [[0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.]]]], device='cuda:0'),\n", " tensor([0], device='cuda:0'))" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "batch = learn.data.one_item(item)\n", "batch" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[9.9979e-01, 2.0649e-04]])" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.pred_batch(batch=batch)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

interpret[source]

\n", "\n", "> interpret(**`learn`**:[`Learner`](/basic_train.html#Learner), **`ds_type`**:[`DatasetType`](/basic_data.html#DatasetType)=***``***, **`tta`**=***`False`***)\n", "\n", "Create a [`ClassificationInterpretation`](/train.html#ClassificationInterpretation) object from `learner` on `ds_type` with `tta`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.interpret, full_name='interpret')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "
Note: This function only works in the vision application.
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "jekyll_note('This function only works in the vision application.')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For more details, refer to [ClassificationInterpretation](/vision.learner.html#ClassificationInterpretation)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model summary" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

model_summary[source]

\n", "\n", "> model_summary(**`m`**:[`Learner`](/basic_train.html#Learner), **`n`**:`int`=***`70`***)\n", "\n", "Print a summary of `m` using a output text width of `n` chars \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.summary)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Test time augmentation" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

TTA[source]

\n", "\n", "> TTA(**`learn`**:[`Learner`](/basic_train.html#Learner), **`beta`**:`float`=***`0.4`***, **`scale`**:`float`=***`1.35`***, **`ds_type`**:[`DatasetType`](/basic_data.html#DatasetType)=***``***, **`with_loss`**:`bool`=***`False`***) → `Tensors`\n", "\n", "Applies TTA to predict on `ds_type` dataset. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.TTA, full_name = 'TTA')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Applies Test Time Augmentation to `learn` on the dataset `ds_type`. We take the average of our regular predictions (with a weight `beta`) with the average of predictions obtained through augmented versions of the training set (with a weight `1-beta`). The transforms decided for the training set are applied with a few changes `scale` controls the scale for zoom (which isn't random), the cropping isn't random but we make sure to get the four corners of the image. Flipping isn't random but applied once on each of those corner images (so that makes 8 augmented versions total)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Gradient clipping" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

clip_grad[source]

\n", "\n", "> clip_grad(**`learn`**:[`Learner`](/basic_train.html#Learner), **`clip`**:`float`=***`0.1`***) → [`Learner`](/basic_train.html#Learner)\n", "\n", "Add gradient clipping of `clip` during training. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.clip_grad)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Mixed precision training" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

to_fp16[source]

\n", "\n", "> to_fp16(**`learn`**:[`Learner`](/basic_train.html#Learner), **`loss_scale`**:`float`=***`None`***, **`max_noskip`**:`int`=***`1000`***, **`dynamic`**:`bool`=***`False`***, **`clip`**:`float`=***`None`***, **`flat_master`**:`bool`=***`False`***) → [`Learner`](/basic_train.html#Learner)\n", "\n", "Put `learn` in FP16 precision mode. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.to_fp16)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Uses the [`MixedPrecision`](/callbacks.fp16.html#MixedPrecision) callback to train in mixed precision (i.e. forward and backward passes using fp16, with weight updates using fp32), using all [NVIDIA recommendations](https://docs.nvidia.com/deeplearning/sdk/mixed-precision-training/index.html) for ensuring speed and accuracy." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

to_fp32[source]

\n", "\n", "> to_fp32(**`learn`**:[`Learner`](/basic_train.html#Learner))\n", "\n", "Put `learn` back to FP32 precision mode. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.to_fp32)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Distributed training" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

distributed[source]

\n", "\n", "> distributed(**`learn`**:[`Learner`](/basic_train.html#Learner), **`cuda_id`**:`int`, **`cache_dir`**:`PathOrStr`=***`'tmp'`***)\n", "\n", "Put `learn` on distributed training with `cuda_id`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.distributed, full_name='distributed')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Discriminative layer training" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When fitting a model you can pass a list of learning rates (and/or weight decay amounts), which will apply a different rate to each *layer group* (i.e. the parameters of each module in `self.layer_groups`). See the [Universal Language Model Fine-tuning for Text Classification](https://arxiv.org/abs/1801.06146) paper for details and experimental results in NLP (we also frequently use them successfully in computer vision, but have not published a paper on this topic yet). When working with a [`Learner`](/basic_train.html#Learner) on which you've called `split`, you can set hyperparameters in four ways:\n", "\n", "1. `param = [val1, val2 ..., valn]` (n = number of layer groups)\n", "2. `param = val`\n", "3. `param = slice(start,end)`\n", "4. `param = slice(end)`\n", "\n", "If we chose to set it in way 1, we must specify a number of values exactly equal to the number of layer groups. If we chose to set it in way 2, the chosen value will be repeated for all layer groups. See [`Learner.lr_range`](/basic_train.html#Learner.lr_range) for an explanation of the `slice` syntax).\n", "\n", "Here's an example of how to use discriminative learning rates (note that you don't actually need to manually call [`Learner.split`](/basic_train.html#Learner.split) in this case, since fastai uses this exact function as the default split for `resnet18`; this is just to show how to customize it):" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# creates 3 layer groups\n", "learn.split(lambda m: (m[0][6], m[1]))\n", "# only randomly initialized head now trainable\n", "learn.freeze()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Total time: 00:04

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracy
10.0677690.0609100.979392
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "learn.fit_one_cycle(1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Total time: 00:06

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_lossaccuracy
10.0223660.0068720.998037
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# all layers now trainable\n", "learn.unfreeze()\n", "# optionally, separate LR and WD for each group\n", "learn.fit_one_cycle(1, max_lr=(1e-4, 1e-3, 1e-2), wd=(1e-4,1e-4,1e-1))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

lr_range[source]

\n", "\n", "> lr_range(**`lr`**:`Union`\\[`float`, `slice`\\]) → `ndarray`\n", "\n", "Build differential learning rates from `lr`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.lr_range)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Rather than manually setting an LR for every group, it's often easier to use [`Learner.lr_range`](/basic_train.html#Learner.lr_range). This is a convenience method that returns one learning rate for each layer group. If you pass `slice(start,end)` then the first group's learning rate is `start`, the last is `end`, and the remaining are evenly geometrically spaced.\n", "\n", "If you pass just `slice(end)` then the last group's learning rate is `end`, and all the other groups are `end/10`. For instance (for our learner that has 3 layer groups):" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([1.e-05, 1.e-04, 1.e-03]), array([0.0001, 0.0001, 0.001 ]))" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.lr_range(slice(1e-5,1e-3)), learn.lr_range(slice(1e-3))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

unfreeze[source]

\n", "\n", "> unfreeze()\n", "\n", "Unfreeze entire model. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.unfreeze)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sets every layer group to *trainable* (i.e. `requires_grad=True`)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

freeze[source]

\n", "\n", "> freeze()\n", "\n", "Freeze up to last layer. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.freeze)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sets every layer group except the last to *untrainable* (i.e. `requires_grad=False`)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

freeze_to[source]

\n", "\n", "> freeze_to(**`n`**:`int`)\n", "\n", "Freeze layers up to layer `n`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.freeze_to)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

split[source]

\n", "\n", "> split(**`split_on`**:`SplitFuncOrIdxList`)\n", "\n", "Split the model at `split_on`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.split)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A convenience method that sets `layer_groups` based on the result of [`split_model`](/torch_core.html#split_model). If `split_on` is a function, it calls that function and passes the result to [`split_model`](/torch_core.html#split_model) (see above for example)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Saving and loading models" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Simply call [`Learner.save`](/basic_train.html#Learner.save) and [`Learner.load`](/basic_train.html#Learner.load) to save and load models. Only the parameters are saved, not the actual architecture (so you'll need to create your model in the same way before loading weights back in). Models are saved to the `path`/`model_dir` directory." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

save[source]

\n", "\n", "> save(**`name`**:`PathOrStr`, **`return_path`**:`bool`=***`False`***, **`with_opt`**:`bool`=***`True`***)\n", "\n", "Save model and optimizer state (if `with_opt`) with `name` to `self.model_dir`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.save)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "learn.save(\"trained_model\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PosixPath('/home/jupyter/.fastai/data/mnist_sample/models/trained_model.pth')" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.save(\"trained_model\", return_path=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

load[source]

\n", "\n", "> load(**`name`**:`PathOrStr`, **`device`**:[`device`](https://pytorch.org/docs/stable/tensor_attributes.html#torch-device)=***`None`***, **`strict`**:`bool`=***`True`***, **`with_opt`**:`bool`=***`None`***, **`purge`**:`bool`=***`True`***)\n", "\n", "Load model and optimizer state (if `with_opt`) `name` from `self.model_dir` using `device`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.load)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "learn = learn.load(\"trained_model\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Deploying your model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When you are ready to put your model in production, export the minimal state of your [`Learner`](/basic_train.html#Learner) with:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

export[source]

\n", "\n", "> export(**`fname`**:`str`=***`'export.pkl'`***, **`destroy`**=***`False`***)\n", "\n", "Export the state of the [`Learner`](/basic_train.html#Learner) in `self.path/fname`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.export)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Passing `destroy=True` will destroy the [`Learner`](/basic_train.html#Learner), freeing most of its memory consumption. For specifics see [`Learner.destroy`](/basic_train.html#Learner.destroy).\n", "\n", "This method only works with the [`Learner`](/basic_train.html#Learner) whose [`data`](/vision.data.html#vision.data) was created through the [data block API](/data_block.html).\n", "\n", "Otherwise, you will have to create a [`Learner`](/basic_train.html#Learner) yourself at inference and load the model with [`Learner.load`](/basic_train.html#Learner.load)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "learn.export()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "learn.export('trained_model.pkl')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PosixPath('/home/jupyter/.fastai/data/mnist_sample')" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "path = learn.path\n", "path" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

load_learner[source]

\n", "\n", "> load_learner(**`path`**:`PathOrStr`, **`fname`**:`PathOrStr`=***`'export.pkl'`***, **`test`**:[`ItemList`](/data_block.html#ItemList)=***`None`***)\n", "\n", "Load a [`Learner`](/basic_train.html#Learner) object saved with `export_state` in `path/fn` with empty data, optionally add `test` and load on `cpu`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(load_learner)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "learn = load_learner(path)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "learn = load_learner(path, fname='trained_model.pkl')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "WARNING: If you used any customized classes when creating your learner, you must first define these classes first before executing [`load_learner`](/basic_train.html#load_learner).\n", "\n", "You can find more information and multiple examples in [this tutorial](/tutorial.inference.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Freeing memory\n", "\n", "If you want to be able to do more without needing to restart your notebook, the following methods are designed to free memory when it's no longer needed. \n", "\n", "Refer to [this tutorial](/tutorial.resources.html) to learn how and when to use these methods." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

purge[source]

\n", "\n", "> purge(**`clear_opt`**:`bool`=***`True`***)\n", "\n", "Purge the [`Learner`](/basic_train.html#Learner) of all cached attributes to release some GPU memory. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.purge)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This method is also internally called by `load`, in which case `learn.opt` is preserved. By default it gets cleared." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

destroy[source]

\n", "\n", "> destroy()\n", "\n", "Free the Learner internals, leaving just an empty shell that consumes no memory \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.destroy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you need to free the memory consumed by the [`Learner`](/basic_train.html#Learner) object, call this method. \n", "\n", "It can also be automatically invoked through [`Learner.export`](/basic_train.html#Learner.export) via its `destroy=True` argument." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Other methods" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

init[source]

\n", "\n", "> init(**`init`**)\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.init)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Initializes all weights (except batchnorm) using function `init`, which will often be from PyTorch's [`nn.init`](https://pytorch.org/docs/stable/nn.html#torch-nn-init) module." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

mixup[source]

\n", "\n", "> mixup(**`learn`**:[`Learner`](/basic_train.html#Learner), **`alpha`**:`float`=***`0.4`***, **`stack_x`**:`bool`=***`False`***, **`stack_y`**:`bool`=***`True`***) → [`Learner`](/basic_train.html#Learner)\n", "\n", "Add mixup https://arxiv.org/abs/1710.09412 to `learn`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.mixup)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Uses [`MixUpCallback`](/callbacks.mixup.html#MixUpCallback)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

backward[source]

\n", "\n", "> backward(**`item`**)\n", "\n", "Pass `item` through the model and computes the gradient. Useful if `backward_hooks` are attached. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.backward)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

create_opt[source]

\n", "\n", "> create_opt(**`lr`**:`Floats`, **`wd`**:`Floats`=***`0.0`***)\n", "\n", "Create optimizer with `lr` learning rate and `wd` weight decay. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.create_opt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You generally won't need to call this yourself - it's used to create the [`optim`](https://pytorch.org/docs/stable/optim.html#module-torch.optim) optimizer before fitting the model." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

dl[source]

\n", "\n", "> dl(**`ds_type`**:[`DatasetType`](/basic_data.html#DatasetType)=***``***)\n", "\n", "Return DataLoader for DatasetType `ds_type`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.dl)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DeviceDataLoader(dl=, device=device(type='cuda'), tfms=[], collate_fn=)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.dl()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DeviceDataLoader(dl=, device=device(type='cuda'), tfms=[], collate_fn=)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.dl(DatasetType.Train)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class Recorder[source]

\n", "\n", "> Recorder(**`learn`**:[`Learner`](/basic_train.html#Learner), **`add_time`**:`bool`=***`True`***) :: [`LearnerCallback`](/basic_train.html#LearnerCallback)\n", "\n", "A [`LearnerCallback`](/basic_train.html#LearnerCallback) that records epoch, loss, opt and metric data during training. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Recorder, title_level=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A [`Learner`](/basic_train.html#Learner) creates a [`Recorder`](/basic_train.html#Recorder) object automatically - you do not need to explicitly pass it to `callback_fns` - because other callbacks rely on it being available. It stores the smoothed loss, hyperparameter values, and metrics for each batch, and provides plotting methods for each. Note that [`Learner`](/basic_train.html#Learner) automatically sets an attribute with the snake-cased name of each callback, so you can access this through `Learner.recorder`, as shown below." ] }, { "cell_type": "markdown", "metadata": { "hide_input": true }, "source": [ "### Plotting methods" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

plot[source]

\n", "\n", "> plot(**`skip_start`**:`int`=***`10`***, **`skip_end`**:`int`=***`5`***, **`suggestion`**:`bool`=***`False`***, **\\*\\*`kwargs`**)\n", "\n", "Plot learning rate and losses, trimmed between `skip_start` and `skip_end`. Optionally plot and return min gradient \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Recorder.plot)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is mainly used with the learning rate finder, since it shows a scatterplot of loss vs learning rate." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "path = untar_data(URLs.MNIST_SAMPLE)\n", "data = ImageDataBunch.from_folder(path)\n", "learn = create_cnn(data, models.resnet18, metrics=accuracy)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n", "Min numerical gradient: 7.59E-03\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learn.lr_find()\n", "learn.recorder.plot()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

plot_losses[source]

\n", "\n", "> plot_losses(**`last`**:`int`=***`None`***)\n", "\n", "Plot training and validation losses. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Recorder.plot_losses)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that validation losses are only calculated once per epoch, whereas training losses are calculated after every batch." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Total time: 00:22

\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_lossaccuracy
10.2472470.1412470.954367
20.1096720.0788760.972522
30.0653910.0546350.983808
40.0440420.0495920.981845
50.0412870.0492240.984298
\n" ], "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": [ "learn.fit_one_cycle(5)\n", "learn.recorder.plot_losses()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

plot_lr[source]

\n", "\n", "> plot_lr(**`show_moms`**=***`False`***)\n", "\n", "Plot learning rate, `show_moms` to include momentum. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Recorder.plot_lr)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAD8CAYAAACPWyg8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xl4VdXV+PHvys1EQuaEEDKQAGGeiQzWGVFwoioqKMprVbTVatUOaPvra3211VZFW+epzjJJKyoqCFocEAgzCYRExpCBhEACgcz798c92BgTuAlJzh3W53nycO85+5y7dg7cxdn77L3FGINSSinVGn52B6CUUsrzaPJQSinVapo8lFJKtZomD6WUUq2myUMppVSrafJQSinVapo8lFJKtZomD6WUUq2myUMppVSr+dsdQHuIjY01qampdoehlFIeZe3ataXGmLi2HOsVySM1NZXMzEy7w1BKKY8iIrvbeqw2WymllGo1TR5KKaVaTZOHUkqpVtPkoZRSqtU0eSillGo1l5KHiEwUkRwRyRORWc3sDxKRudb+VSKS2mjffdb2HBG50NoWLCKrRWSjiGSJyJ8alU+zzpFrnTPw1KuplFKqPZ00eYiIA3gGmAQMBKaJyMAmxW4CDhpj+gCzgUetYwcCU4FBwETgWet81cB5xphhwHBgooiMtc71KDDbGJMOHLTOrZRSyo24Ms5jNJBnjNkBICJzgMlAdqMyk4EHrNcLgKdFRKztc4wx1cBOEckDRhtjVgJHrPIB1o+xjjkPuNba97p13ufaVDtlu4qqWtbsLGP3gaOUH6sl0N+PIH8/ugQ6iO0aRHx4MPHhQcSHBePnJ3aHq5RykSvJIxHY2+h9PjCmpTLGmDoRKQdirO3fNjk2Eb6/o1kL9AGeMcasEpFY4JAxpq5p+aZEZCYwEyAlJcWFaqjOtGZXGS+t2MGybfupbzAnLd8lwEF6fFfSu4UxJDGc09Ki6d89HIcmFKXckivJo7l/vU2/DVoq0+Kxxph6YLiIRAL/EpHBQLELn4V1/IvAiwAZGRkn/3ZSnWL/4Soe/CCbDzcVEhUSwM1npHFOv2706x5GRJcAausbqK5r4FhNPaVHqimuqKKwvIodJZVsLz7MitwS3luXD0DXIH/GpEVz/sB4xvfvRrfwYJtrp5Q6zpXkkQ8kN3qfBBS0UCZfRPyBCKDMlWONMYdE5AucfSKPA5Ei4m/dfTT3WcpNrd5Zxi/eXkdFVS13n9+XmWf1okug4wdlHH4OggMcRHQJoHtEMIMTI350nn2HjpG5q4zVO8v4z/YSlm3bD8Dw5Eh+OrwHk4cnEhWqz1EoZScx5sT/abeSwXZgPLAPWANca4zJalTmdmCIMeY2EZkKXGGMuVpEBgHv4Ow36QEsA9KBaKDWShxdgCXAo8aYD0VkPvCeMWaOiDwPbDLGPHuiGDMyMozObWWvDzYWcPfcDaREh/D89aPoGx/WLuc1xpBTfJjPsotZvLmI7MIKAhzC+QPimTY6hTPTY3F2lSmlWktE1hpjMtp07MmSh/UBFwFPAg7gVWPMwyLyIJBpjFkkIsHAm8AInHccUxt1sP8e+BlQB/zKGPOxiAzF2RnuwPnE1zxjzINW+V7AHJwJZj0w3epwb5EmD3v9a30+987bSEZqNC/PyCA8OKDDPiu7oIIFa/P594Z9lFXW0C8+jJvOTGPy8B4E+TtOfgKl1Pc6PHm4O00e9lmaXczMNzMZ1yuGl2dkEBLYORM119Q18MHGAl76cgfbig4TFxbEL87pzbTRKQQHaBJRyhWaPDR52CKroJyrnl9Jn25dmTtz3I/6NzqDMYav8w7wzOd5rNxxgB4RwfxyfDpTRiUR4NAJFJQ6kVNJHvqvS7VJWWUNN7+eSUSXAF6+IcOWxAEgIpyRHsu7M8fyzs1jiI8I5r6Fm5n45ApWbC+xJSalfIEmD9Vqxhh+u2AjB47U8NINGW7zCO3pfWJZ+PPTeemGDOobDDe8upqZb2Sy58BRu0NTyuto8lCt9sbK3Xy2dT+zJvVv9lFbO4kIEwbG8+ndZ/Hbif34Kq+U82f/h+f/8x119Q12h6eU19DkoVplV2klf168lXP7xXHjT1LtDqdFQf4OfnFOH5bdezbn9I3jkY+3ceVz35BTdNju0JTyCpo8lMuMMfz+35sJdPjxyJVDPWJ8RUJEF164fhT/mDaCvQePcck/vuTp5bkuTZmilGqZJg/lsoXr9vF13gF+O6k/8W7Sz+EKEeHSYT1YevdZXDCoO48t2c60l76l4NAxu0NTymNp8lAuOXS0hoc+ymZUzyiuG+2ZE1HGdA3imWtH8sTVw9iyr5yL/v4lS7KK7A5LKY+kyUO55O/L8ig/VstDPx3s8VOnXzEyiY/uPJOkqC7MfHMtDyzKolY705VqFU0e6qR2lVby5re7uDojmQEJ4XaH0y7SYkN57+enc+NPUnntm11c9/IqSo+ccBYcpVQjmjzUST3y8TYCHH7cM6Gv3aG0qyB/B/976SCemjqcjXsPcek/vmJT/iG7w1LKI2jyUCe0dncZn2QVcetZvd1mMGB7mzw8kfd+fjp+Ikx5fiXvrc23OySl3J4mD3VCs5fmEts1kFvOSrM7lA41ODGCD355BqNSorh3/kZmL92ON8z7plRH0eShWpS5q4yv8kqZeVavTpst107RoYG8cdNopoxK4qllufx6/iZq6rQjXanmeP83gmqzp5blEhMayPSxPe0OpdMEOPz425ShpESH8MTS7RRVHOO56aM6dI0SpTyR3nmoZq3dfZAvc33nrqMxEeHO8ek8dtUwVu0o46rnVrK/osrusJRyK5o8VLP+viyX6NBArh/nO3cdTU0ZlcRrN45m78GjXPXCSvaW6ey8Sh2nyUP9yNbCCv6zvYSbzkjzubuOps5Ij+Wtm8dwsLKGq19YyXclR+wOSSm3oMlD/cjLX+6kS4CD68Z45jQk7W1kShRzZo6jtr6Bq59fSVZBud0hKWU7TR7qB4orqli0cR9XZyQRGRJodzhuY2CPcObeOo5Afz+mvvgt6/cctDskpWylyUP9wOvf7KKuwfCzM7x7XEdb9I7ryvzbxhEVEsgNr6xm414dja58lyYP9b2jNXW8vWoPFw7sTs+YULvDcUtJUSG8O3MskaEBXP/KKrbs0yYs5Zs0eajvvbduH+XHar1+NPmpSozswru3jCUsOIDrXl6lfSDKJ2nyUIBzlcC3Vu5mcGI4I1Oi7A7H7SVFhTBn5lhCAx1Mf3kVWwsr7A5JqU7lUvIQkYkikiMieSIyq5n9QSIy19q/SkRSG+27z9qeIyIXWtuSReRzEdkqIlkiclej8g+IyD4R2WD9XHTq1VQnk7n7IDnFh5k+pqdHLC/rDpKjnU1YwQEOrn9lFTtLK+0OSalOc9LkISIO4BlgEjAQmCYiA5sUuwk4aIzpA8wGHrWOHQhMBQYBE4FnrfPVAfcaYwYAY4Hbm5xztjFmuPWz+JRqqFzy1re7CQv257LhPewOxaP0jAnlrZvHYAxMf3kVReU6El35BlfuPEYDecaYHcaYGmAOMLlJmcnA69brBcB4cf73dTIwxxhTbYzZCeQBo40xhcaYdQDGmMPAViDx1Kuj2uLAkWo+3lzElSOTfH5QYFv0juvKazeOpvxYLde/soqDlTV2h6RUh3MleSQCexu9z+fHX/TflzHG1AHlQIwrx1pNXCOAVY023yEim0TkVRFptgFeRGaKSKaIZJaUlLhQDdWSeZn51NQ36KDAUzAkKYKXbshgd9lRbnxtDZXVdXaHpFSHciV5NNcA3nShg5bKnPBYEekKvAf8yhhzvMfxOaA3MBwoBB5vLihjzIvGmAxjTEZcXNyJa6Ba1NBgeGf1bsakRZMeH2Z3OB5tXO8Ynp42gk35h7jtrbVU19XbHZJSHcaV5JEPJDd6nwQUtFRGRPyBCKDsRMeKSADOxPG2MWbh8QLGmGJjTL0xpgF4CWezmeogX+WVsrfsmE9Nu96RLhjUnUevHMqXuaX8ev4mGhp0QSnlnVxJHmuAdBFJE5FAnB3gi5qUWQTMsF5PAZYb5zJsi4Cp1tNYaUA6sNrqD3kF2GqMeaLxiUQkodHby4Etra2Uct38tflEhgRwwaB4u0PxGldlJPO7if35YGMBjy3JsTscpTrESXtHjTF1InIH8CngAF41xmSJyINApjFmEc5E8KaI5OG845hqHZslIvOAbJxPWN1ujKkXkTOA64HNIrLB+qj7rSer/ioiw3E2b+0Cbm3H+qpGyo/W8mlWEdNOSybI32F3OF7ltrN7safsKM9+8R1JUSFcq/1Jysu49GiN9aW+uMm2PzZ6XQVc1cKxDwMPN9n2Fc33h2CMud6VmNSpW7SpgJq6Bq7KSD55YdUqIsL/TR5EYfkx/t/7W+gRGcw5/brZHZZS7UZHmPuwBWvz6d89jEE9wu0OxSv5O/x4+tqR9IsP4/a31+k0JsqraPLwUbnFh9m49xBTRiXpiPIO1DXIn3/eeBrhXQL42WtrKDh0zO6QlGoXmjx81Py1+fj7CZeP0LGZHS0+PJh/3ngaR6vrufn1TI7W6BgQ5fk0efiguvoGFq7bx3n9uxHTNcjucHxC/+7h/P3aEWwrquDX8zfqI7zK42ny8EErcksoPVKtHeWd7Nx+3bhv0gAWby7i78tz7Q5HqVOiExn5oH+vLyAqJIBz+unI/M5285lp5BQf5snPcukXH8akIQknP0gpN6R3Hj6msrqOpdnFXDw0gQCHXv7OJiI8fPlgRqZEcs+8jfoElvJY+u3hYz7bWsyx2nomD9eOcrsE+Tt4/vpRRIYEMPONtZQeqbY7JKVaTZOHj3l/QwGJkV0YpasF2qpbWDAv3ZDBgcpqbntzLTV1DXaHpFSraPLwIWWVNazYXsIlwxLw89OxHXYbnBjB36YMI3P3QR7+KNvucJRqFU0ePmTx5kLqGgyTh2mTlbu4dFgPbj4jjddX7uZf6/PtDkcpl2ny8CGLNhSQ3q0rAxJ03Q53MmtSf8akRXPfws1kF1Sc/ACl3IAmDx+x79AxVu8qY/LwHjodiZs5PgdWRJcAbntrLeVHa+0OSamT0uThIz7Y6Fy/6zJtsnJLcWFBPHvdKArLj/Gruet1BLpye5o8fMSiDQUMT44kJSbE7lBUC0b1jOKPlwzk85wSHYGu3J4mDx+ws7SS7MIKLhmqo5nd3fSxPbliZCJPLcvl82377Q5HqRZp8vABizcXAuhUGB5ARPjz5UPo3z2cu+dtYJ9O4a7clCYPH/DxlkKGJ0eSGNnF7lCUC4IDHDx73Ujq6g2/fGcdtfU6gFC5H00eXm7PgaNs2VfBxXrX4VHSYkP5yxVDWLfnEH/7NMfucJT6EU0eXm7xFmeT1cTB3W2ORLXWpcN6MH1sCi+u2MFn2cV2h6PUD2jy8HIfby5kaFIEydH6lJUn+sPFAxnUI5x752/U/g/lVjR5eLH8g0fZmF/ORdpk5bGCAxw8c+1I6hsMd2j/h3Ijmjy82MebiwCYpE1WHi01NpRHrxzKeu3/UG7EpeQhIhNFJEdE8kRkVjP7g0RkrrV/lYikNtp3n7U9R0QutLYli8jnIrJVRLJE5K5G5aNFZKmI5Fp/6tzhbbR4SyGDeoTTMybU7lDUKbp4aAI3jOup/R/KbZw0eYiIA3gGmAQMBKaJyMAmxW4CDhpj+gCzgUetYwcCU4FBwETgWet8dcC9xpgBwFjg9kbnnAUsM8akA8us96qVCg4dY/2eQ9pk5UXuv2gAgxOd/R8F2v+hbObKncdoIM8Ys8MYUwPMASY3KTMZeN16vQAYL87Z9yYDc4wx1caYnUAeMNoYU2iMWQdgjDkMbAUSmznX68BP21Y13/bJFm2y8jbBAQ6enjaSuvoG7p67gXqd/0rZyJXkkQjsbfQ+n/9+0f+ojDGmDigHYlw51mriGgGssjbFG2MKrXMVAt1ciFE1sXhzIf27h9Errqvdoah2lBobyoOTB7NqZxnPfp5ndzjKh7mSPJqbv7vpf3laKnPCY0WkK/Ae8CtjTKsWMhCRmSKSKSKZJSUlrTnU6xVXVJG5+6AODPRSV4xMZPLwHjy5LJe1uw/aHY7yUa4kj3wgudH7JKCgpTIi4g9EAGUnOlZEAnAmjreNMQsblSkWkQSrTALQ7OxwxpgXjTEZxpiMuLg4F6rhO5ZkOZusdGCgdxIRHvrpYHpEBnPnu+spP6brf6jO50ryWAOki0iaiATi7ABf1KTMImCG9XoKsNwYY6ztU62nsdKAdGC11R/yCrDVGPPECc41A3i/tZXydUuyi+kVG0qfbtpk5a3CggN4auoIiiqq+P2/NuP856ZU5zlp8rD6MO4APsXZsT3PGJMlIg+KyGVWsVeAGBHJA+7BekLKGJMFzAOygU+A240x9cBPgOuB80Rkg/VzkXWuR4AJIpILTLDeKxdVVNXy7Y4DTBgYrysGermRKVHcM6EvH24qZP5aXf9cdS5/VwoZYxYDi5ts+2Oj11XAVS0c+zDwcJNtX9F8fwjGmAPAeFfiUj/2RU4JtfWGCQPj7Q5FdYLbzu7Nl7klPLAoi4yeUfqAhOo0OsLcyyzNLia2ayAjUnRspS9w+AlPXjOCQH8/7pyznuq6ertDUj5Ck4cXqalr4Itt+xnfPx6HnzZZ+YruEcH89cqhbNlXwWM6fYnqJJo8vMi3Ow5wuLpOm6x80AWDujN9bAovfbmTL3P10XXV8TR5eJGl2cV0CXBwRnqs3aEoG/zh4oH06daVX8/fyKGjNXaHo7ycJg8vYYxhaXYxZ/WNJTjAYXc4ygbBAQ6evGY4ZZU13K+P76oOpsnDS2zeV05RRRUTBurAQF82ODGCuyf0ZfHmIhau22d3OMqLafLwEkuzi/ETOK+/TgXm6249qzejU6P530VZ7C07anc4yktp8vASS7OLOS01mujQQLtDUTZz+AmPXz0MgHvm6ey7qmNo8vACew4cZVvRYX3KSn0vOTqEP102iDW7DvLCiu/sDkd5IU0eXmBJtnMixAu0v0M1csXIRC4eksATS7azZV+53eEoL6PJwwsszS6mf/cwUmJC7A5FuRER4eHLBxPTNZBfzd1AVa2OPlftR5OHhyurrGHNrjJtslLNigwJ5LGrhpG3/wiPfLzN7nCUF9Hk4eGWb9tPg0GTh2rRmelx3PiTVF77Zhf/2a6jz1X70OTh4ZZmF9E9PJghiRF2h6Lc2O8m9ifdGn1eVqmjz9Wp0+Thwapq61mxvVTX7lAnFRzg4Mmpwzl0tIb7F+roc3XqNHl4sK9ySzlWW69NVsolg3pEcO8F/fgkq4gFuniUOkWaPDzY0uxiwoL8Gdsrxu5QlIe45cxejEmL5k8fZOvoc3VKNHl4qPoGw7JtxZzTvxuB/noZlWsajz6/d95GHX2u2ky/dTzU+j0HKT1So01WqtWSopyjz1fvKuOlL3fYHY7yUJo8PNTS7GICHMI5/eLsDkV5oCtGJjJpcHceX5JDdkGF3eEoD6TJwwMZY1iSXczYXjGEBwfYHY7yQM7R50OIDAnkbh19rtpAk4cH+q7kCDtLK7lAm6zUKYgODeSvU4aSU3yYx5fo2ueqdTR5eKAl2cUAnK/JQ52ic/t1Y/rYFF7+aifffFdqdzjKg2jy8EBLs4sZmhRBQkQXu0NRXuD+iwaQGhPKr+dtpKKq1u5wlIdwKXmIyEQRyRGRPBGZ1cz+IBGZa+1fJSKpjfbdZ23PEZELG21/VUT2i8iWJud6QET2icgG6+eitlfP++yvqGL9nkNMGKB3Hap9hAT688TVwyg+XM0D72fZHY7yECdNHiLiAJ4BJgEDgWkiMrBJsZuAg8aYPsBs4FHr2IHAVGAQMBF41jofwGvWtubMNsYMt34Wt65K3u2zrfsBmDBIk4dqPyNSorjj3D4sXL+PjzYV2h2O8gCu3HmMBvKMMTuMMTXAHGBykzKTgdet1wuA8eKcbGkyMMcYU22M2QnkWefDGLMCKGuHOviUpdlFpESH0C8+zO5QlJe547w+DEuK4Pf/3kxxRZXd4Sg350rySAT2Nnqfb21rtowxpg4oB2JcPLY5d4jIJqtpK8qF8j7hSHUdX+cd0IkQVYcIcPjxxDXDqaqt5zcLNunkieqEXEkezX1LNf1b1VIZV45t6jmgNzAcKAQebzYokZkikikimSUlvrFGwYrtJdTUN+ioctVhesd15fcXDWDF9hLe+na33eEoN+ZK8sgHkhu9TwIKWiojIv5ABM4mKVeO/QFjTLExpt4Y0wC8hNXM1Uy5F40xGcaYjLg43xhlvTS7mMiQADJ66s2Y6jjTx/bkrL5xPLx4K9+VHLE7HOWmXEkea4B0EUkTkUCcHeCLmpRZBMywXk8BlhvnPe8iYKr1NFYakA6sPtGHiUhCo7eXA1taKutLausbWL5tP+P7x+Pv0CesVccREf42ZSjBAQ7umbuB2voGu0NSbuik30JWH8YdwKfAVmCeMSZLRB4UkcusYq8AMSKSB9wDzLKOzQLmAdnAJ8Dtxph6ABF5F1gJ9BORfBG5yTrXX0Vks4hsAs4F7m6nunq0NTvLKD9Wq01WqlPEhwfzl8uHsDG/nKeX59kdjnJD/q4Ush6XXdxk2x8bva4Crmrh2IeBh5vZPq2F8te7EpOvWZJdTJC/H2f1jbU7FOUjJg1J4IqRiTz9eR7n9ItjRIo2l6r/0vYPD2CMYWl2MWemxxES6FK+V6pdPHDZILqHB3PPvI0cramzOxzlRjR5eICsggr2HTqmEyGqThceHMDjVw9j14FK/rx4q93hKDeiycMDLMkuxk9g/IBudoeifNDYXjHccmYv3vp2D5/n7Lc7HOUmNHl4gKXZxWT0jCama5DdoSgfde8FfenfPYzfLthEWWWN3eEoN6DJw83tLTvK1sIKfcpK2SrI38Hsa4ZTfrSW+xbq6HOlycPtHV+7Q5OHstuAhHDuvaAvn2YV8966fXaHo2ymycPNLc0uol98GKmxoXaHohQ3n9mL0WnRPLAoi71lR+0OR9lIk4cbO1hZw+qdZXrXodyGw094/KphANw7byP1Ddp85as0ebixZdv202DgAl27Q7mR5OgQHrhsEKt3lfHylzvsDkfZRJOHG1uaXUT38GCGJEbYHYpSP3DlyEQmDurOY0tyyC6osDscZQNNHm6qqraeFdtLde0O5ZZEhD9fMYSILoHcM28DVbX1doekOpkmDzf1VW4px2rrtclKua3o0ED+NmUo24oO88TS7XaHozqZJg83tSS7iLAgf8akxdgdilItOrd/N6aPTeGlL3ew8rsDdoejOpEmDzdU32BYtnU/5/bvRqC/XiLl3u6/aACpMaH8ev5GKqpq7Q5HdRL9ZnJD6/Yc5EBljTZZKY8QEujPE1cPo6iiigcWZdkdjuokmjzc0JKsIgIcwtl9fWN5XeX5RqREcce5fVi4bh+LNxfaHY7qBJo83Iwxhk+yiji9dyxhwQF2h6OUy+44rw/DkiK4/1+b2V9RZXc4qoNp8nAzWQUV7C07xqTB3e0ORalWCXD48cQ1w6mqrec3C3TyRG+nycPNfLKlCD/RiRCVZ+od15XfXzSA/2wv4a1Ve+wOR3UgTR5uxBjD4i2FjO0Vo2t3KI81fWxPzuobx8MfZbOj5Ijd4agOosnDjeTuP8KOkkptslIeTUT425ShBAc4uHvuBmrrG+wOSXUATR5u5OPNRYjAhYM0eSjPFh8ezJ8vH8LG/HKe+TzP7nBUB9Dk4UY+3lLIqJQouoUH2x2KUqfsoiEJXDEikX8sz2P9noN2h6PamSYPN7GrtJJtRYeZqE1Wyos8MHkQ3cODuWfeRo7W1NkdjmpHLiUPEZkoIjkikicis5rZHyQic639q0QktdG++6ztOSJyYaPtr4rIfhHZ0uRc0SKyVERyrT+j2l49z/HxliIATR7Kq4QHB/DYVcPYdaCShz7aanc4qh2dNHmIiAN4BpgEDASmicjAJsVuAg4aY/oAs4FHrWMHAlOBQcBE4FnrfACvWduamgUsM8akA8us917vky2FDE2KICkqxO5QlGpX43rHMPPMXryzag8f6+hzr+HKncdoIM8Ys8MYUwPMASY3KTMZeN16vQAYL85FKCYDc4wx1caYnUCedT6MMSuAsmY+r/G5Xgd+2or6eKR9h46xMb9c7zqU17r3gn4MS47kt+9t0rXPvYQrySMR2Nvofb61rdkyxpg6oByIcfHYpuKNMYXWuQqBbi7E6NE+sZqsJg1OsDkSpTpGoL8f/5g6AgzcNWe9Pr7rBVxJHs0tY9d03oGWyrhybJuIyEwRyRSRzJKSkvY4pW0+3lxI/+5hpMWG2h2KUh0mJSaEv1w5hHV7DuniUV7AleSRDyQ3ep8EFLRURkT8gQicTVKuHNtUsYgkWOdKAPY3V8gY86IxJsMYkxEX57mzzxYcOkbm7oNcPETvOpT3u2RoD6aNTuG5L75jxXbP/k+fr3MleawB0kUkTUQCcXaAL2pSZhEww3o9BVhunLOiLQKmWk9jpQHpwOqTfF7jc80A3nchRo/10SZnB+Ilw3rYHIlSneOPlwykb3xX7pm3gf2HdfZdT3XS5GH1YdwBfApsBeYZY7JE5EERucwq9goQIyJ5wD1YT0gZY7KAeUA28AlwuzGmHkBE3gVWAv1EJF9EbrLO9QgwQURygQnWe6/14aYChiRGaJOV8hldAh08fe1IjlTXce+8jTQ06Oy7nki8YdrkjIwMk5mZaXcYrbb7QCVn/+0L7r+oPzPP6m13OEp1qndX7+G+hZv53cT+/Pwc/ftvBxFZa4zJaMuxOsLcRh9aTVYXD9UmK+V7pp6WzMVDE3hsSQ5rd+v0JZ5Gk4eNPthYQEbPKBIju9gdilKdTkT4yxVD6BEZzJ3vrufQ0Rq7Q1KtoMnDJtuLD7Ot6DCXake58mHhwQE8PW0kJYeruXvuBu3/8CCaPGzy4cYC/AQmDdFR5cq3DUuO5P9dMoDPc0p47j/f2R2OcpEmDxsYY/hwk3PFwG5hOv26UtPH9uSyYT14fEkOX+eV2h2OcoEmDxtkFVSwo7RSm6yUshzv/+gV15W75qynqFzHf7g7TR42+Nf6fQQ4RJc8H98NAAARaklEQVSbVaqR0CB/np8+kqM19dzxzjqd/8rNafLoZHX1Dby/YR/j+8cTGRJodzhKuZU+3cJ45MqhZO4+yF8/2WZ3OOoENHl0si9zSyk9UsMVI082ubBSvumyYT24YVxPXvpyJ59s0fU/3JUmj0723rp8okICOKef1880r1Sb/f7iAQxLjuQ38zexo+SI3eGoZmjy6EQVVbUszS7m0mE9CPTXX71SLQnyd/DMtSPwdwgz31zLkWpd/9zd6DdYJ/p4cyHVdQ1cMTLJ7lCUcntJUSE8c91IdpZWco8OIHQ7mjw60Xvr9tErLpRhSRF2h6KURzi9dyx/uHgAS7KL+cfyPLvDUY1o8ugke8uOsnpnGVeMSMS5vLtSyhX/c3oqV45MYvZn21mSVWR3OMqiyaOTvLcuH4CfjtCnrJRqDRHh4csHMywpgrvnbiC3+LDdISk0eXSK+gbDvDV7OTM9lqSoELvDUcrjBAc4eP76UXQJdDDzzbWUH6u1OySfp8mjE6zILaGgvIppo1PsDkUpj5UQ0YXnpo8i/+BR7pqznnrtQLeVJo9O8O6qPcSEBnL+gHi7Q1HKo52WGs2fLhvMFzklPPRRtt3h+DR/uwPwdvsrqli2bT83n5GmYzuUagfXjknhu5IjvPLVTnrFhnL9uFS7Q/JJmjw62Py1+dQ3GK45LdnuUJTyGvdfNIDdByp54INskqNDdMYGG+h/hTtQQ4Nh7pq9jO0VTa+4rnaHo5TXcPgJT00dQb/4MO54Zz05RfoEVmfT5NGBvv6ulD1lR7WjXKkOEBrkzyv/k0FIoIOfvbaG/Yd1DZDOpMmjA73+zS5iuwYyUdftUKpDJER04ZUZp1FWWcMtb6zlWE293SH5DE0eHWT3gUqWbdvPtWN6EuTvsDscpbzWkKQInpw6nE35h/jlu+up00WkOoVLyUNEJopIjojkicisZvYHichca/8qEUlttO8+a3uOiFx4snOKyGsislNENlg/w0+tivZ4Y+VuHCJMH6NNVkp1tAsHdeeBSwfx2dZi/vDvLRijY0A62kmfthIRB/AMMAHIB9aIyCJjTOOHrG8CDhpj+ojIVOBR4BoRGQhMBQYBPYDPRKSvdcyJzvkbY8yCdqifLSqr65i3Zi8XDUmgW3iw3eEo5RNmnJ5KyeFqnv48j25hQdxzQT+7Q/Jqrtx5jAbyjDE7jDE1wBxgcpMyk4HXrdcLgPHinP1vMjDHGFNtjNkJ5Fnnc+WcHmvhunwOV9fxPz9JtTsUpXzKvRf05ZqMZP6+PI83V+6yOxyv5krySAT2Nnqfb21rtowxpg4oB2JOcOzJzvmwiGwSkdkiEuRCjG6jvsHwz693MSwpghHJkXaHo5RPOT6J4vkDuvHHRVks3qzL2HYUV5JHc/OHN21QbKlMa7cD3Af0B04DooHfNRuUyEwRyRSRzJKSkuaK2OLTrCJ2lFYy86zeOvW6Ujbwd/jxj2kjGZkSxa/mbODrvFK7Q/JKriSPfKDx8OgkoKClMiLiD0QAZSc4tsVzGmMKjVM18E+cTVw/Yox50RiTYYzJiIuLc6EaHc8Yw3NffEdabKg+nquUjboEOnhlRgZpsaHc/Homa3aV2R2S13EleawB0kUkTUQCcXaAL2pSZhEww3o9BVhunI87LAKmWk9jpQHpwOoTnVNEEqw/BfgpsOVUKtiZvsorZfO+cm49qxcOP73rUMpOkSGBvHXzGBIigrnxn2vYsPeQ3SF5lZMmD6sP4w7gU2ArMM8YkyUiD4rIZVaxV4AYEckD7gFmWcdmAfOAbOAT4HZjTH1L57TO9baIbAY2A7HAQ+1T1Y737OffER8exOUjdcEnpdxBXFgQb98yhqjQAG54ZRVZBeV2h+Q1xBueh87IyDCZmZm2xrBuz0GuePYb/nDxAG4+s5etsSilfmhv2VGueWElVXUNzJk5lr7xYXaH5BZEZK0xJqMtx+oI83byxJLtxIQG6jxWSrmh5OgQ3r5lLP5+wrUvrdKlbNuBJo928E1eKV/llfKLc/sQGqSz3CvljtJiQ3nnljGIwNQXvyW7oMLukDyaJo9TZIzhb0tySIgI5jqdikQpt9anWxhzZ44l0N+PaS99y0btRG8zTR6n6LOt+1m/5xB3jU8nOEAnQFTK3fWK68q8W8cR3sWf6S+vIlMf420TTR6noKaugT8v3kqv2FCuHJVkdzhKKRclR4cw79ZxxIUFccOrq3UgYRto8jgFr369k52llfzx0oEEOPRXqZQnSYjowpxbx5IcFcL//HM1izY2HfusTkS/8dqouKKKfyzL5fwB3XT9ZKU8VLewYObdOo4RyVHc+e56Xv5yh90heQxNHm3058Vbqa03/OHigXaHopQ6BREhAbxx02gmDe7OQx9t5aEPs2lo8Pzxbx1Nk0cbfJZdzPsbCrjtnN6kxobaHY5S6hQFBzh4+tqRzBjXk5e/2skv312vS9qehA5KaKXyo7Xc/6/N9O8exh3n9rE7HKVUO3H4CQ9cNogekV145JNt7C6r5MXrM+gR2cXu0NyS3nm0gjGGP7y/hQOVNTx21TAC/fXXp5Q3ERFuPbs3L9+Qwa7So1z29Nes23PQ7rDckn77tcJbq/bwwcYC7pnQl8GJEXaHo5TqIOMHxLPwF6cTEuhg6gvfMj9z78kP8jGaPFy0ce8h/u+DbM7tF8fPz+5tdzhKqQ7WNz6M92//CRmpUfxmwSZ+u2Cj9oM0osnDBbsPVHLT62uICwviiauH46drdSjlE6JCA3njZ6P55Xl9mL82n58+8zV5+4/YHZZb0ORxEqVHqpnx6mrqGgyv/2w0UaGBdoeklOpE/g4/7r2gH6/fOJrSI9Vc9vRXzMvcizcsZ3EqNHmcwL5Dx7j6hZUUVVTxyozT6NOtq90hKaVsclbfOBbfdSZDkyL47YJN3PJGJvsPV9kdlm00ebRg7e6DXPnsN5QcrubNm8YwqmeU3SEppWwWHx7MOzeP5Q8XD2BFbikXzl7BR5sK7Q7LFpo8mqiqreepz3K55oWVBPgLc2eO47TUaLvDUkq5CT8/4eYze7H4zjNIiQ7h9nfWccsbmeQfPGp3aJ1Kl6G1FFdU8e/1+3hj5W72HTrGJUMTePjyIUR0CWinKJVS3qauvoGXv9rJU5/lYjDcOT6dm8/o5TFjwE5lGVqfTh6vfrWTjzYXUlRexb5DxwA4LTWKuyf05fTese0dplLKS+07dIwHP8ji06xieseFMmvSAM4f0A0R934y81SSh09PT9JgDEH+fozsGcWNP0nlrL5x9I0PszsspZSHSYzswgvXZ/D5tv3834fZ3PJGJhk9o5g1qT8ZXtrs7dN3Hkop1d5q6xuYn5nP7M+2U3K4mrP7xvGLc3ozOi3a7e5EtNlKk4dSys0cranjn1/v4tWvdnKgsoaRKZHcenZvzh8Qj8NNBhpr8tDkoZRyU8dq6pm/di8vrthB/sFjJEQEc3VGMleflkyizTP2nkrycOmRABGZKCI5IpInIrOa2R8kInOt/atEJLXRvvus7TkicuHJzikiadY5cq1z6pBupZTH6hLo4IZxqXzx63N4fvpI+saH8ffluZzx6HKmvfgtb6zcRXGF5w02POmdh4g4gO3ABCAfWANMM8ZkNyrzC2CoMeY2EZkKXG6MuUZEBgLvAqOBHsBnQF/rsGbPKSLzgIXGmDki8jyw0Rjz3Ili1DsPpZQn2Vt2lPlr8/loUwHflVQiAsOTI/lJ71jG9Y5hZEoUXQIdHR5HhzZbicg44AFjzIXW+/sAjDF/aVTmU6vMShHxB4qAOGBW47LHy1mH/eicwCNACdDdGFPX9LNboslDKeWpcosP8/GWIpZv28/mfeXUNxgCHX707d6VAd3D6Z8QTq/YUHpEdiEhMpjw4PYbe9bRj+omAo0ns88HxrRUxvrSLwdirO3fNjk20Xrd3DljgEPGmLpmyiullNdJjw8jPT6MO8enc6S6jjW7yli1o4ysgnI+z9nP/LX5Pygf6O9HaKCDkEB/ugQ6+MsVQ2yZBcOV5NHcYwFNb1daKtPS9ub6Wk5U/sdBicwEZgKkpKQ0V0QppTxK1yB/zu3XjXP7dft+W8nhavaUVVJwqIrC8mMcqKzhaHU9lTV1VNXWE9IJzVvNcSV55APJjd4nAQUtlMm3mq0igLKTHNvc9lIgUkT8rbuP5j4LAGPMi8CL4Gy2cqEeSinlceLCgogLC2JUT7sj+SFXnrZaA6RbT0EFAlOBRU3KLAJmWK+nAMuNszNlETDVehorDUgHVrd0TuuYz61zYJ3z/bZXTymlVEc46Z2H1YdxB/Ap4ABeNcZkiciDQKYxZhHwCvCmiOThvOOYah2bZT09lQ3UAbcbY+oBmjun9ZG/A+aIyEPAeuvcSiml3IgOElRKKR/V4YMElVJKqcY0eSillGo1TR5KKaVaTZOHUkqpVtPkoZRSqtW84mkrESkBdrfx8FicgxN9kdbdd/ly/bXu/9XTGBPXlhN5RfI4FSKS2dZH1Tyd1t036w6+XX+te/vUXZutlFJKtZomD6WUUq2mycOaXNFHad19ly/XX+veDny+z0MppVTr6Z2HUkqpVvPp5CEiE0UkR0TyRGSW3fG0NxFJFpHPRWSriGSJyF3W9mgRWSoiudafUdZ2EZG/W7+PTSIy0t4anDoRcYjIehH50HqfJiKrrLrPtZYEwFo2YK5V91Uikmpn3KdKRCJFZIGIbLOu/zhfue4icrf1932LiLwrIsHeet1F5FUR2S8iWxpta/V1FpEZVvlcEZnR3Gc15bPJQ0QcwDPAJGAgME1EBtobVburA+41xgwAxgK3W3WcBSwzxqQDy6z34PxdpFs/M4HnOj/kdncXsLXR+0eB2VbdDwI3WdtvAg4aY/oAs61ynuwp4BNjTH9gGM7fgddfdxFJBO4EMowxg3Eu+TAV773urwETm2xr1XUWkWjgf3EuBT4a+N/jCeeEjDE++QOMAz5t9P4+4D674+rgOr8PTABygARrWwKQY71+AZjWqPz35TzxB+dKlMuA84APcS5zXAr4N/07gHNtmXHWa3+rnNhdhzbWOxzY2TR+X7juQCKwF4i2ruOHwIXefN2BVGBLW68zMA14odH2H5Rr6cdn7zz471+y4/KtbV7Juh0fAawC4o0xhQDWn8cXTPa238mTwG+BBut9DHDIOJc4hh/W7/u6W/vLrfKeqBdQAvzTarJ7WURC8YHrbozZBzwG7AEKcV7HtfjGdT+utde5Tdffl5OHNLPNKx89E5GuwHvAr4wxFScq2sw2j/ydiMglwH5jzNrGm5spalzY52n8gZHAc8aYEUAl/226aI7X1N1qbpkMpAE9gFCczTVNeeN1P5mW6tqm34EvJ498ILnR+ySgwKZYOoyIBOBMHG8bYxZam4tFJMHanwDst7Z70+/kJ8BlIrILmIOz6epJIFJEji+/3Lh+39fd2h+Bc0llT5QP5BtjVlnvF+BMJr5w3c8HdhpjSowxtcBC4HR847of19rr3Kbr78vJYw2Qbj2FEYizU22RzTG1KxERnGvAbzXGPNFo1yLg+BMVM3D2hRzffoP1VMZYoPz47a+nMcbcZ4xJMsak4ry2y40x1wGfA1OsYk3rfvx3MsUq75H/AzXGFAF7RaSftWk8kI0PXHeczVVjRSTE+vt/vO5ef90bae11/hS4QESirDu3C6xtJ2Z3Z4/NHU0XAduB74Df2x1PB9TvDJy3n5uADdbPRTjbdJcBudaf0VZ5wfkE2nfAZpxPrNhej3b4PZwDfGi97gWsBvKA+UCQtT3Yep9n7e9ld9ynWOfhQKZ17f8NRPnKdQf+BGwDtgBvAkHeet2Bd3H27dTivIO4qS3XGfiZ9TvIA2505bN1hLlSSqlW8+VmK6WUUm2kyUMppVSrafJQSinVapo8lFJKtZomD6WUUq2myUMppVSrafJQSinVapo8lFJKtdr/BwPPs4N97Rd7AAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learn.recorder.plot_lr()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuwAAAEKCAYAAABJ1QD+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xd8VHX2//HXSU9IgTRKILSEEghdmiCCDQsiiK5Y11X5umtZ17Jrb7u2tf12Xeuu7qqrIqIoKhYEAUGl95IQQi8ptNASUs7vjxncGAMZIJM75Twfj/tgcufeyXsUbk7ufD7nI6qKMcYYY4wxxjeFOB3AGGOMMcYYc3RWsBtjjDHGGOPDrGA3xhhjjDHGh1nBbowxxhhjjA+zgt0YY4wxxhgfZgW7McYYY4wxPswKdmOMMcYYY3yYFezGGGOMMcb4MCvYjTHGGGOM8WFhTgdwUnJysrZp08bpGMYYc9wWLlxYrKopTudoSHbNNsb4s5O5bgd1wd6mTRsWLFjgdAxjjDluIrLR6QwNza7Zxhh/djLXbRsSY4wxxhhjjA+zgt0YY4wxxhgfZgW7McYYY4wxPswKdmOMMcYYY3yYFezGGGOMMcb4MK8W7CIyXERyRCRPRO6u5flIEXnf/fxcEWlT7bl73PtzROQc974oEZknIktFZKWIPFLt+Lbu11jrfs0Ib743Y4wxxhhjGoLXCnYRCQVeBM4FsoCxIpJV47DrgN2qmgE8DzzlPjcLuAzoAgwHXnK/XhkwTFW7Az2A4SLS3/1aTwHPq2omsNv92sYYY4wxxvg1b/Zh7wvkqWo+gIiMB0YCq6odMxJ42P14IvAPERH3/vGqWgasF5E8oK+q/gDsdx8f7t7Ufc4w4HL3c2+6X/dl77w1c6JUlZyCfSzbvJcdJaUARIWHkBAdTkJ0BC0aR9E6qREJ0eEOJzXGBIIPFmymcF8ZLZtE069tEs0SopyOZIzxA6pK4b4yNu06yPa9pZQcKmdfaQWHyisZlJFM37aJDZrHmwV7GrC52tdbgH5HO0ZVK0RkL5Dk3v9jjXPT4Kc79wuBDOBFVZ0rIsnAHlWtqHl8TSIyDhgHkJ6efsJvzhyfqipl0uKtvDprHbkF++s8PrFRBF1axNOjVWN6pjemX9skGkUG9TpfxpgTMHnpNr5bWwyACAzrmMptZ3Ygu2WCw8mMMb6kaF8Z368rZvGmPSzdsofV20soLa+q9djo8NCAKtilln3q4TFHPVdVK4EeItIYmCQiXYECD74X7vNfA14D6NOnT63HmPq1eddBbh2/mMWb9tClRTyPjerKwPbJtGwSjQCHyivZe6icPQfL2brnEBuKD5BfdIBlW/fy4rd5VClEhIbQt20iQzulMqJbc1Lj7S6ZMaZub1/Xj9LySvIK9/PVyh28M3cTI1+czXWD2vLH4Z0ID7XeC8YEq9XbS/h82XZm5BayYmsJ4CrGu6bFM7ZvOu2SG9EqMYYWjaNJiA4nLiqM6PBQXAM7GpY3C/YtQKtqX7cEth3lmC0iEgYkALs8OVdV94jIDFxj3J8FGotImPsue23fyzjg+3XF3Pj2QhR49pLujOqZRkjIz/+ix4WGEBcVTssm0DXt53e9Dh6uYPGmPczMLeLbNYX8+bNVPPb5KgZlpjC6ZxrnZjcjMiy0Ad+RMcbfRIWH0jUtga5pCdxwWjue/GIN//xuPSu2lvDKlb1JiLEheMYEi+L9ZXy0aAsfLdrKmh37CA0ReqU35q5zOjKkQwqdmsUR5oO/yIuqd24yuwvwXOAMYCswH7hcVVdWO+YmIFtVbxSRy4DRqnqpiHQB3sU1Dr4FMA3IBBKBcnexHg18DTylqp+JyAfAh6o6XkReAZap6kvHytinTx9dsGBBfb914zYzt4hxby0gPTGG1685hfSkmJN+zXVF+5m0aCuTFm9l655DJMdGcvWA1lzRL52k2Mh6SG2MfxCRharax+kcDak+r9kfLtzCPR8tp1PzOP57fT/io6xoNyaQ5Rbs4/Xv1jNpyVYOV1TRvVVjLu6VxgXdWpDYqGEaC57MddtrBTuAiJwH/D8gFHhDVR8TkUeBBao6WUSigLeBnrjurF9WbZLqfcBvgArgNlX9QkS64ZpQGoqrw80EVX3UfXw7YDyuon4xcKV70upRWcHuPQs27OLyf80lIyWWt6/rW+/FdFWVMmddMa/PXs+MnCIiw0K4vF86Nw3NINkKdxMErGA/edNWF3DjfxfSo1Vj3rm+PxFhvndXzRhzclZtK+HZr3OYtqaQqPAQRvdqybUD25DZNK7Bs/hswe7rrGD3js27DnLRi3OIjw7no98OpImXf3PNK9zHa7Py+XDRViLDQrj21DaMO629dZoxAc0K9voxeek2bn1vMWP7pvPE6Ox6fW1jjHPyi/bz3NRcPlu2nfioMK4f3I4r+7dusLvptTmZ67a13TD1qqyiknFvL6S8sorXr+nj9WIdICM1jr+O6c6NQ9rz/DdrefHbdbw/fzN/Gt6Ji3u1/MWYeWOMOeLC7i1Yvb2El2eso3vLBC7ra93DjPFnB8oqeGF6Hq/Pzic8NIRbhmVw/eB2fn8Tzz7/M/Xq6S9zWL29hOd/1YN2KbEN+r3bpcTywtiefHbLINITY7hr4jLGvPI9K7ftbdAcxhj/cufZHTk1I4lHP1vFxp0HnI5jjDkBqsqU5ds587mZvDJzHSN7pDHzrqHccXZHvy/WwQp2U4/m5BXzr9nruXpAa87o3NSxHF3TEph440CeHtONjTsPMvIfc/jbN2spr6y9n6oxJriFhghPj+lOaIhw5wdLqawK3qGixvij4v1l/N/bC/ndO4toHBPBxBsH8Mwl3UmJC5w5bVawm3pRWl7JvZOW0y65Efee19npOISECJf0acW0O4ZwfrfmPP9NLqNf+p7cgn1ORzPG+KAWjaN5eEQX5m/YzbvzNjkdxxjjoS9X7OCc52cxI6eIu8/txKc3n0qfNg27qFFDsILd1IuXZ6xj486D/PmirkSF+05f9MYxEfztsp68fEUvtu45xAV/n83bP24kmCdbG2NqN7pXGgPaJfHs1znsPnDY6TjGmGM4dLiSP05cyo3/XUizhCg+vWUQNw5p75M91OtDYL4r06A2FB/g5ZnruLB7C07NSHY6Tq3OzW7O1384jYEZSTzw8QpuHb+E/WUVTscyxvgQEeGRkV3YV1rB01/nOB3HGHMU64r2M+qlOXywcAs3D81g0u9OpWOzhm/T2JCsYDcn7fEpq4kIDeH+850fCnMsybGRvHHNKdx1Tkc+X7aNC1+YzZodJU7HMsb4kA5N47hmQBvGz9vEWhtCZ4zP+cz987ugpJQ3r+3Lned0DIo1FAL/HRqvWrRpN1+vKmDcae1IjY9yOk6dQkKEm4Zm8N4N/dlfVsHFL33P1FUFTscyxviQm4dlEBMRxnNTc52OYoxxq6pS/vrlGm5+dzEdm8Xx+a2DOa1DitOxGowV7OaEqSpPfbGG5NgIrhvU1uk4x6VfuyQ+vWUQGamxjHt7Aa/MXGfj2o0xACQ2iuA3g9ryxYodLN9ibWGNcdqhw5X87p1FvDRjHWP7tmL8uAG0aBztdKwGZQW7OWEzc4uYu34XtwzLpFGk/63B1TQ+ivf/bwDnZzfnyS/WcOcHyzhcYa0fjTFw/eC2NI4J5xkby26MowpKSrn01R/4atUO7j+/M4+Pyg6KITA1Bd87NvVCVfn7tLWkNY5mrB+vDBgVHsoLY3ty25mZfLhoC9e/tYADNhnVGI+JyHARyRGRPBG5u5bnW4vINBFZJiIzRKRljefjRWSriPyj4VLXLT4qnP87rT0zc4vsLrsxDskr3MdFL85hXdF+/nlVH64f3A6R4Fy93Ap2c0Lmrt/Fok17+L8h7fz+N10R4bYzO/DUxdnMXlvE5f+ayy5r6WZMnUQkFHgROBfIAsaKSFaNw54B3lLVbsCjwBM1nv8zMNPbWU/EFf3TiYsM45WZ65yOYkzQWbp5D5e88gPllcoHNw7gzCznFmT0Bf5daRnHvDRjHcmxEVzap5XTUerNr05J55Ure7NmewmXvPI9W/cccjqSMb6uL5CnqvmqehgYD4yscUwWMM39+Nvqz4tIb6Ap8HUDZD1u8VHhXNG/NV+s2M6G4gNOxzEmaMzJK+byf/5IbFQYH/52AF1aJDgdyXFWsJvjtmLrXmblFnHtqW19apGk+nB2l2a8fV0/CveVccnL37Np50GnIxnjy9KAzdW+3uLeV91S4GL341FAnIgkiUgI8Cxwl9dTnoTfnNqGsJAQ/vldvtNRjAkKX63cwbX/nk/LJjFMvHEgrZMaOR3JJ1jBbo7byzPXERcZxlUDWjsdxSv6tk1k/Lj+HCyv5Fev/cDGnXZnzZijqG0wac12S3cCQ0RkMTAE2ApUAL8DpqjqZo5BRMaJyAIRWVBUVFQfmY9LanwUF/dO44OFW2yonDFe9uWKHdz0ziK6pMUz4f8G0NQP2kU3FCvYzXHZtucQX67Ywdh+6cRHhTsdx2u6tEjg3ev7U1peya9e/dE+DjemdluA6uPiWgLbqh+gqttUdbSq9gTuc+/bCwwAbhaRDbjGuV8tIk/W/Aaq+pqq9lHVPikpzvRc/vXAthyuqOKDBcf83cIYcxK+XLGDm99dRLeWCbz1m74kxARujXEirGA3x+XduZuoUuWq/oF5d726rBbxvHtDfw5XVvGr135gvRXtxtQ0H8gUkbYiEgFcBkyufoCIJLuHvwDcA7wBoKpXqGq6qrbBdRf+LVX9RZcZX9CxWRx92yby37kbqayy9RqMqW9fr3QV69ktE3jzN32JC+AbgifKCnbjsdLySt6bt4kzOjWlVWKM03EaROfm8bx7Qz/KK5Wxr/3I5l02pt2YI1S1ArgZ+ApYDUxQ1ZUi8qiIXOg+7HQgR0RycU0wfcyRsCfp6gGt2bzrEDNzC52OYkxA+WZVATe9u4iuaVasH4sV7MZjU5ZvZ+eBw1wzMPDvrlfXqVk871zfj4OHK7jq9bkU7it1OpIxPkNVp6hqB1Vtr6qPufc9qKqT3Y8nqmqm+5jrVbWsltf4j6re3NDZj8fZWc1IiYvk7R82Oh3FmIDxw7qd/O7dRWS1SOCt6/oG9FDbk2UFu/HYmz9spF1KIwZlJDsdpcF1bh7Pv6/tS0FJGVe/Po+9B8udjmSMaUARYSGM7ZvOjNwi6x5lTD1YsXUvN7y1gNaJMbx57SlWrNfBCnbjkRVb97J08x6u7t86aFcZ6926Ca9d3Zt1Rfv5zZvzOXjYVkQ1Jphc3jcdAT5YaJNPjTkZ+UX7ueaNeSREh/P2df1oHBPhdCSfZwW78ciEBZuJCAthVM+WdR8cwAZnpvD3y3qyeNNufvvfRZRXVjkdyRjTQJolRDE4M4UPF26xyafGnKAde0u56vV5ALx9XV+aJVjrRk9YwW7qVFpeyceLt3Ju12bWZgk4N7s5T4zOZmZuEQ98vAJV+8FtTLAY07sl2/aW8sO6nU5HMcbv7D1UztVvzGXvoXL+c21f2qXEOh3Jb1jBbur01codlJRWcGmfVnUfHCR+dUo6twzLYPz8zbw0Y53TcYwxDeSsrKbER4XZsBhjjlN5ZRU3vbOI/KIDvHZVb7JbJjgdya94tWAXkeEikiMieSLyi/66IhIpIu+7n58rIm2qPXePe3+OiJzj3tdKRL4VkdUislJEfl/t+IdFZKuILHFv53nzvQWTCQs207JJNAPaJTkdxafcflYHLurRgqe/yuGTJVudjmOMaQBR4aFc2KMFX67YQUmpTT43xhOqygMfr2B2XjFPjM5mYBA2rzhZXivYRSQUeBE4F8gCxopIVo3DrgN2q2oG8DzwlPvcLFwLcHQBhgMvuV+vArhDVTsD/YGbarzm86raw71N8dZ7Cyabdx1kTt5OLundipCQ4JxsejQiwlNjutGvbSJ3fbCMufn2EbkxweCS3q0oq6jis6XbnY5ijF94dVY+4+dv5uahGVxin9afEG/eYe8L5KlqvqoeBsYDI2scMxJ40/14InCGuFqQjATGq2qZqq4H8oC+qrpdVRcBqOo+XAt1pHnxPQS9DxZuQQTG9AnuyaZHExkWymtX9aFVYjTj3l5IftF+pyMZY7ysW8sEOjSNtWExxnhgyvLtPPnFGkZ0b8HtZ3VwOo7f8mbBngZUv5pt4ZfF9U/HuFfM2wskeXKue/hMT2Butd03i8gyEXlDRJrUFkpExonIAhFZUFRUdLzvKaioKpMWb+HU9smkNY52Oo7PSogJ5z/X9iVE4Ia3FtjH5MYEOBFhVM+WLN60x1Y/NuYYlmzewx/eX0Lv1k14ekw3+6T+JHizYK/t/0rNdhpHO+aY54pILPAhcJuqlrh3vwy0B3oA24Fnawulqq+pah9V7ZOSknLsdxDkFm/ew+ZdhxjZo4XTUXxeq8QYXrqiNxt3HuS28Uus5ZsxAe6Cbs0B+HTZNoeTGOObCktKGffWAlLjI3ntqt5EhYc6HcmvebNg3wJUH6jUEqh5ZfvpGBEJAxKAXcc6V0TCcRXr76jqR0cOUNUCVa1U1Srgn7iG5JiTMHnJNiLCQjinazOno/iFAe2TeGhEFtPXFPLs1zlOxzHGeFGrxBh6pTdm8hIr2I2p6XBFFb99ZxH7yyr459V9SIqNdDqS3/NmwT4fyBSRtiISgWsS6eQax0wGrnE/HgNMV1dT68nAZe4uMm2BTGCee3z768BqVX2u+guJSPNqX44CVtT7OwoiFZVVfLZsG2d0SrXlgo/Dlf1bM7ZvOi/NWMfkpfaD3JhANqJ7C9bs2Mfagn1ORzHGpzz86UoWbtzN02O606lZvNNxAoLXCnb3mPSbga9wTQ6doKorReRREbnQfdjrQJKI5AG3A3e7z10JTABWAV8CN6lqJXAqcBUwrJb2jX8VkeUisgwYCvzBW+8tGHy/bifF+w/bcJjjJCI8cmEXTmnThD9OXMqKrXudjmSM8ZLzs5sTIvDpMusWY8wR783bxLtzN/Hb09tzfrfmdZ9gPCLBvEpjnz59dMGCBU7H8El3TFjK1yt3MP/+M23c2Qko3l/GhS/MRkT47JZBNGkU4XQkE2BEZKGq9nE6R0PyxWv25f/8ke17S5l+xxBcHwIbE7wWbtzNZa/9wMD2ybzx61MItUmmP3My121b6dT8Qml5JV+t3MHwrs2sWD9BybGRvHJVb4r2lfGHCUuoskmoxgSkEd1bsL74ACu3ldR9sDEBrLCklN/+dyEtGkfz98t6WrFez6xgN78wfU0h+8squKintbg/Gd1aNuaBEVnMyCnixW/znI5jjPGC4V2aERYi1i3GBLWKyipufncx+8sqeO2qPiTE2Ny3+mYFu/mFz5ZtIzk2kv7tkpyO4veu7JfORT1a8Nw3ucxeW+x0HGNMPWvSKIIB7ZP4asUOgnmIqQluz03NZd6GXTw+KpuOzeKcjhOQrGA3P3PocCXfrilieNem9nFWPRARHh+dTWZqLL8fv5gde0udjmSMqWfndGnGhp0HyS2wlY5N8Pk2p5CXZqxjbN9W9sm8F1nBbn5mZm4Rh8orOberzeyuLzERYbx0RW9Kyyu56d1FlFdWOR3JGFOPzs5qigh8uWKH01GMaVDb9hziD+8voXPzeB4a0cXpOAHNCnbzM1+u2E6TmHD6tU10OkpAyUiN5akx3Vi4cTdPfbHG6TjGmHqUGh9F7/QmfLnSCnYTPMorq7j53UWUV1Tx4uU9rUmFl1nBbn5SVlHJtNWFnJXVlLBQ+6tR3y7o1oKrB7TmX7PX821OodNxjDH1aHjXZqzeXsKmnQedjmJMg3j6qxwWbdrDkxd3o11KrNNxAp5VZeYn3+ftZF9ZhQ2H8aJ7z+tMp2Zx3DlhKYUlNp7dmEBxTpdmAHxld9lNEPhmVQGvzcrnqv6tGdHdFlhsCFawm598sWI7cZFhDMyw7jDeEhUeyj8u78mBwxXcPmGp9Wc3JkC0Sowhq3m8DYsxAa+gpJS7Ji6lS4t47ju/s9NxgoYV7AZw9VCduqqAMzqnEhlm49C8KSM1jodHdGF2XjGvzsp3Oo4xpp4M79qMhRt326dnJmBVVSm3T1hCaXkVfx9r49YbkhXsBoC563ex+2A5w204TIP41SmtOD+7Oc9+ncPiTbudjmOMqQfDu7qGxXy9qsDhJMZ4x79m5zMnbycPjsiivY1bb1BWsBvANRwmOjyUIR1SnI4SFI70Z28aH8Wt4xdTUlrudCRjzEnKTI2lVWI009fYpHITeFZs3cvTX+VwTpemXHZKK6fjBB0r2A1VVcpXKwsY2imF6Aj7eKuhJESH8/exPdi2p5QHPl7hdBxjzEkSEc7o1JQ5ecUcOlzpdBxj6s3BwxXcOn4xSY0ieXJ0N0RsYcWGZgW7YcmWPRTtK/upy4FpOL1bJ/L7MzL5ZMk2Ji/d5nQcY8xJOqNzKmUVVczJK3Y6ijH15s+frWZ98QGeu7Q7TRpFOB0nKFnBbpi2uoDQEOH0DqlORwlKvzu9PT3TG3P/pOXs2GuT1YzxZ33bJtIoIpRpNizGBIivVu7gvXmbGDe4HQMzkp2OE7SsYDdMW13IKW2akBAT7nSUoBQWGsLzl/agvFK5a6K1ejTGn0WGhXJahxSmrylA1f4tG/9WUFLK3R8uo2taPHec3dHpOEHNCvYgt3nXQdbs2MeZnZs6HSWotUluxAMXZPHd2mLe+mGD03GMMSdhWKdUCkrKWLmtxOkoxpwwVeWPE5dxqLySv13Wk4gwKxmdZP/1g9y01a72Y2dYwe64sX1bMaxTKk98sYa8wn1OxzHGIyIyXERyRCRPRO6u5fnWIjJNRJaJyAwRaene30NEfhCRle7nftXw6b1jaKdURFyfXhrjr8bP38zM3CLuObeztXD0AVawB7lpawppn9KItsmNnI4S9ESEJy/OJiYilD+8v5TyyiqnIxlzTCISCrwInAtkAWNFJKvGYc8Ab6lqN+BR4An3/oPA1araBRgO/D8Radwwyb0rOTaSHq0aM22N9WM3/mnzroP85bNVDGyfxFX9Wzsdx2AFe1DbV1rOj/k7bTiMD0mNi+KJ0dks37qXF6atdTqOMXXpC+Spar6qHgbGAyNrHJMFTHM//vbI86qaq6pr3Y+3AYVAwCwEcWbnpizbstdWPTV+p6pKueODpYSI8PQl3QkJsRaOvsAK9iA2K7eY8krlzCwr2H3J8K7NGdO7Jf/4No+FG20VVOPT0oDN1b7e4t5X3VLgYvfjUUCciCRVP0BE+gIRwDov5Wxwwzq5um7ZIkrG37wxZz3z1u/iwRFZpDWOdjqOcbOCPYhNW11Ak5hweqU3cTqKqeGhEVk0T4jmrg+WUlpuC7AYn1XbrbearVHuBIaIyGJgCLAVqPjpBUSaA28D16rqL8aBicg4EVkgIguKiorqL7mXdWoWR1rjaL6xcezGj+QV7uOvX+VwZudUxvRu6XQcU40V7EGqorKK6TmFDO2YSqh93OVz4qLC+euYbuQXH+C5qblOxzHmaLYA1dcobwn8bAUwVd2mqqNVtSdwn3vfXgARiQc+B+5X1R9r+waq+pqq9lHVPikp/jNiRkQY2imF79cVc7jC5qMY31dRWcUdE5bSKCKUx0dn22qmPsarBbsH3QMiReR99/NzRaRNtefuce/PEZFz3Ptaici3IrLa3Vng99WOTxSRqSKy1v2n3TY+hkWb9rDnYLkNh/Fhp2Ykc3m/dP75Xb4NjTG+aj6QKSJtRSQCuAyYXP0AEUkWkSM/a+4B3nDvjwAm4ZqQ+kEDZm4wQzqkcvBwJQs27nI6ijF1ennGOpZu2ctfLsomNS7K6TimBq8V7B52D7gO2K2qGcDzwFPuc7NwXfiPdA94yf16FcAdqtoZ6A/cVO017wamqWomrglOv/gFwfzPtNUFhIcKgzNt1TJfdu95nWmREM1dE21ojPE9qloB3Ax8BawGJqjqShF5VEQudB92OpAjIrlAU+Ax9/5LgdOAX4vIEvfWo2HfgXcNaJ9EeKgwM9d/hvKY4LRy217+Nm0tF3Zvwfndmjsdx9TCm3fYPekeMBJ40/14InCGuD6DGQmMV9UyVV0P5AF9VXW7qi4CUNV9uH5ApNXyWm8CF3npfQWEqasL6N8uibgoW93Ul8VGhvHUxd3IL7KhMcY3qeoUVe2gqu1V9TH3vgdVdbL78URVzXQfc72qlrn3/1dVw1W1R7VtiZPvpb7FRobRp3UiM3OsYDe+63CFayhMk0YRPDqyi9NxzFF4VLCLyCARudb9OEVE2npwmifdA346xn2nZi+Q5Mm57uEzPYG57l1NVXW7+7W2A6keZAxKG3ceIL/owE9dDIxvG5TpGhrzLxsaY4zfGdIxhTU79lFg7R2Nj3pl5jrW7NjH46OyaRwT4XQccxR1Fuwi8hDwJ1xjDwHCgf968NqedA842jHHPFdEYoEPgdtU9bjWfvbXjgP1aYb7bs/Qjlaw+4t7zu3k6hpjQ2OM8StDOrgmytpdduOLcgv28cL0tYzo3oKzbE6bT/PkDvso4ELgAPy0wEWcB+fV2T2g+jEiEgYkALuOda6IhOMq1t9R1Y+qHVPgbg92pE1Yrb20/LXjQH2akVNIm6QY2tjqpn4jLiqcJy/OJr/oAM/b0Bhj/EanZnE0jY+0cezG51RWKXdNXEZcVDgPj6g5xdD4Gk8K9sOqqrjvcIuIp1Vend0D3F9f4348Bpju/l6TgcvcXWTaApnAPPf49teB1ar63DFe6xrgEw9zBpXS8kp+yN/J6XZ33e8MzkxhbF9X15hFm2xojDH+QEQY0iGF79YWUVFp7R2N73hj9nqWbt7Dwxd2ISk20uk4pg6eFOwTRORVoLGI3AB8A/yrrpM87B7wOpAkInnA7bg7u6jqSmACsAr4ErhJVSuBU4GrgGHVugqc536tJ4GzRGQtcJb7a1PD3PW7KC2vYkjH4Px0wd/de55raMydtqCSMX5jSIdUSkorWLplj9NRjAFgffEBnvk6hzM7N2WEdYXxC2F1HaCqz4jIWUAJ0BF4UFWnevLiqjoFmFJj34PVHpcClxzl3Mf4X/uvI/tmU/v4dlR1J3CGJ7mC2YycQiLDQhjQLqnug43PiYu0OLUFAAAgAElEQVQK54nR2Vz9xjxemL6Wu87p5HQkY0wdBmUkEyKucey9Wyc6HccEuaoq5U8fLiMiLITHRnW1BZL8hCeTTp9S1amqepeq3qmqU0XkqYYIZ+rfzJwi+rdLIio81Oko5gSd1iGFi3u15NWZ+azadlxzro0xDkiICadnehMbx258wjvzNjFv/S4eOD+LpvG2QJK/8GRIzFm17Du3voMY79u08yD5xQc43YbD+L37z+9M45hw7v5omY2LNcYPDOmQwrKte9m5v8zpKCaIbd1ziCenrGZwZjKX9GnpdBxzHI5asIvIb0VkOdBRRJZV29YDyxouoqkvM3JdjXNswqn/a9IogodGdGHZlr385/sNTscxxtRhSIcUVGF2XrHTUUyQUlXu+Wg5Cjw+KtuGwviZY91hfxcYgav7yohqW29VvbIBspl6NiOniNZJMbS1do4B4YJuzTmzcyrPfJ3Dpp0HnY5j/JyI9BGRSSKyyH1zZrmI2M2ZepKdlkBio4if1sEwpqF9uGgrs3KL+NPwTrRKjHE6jjlORy3YVXWvqm5Q1bGquhE4hKu1Y6yIpDdYQlMvSssr+X5dMad3sOEwgUJE+PNFXQkLCeHeSctxdUQ15oS9A/wbuBjXzZkL3H+aehASIgzOTOa7tcX2b9U0uMKSUh79dCWntGnCVf1bOx3HnABPJp2OcLdKXA/MBDYAX3g5l6ln89ztHG04TGBpnhDNn87txOy8YiYu3OJ0HOPfilR1sqquV9WNRzanQwWSQRnJFO8vY82OfU5HMUHmkU9XUVpRxZMXdyMkxIbC+CNPJp3+BegP5KpqW1ytE+d4NZWpdzNyiogIC6G/tXMMOFf0TeeUNk34y+erKdpnE9rMCXtIRP4lImNFZPSRzelQgWRwpusTztlrbRy7aTjTVhfw+fLt3Dosg/YpsU7HMSfIk4K93N3jPEREQlT1W6CHl3OZejYjt5D+7ZKIjrB2joEmJER4YnQ3Dh2u5OFPVzodx/iva3Fd24fzvzlLFziaKMA0S4giIzWWWWttHLtpGAfKKnjwk5V0aBrLuNPaOx3HnIQ6F04C9ohILDALeEdECoEK78Yy9WnzroPkFx3gyn42bi1QZaTGcusZGTzzdS4X9SjgrKymTkcy/qe7qmY7HSLQDcpI5r15mygtr7T1MIzXPTc1l617DjHxxgFEhHlyj9b4Kk/+740EDgJ/AL4E1mETkfzKjJwj7RxtwmkgG3daezo1i+OBj1dQUlrudBzjf34UkSynQwS60zokU1ZRxcKNu52OYgLc8i17+fec9VzRL50+bWyFXX9XZ8GuqgdUtUpVK1T1TeBFXB+ZGj8xI6eI9ERr5xjoIsJCePLibhTuK+WpL9Y4Hcf4n0HAEhHJsbaO3tOvbRLhocJ3No7deFFFZRV3f7SMpNhI/ji8k9NxTD041sJJ8SJyj4j8Q0TOFpebgXzg0oaLaE6Gq53jTk7vmGKLJASBHq0ac+2pbXln7ibmb9jldBzjX4YDmcDZWFtHr2kUGUbP9CbMzrNx7MZ7/vP9BlZuK+HhEV1IiA53Oo6pB8e6w/420BFYDlwPfA1cAoxU1ZENkM3Ug/kbdnGovNKGwwSRO87uQFrjaO79aDmHK6qcjmP8hx5lM/VscEYyK7eVsOvAYaejmAC0ZfdBnv06lzM6pXJedjOn45h6cqyCvZ2q/lpVXwXGAn2AC1R1ScNEM/XhSDvHAe2SnY5iGkhMRBh/vqgLawv389qsdU7HMf7jc+Az95/TcH2aamtueMGgzGRUYU6eDYsx9UtVefCTlYjAoxd1tU/WA8ixCvafZq2paiWwXlVttQc/MzO3iH5tE62dY5AZ1qkp52c35+/T81hffMDpOMYPqGq2qnZz/5kJ9AVmO50rEHVr2Zj4qDDrx27q3efLtzN9TSG3n+X6pNUEjmMV7N1FpMS97QO6HXksIiUNFdCcuC27D5JXuJ8hHWw4TDB6cEQWkaEh3P/xclsK3Rw3VV0EnOJ0jkAUGiIMbJ/M7Lxi+7dp6s3eQ+U88ukquqbF8+uBbZyOY+rZUfuwq6rdkvVzs3Jdd29s/HpwahofxR/P7cQDH69g0uKtjO7V0ulIxoeJyO3VvgwBegE2M9JLBmUm8+XKHeQXH7DVJ029eOrLNezcX8a/f30KYaHWcz3Q2P/RADYrt4gWCVH2wyCIXdE3nZ7pjfnL56vZbRPczLHFVdsicY1ltwYDXnJaputGig2LMfVh/oZdvDt3E785tS1d0xKcjmO8wAr2AFVeWcWcvGKGWDvHoBYSIjwxOpuSQ+U8PmW103GMb1ulqo+4t8dU9R2sraPXpCfFkJ4YY/3YzUk7XFHFvR8tJ61xNH84q4PTcYyXWMEeoJZs3sO+sgobv27o1CyeG05rxwcLt/DDup1OxzG+6x4P95l6MigzmR/zd1Jeae1XzYl7deY61hbu5y8XdaVR5FFHOhs/ZwV7gJqZU+Sa2JRh7RwN3Dosk1aJ0dw3aTllFZVOxzE+RETOFZEXgDQR+Xu17T9AhcPxAtrgjGT2l1WwdPMep6MYP5VftJ8Xvs3j/G7NGdop1ek4xovqLNiPdIWpsW0WkUki0q4hQprjNzO3iF7pjYmPshXODERHhPKXi7LJLz7AS99ab3bzM9uABUApsLDaNhk4x8FcAW9g+2RCBBsWY06IqnLfpBVEhoXw0Igsp+MYL/Pks5PncF3Q3wUEuAxoBuQAbwCneyucOTHF+8tYvnUvd9hYNlPNkA4pXNi9BS/PWMeI7i3ISLXJyAZUdSmwVETeVdXyOk8w9SYhJpzslo2ZnVdsY4/NcZu4cAs/5O/ksVFdSY2LcjqO8TJPhsQMV9VXVXWfqpao6mvAear6PtDEy/nMCTjSdWCItXM0NTxwQRZR4SHcN8l6s5tf6CsiU0UkV0TyRWS9iOQ7HSrQDc5IZsnmPZSU2u9KxnM795fx2JTV9GndhLGnpDsdxzQATwr2KhG5VERC3Nul1Z475k98ERkuIjkikicid9fyfKSIvO9+fq6ItKn23D3u/Tkick61/W+ISKGIrKjxWg+LyFYRWeLezvPgvQWkWblFJDaKoGsLa+1kfi4lLpJ7z+vM3PW7+GDBFqfjGN/yOq5PVAfhWjCpDx4snOTBdb61iEwTkWUiMkNEWlZ77hoRWeverqnH9+I3BmUmU1ml/GgTws1xeOzz1Rwoq+CJ0dmEhFgnuGDgScF+BXAVUAgUuB9fKSLRwM1HO0lEQoEXgXOBLGCsiNQcZHUdsFtVM4Dngafc52bhGnrTBRgOvOR+PYD/uPfV5nlV7eHepnjw3gJOVZUya20RgzOT7R+xqdWlfVpxSpsmPDZlNcX7y5yOY3zHXlX9QlULVXXnke1YJ3h4nX8GeEtVuwGPAk+4z00EHgL6AX2Bh0Qk6D617ZXehJiIUGbn2Th245nv1hbx0eKt3DikPZlN45yOYxpInQW7quar6ghVTVbVFPfjPFU9pKqzj3FqXyDPff5hYDy/XIRjJPCm+/FE4AxxNQ0fCYxX1TJVXQ/kuV8PVZ0F7DqudxlEVm0voXj/YWvnaI4qJER4fFQ2Bw9X8Njn1pvd/ORbEXlaRAaISK8jWx3neHKdzwKmHfke1Z4/B5iqqrtUdTcwlaPfjAlYEWEh9G+XZBNPjUdKyyu5/+MVtE1uxE1DM5yOYxpQnZNORSQFuAFoU/14Vf1NHaemAZurfb0F152UWo9R1QoR2Qskuff/WOPctLqyAjeLyNW4Oh7c4f4hEFRm5rpWEh+caQW7ObrMpnHcOKQ9L0zP4+JeLRmUae0/zU/X5z7V9ikw7BjneHKdXwpcDPwNGAXEiUjSUc715DofcAZlJDN9TSFbdh+kZZMYp+MYH/b3aWvZuPMg797Qj6jw0LpPMAHDkyExnwAJwDe4lqo+stWltvEYNce8H+0YT86t6WWgPdAD2A48W2sokXEiskBEFhQVFdXxkv5nZm4RXVrEkxIX6XQU4+NuGppBm6QY7vt4OaXl1ps92Knq0Fq2YxXr4Nm1+k5giIgsBoYAW3H1d/foOh/o12yAwe5fmGfbXXZzDGt2lPDarHzG9G7JwPZ2kyXYeFKwx6jqn1R1gqp+eGTz4LwtQKtqX7fE1R6y1mNEJAzXLwa7PDz3Z1S1QFUrVbUK+CfuITS1HPeaqvZR1T4pKYF1F3pfaTmLNu7mNBsOYzwQFR7KY6Oy2bjzIP+Ynud0HOMwEWkqIq+LyBfur7NE5Lo6TqvzWq2q21R1tKr2BO5z79vrybnuYwP2mn1ERmoszeKj+M7GsZujqKpS7vloOfHR4dx3Xmen4xgHeFKwf3aCHVfmA5ki0lZEInBNIp1c45jJwJHOAGOA6erqNTcZuMzdRaYtkAnMO9Y3E5Hm1b4cBaw42rGB6vt1O6moUhu/bjx2akYyo3ul8crMdeQW7HM6jnHWf4CvgBbur3OB2+o4p87rvIgki8iRnzX34Fq/A/f3OltEmrgnm57t3hd0RIRBmcnMySumssrarZpfemfuRhZv2sMDF3SmSaMIp+MYB3hSsP8eV9F+yL3K6T4RKanrJFWtwNVF5itgNTBBVVeKyKMicqH7sNeBJBHJA24H7nafuxKYAKwCvgRuUtVKABF5D/gB6CgiW6rdAfqriCwXkWXAUOAPHv0XCCCzcouIjQyjV3rQNVowJ+G+8zoTFxXGPR8tp8qKhWCWrKoTgCr46Rp+zLFSHl7nTwdyRCQXaAo85j53F/BnXEX/fOBR976gNDgzmT0Hy1m5ba/TUYyPKSgp5a9f5jAoI5mLegTlNA+DB5NOVfWEewa5WytOqbHvwWqPS4FLjnLuY7gv7DX2jz3K8VedaM5AoKrMzC1iQPskIsI8+T3MGJekWFdv9rsmLuO9+Zu4ol9rpyMZZxxwTwZVABHpD9RZPXpwnZ+IqwtYbee+wf/uuAe1UzNcY5K/W1tMt5aNHU5jfMnDk1dyuLKKx0Z1xdVIzwSjo1Z2ItLJ/Wev2raGi2g8kV98gC27D9lwGHNCxvRuyYB2STz5xRoKS0qdjmOccTuu4SztRWQO8BZwi7ORgkdybCRZzeP5bm1gTqw1J2bqqgK+WLGDW8/IpHVSI6fjGAcd61bs7e4/n61le8bLucxxmuVu52gFuzkRIsLjo7Mpq6jikU9XOR3HOEBVF+Hq4jIQ+D+gi6ouczZVcBmcmczCjbs5eLjC6SjGB+wvq+DBT1bQsWkc405r53Qc47CjFuyqOs7954m0+jINbGZuEe2SG9Eq0Xr4mhPTNrkRtw7L4PPl2/lmVYHTcUwDc69aeh5wBq4JoLeIyO3HPsvUp0GZyZRXKnPXB+1QflPNs1/nsKOklCcuziY81Ia6BjuP/gaIyEARuVxErj6yeTuY8VxpeSU/5u+0do7mpI07rT0dmsby4Ccr2F9md/mCzKfAr3EtXhdXbTMN5JQ2iUSEhfBdrrV3DHbLtuzhze83cGW/1tZIwgCerXT6Nq4FiZbwv44Bimt8o/EB8zfsorS8yobDmJMWERbCE6O7MeaV73n26xweGtHF6Uim4bRU1W5OhwhmUeGh9GubyOw8G8cezCoqq7j7w+Ukx0Zy1/COTscxPqLOgh3XMtVZ7v7oxgfNzCkiIiyEfu0SnY5iAkDv1k24sl9r3vx+Axf1SKN7K+tYESS+EJGzVfVrp4MEs0EZyTzxxRoKSkppGh/ldBzjgDfmrGfV9hJevqIX8VHhTscxPsKTITErgGbeDmJO3Ky1RfRtk0hMhCe/fxlTt7uGdyQlLpK7P1pOeWWV03FMw/gRmHS8a26Y+jUo09XecfZaGxYTjDbvOsjzU9dyZuemDO9qpZf5H08K9mRglYh8JSKTj2zeDmY8s23PIXIL9ttwGFOv4qPCeeTCrqzeXsIbs9c7Hcc0jGeBAUCMqsarapyqxjsdKth0bhZPcmyEtXcMQqrKA5+sIETg0ZFdrOe6+RlPbsk+7O0Q5sQduajbhFNT34Z3bcZZWU15/ptczu3anPQk60AU4NYCK2z4o7NCQoRTM5KZnbcTVbWiLYh8tmw7M3KKePCCLFo0jnY6jvExx7zD7m7z9YCqzqy5NVA+U4eZuUU0i4+iQ9NYp6OYAPToyC6EinDfx8uxOi7gbQdmiMg9InL7kc3pUMFoUEYyxfvLWLNjn9NRTAPZe7CcRz5dSbeWCVwzsI3TcYwPOmbBrqqVwEERSWigPOY4lFdW8d3aYoZ0SLG7MMYrmidE88fhnfhubTGTl25zOo7xrvXANCACa+voqMGZrk9MbVhM8Hjyy9XsPljO46OyCQ2xn+fmlzwZElMKLBeRqcCBIztV9VavpTIeWbRxN/tKKxjaKdXpKCaAXdm/NZMWb+XRT1dxWmYKTRpFOB3JeIGqPgIgInGuL3W/w5GCVrOEKDJTY/lubTHjTmvvdBzjZfPW7+K9eZsZd1o7uqbZ/VFTO08mnX4OPADMAhZW24zDpucUEh4qnJqR5HQUE8BCQ4QnRmez91A5j09Z7XQc4yUi0lVEFuPqDLZSRBaKiDXid8igzGTmrd9FaXll3Qcbv1VWUcm9k5aT1jia287MdDqO8WF1Fuyq+mZtW0OEM8c2Y00Rp7RJJM76tBov69w8nhtOa8cHC7fw/TprNxegXgNuV9XWqtoauAP4p8OZgtbgzGTKKqpYsGG301GMF706M5+8wv38ZVRXa81sjqnOgl1EMkVkooisEpH8I1tDhDNHt3XPIXIK9jG0ow2HMQ3j92dk0jophvsmrbC7foGpkap+e+QLVZ0BNHIuTnDr1zaJ8FDhO1v1NGDlFe7nH9PzuKBbc/tZburkyZCYfwMvAxXAUOAt4G1vhjJ1+3ZNIYCNXzcNJio8lMcuymZ98QFe/DbP6Tim/uWLyAMi0sa93Y9rIqpxQKPIMHqlN7EFlAJUVZVy94fLiI4I5cERWU7HMX7Ak4I9WlWnAaKqG1X1YWCYd2OZuszIKaRVYjTtU+wGmGk4gzKTGd0rjZdnrCPHWs4Fmt8AKcBHwCT342sdTRTkBmcms3JbCTv3lzkdxdSz/87dyIKNu3nggixS46KcjmP8gCcFe6mIhABrReRmERkF2G1dB5WWVzInbydDO6ZaO0fT4O4/P4u4qDDu+WgZVVXWmz1QqOpuVb1VVXupak9V/b2q2gBqBw1yt3ecnWd32QPJ1j2HeOqLNQzOTObiXmlOxzF+wpOC/TYgBrgV6A1cCVzjzVDm2Oat38Wh8kob82YckdgoggcuyGLRpj28/eNGp+OYkyQik4+1OZ0vmGWnJZAQHW7DYgKIqnLfpOUo8PiobLvpZjxW55RkVZ0PICKqqvbxqA+YvqaQyLAQBrS3do7GGaN6pvHJkm089eUahnVKpVVijNORzIkbAGwG3gPmAlZB+IjQEFfb3tl5xaiqFXcB4OMlW5mRU8RDI7LsummOiyddYgaIyCpgtfvr7iLykteTmaOakVPIwPZJRIWHOh3FBCkR4fHR2Qhwz0fLUbWhMX6sGXAv0BX4G3AWUKyqM1V1pqPJDIMyUti+t5R1RbaOlb8r3l/Go5+uold6Y64e0MbpOMbPeDIk5v8B5wA7AVR1KXCaN0OZo1tffIANOw9adxjjuLTG0dx9Xmdm5xUzYcFmp+OYE6Sqlar6papeA/QH8oAZInKLw9EMromnAN/ZsBi/98inqzhQVslTF3cjNMQ+LTHHx5OCHVWt+dPYmjA7ZPqRdo42ft34gCv6ptOvbSJ/+Xw1O/aWOh3HnCARiRSR0cB/gZuAv+PqFmMc1ioxhjZJMVaw+7lvVhXw6dJt3Dwsg8ymcU7HMX7Ik4J9s4gMBFREIkTkTtzDY0zDm5FTSEZqrI19Mz4hJER46uJulFdWcf/HNjTGH4nIm8D3QC/gEVU9RVX/rKpbHY5m3AZnpvBj/k7KKuxemT8qKS3n/o9X0LFpHDcOae90HOOnPCnYb8R1xyUN2AL0AH7nyYuLyHARyRGRPBG5u5bnI0Xkfffzc0WkTbXn7nHvzxGRc6rtf0NECkVkRY3XShSRqSKy1v1nE08y+pMDZRXMzd/F0I4pTkcx5idtkhtx59kd+WZ1IZOXbnM6jjl+VwEdgN8D34tIiXvbJyIlDmczwOkdUzh4uJL5663Lpj968os1FO4r5akx3YgI82hggzG/UOffHFUtVtUrVLWpqqaq6pXA1XWdJyKhwIvAuUAWMFZEai7ndR2wW1UzgOeBp9znZgGXAV2A4cBL7tcD+I97X013A9NUNROY5v46oHy3tojDlVU2ft34nGtPbUuPVo155NNVtsiLn1HVEFWNc2/x1bY4VY13Op+BAe2TiAgNYUZOodNRzHH6MX8n787dxHWDXNdIY07Uif6qd7sHx/QF8lQ1X1UPA+OBkTWOGQm86X48EThDXH2rRgLjVbVMVdfjmgTVF0BVZwG7avl+1V/rTeCi43g/fmHqqkISosPp2ybR6SjG/ExoiPDXMd3YV1rOQ5NXOh3HmIASExFGv3aJzMgtcjqKOQ4HD1fwx4nLSE+M4fazOjodx/i5Ey3YPZnenIart+8RW9z7aj1GVSuAvUCSh+fW1FRVt7tfazsBthprRWUV09cUMKxTKmGh9pGa8T0dmsZx67BMPlu2na9W7nA6jjEB5fSOqeQV7mfzroNORzEeeuqLNWzadZCnx3QjOsLaMJuTc6KVnyczy2or6mued7RjPDn3hIjIOBFZICILior8527Fok172H2wnDM7N3U6ijFHdePp7encPJ77P17B3oPlTscxJmCc7p67ZHfZ/cP364p584eNXHtqG/q1s0UOzck7asF+ZMJRLds+oIUHr70FaFXt65ZAzRlpPx0jImFAAq7hLp6cW1OBiDR3v1ZzoNbBfqr6mqr2UdU+KSn+M3lz6qodRISGMMQmnBofFh4awtNjurHrwGEe+cyGxhhTX9olN6JVYjQzbRy7zztQ5hoK0yYphj+e08npOCZAHLVgr2UCUvWJSGEevPZ8IFNE2opIBK5JpJNrHDMZuMb9eAwwXV194SYDl7m7yLQFMoF5dXy/6q91DfCJBxn9gqoydVUB/dsnERvpyX96Y5zTNS2B353eno8WbeVrGxpjTL0QEU7vkMqcvJ2Ullt7R1/2xBer2brnEM9c0t2Gwph647XB0O4x6TcDX+Hq2z5BVVeKyKMicqH7sNeBJBHJwzWR9W73uSuBCcAq4EvgJlWtBBCR94AfgI4iskVErnO/1pPAWSKyFtfS2k966701tHVFrtVNz+ocUMPyTQC7ZVgmWc3juXfScnYdOOx0HONFHrTvTReRb0VksYgsE5Hz3PvDReRNEVkuIqtF5J6GT+9fhnZK4VB5JfM31NZ3wfiC2WuL+e+Pm7h+UFv6WIMIU4+8ertWVacAU2rse7Da41LgkqOc+xjwWC37xx7l+J3AGSeT11dNXVUAwJlZNn7d+IeIsBCe+1V3Rrwwm/s/Xs6Ll/fC1QDKBJJq7XvPwjWUcb6ITFbVVdUOux/XDZuX3S17pwBtcF37I1U1W0RigFUi8p6qbmjQN+FHBrRLJiIshBk5RQzOtOGRvmZfaTl/+nAZ7VIaccfZ1hXG1C9rN+IHvlldQNe0eJonRDsdxRiPdWoWzx/O6sCU5TtsQaXA5Un7XgWO9HNP4H/zkRRo5J6/FA0cBmyhpmOIjgilX9tE68fuox6fsobte11DYaLCbSiMqV9WsPu4on1lLNq0m7M6N3M6ijHHbdzgdvRMb8yDn6ykoKTU6Tim/nnSgvdh4EoR2YLr7vot7v0TgQPAdmAT8Iyq2liPOgztmMq6ogPW3tHHzMot4r15m7jhtHb0Sg+4hdaND7CC3cd9u6YQVTgzy8avG/8TFhrCs5d0p6yikj99uAzXnHITQDxpwTsW+I+qtgTOA94WkRBcd+crcXUdawvcISLtfvEN/LQVr7f81N7R7rL7jL0HXUNhMlJj+cOZHZyOYwKUFew+7quVO0hrHE1Wc1sh3Pindimx3D28EzNyinh//ua6TzD+xJMWvNfhaiKAqv4ARAHJwOXAl6parqqFwBygT81v4K+teL2lbXIj0hNjmJFjv7z4ivs/WUHRvjKeu9SGwhjvsYLdh5WUlvPd2mLO7drMJuwZv3b1gDYMbJ/Enz9bZR/lBxZP2vduwt0QQEQ64yrYi9z7h4lLI6A/sKbBkvspEWFoxxTmrCvm0GFr7+i0T5Zs5dOl27jtzEy6tWzsdBwTwKxg92HTVxdyuLKKc7ObOx3FmJMSEiL8dUw3RIQ7P1hKZZUNjQkEHrbvvQO4QUSWAu8Bv3avt/EiEAuswFX4/1tVlzX4m/BDZ2Y1pbS8ijl5xU5HCWpb9xzi/o9X0Kd1E357eobTcUyAs1V4fNiU5dtpFh9Fz1b2W7vxfy2bxPDQiCzumriMV2et43f2Ay4geNC+dxVwai3n7ecobX3NsfVrm0RcZBjfrC6wdr8OqapS7piwhKoq5flf9SA0xD4FN95ld9h91P6yCmbkFjG8azNC7EJgAsSY3i05P7s5z32dy9LNe5yOY4xfiggLYUjHFL5ZXUiVfVrliH/NzufH/F08fGEXWiXGOB3HBAEr2H3Ut2sKOVxRxbldrZ2jCRwiwuOjskmNi+S295dwoKzC6UjG+KWzsppSvL+MJVvsF9+GtmpbCU9/lcPwLs0Y07ul03FMkLCC3Ud9uWIHybGRtrSxCTgJMeE896sebNh5gEc+Xel0HGP80ukdUgkNEb5xr4RtGkZpeSW3vb+YJjERPD462xpCmAZjBbsPOnS4kulrChnetamNizMBqX+7JH53ensmLNjClOXbnY5jjN9JiAmnX9tEvlltBXtDevKLNeQW7OfpS7qT2CjC6TgmiFjB7oNm5hZyqLySc7tadxgTuG47swPdWzXm7g+XsW3PIafjGON3zuzclNyC/WzcecDpKEFh6iDT62sAAB4zSURBVKoC/vP9Bn49sA1DOtiaAKZh/f/27jy+ivLs//jnIglJ2MIWSAhLAkQgRHYQ3KtWwSqI1bJoi5a61N2u8PSx+rO1tXZxqai11WoVwV35URQVVCrKEhYh7JE17BC2EMh27uePM9g0DZBAkjnL9/16nVfOmXPP5LoyOXeuzNxzjwr2EPTP5Tto4R09EYlUcTENeHxUH8oDjnteXaqpHkVq6JIewRliPtSwmDq3bf8RfvrGl2SnNWPi5d39DkeikAr2EHO4uIyPVu5k2JmpxMZo90hkS2/dmAeG92TBhgKe/iTP73BEwkrHVo3o1raphsXUsbLyAPdMXUppWYA/j+lHfKzuZir1TxVhiPlg5Q6OlJZzVZ80v0MRqRfX9G/Plb3b8acP1zJ//V6/wxEJK9/MasvCjfvYX1TidygR64lZ61iwsYCHRp5JRuvGfocjUUoFe4h5d+k20ponMqBTC79DEakXwakes+nUqjF3TlnCnsJiv0MSCRuXZLWlPOCYtWqX36FEpM/z9vDnj/O4pn97ruqrA2niHxXsIWRPYTH/WreH4X3a6WZJElWaJsQxaWw/Dhwp5V6NZxeptt7tk2iXlMB7uTv8DiXi7Cks5u5Xl5LRujEPjujpdzgS5VSwh5B/LttOecAxok87v0MRqXdZ7ZrxwPCe/GvdHiZ9rPHsItVhZgzNTmXOut0cOlrqdzgRIxBw/Oi1LzlwpJRJY/vRqGGs3yFJlFPBHkLeWbqV7ilN6Z7SzO9QRHwxemAHrurTjsc+WsvneXv8DkckLHyrVwolZQFmr9awmNry+Kx1zFm7m/uvzKJHqv4mi/9UsIeITXsPs2TzfkboYlOJYmb29YVdd01dyq5DR/0OSSTk9e3QgrbN4nUTslry8epdPD5rHd/u156xgzr6HY4IoII9ZLy7dBsAwzUcRqJc4/hYnrquP4XFpdw1ZQll5QG/QxIJaQ0aGMOyU/lkzW4OF5f5HU5Y21JQxD2vLiUrtRkPjczGTNeTSWhQwR4CAgHH64u2MKRzK9KaJ/odjojvuqU05Tcjz2Te+gJ+M2O13+GIhLzLz0ylWMNiTsvR0nJufXkRzjmeub4/CXGab11Chwr2EDBv/V62FBxh1MAOfociEjKu7teeG85O5/m5G3hrcb7f4YiEtP6dWpDcNJ73cjUs5lQ457jvnVxWbDvIY6P70LFVI79DEvkPKthDwKs5W2iWEMvQ7BS/QxEJKb/4Vg8Gd27JxLeWszz/gN/hiISsmAbG0J4pzF69i6ISDYupqSkLtvD6onzuuqgrF3Vv63c4Iv+lTgt2MxtqZmvMLM/MJlTxfryZveq9P9/M0iu8N9FbvsbMLjvZNs3sBTPbYGZLvUefusytthwoKuW93B1c1TdNp99EKomLacCksf1o3SSeW17K0U2VRE7gW71SOVoa4CPdRKlG5q/fy/3TcrngjGTuvuQMv8MRqVKdFexmFgNMAoYBWcAYM8uq1Gw8sM851xV4FPidt24WMBroCQwFnjKzmGps86fOuT7eY2ld5Vab3lm6lZKyAN8ZoOEwIlVp1SSev3y3P3sPl3D75MWU6iJUkSoNSm9JalIC7yzZ6ncoYWNLQRE/nLyYDi0b8cSYvsTopoUSouryCPsgIM85t945VwJMBUZUajMCeNF7/gZwsQUvyR4BTHXOFTvnNgB53vaqs82w4Zxj6sItZKc1Izstye9wREJWdloSD3/7TOZvKOBX01f6HY5ISGrQwBjepx2frt3NXp2NOqnC4jJ+8GIO5QHHc+MGkpQY53dIIsdVlwV7GrClwut8b1mVbZxzZcABoNUJ1j3ZNh8ys2Vm9qiZxddGEnXpy/wDrNp+kFE6ui5yUiP7tuem8zL4xxeb+PvcDX6HIxKSRvZNozzg+KfmZD+h8oDjnqlLyNtdyKSx/cho3djvkEROqC4L9qrOK7lqtqnpcoCJQHdgINAS+HmVQZndbGY5Zpaze/fuqprUmxc/30iT+Fiu6qubJYlUx4RhPfhmVlt+NX0ls1bt9DsckZDTPaUZ3VOa8raGxZzQ72eu4aNVu7j/yizOzWztdzgiJ1WXBXs+UPHQcXtg2/HamFkskAQUnGDd427TObfdBRUDfyc4fOa/OOeedc4NcM4NSE5OPsXUTt+uQ0eZvmwb1/RvT9MEnYYTqY6YBsbjo/vQs10Sd05ZQu5WzRwjUtlVfdNYsnk/G/cc9juUkPTawi088+lXXHdWR747uJPf4YhUS10W7AuBTDPLMLOGBC8inVapzTRgnPf8GmC2c855y0d7s8hkAJnAghNt08xSva8GXAXk1mFup+2V+ZspLXd8b4g6C5GaaNQwlufGDaB5YhzjX1zI9gNH/A5JJKQM790Os+CkBvKfPlmzi4lvL+e8zNY8MLyn7mQqYaPOCnZvTPodwExgFfCac26FmT1oZsO9Zs8BrcwsD/gRMMFbdwXwGrASeB+43TlXfrxtetuabGbLgeVAa+DXdZXb6SopCzB5/mYu7JZM5+QmfocjEnbaNEvguRsGcri4nPEv5FCo27GLfK1d80QGZ7TircVbCQQqj0SNXsvzD3Db5MV0a9uUp6/vT1yMbkUj4aNOf1udczOcc2c457o45x7ylv3SOTfNe37UOXetc66rc26Qc259hXUf8tbr5px770Tb9JZf5Jw70zmX7Zy73jlXWJe5nY4Zy7ez+1AxN5yd7ncoImGrR2oznhzblzU7D3HrS4soLiv3OySRkDFqYAc2FxTxxfq9focSErYUFHHjCwtp0aghL9w4kCbxsX6HJFIj+veyngUCjqc/+YqubZpwfqZ/Y+hFIsGF3drwyLd78VneHu59dSnlOpooAsDQ7BSSEuOYsmCz36H4bt/hEsb9fQGl5QFe/P5A2jRL8DskkRpTwV7PZq/exZqdh7jtwi400A0aRE7bt/u353+/1YMZy3dw37u5BC+DEYluCXExjOybxgcrdlJwuMTvcHxz6GgpN7ywkPx9R3hu3AC6tmnqd0gip0QFez1yzjHpkzzat0jkyt7t/A5HJGL84LzO3HZhF16Zv5k/frDW73BEQsKYQR0pKQ/w1uJ8v0PxxZGScsa/mMOKrQd4amw/BqS39DskkVOmgr0efbF+L0s27+eWC7roYheRWvbTy7oxZlAHnvw4j7/OWX/yFUQiXLeUpvTt2JypC7dE3Zmn4rJybnl5ETkbC3h0VB8uyWrrd0gip0VVYz1xzvHHD9bSpmk81/Zv73c4IhHHzPj1VWfyrTNTeWjGKv72LxXt9cHMhprZGjPLM7MJVbzf0cw+NrMl3p2oL6/wXi8z+8LMVpjZcjPT4OJaNmZgR/J2FZKzaZ/fodSb0vIAd76yhDlrd/Pw1b10Rlsiggr2ejJr1S4WbdrHPZecQUJcjN/hiESkmAbGY6P7MCw7hV//cxXPfbbB75AimpnFAJOAYUAWMMbMsio1+1+CU/D2JXjvjKe8dWOBl4FbnXM9gQuB0noKPWpc0TuVZgmxvDB3o9+h1IvS8gD3vrqUD1bu5IErs/jOwA4nX0kkDKhgrwflAccjM1eT0box1w7Q0XWRuhQX04AnxvRlWHYKv5q+UkV73RoE5Dnn1jvnSoCpwIhKbRzQzHuexL/veH0psMw59yWAc26vc05zc9ayRg1jGXNWR97L3U7+viK/w6lTJWUB7nhlMdOXbed/Lu/ODedk+B2SSK1RwV4P3lycz9qdhfzk0m4auy5SD44V7UN7Bot2DY+pM2nAlgqv871lFT0AXG9m+cAM4E5v+RmAM7OZZrbYzH5W18FGq3FD0jEzXvx8o9+h1JmjpeXc+vIiZq7Yyf1XZnHz+V38DkmkVql6rGMHjpTyyPur6duxOcOyU/wORyRqxMU04M9j+349POYPM9dE3YV39aCquWkr/5DHAC8459oDlwMvmVkDIBY4F7jO+zrSzC7+r29gdrOZ5ZhZzu7du2s3+ijRrnkiw7JTmLpwS0TeFfhISTk3/SOH2at38dDIbG7UkXWJQCrY69gfP1hDweESfjUiW/Oui9SzuJgGPDm2H6MHBmePue/dXN1cqXblAxUHCbfn30NejhkPvAbgnPsCSABae+t+6pzb45wrInj0vV/lb+Cce9Y5N8A5NyA5WTebO1Xjz83g0NEy3sjZcvLGYaTgcAlj/zaPz/L28Mg1vbjurE5+hyRSJ1Sw16GlW/bz8rxNfHdwJ7LTkvwORyQqxTQwfnv1mdx6QRdenreZu6cuoaQs4HdYkWIhkGlmGWbWkOBFpdMqtdkMXAxgZj0IFuy7gZlALzNr5F2AegGwst4ijzJ9O7agf6cW/PVfGyLm939LQRHXPP05K7Yd5Onr+vOdAbrAVCKXCvY6UlRSxr2vLiWlWQI/vqyb3+GIRDUzY8Kw7kwc1p3py7bz3efmsy+K7/5YW5xzZcAdBIvvVQRng1lhZg+a2XCv2Y+Bm8zsS2AKcIML2gf8iWDRvxRY7Jz7Z/1nET3uvKgrW/cf4c0IuJFS7tYDXP305+wpLGbyD85iqIacSoSL9TuASPWbGavYsOcwr9x0Fs0S4vwOR0SAWy7oQkpSAj99Yxkjn5rLczcMpEtyE7/DCmvOuRkEh7NUXPbLCs9XAuccZ92XCU7tKPXggjOS6d2hOZM+zuOa/u3DdhKED1fu5J6pS0hKjOOVH55NZtumfockUufC89Ma4t5clM/L8zZz03kZnN2ltd/hiEgFI/qkMeWmwRQWlzFy0lzm5u3xOySRemFm3HNxJvn7jvBWGB5ld87x5Ox13PxSDp2Tm/DWbeeoWJeooYK9li3ZvI+Jby9nSOdW/Gxod7/DEZEq9O/UgrdvO4fUpES+9/wCnp3zlWaQkahwYbfgUfbHPlrHkZLwmfa+qKSMO15Zwh8+WMvw3u14/dYhpCTpxrgSPVSw16KV2w5y4wsLadssnqeu6xe2pxtFokGHlo1444dDuKxnW34zYzW3vLSIA0d0o02JbGbGLy7vwfYDR8Pm/gSrdxxk+JNzmZG7nYnDuvPYqD66Y7hEHVWUtSRnYwHXPzefxLgYJo8fTIvGDf0OSUROomlCHJPG9uOXV2Qxe/UurvzzZ3y5Zb/fYYnUqUEZLRmWncLTn37FroNH/Q7nuJxzTJ6/iRFPzmV/USkvff8sbrmgC2aaIlmijwr201QecDz/2QbG/HUeSYlxTLlpMB1bNfI7LBGpJjPj++dm8OotQygrD3D105/zpw/XUloeGVPfiVRlwrDulJYHePj91X6HUqW9hcXc/spifvF2LoMyWvLe3edxbqauCZPopYL9FB0tLee95dsZ+dRcHpy+knO7tubt284mvXVjv0MTkVPQv1ML3rvnfEb0bscTs9Yx8qm5rN15yO+wROpEp1aNufn8zry1eCtz1obOHWSdc0xfto1LH53Dhyt38rOh3XjxxkEkN433OzQRX1k0X2g1YMAAl5OTU+32zjnG/X0hewuLWberkJKyAB1bNuJH3zyDEX3a6TSdSIR4P3c7v3g7l4NHS7n5/M7c/o2uNGoYWrPgmtki59wAv+OoTzXts+XEjpaWc/kT/6K4NMAH955P43h/f8d3HDjK/dNymbliJ73bJ/HINb3plqJZYCRynE6/HVp/gUKcmVEeCNCmaTxDOrfinMzWnJ+ZTEwDFeoikWRodioD0lvy2xmrmfTxV7yzZBv3XZHFZT3b6h9ziRgJcTE88u1eXPuXL7jv3Vz+eG1vX36/j5aW89c563nqk68od46Jw7oz/twMYjVxg8jXVLDX0OQfDPY7BBGpB62bxPPH7/Rm1MAO/PLdXG59eRGDMlry08u6MTC9pd/hidSKAektufOiTJ6YtY6zMloyamDHevve5QHH//9yG7+fuYat+48wLDuF/7m8Bx1a6jowkcpUsIuInMCgjJZMv/NcXlmwmT/PzuPaZ77gwm7J3HVxJv06tvA7PJHTdvfFmSzetI/73l1B5+Qmdf4P6bFC/YnZ61i/+zA9Upvxh2t7M6RLqzr9viLhTGPYNR5SRKrpSEk5L36xkWc+/Yr9RaX069icH5zXmUuz2tb76XuNYZfatLewmGuf+YLdhcW8dssQeqQ2q/Xvsb+ohNdz8nlp3iY2FxTRPaUp91ySyaVZKTTQ0FKJAqfTb9fpXxgzG2pma8wsz8wmVPF+vJm96r0/38zSK7w30Vu+xswuO9k2zSzD28Y6b5uaCF1EalViwxhuvaALc39+EQ9cmcWewhJum7yYc343m9/OWMXqHQf9DlHklLRqEs8/xg+iccNYxv51Hos2FdTKdsvKA8xZu5ufvP4lg387i4dmrCIlKYFnru/HjLvOY2h2qop1kWqosyPsZhYDrAW+CeQDC4ExzrmVFdrcBvRyzt1qZqOBkc65UWaWBUwBBgHtgI+AM7zVqtymmb0GvOWcm2pmzwBfOueePlGMOlojIqejPOD4aNVOXs/ZwidrdlMWcHRr25QLuydzwRnJDOjUkoaxdXNcREfYpS5s3HOYG19YyNb9R5gwtDs3nJ1e44L6QFEpX6zfw5x1e5iZu4O9h0toEh/LFb1S+d6QdLLa1f7Re5FwEKqzxAwC8pxz6wHMbCowAlhZoc0I4AHv+RvAkxa8RH0EMNU5VwxsMLM8b3tUtU0zWwVcBIz12rzobfeEBbuIyOmIaWBc1jOFy3qmsLewmOnLtjNzxQ6e/2wDf/l0PYlxMWSnNaNX++b0bNeMTq0a0aFlI5KbxGu2GQlJ6a0b89YPz+ZHry3lwekreXNxPjef35lvdG9Ds4S4/2hbUhZg+4EjbN1/hLxdheRuPUDu1oOs3nGQgIPGDWP4Rvc2XNm7HReckUxCXIxPWYmEv7os2NOALRVe5wNnHa+Nc67MzA4Arbzl8yqtm+Y9r2qbrYD9zrmyKtqLiNS5Vk3iGXd2OuPOTqewuIzP8/bw+Vd7WZa/n5fnbaK47N93Tm1g0CQ+lqYJcSQ2jOGxUX3ITkvyMXqRf2vRuCHP3zCQd5du4/FZ67h76lJiGhjJTeJJbBhDUUkZRSXlFBaXUfEkfYtGcWSnJXHHRZmcl9maPh2aE6epGUVqRV0W7FUdPqo8/uZ4bY63vKpP/ona/3dQZjcDNwN07Fh/01eJSPRoEh/LpT1TuLRnCgCl5QE27S1iS0ERm/YeZk9hCYeOlnLoaBnFZQESG+rIo4QWM+Oqvmlc2bsdCzcW8PlXe9m+/whHywI0ioshsWEMSYlxpLVIpH3zRNJbNyY1KUFnjkTqSF0W7PlAhwqv2wPbjtMm38xigSSg4CTrVrV8D9DczGK9o+xVfS8AnHPPAs9CcDxkzdMSEamZuJgGdG3ThK5tmvgdikiNxDQwBnduxeDOmnJRxE91ea5qIZDpzd7SEBgNTKvUZhowznt+DTDbBa+CnQaM9maRyQAygQXH26a3zsfeNvC2+W4d5iYiIiIiUi/q7Ai7Nyb9DmAmEAM875xbYWYPAjnOuWnAc8BL3kWlBQQLcLx2rxG8QLUMuN05Vw5Q1Ta9b/lzYKqZ/RpY4m1bRERERCSs6cZJmiJMRMKQpnUUEQkvIXvjJBEREREROT0q2EVEREREQpgKdhERERGREKaCXUREREQkhKlgFxEREREJYVE9S4yZ7QY2ncKqrQnerCmSRUOOEB15KsfIUTHPTs65ZD+DqW/qs08oGnKE6MgzGnKE6Mizco6n3G9HdcF+qswsJ9KnU4uGHCE68lSOkSNa8qxt0fBzi4YcITryjIYcITryrM0cNSRGRERERCSEqWAXEREREQlhKthPzbN+B1APoiFHiI48lWPkiJY8a1s0/NyiIUeIjjyjIUeIjjxrLUeNYRcRERERCWE6wi4iIiIiEsJUsNeAmQ01szVmlmdmE/yO53SYWQcz+9jMVpnZCjO721ve0sw+NLN13tcW3nIzsye83JeZWT9/M6g+M4sxsyVmNt17nWFm870cXzWzht7yeO91nvd+up9xV5eZNTezN8xstbc/h0TofrzX+13NNbMpZpYQ7vvSzJ43s11mllthWY33nZmN89qvM7NxfuQSqiKl31afHb6f86pEQ78diX02+Ndvq2CvJjOLASYBw4AsYIyZZfkb1WkpA37snOsBDAZu9/KZAMxyzmUCs7zXEMw703vcDDxd/yGfsruBVRVe/w541MtxHzDeWz4e2Oec6wo86rULB48D7zvnugO9CeYaUfvRzNKAu4ABzrlsIAYYTfjvyxeAoZWW1WjfmVlL4H7gLGAQcP+xPxbRLsL6bfXZ4fs5r0pE99sR3GeDX/22c06PajyAIcDMCq8nAhP9jqsW83sX+CawBkj1lqUCa7znfwHGVGj/dbtQfgDtvQ/PRcB0wAjexCC28n4FZgJDvOexXjvzO4eT5NcM2FA5zgjcj2nAFqClt2+mA5dFwr4E0oHcU913wBjgLxWW/0e7aH5Ecr+tPju8PueVcoz4fjuS+2wvxnrvt3WEvfqO/fIdk+8tC3veqae+wHygrXNuO4D3tY3XLFzzfwz4GRDwXrcC9jvnyrzXFfP4Okfv/QNe+1DWGdgN/N07hfw3M2tMhO1H59xW4A/AZmA7wX2ziMjal8fUdN+F5T6tJxH5s1GfHfaf84jvt6Osz4Z66LdVsFefVbEs7KfYMbMmwJvAPc65gydqWsWykM7fzK4AdjnnFlVcXEVTV433QlUs0A942jnXFzjMv0/FVSUcc8Q7VTgCyADaAY0JnmqsLJz35ckcL6dIzLW2RNzPRn02EP6f84jvt9Vnf63W+m0V7NWXD3So8Lo9sM2nWGqFmcUR7PgnO+fe8hbvNLNU7/1UYJe3PBzzPwcYbmYbgakET7E+BjQ3s1ivTcU8vs7Rez8JKKjPgE9BPpDvnJvvvX6D4B+CSNqPAJcAG5xzu51zpcBbwNlE1r48pqb7Llz3aX2IqJ+N+mwgMj7n0dBvR1OfDfXQb6tgr76FQKZ3hXNDghdPTPM5plNmZgY8B6xyzv2pwlvTgGNXK48jOE7y2PLveVc8DwYOHDv9E6qccxOdc+2dc+kE99ds59x1wMfANV6zyjkey/0ar31I/4fvnNsBbDGzbt6ii4GVRNB+9GwGBptZI+9391ieEbMvK6jpvpsJXGpmLbyjWpd6yySC+m312ZHzOY+Sfjua+myoj37b74H74fQALgfWAl8Bv/A7ntPM5VyCp1+WAUu9x+UEx4zNAtZ5X1t67Y3gbAtfAcsJXvntex41yPdCYLr3vDOwAMgDXgfiveUJ3us87/3Ofsddzdz6ADnevnwHaBGJ+xH4f8BqIBd4CYgP930JTCE4vrOU4BGX8aey74Dve7nmATf6nVcoPSKl31afHb6f8+PkF/H9diT22V6svvTbutOpiIiIiEgI05AYEREREZEQpoJdRERERCSEqWAXEREREQlhKthFREREREKYCnYRERERkRCmgl2impkVel/TzWxsLW/7fyq9/rw2ty8iEo3Ub0s0UsEuEpQO1KjjN7OYkzT5j47fOXd2DWMSEZHjS0f9tkQJFewiQQ8D55nZUjO718xizOz3ZrbQzJaZ2S0AZnahmX1sZq8QvAkCZvaOmS0ysxVmdrO37GEg0dveZG/ZsaNC5m0718yWm9moCtv+xMzeMLPVZjbZu0McZvawma30YvlDvf90RERCj/ptiRqxfgcgEiImAD9xzl0B4HXgB5xzA80sHphrZh94bQcB2c65Dd7r7zvnCswsEVhoZm865yaY2R3OuT5VfK+rCd7lrjfQ2ltnjvdeX6AnsA2YC5xjZiuBkUB355wzs+a1nr2ISPhRvy1RQ0fYRap2KfA9M1sKzCd42+FM770FFTp9gLvM7EtgHtChQrvjOReY4pwrd87tBD4FBlbYdr5zLkDw1uPpwEHgKPA3M7saKDrt7EREIo/6bYlYKthFqmbAnc65Pt4jwzl37EjN4a8bmV0IXAIMcc71BpYACdXY9vEUV3heDsQ658oIHh16E7gKeL9GmYiIRAf12xKxVLCLBB0CmlZ4PRP4oZnFAZjZGWbWuIr1koB9zrkiM+sODK7wXumx9SuZA4zyxlsmA+cDC44XmJk1AZKcczOAewielhURiXbqtyVqaAy7SNAyoMw7RfoC8DjB05qLvQuIdhM8SlLZ+8CtZrYMWEPw9OoxzwLLzGyxc+66CsvfBoYAXwIO+Jlzbof3h6MqTYF3zSyB4FGee08tRRGRiKJ+W6KGOef8jkFERERERI5DQ2JEREREREKYCnYRERERkRCmgl1EREREJISpYBcRERERCWEq2EVEREREQpgKdhERERGREKaCXUREREQkhKlgFxEREREJYf8Hk1/hnkimrswAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learn.recorder.plot_lr(show_moms=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

plot_metrics[source]

\n", "\n", "> plot_metrics()\n", "\n", "Plot metrics collected during training. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Recorder.plot_metrics)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that metrics are only collected at the end of each epoch, so you'll need to train at least two epochs to have anything to show here." ] }, { "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_metrics()" ] }, { "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. Refer to [`Callback`](/callback.html#Callback) for more details." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

on_backward_begin[source]

\n", "\n", "> on_backward_begin(**`smooth_loss`**:`Tensor`, **\\*\\*`kwargs`**:`Any`)\n", "\n", "Record the loss before any other callback has a chance to modify it. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Recorder.on_backward_begin)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

on_batch_begin[source]

\n", "\n", "> on_batch_begin(**`train`**, **\\*\\*`kwargs`**:`Any`)\n", "\n", "Record learning rate and momentum at beginning of batch. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Recorder.on_batch_begin)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

on_epoch_end[source]

\n", "\n", "> on_epoch_end(**`epoch`**:`int`, **`num_batch`**:`int`, **`smooth_loss`**:`Tensor`, **`last_metrics`**=***`typing.Collection[typing.Union[torch.Tensor, numbers.Number]]`***, **\\*\\*`kwargs`**:`Any`) → `bool`\n", "\n", "Save epoch info: num_batch, smooth_loss, metrics. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Recorder.on_epoch_end)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

on_train_begin[source]

\n", "\n", "> on_train_begin(**`pbar`**:`PBar`, **`metrics_names`**:`StrList`, **\\*\\*`kwargs`**:`Any`)\n", "\n", "Initialize recording status at beginning of training. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Recorder.on_train_begin)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Inner functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following functions are used along the way by the [`Recorder`](/basic_train.html#Recorder) or can be called by other callbacks." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

add_metrics[source]

\n", "\n", "> add_metrics(**`metrics`**)\n", "\n", "Add `metrics` to the inner stats. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Recorder.add_metrics)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

add_metric_names[source]

\n", "\n", "> add_metric_names(**`names`**)\n", "\n", "Add `names` to the inner metric names. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Recorder.add_metric_names)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

format_stats[source]

\n", "\n", "> format_stats(**`stats`**:`MetricsList`)\n", "\n", "Format stats before printing. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Recorder.format_stats)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Module functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Generally you'll want to use a [`Learner`](/basic_train.html#Learner) to train your model, since they provide a lot of functionality and make things easier. However, for ultimate flexibility, you can call the same underlying functions that [`Learner`](/basic_train.html#Learner) calls behind the scenes:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

fit[source]

\n", "\n", "> fit(**`epochs`**:`int`, **`model`**:[`Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module), **`loss_func`**:`LossFunction`, **`opt`**:[`Optimizer`](https://pytorch.org/docs/stable/optim.html#torch.optim.Optimizer), **`data`**:[`DataBunch`](/basic_data.html#DataBunch), **`callbacks`**:`Optional`\\[`Collection`\\[[`Callback`](/callback.html#Callback)\\]\\]=***`None`***, **`metrics`**:`OptMetrics`=***`None`***)\n", "\n", "Fit the `model` on `data` and learn using `loss_func` and `opt`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(fit)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that you have to create the `Optimizer` yourself if you call this function, whereas [`Learn.fit`](/basic_train.html#fit) creates it for you automatically." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

train_epoch[source]

\n", "\n", "> train_epoch(**`model`**:[`Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module), **`dl`**:[`DataLoader`](https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader), **`opt`**:[`Optimizer`](https://pytorch.org/docs/stable/optim.html#torch.optim.Optimizer), **`loss_func`**:`LossFunction`)\n", "\n", "Simple training of `model` for 1 epoch of `dl` using optim `opt` and loss function `loss_func`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(train_epoch)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You won't generally need to call this yourself - it's what [`fit`](/basic_train.html#fit) calls for each epoch." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

validate[source]

\n", "\n", "> validate(**`model`**:[`Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module), **`dl`**:[`DataLoader`](https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader), **`loss_func`**:`OptLossFunc`=***`None`***, **`cb_handler`**:`Optional`\\[[`CallbackHandler`](/callback.html#CallbackHandler)\\]=***`None`***, **`pbar`**:`Union`\\[`MasterBar`, `ProgressBar`, `NoneType`\\]=***`None`***, **`average`**=***`True`***, **`n_batch`**:`Optional`\\[`int`\\]=***`None`***) → `Iterator`\\[`Tuple`\\[`IntOrTensor`, `Ellipsis`\\]\\]\n", "\n", "Calculate `loss_func` of `model` on `dl` in evaluation mode. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(validate)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is what [`fit`](/basic_train.html#fit) calls after each epoch. You can call it if you want to run inference on a [`DataLoader`](https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader) manually." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

get_preds[source]

\n", "\n", "> get_preds(**`model`**:[`Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module), **`dl`**:[`DataLoader`](https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader), **`pbar`**:`Union`\\[`MasterBar`, `ProgressBar`, `NoneType`\\]=***`None`***, **`cb_handler`**:`Optional`\\[[`CallbackHandler`](/callback.html#CallbackHandler)\\]=***`None`***, **`activ`**:[`Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module)=***`None`***, **`loss_func`**:`OptLossFunc`=***`None`***, **`n_batch`**:`Optional`\\[`int`\\]=***`None`***) → `List`\\[`Tensor`\\]\n", "\n", "Tuple of predictions and targets, and optional losses (if `loss_func`) using `dl`, max batches `n_batch`. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(get_preds)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

loss_batch[source]

\n", "\n", "> loss_batch(**`model`**:[`Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module), **`xb`**:`Tensor`, **`yb`**:`Tensor`, **`loss_func`**:`OptLossFunc`=***`None`***, **`opt`**:`OptOptimizer`=***`None`***, **`cb_handler`**:`Optional`\\[[`CallbackHandler`](/callback.html#CallbackHandler)\\]=***`None`***) → `Tuple`\\[`Union`\\[`Tensor`, `int`, `float`, `str`\\]\\]\n", "\n", "Calculate loss and metrics for a batch, call out to callbacks as necessary. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(loss_batch)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You won't generally need to call this yourself - it's what [`fit`](/basic_train.html#fit) and [`validate`](/basic_train.html#validate) call for each batch. It only does a backward pass if you set `opt`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Other classes" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class LearnerCallback[source]

\n", "\n", "> LearnerCallback(**`learn`**) :: [`Callback`](/callback.html#Callback)\n", "\n", "Base class for creating callbacks for a [`Learner`](/basic_train.html#Learner). \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(LearnerCallback, title_level=3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

class RecordOnCPU[source]

\n", "\n", "> RecordOnCPU() :: [`Callback`](/callback.html#Callback)\n", "\n", "Store the `input` and `target` going through the model on the CPU. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(RecordOnCPU, title_level=3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Undocumented Methods - Methods moved below this line will intentionally be hidden" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

_tta_only[source]

\n", "\n", "> _tta_only(**`learn`**:[`Learner`](/basic_train.html#Learner), **`ds_type`**:[`DatasetType`](/basic_data.html#DatasetType)=***``***, **`scale`**:`float`=***`1.35`***) → `Iterator`\\[`List`\\[`Tensor`\\]\\]\n", "\n", "Computes the outputs for several augmented inputs for TTA \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.tta_only)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

_TTA[source]

\n", "\n", "> _TTA(**`learn`**:[`Learner`](/basic_train.html#Learner), **`beta`**:`float`=***`0.4`***, **`scale`**:`float`=***`1.35`***, **`ds_type`**:[`DatasetType`](/basic_data.html#DatasetType)=***``***, **`with_loss`**:`bool`=***`False`***) → `Tensors`\n", "\n", "Applies TTA to predict on `ds_type` dataset. \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(Learner.TTA)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/markdown": [ "

on_batch_begin[source]

\n", "\n", "> on_batch_begin(**`last_input`**, **`last_target`**, **\\*\\*`kwargs`**)\n", "\n", "Set HP before the step is done. Returns xb, yb (which can allow us to modify the input at that step if needed). \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_doc(RecordOnCPU.on_batch_begin)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## New Methods - Please document or move to the undocumented section" ] } ], "metadata": { "jekyll": { "keywords": "fastai", "summary": "Learner class and training loop", "title": "basic_train" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 2 }