"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# %load ../code_lightningmodule/logger_csv_plot_basic.py\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"\n",
"\n",
"metrics = pd.read_csv(f\"{trainer.logger.log_dir}/metrics.csv\")\n",
"\n",
"aggreg_metrics = []\n",
"agg_col = \"epoch\"\n",
"for i, dfg in metrics.groupby(agg_col):\n",
" agg = dict(dfg.mean())\n",
" agg[agg_col] = i\n",
" aggreg_metrics.append(agg)\n",
"\n",
"df_metrics = pd.DataFrame(aggreg_metrics)\n",
"df_metrics[[\"train_loss\", \"valid_loss\"]].plot(\n",
" grid=True, legend=True, xlabel=\"Epoch\", ylabel=\"Loss\"\n",
")\n",
"df_metrics[[\"train_acc\", \"valid_acc\"]].plot(\n",
" grid=True, legend=True, xlabel=\"Epoch\", ylabel=\"ACC\"\n",
")\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "2dcb96f0",
"metadata": {},
"source": [
"- The `trainer` automatically saves the model with the best validation accuracy automatically for us, we which we can load from the checkpoint via the `ckpt_path='best'` argument; below we use the `trainer` instance to evaluate the best model on the test set:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "4ee52559",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Restoring states from the checkpoint path at logs/my-model/version_1/checkpoints/epoch=15-step=6863.ckpt\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
"Loaded model weights from checkpoint at logs/my-model/version_1/checkpoints/epoch=15-step=6863.ckpt\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "ac4f3c84e20a4fc38e24dfcb7e521c60",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Testing: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃ Test metric ┃ DataLoader 0 ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│ test_acc │ 0.9865000247955322 │\n",
"└───────────────────────────┴───────────────────────────┘\n",
"\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
"│\u001b[36m \u001b[0m\u001b[36m test_acc \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.9865000247955322 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[{'test_acc': 0.9865000247955322}]"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"trainer.test(model=lightning_model, datamodule=data_module, ckpt_path='best')"
]
},
{
"cell_type": "markdown",
"id": "225cce7c",
"metadata": {},
"source": [
"## Predicting labels of new data"
]
},
{
"cell_type": "markdown",
"id": "7334a256",
"metadata": {},
"source": [
"- We can use the `trainer.predict` method either on a new `DataLoader` (`trainer.predict(dataloaders=...)`) or `DataModule` (`trainer.predict(datamodule=...)`) to apply the model to new data.\n",
"- Alternatively, we can also manually load the best model from a checkpoint as shown below:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "d29621f0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"logs/my-model/version_1/checkpoints/epoch=15-step=6863.ckpt\n"
]
}
],
"source": [
"path = trainer.checkpoint_callback.best_model_path\n",
"print(path)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "b06512b7",
"metadata": {},
"outputs": [],
"source": [
"lightning_model = LightningModel.load_from_checkpoint(path, model=pytorch_model)\n",
"lightning_model.eval();"
]
},
{
"cell_type": "markdown",
"id": "0c5b0803",
"metadata": {},
"source": [
"- For simplicity, we reused our existing `pytorch_model` above. However, we could also reinitialize the `pytorch_model`, and the `.load_from_checkpoint` method would load the corresponding model weights for us from the checkpoint file.\n",
"- Now, below is an example applying the model manually. Here, pretend that the `test_dataloader` is a new data loader."
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "c0d62c53",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([1, 2, 3, 4, 5])"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# %load ../code_lightningmodule/datamodule_testloader.py\n",
"test_dataloader = data_module.test_dataloader()\n",
"acc = torchmetrics.Accuracy()\n",
"\n",
"for batch in test_dataloader:\n",
" features, true_labels = batch\n",
"\n",
" with torch.no_grad():\n",
" logits = lightning_model(features)\n",
"\n",
" predicted_labels = torch.argmax(logits, dim=1)\n",
" acc(predicted_labels, true_labels)\n",
"\n",
"predicted_labels[:5]\n"
]
},
{
"cell_type": "markdown",
"id": "e50fa7b1",
"metadata": {},
"source": [
"- As an internal check, if the model was loaded correctly, the test accuracy below should be identical to the test accuracy we saw earlier in the previous section."
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "018e99a8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Test accuracy: 0.9865 (98.65%)\n"
]
}
],
"source": [
"test_acc = acc.compute()\n",
"print(f'Test accuracy: {test_acc:.4f} ({test_acc*100:.2f}%)')"
]
},
{
"cell_type": "markdown",
"id": "e764010a",
"metadata": {},
"source": [
"## Inspecting Failure Cases"
]
},
{
"cell_type": "markdown",
"id": "1ba517ab",
"metadata": {},
"source": [
"- In practice, it is often informative to look at failure cases like wrong predictions for particular training instances as it can give us some insights into the model behavior and dataset.\n",
"- Inspecting failure cases can sometimes reveal interesting patterns and even highlight dataset and labeling issues."
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "e93be369",
"metadata": {},
"outputs": [],
"source": [
"class_dict = {0: 'airplane',\n",
" 1: 'automobile',\n",
" 2: 'bird',\n",
" 3: 'cat',\n",
" 4: 'deer',\n",
" 5: 'dog',\n",
" 6: 'frog',\n",
" 7: 'horse',\n",
" 8: 'ship',\n",
" 9: 'truck'}"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "e72aa090",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# %load ../code_lightningmodule/plot_failurecases_basic.py\n",
"# Append the folder that contains the\n",
"# helper_data.py, helper_plotting.py, and helper_evaluate.py\n",
"# files so we can import from them\n",
"\n",
"import sys\n",
"\n",
"sys.path.append(\"../../pytorch_ipynb\")\n",
"\n",
"from helper_plotting import show_examples\n",
"\n",
"\n",
"show_examples(\n",
" model=lightning_model, data_loader=test_dataloader, class_dict=class_dict\n",
")\n"
]
},
{
"cell_type": "markdown",
"id": "363e4ef2",
"metadata": {},
"source": [
"- In addition to inspecting failure cases visually, it is also informative to look at which classes the model confuses the most via a confusion matrix:"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "5d3b37b8",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAATQAAAErCAYAAABQAX/RAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABK0ElEQVR4nO2dd3gU1feH30PoNYQqTaSJSBVQQJpIEaUqCn7piIBSxIJix46CXX9iBwURRVEEUURpIl1BihSliEgLvUpIzu+POxuWkLKbnSHZzX2fZ59MPXPmZvbsbXM+oqpYLBZLJJAtox2wWCwWt7ABzWKxRAw2oFkslojBBjSLxRIx2IBmsVgiBhvQLBZLxJA9ox2INCR7HpVchVy3W6dqGddteoVIRnuQOTh5OsETu7lzhE89xKtnYeXKlbGqWizpdhvQXEZyFSLX5d1dt7volxddt+kVue1TBcDqv496YvfSUgU8sesFXj0LIrI9ue3hE+otFoslDWxAs1gsEYMNaBaLJWKwAc1isUQMNqB5yOCuTVgx+T5WfjqCId2aAPDxMz1ZMvEelky8hw1fPcySifcA0OLKKiyaMJzln9zHognDaVavUtDXG9i/H+VKFadu7equ3odXdr/77jsuvfRSKlWqxOjRozO1Xa98BYiPj6dr28YM7XuzK/ay8nMQVgFNRL4VkeggzxkvIl08cilFqlUoSd9OV9Gkz6tc2f1F2jauRsWyRen58Mc06PESDXq8xFdzf+fruWsA2H/oOF3u/YD6/xvL7U98ygej/hf0NXv27sPXM75z+1Y8sRsfH8/gwYOZNWsW69evZ/Lkyaxfvz5T2vXKVx+ffPAWl1Sq4pq9rPwchFVAU9XrVfWQ/zYxZLr7qHpJcZat/ZuT/8URH5/Awl//omPzGuccc1PL2nw2+zcAVm/aya7YIwCs37KbXLmykzNHVFDXbNykKTExMe7cgMd2ly1bRqVKlahQoQI5c+akW7dufP3115nSrle+AuzZtZOFP33Pjd16u2IPsvZzkOkCgQ8R+UpEVorIOhEZ4GzbJiJFRaS8iPwhIv8H/AqUFZFjIvKiiPwqIj+KyHmT7kTkMRFZLiJrReQdETPtT0TmicjzIrJMRDaJSBNne5SIjHHO+V1EBgbq/7q/dtO4TgViCuUlT64cXHf1ZZQpEZ24/+o6Fdhz4Ch/7Yg979zOLWqyeuNOTsfFB1lq4cPOnTspW7Zs4nqZMmXYuXNnprTrla8AY54YyfCHnkSyZdqvoqe4XbaZuRT7qWpdoB4wTESKJNl/KfCRqtZR1e1APuBXVb0CmA88nozNN1S1vqpWB/IA7fz2ZVfVK4HhfufeBhxW1fpAfeB2EbkkqVERGSAiK0RkhZ45AcDGbXt58aOfmPH6QKa/dju/b/6XM/FnA9Qtrevw+fe/nefgZRVK8PSQGxjy3NS0yiesSS6xqLgwrdwLu175uuDHWRQuUpRqNeqEbCtccbtsM/Oc7mEi0tlZLgtUTrJ/u6ou8VtPAKY4yxOBL5OxeY2I3A/kBWKAdcA3zj7f8SuB8s5ya6CmXx9cIcePrf5GVfUd4B2AbPlKJv6HJkxfxoTpywB44o627Nx7GICoqGx0bF6Dq3u/fI5zpYsXYsoLfek/ajJbd+5Pxv3IoUyZMuzYsSNx/Z9//qFUqVKZ0q5Xvq5asZT5c2bx87wfOP3fKY4fPcpDd/Xn2VffC9l2uOB22WbKGpqINAdaAg1VtRbwG5A7yWHH0zBzTugXkdzA/wFdVLUG8G4Sm/85f+M5G+gFGKqqtZ3PJao6O9D7KFY4PwBlS0TT8Zqaif1lLepXZtP2vYkBDqBQ/tx8+XJ/HntzJot/3xboJcKW+vXrs3nzZrZu3crp06f59NNP6dChQ6a065Wvwx4YxeylG5i1aC2jX/+Q+o2aZqlgBu6XbaYMaJia0EFVPSEiVYEGAZyTDfDVpP4H/Jxkvy94xYpIfr9jU+N74A4RyQEgIlVEJF8A5wEw+fne/PrpCKa+dBvDx3zJoaMnAbi5dZ3E4OZj0C2NqVimCCNva5U4rcMXEAOlV49bad6kIZs2bqRi+TKM/+D9oM6/kHazZ8/OG2+8QZs2bbjsssu45ZZbuPzyyzOlXa989Yqs/BxIZhRJEZFcwFdAaWAjUAwYBYzH9KnlB2Y4fWG+c44BLwPXA4eBrqq6T0TGO8dOFZGngW7ANmAHptk6SkTmAfep6goRKQqsUNXyzujp00B7TG1tH9BJVc9WrZKQLV9J9eLl9IP25fSww76c7unL6StVtd552zNjQEsPInJMVYOr0niADWg2oPmwAe3CB7TM2uS0WCyWoImYgJYZamcWiyVjiZiAZrFYLDagWSyWiMEGNIvFEjHY8SiXueKyMqxY5v6IZJ46Q1y3CbDk6+dctxlOo3Dg3UhcrXLhUw6nzmS0B+5ga2gWiyVisAHNYrFEDDagWSyWiMEGNIvFEjHYgGaxWCIGG9AsFkvEYANaBhGs0s32H59jxecPJa7f2LIOK6c+zPGVr3FFtXKJ21tcVZVFk+5n+WcPsWjS/TSrf1Z845br6rL8s4dYNuVBvn7jTopEB5wJySoThZFClVd2w6FsM01AE5FOIlLN42uUF5G1Kex7z3d9n3aBV36kR+mm4+A3z1lf99e/dLv3XX7+9a9ztu8/dIwuw9+m/i3PcvtjH/PB070AkyV3zIguXDfgVa7s+hxrN+9kUNdmAftslYnCQ6HKS7vhULaZJqABnQBPA1pqqGp/VXVPmywV0qN0c+DwiXPWN27dw+bte887bvXGf9i1z6RrW//XLnLlzEHOHNkRARHIlycnAAXy50k8Li2sMlH4KFR5aTccytbTgJaCctMxv/1dHN3MRkAHYIyIrBKRiiJSW0SWOGpL00SksHPOPBF5WUQWOMpP9UXkSxHZ7CRw9Nm+x1F3Wisiw/3cyi4iExy7U0Ukr5/d8xPGifRw1KBWicjbIhKctlwyeKki5E/nlrVZvXEHp+POcOZMAnc9O4Xlnz3EltnPcFmFkoz/6peA7FhlovBRqPLSrheEm+pTWspNAKjqL8B0YISTu/8v4CPgAVWtCazhXBWn06raFBgHfA0MBqoDfUSkiIjUBfoCV2HSd98uIj5pnUuBdxy7R4A7U3JeRC4DugJXq2ptjN7Aedkb/VWf9u3bl2aheKUi5M9lFUry9LCODHn6UwCyZ8/G7V2a0ODW56nQ+mHWbtrJiH6t07RjlYnCS6HKS7te4LavXge0YSKyGlhC8spNySIihYBoVZ3vbJoANPU7ZLrzdw2wTlV3qep/wBbnOo2Baap6XFWPYRSdmjjn7FDVRc7yROfYlLgWqAssF5FVznqFpAep6juqWk9V6xUrdp4c6Hl4pSLko3TxaKa8NID+j37M1n+M7metKmUAEten/vArDWqddyvn4VMmant1dUYO7cvyXxbw0F39XfM1HAgnhSov7XpB2Kg+paLc5B+Skyo5BYpPoSnBb9m3nh2T/z8lkv4kpJaDXIAJfqpPl6rqqGCdTYpXKkIAhfLn4cvXB/HY69NZvHpL4vZ/9x2maoWSFHWEV65tUJWNW3enac8qE4WXQpWXdr0gnFSfUlJu2iMilzkCJJ39jj8KFABwREgO+hTMgZ4Y8eBAWQB0EpG8jkpTZ2Chs6+ciDR0lm/lfHUof34EuohIcQARiRGRi4PwI1nSo3Qzb8K9VLm4BH9+9xS9OzWkwzU1+fO7p7iqZnm+fG0Q098cDMCgbk2pWLYYI2+/jiWfjmTJpyMpVjg/u/Yd5tl3ZvHDe8NZNuVBalYpwwvvB6zI5zpZWZkoXO2GQ9l6JpKSinJTUeB5jOrSWiC/qvYRkasxWpn/YSTmCmD6yPJimpJ9VfVgEoWm5s5yO+ea/vvuAfo57rynqq+ISHngW0zAawRsBno6Qdf/3G1APVWNFZGuwIOY4B8HDE4icHwO9erV0xUrVoRQcslj0wd5hxV18S59kFV9CnNsQLMBLRyJlICWNcfhLRZLRGIDmsViiRhsQLNYLBGDDWgWiyVisAHNYrFEDHZ8x2VUvRkxOrj8DfeNAoUbDHfd5skVr7hu03KWuRv2u26zYaVk30oMmQutJmVraBaLJWKwAc1isUQMNqBZLJaIwQY0i8USMdiAZrFYIgYb0CwWS8RgA1oGkFkUj7Jng+2zn2LFlAcStxUumJcZb97Bmi8fZsabdxBdIA8ALa6qwqKP72X5p/ez6ON7aVbvbK7OUXdez+YZj7NvwfNB+RtOikfh5OvfWzdze+fmiZ929cozdcK4kO1mluc2NbJUQEtJ9clf8SmN8/uISMgTwjKL4lF8AnQc+vY52+7rcy3zlm2ixo3PMG/ZJu7r0xKA/YeO0+Xud6nf7QVuHzWJD548m4n82wXraNL75aB8DSfFo3DyFaDcJZV5d9o83p02j3FTfyRXnrw0bnlDyHYzy3ObGlkqoKVESopPbgiiJEdmUTxS4MCRc9Wk2jWrwcQZywGYOGM57ZvXAGD1xp3sij0CwPq/djtqUqZ4lq3dzu79R4LyNZwUj8LJ16T8umQBpcqWp2TpsmkfnAaZ5blNjawY0M5TffJXfBKRYyLypIgsBRqKSF8R2SQi84GrM9Z17ykeUyAxOO3ef4RiTspufzpfW4vVG//hdFx8uq8TTopH4eRrUuZ+O40WN9zoqs3MTFYMaGmpPuUD1qrqVcBfwBOYQNaKFHRDz1F9ik1b9SmcuaxCSZ4e2p4hz34Wkp1wUjwKJ1/9iTt9ml9++o5mbTKnnoAXZMWAlpbqUzzwhbN8FTBPVfep6mlgSnIGz1F9Kpq26lNmZu+Bo5QsUhCAkkUKsu9goowqpYsXYsqYfvR/fBJbd4b2PmE4KR6Fk6/+LFs4h8rVahJTtLhrNjM7WTGgpaX6dEpV41PZH9HMnL+WHu3qA9CjXX1mzF8DOGpSrwzgsTdnsHj11pCvE06KR+Hkqz8/zfwySzU3IWsGtGBUn5YCzR3x4hzAzW44kFkUj3Jkg3kf3kWVi4vz58xR9O54FWMnzKHFVZey5suHaXHVpYwd/yMAg7o2pmLZooy8rQ1LJo1gyaQRif1rzwxrz58zR5E3dw7+nDkqIF/DSfEonHz1cerkCVb+Mp8mrdq5Yg8yz3ObGllKJCUl1Sdnm0/x6Ziq5vc7py9G9WkXsAqIUtUUFUvq1q2ni5a6L5LiFTZ9UPgRTumDvCJPjuRFUrJUPjRV3UbyHfvN/Y45Z1hPVT8EPvTUMYvF4gpZsclpsVgiFBvQLBZLxGADmsViiRhsQLNYLBFDlhoUuBCIQO4wKtWDS15x3Wae+ve4bhPg5PKXPLG7fMthT+zWr1DIE7vXVHV/RNIrMZML/V2wNTSLxRIx2IBmsVgiBhvQLBZLxGADmsViiRhsQLNYLBGDDWgWiyVisAEtgwgnIY9gRSzGPdqV7d8/wYpPRyRuK1wwLzPeGMiaLx5kxhsDE8VXwOgYrP3yIVZPHUnLBpcmbv/6tQEsnXQfK6fcz2sjuwTsr1fl0LFpDW5t24ju7RrTq2NzV2yGk/iKVyIpbvpqA1oAiEhzEWnklr1wEvKA4EUsPp6xnI7D3jln2329WzBv+WZq3PQc85Zv5r7e1wJQ9ZIS3NyqDld0fZ4Ow97h1QduIls2k7W1x4MTuKr7WOp2fSHZVODJ4WU5ALw16RsmzfiZj76eF7KtcBNf8UIkxW1fbUALjOaYdEOuEE5CHhC8iMWi37YkI75SPYn4SvXE7Z//8Bun4+LZ/u8B/toRS/3LywFw9Ph/AGSPykaOHIHp1VwI4RG3CDfxFS9EUtz2NUsHNBHp5YilrBaRj0WkvYgsFZHfRGSOiJRwcqgNAu4WkVUi0iTU64aTkIdbGPGVowDs3n80scZVulgh/tlzKPG4nXsPU6rY2Rn2018bwN+zn+SYE9zSwtNyEGFon8706tCMaZPHh2wunMVX3MJtX8PoJR13EZHLgYeBq1U1VkRiMOm2G6iqikh/4H5VvVdExgHHVHWsG9cOJyEPz0nGRf9b6TDsHXLlzM74p3oEZM7Lcnjvs+8pVuIiDsTuY0jvTlxcsTJXXJl+IbBwFV9xE7d9zco1tBbAVFWNBVDVA0AZ4HsRWQOMAALKh3yO6tO+tFWfwknIwy2M+EoBAEoWKZAovrJz72HKlIhOPK508ULsij333cr/Tp9hxoLz9KGTxctyKFbiIgBiihajeet2rF/9a0j2wlV8xU3c9jUrBzThfAGU14E3VLUGMBDIHYihc1SfiqWt+hROQh5uMXPBuiTiK2ud7Wu5uVUdcuaI4uJSMVQqV4zl6/4mX56ciQEwKiob1119WUDX8aocTp44zvFjRxOXly6cS8Uqgfl0oX3N7M+CP277mmWbnMCPwDQReVlV9ztNzkKArwHf2+/Yo0BBty7sL44RHx9Pv379XBXycMumj149bmXh/HnExsZSsXwZHn3sCfr0uy3F4yc83YMmdStRNDoff854jKfe+Z6xE35k4nO96N3hKnbsOUj3kR8B8MeWPXwxZxW/ffYAZ+ITGP7CFyQkKPny5GTqS7eRM0d2oqKyMX/55gwthwOx+xhxR3fAjMy1ad+Fhs1ahmTTK1+9shvsc5ARvmYpkZSkiEhvTNMyHvgNmAa8jAlqS4D6qtpcRKoAU4EEYKiqLkzJZr169XTFivARSfEibUzhhjZ9EHiXPsgLwi19kIgVSTkPVZ0ATEiy+bwxY1XdBNS8IE5ZLJZ0k5X70CwWS4RhA5rFYokYbECzWCwRgw1oFoslYrABzWKxRAxZepQznPjnYGDvMmYGvJpekeeqEWkflA5OLh3jid0Nu457YvfoSffnWBTI400omLct7Tdn3CTFuxCRo5ydSe97uUqdZVVV1yaaWiwWixukGNBUtcCFdMRisVhCJaA+NBFpLCJ9neWiInKJt25ZLBZL8KQZ0ETkceAB4EFnU05gopdOWSwWS3oIpIbWGegAHAdQ1X8B2xy1WCyZjkAC2mk1b7ArgIjk89Yli8ViSR+BBLTPRORtIFpEbgfmAO9661bk44Uqz7//7OCWDq255qpaXNuwDu+PeyNT2vQRShkM7tqYFZ/cy8rJ9zKkW2MAHu7fir++eYQlH9/Nko/vpk2jqgDEFMzLd/83kH1zn+bl+zpdcF9T4r9Tp7jl+mZ0atmAds3r8fqYp12xC94oVLnp70fP3M+I6+vxZPc252yf+/l4Hu/Wgie7t+bLN58L2m6ak09UdayItAKOAFWAx1T1h6CvlAkQkVG4mEo7vfiUbn744QfKlClD/fr16dChA9WqVQvJblT27Dz61PPUqFWHY0ePcn2LhjRpfi1VqqY/EaEXNiG0MqhWoQR9O15Fk76vcfpMPNNf6c+sRRsAeP3Thbwyaf45x586HceTb39PtQolubxiyQvqa2rkzJWLDz+fSb58+YmLi6NHp1Y0adGa2nWvDMmuj7cmfUN0TBFXbIG7/ja8/iaad+nF+CfvTdy2ceViVi+cwyMfzSJHzlwcORAbtN1A3xRYAywEFjjLWRYRCXkGoleqPCVKXkSNWnUAyF+gAJWqVGX3rtDEMbywCaGVQdXyJVi2djsn/4sjPj6Bhb9toWOzlLUiT5yK45fV2zh1On0TUr36f4kI+fIZsZgzcXHExcVl2tz/4K6/letcRb6C0edsWzBtIm16DiJHzlwAFIwpGrTdQEY5+wPLgBuBLsASEekX9JUyCBF5WEQ2isgc4FJnW0UR+U5EVorIQhGp6mwvJiJfiMhy53O1s32UiLwjIrOBj0L16UKo8uz4exvrfl9FHZd+7d22GUoZrNuym8Z1KhBTMC95cuXgukZVKVPCJFMc1KURyybew7hHbj5HzDijfE2L+Ph4OrdsSOOal9CoaQtqXVHfFbtuK1T58MxfYO+Orfy5ejnP9+/ES3d2Zdv61UHbCKS2MQKoo6r7AUSkCPAL8EHQV7vAiEhdoBtQB3OvvwIrgXeAQaq6WUSuAv4PI5ryKvCyqv4sIuWA7wFf26ou0FhVTyZznQHAAIBy5cql6ZfXqjzHjx1jYO9bGfXsWAoUdOeFDrdthlIGG7ft5cWP5jLj9ds5fvI0v2/+lzPxCbz75WKe+2AOqvD4wDaMvqsdg57+PEN9TYuoqCimzVnMkcOHGHrbrWzasI4qVUNPl+22QpXX/gLEn4nnxJHD3P/uNLb/sZr3Hh3CU1MXBFXWgTQ5/8Hk1PdxFNiRwrGZjSbANFU9oapHgOkY4ZNGwOcisgp4G7jIOb4l8IazfTpQUER8U1SmJxfMIHiRFC9VeeLi4hjQuxudunSjbftOmdZmqGUw4ZvlNOr9Kq0GvcXBIyf4c0csew8cIyFBUVU++Hop9aql/eNyIXwNhIKFormyYRN+njvHFXtuK1QlxW1/AQoXL0md5tchIpSvVhuRbBw7dCAoGykGNBG5R0TuweTXX+o0ux7H5Nr/MyTPLyxJf16zAYdUtbbf5zK/fQ39tpdWVV8wd+1NY69UeVSVEcMGUrlKVQYMvssFT72xCaGXQbHCZvZQ2RLRdGxeg89mr0pUiQLo2Kw667fszhS+psSB/fs4cvgQAKdOnmTxwrlcUqlKyHa9UKgC7/z1Uatpazau/AWAPX9vIf5MHPmjg1NqT63J6Xs6/nI+PkLvDb1wLADGi8hozL22x9TItorIzar6uZj6bE1VXQ3MBoYAYwBEpLaqrnLbKa9UeZYv/YUvpnxC1WrVadPU9HM98OiTtGh1XaayCaGXweTRvYgplI+4M/EMHzONQ0dP8v6obtSsXApV2L7rAENHf5F4/IZpD1IgX25y5oiifbPLaTfsXTZs3XtBfE2JfXv28OBdA4hPiCchIYHr2t/INa3ahmzXC4UqcNff9x8bxqbflnDs0EEe7NiQdv2H06jdzXz8zP082b0N2XPkoNcjY4Nu2ke86pOIPAz0ArZjms/rgS+AtzBNzRzAp6r6pIgUBd7E9JtlBxao6qBgpnt4pfoUTumDyhTO5Yldmz7IYNMHwR2NLkmf6pOIFAPux6iIJwrvqmoLVz30CFV9BngmmV3nVTEcFfWuyWwf5b5nFovFbQIZFJgEbAAuAZ4AtgHLPfTJYrFY0kUgAa2Iqr4PxKnqfFXtBzTw2C+LxWIJmkAaznHO310icgPwL1DGO5csFoslfQQS0J4WkULAvcDrQEHgbk+9slgslnQQyMvpM5zFw8A13rpjsVgs6Sc1kZTXOX9SaiKqOswTjyzJ4tVUCC9Y/ffRtA9KB15Nr8jTcKQndjd/+4Qndqte5H5KwlPuzwQBoF1ub6aD3JHC9tSu5v5kKovFYvGQ1FSfJlxIRywWiyVUrHK6xWKJGGxAs1gsEYMNaBaLJWIIJGNtFRH5UUTWOus1ReQR712zWCyW4AikhvYuRmQ4DkBVf8dkgbWEgBcqQl7Y9NIumPQ2Xds2Zmjfm12zGYq/Q7s1ZuWku1kxcTgTnuhGrpzZqVn5Iua/eydLJgzj5w+GUK+aeVGmXrUyLJkwjCUThrH0o7vo0Cy4lEKZVVErJQb270e5UsWpWztl/YZgcbsMAgloeVV1WZJtHs1aubA4SSvvu9DX9akIzZo1i/Xr1zN58mTWr1+f6Wx6adfHJx+85WqSwFD8LVWsIHfe3Iir+71OvR6vEBWVjZtb1uKZwW155v05NOj9Gk+9+wPPDL4egHV/7eHqfm/QoPdrdLz7A16/vzNRUYH34vgUteYuXc3Xsxcw4f1xbNrwR7ru2x+v/mc9e/fh6xnfhWzHH7fLIJDSjxWRipwVGu4C7Er3FS2eqAh5pUzklV2APbt2svCn77mxW29X7EHo/maPykaeXDmIispGntw52BV7BFUomM9kziqUPze7Yo8AJKpOAeTKmR1NeR56smRGRa3UaNykKTExwWWQTQu3yyCQabyDMaIiVUVkJ7AV6JHuK2YwfgkfdwD7gJUiUhsYB+TFZOftp6oHRaQ+8D4m/fbPQFtVDbm+nZyK0NKlSzOdTS/tAox5YiTDH3qS48eOuWIPQvP3331HeOWThWyaNpKT/8Xx47LN/LhsM//sOcQ3r9zGc0OvJ1s24ZoBbyWeU79aWcY93IVyJaO57cnPEgNcsHitqOXW/8xL3CiDNGtoqrpFVVsCxYCqqtpYVbel+4oZSBIVqBsBnwbXR8ADqloTozv6uLP9Q4w6VEMgPhW7A0RkhYis2Lcv7QydXqgIeaVM5JXdBT/OonCRolSrUSdkW/6E4m90gTy0a1KNy256gQrtnyVf7px0a1ObATc24P5XZ1C502juf3UGbz10U+I5y9fvoG73l2nc7w1G9GpOrpzBv+qTmRS1Mgq3yiCQUc7HROQxTLaNu/3Ww5HkVKDyAdGq6pPbngA0FZFooICq/uJs/yQlo5lB9ckrZSKv7K5asZT5c2bR9urqjBzal+W/LOChu/qHbDcUf1vUr8S2XQeIPXScM/EJfDV/HQ1qXEz36+vy1by1AHzx4xrqVSt73rkbt+/j+MnTXF6hRFD+ZkZFrQuNm2UQSB/acb9PPNAWKB/SVTOWQDs6PPtJ80JFyCtlIq/sDntgFLOXbmDWorWMfv1D6jdqyrOvvpeh/u7YfYgrLy9Hnlw5ALimXkU2btvHrtgjNKlTAYDm9Sry545YAC6+qHDiIEC5ktFUKVeM7bsOBuxrZlXUupC4XQaBpA960X9dRMZiajbhSEoqUAdFpImqLgR6AvOdPrSjItJAVZfg4lQVL1SEvFIm8squV4Ti7/L1O5g2dw2LJwzlzJkEVm/6l/e/XsrqTTsZc3d7skdF8d/pOIaMngZAo1rlua9nc+LOxJOgyl1jv2L/4RMB+5pZFbVSolePW1k4fx6xsbFULF+GRx97gj79bgvJpttlELTqk4gUBpapauV0XTGDSUEFag5nBwW2AH2dgHYVZh7ecWAe0FRVU5Wf9kr1KZzwKn1QrXIF0j4oHYRb+iAvUkl5lT4o9qg3amVlY3KnW/VpDWebaVGYwYEn3XXvwpGKClRyOgnrnIECRGQkNqWSxZKpCWRIpp3f8hlgj6pGxMTaALhBRB7ElNN2oE/GumOxWFIj1YAmItmAmW7MvQpHVHUKMCWj/bBYLIGR6iinqiYAq0Wk3AXyx2KxWNJNIE3Oi4B1IrIM0zkOgKpmznFgi8WSZQkkoHkzVGOxWCwuE0hAu15VH/DfICLPA/NTOD5LcyougQ27jqd9YJD8F5e+dwTT4tJS7k+F8Gp6hVdTC7yaXlH5Om/SBnqhfuXV9IoLrVYWyJsCrZLZ1tZtRywWiyVUUtPlvAO4E6ggIr/77SoALPLaMYvFYgmW1JqcnwCzgOcA/6nUR1X1gKdeWSwWSzpITZfzMHAYuPXCuWOxWCzpx6o+WSyWiMEGNIvFEjHYgJYB/HfqFLdc34xOLRvQrnk9Xh/ztGu2vVBR8kLtB7KWMtHgro1Z8cm9rJx8L0O6NT5n3/DuzTi5dAxFCuUFoNxFhTkw/1mWfHw3Sz6+m9ceuDHo63lRtl6pVLnpa5YKaCIyTET+EJFJGelHzly5+PDzmXw1ZwnTfljMz/PmsGplUmGt9OG2ihJ4o/aTlZSJqlUoQd+OV9Gk72tc2eNl2l5djYpliwJQpnghWlxZmb+TJIbcsnM/DXq+TIOeLzPs+S+D8tersvVCpcptX7NUQMNMQ7leVbv7NohI8EngQ0REyJcvPwBn4uKIi4tzJee7FypK4I3aT1ZSJqpavgTL1m5PVIla+NsWOjYzNcgX7u7Aw2/MTFYHIL14VbZeqFS57WuWCWgiMg6oAEwXkcMi8o6IzAY+EpGLHXX4352/5ZxzKorIEhFZLiJPiohr8kTx8fF0btmQxjUvoVHTFtS6on7aJ6WBT0VJsmX+f2tyykQ7d4Yu4eY16VEmWrdlN43rVCCmYF7y5MrBdY2qUqZEIW5oUo1/9x1mzebzVSHLl4ph8UfDmf3WIK6ufUlQPl6IsnVLpcptXzP/k+8SqjoI+Be4BngZqAt0VNX/AW8AHznJHCcBrzmnvQq8qqr1nXOTxV/16eD+2ID8iYqKYtqcxcxduZE1q1awacO6dN8beKei5BVZSZlo47a9vPjRXGa8fjvTX+3P75v/5Ux8Ag/0uZYn35593vG7Y49QpcMzNOz1Cg+8+g3jn/wfBfIF/gqR12XrpkqV275mmYCWDNNV9aSz3JCzqk4fA439tn/uLAek+lS4SNGgnChYKJorGzbh57lzgjovKV6pKHlFVlMmmvDNchr1fpVWg97i4JETbN91kItLxbBs4t1smPYgpYsXYvFHwykRU4DTcfEcOGK0CX7bsJMt/+ynctm01cR8eFm2bqtUue1rVg5oqb1B7l6HRjIc2L+PI4cPAXDq5EkWL5wbcke+VypKXpHVlImKFc4HQNkS0XRsXoNJ367k4rZPULXzc1Tt/Bw79x6mYa9X2HPgKEWj85Etm6mllC8VQ6WyRdn67/6Ar+VV2XqhUuW2rxe8QzyT8gtG1eljoDtGJR1gCXATJmuta6pP+/bs4cG7BhCfEE9CQgLXtb+Ra1pl3vf9vVD7yWrKRJNH9yKmUD7izsQzfMw0Dh09meKxjetU4NEBrTkTn0B8fAJDn/+Cg0dSPj4pXpWtFypVbvsatOpTOCMi24B6wBDgmKqOdbaXBz4AigL7MKpPf4tIZWAiRqNzJjBAVUundo3qta7Qqd8tdN33cEoflNujn8lwUyYKp/RB/xwMr/RBIpI+1adIQlXLO4ujkmzfBrRI5pSdQANVVRHphlV9slgyNVkqoKWDusAbYoZdDgH9MtYdi8WSGjagpYKjpF4ro/2wWCyBkZVHOS0WS4RhA5rFYokYbECzWCwRg+1Dc5ncObJR9aJ8rtv1alh9zd+HXbdZv0Ih122Cd9NBvJpa4MX0CoA89Ya7bnPzD8+7bhNg7obAJwS7ga2hWSyWiMEGNIvFEjHYgGaxWCIGG9AsFkvEYAOaxWKJGGxAyyDCScSiY9Ma3Nq2Ed3bNaZXx+au2ARvysAru5nJ1+2zn2LFlAcS1wsXzMuMN+9gzZcPM+PNO4gukAeAmEJ5+W7cYPYteJ6X778p8fg8uXLw5Su3s2rqg6yc8gBPDWkX0HW9er7+3rqZ2zs3T/y0q1eeqRPGpctWxGTbcDJmzFBVd6WJgqRevXq6YkXq77DHx8dTpUoVfvjhB8qUKUP9+vWZPHky1apVS/GcQKZt7Nm9i717dlOjVh2OHT3K9S0a8t7Hn1Ol6mUpnrPr4Kk07XZsWoMJX80jOqZImsdCYNM20lMGgeCF3czma8PuY3nvye7U62qmWjwzrD0HD59g7IQfua/3tUQXzMsjr39D3tw5qX1paapVuojLK17E3S98AZiAVr/6xSxY+Sc5skcx6607ubRSOU6dST2jS3qer817gstaHx8fzy3Na/Dmp99TsnTZFI9rcVnRZLNt2BoaF14oJZxELLzCqzLwwm5m89WXzdZHu2Y1mDhjOQATZyynffMaAJw4dZpfVm/l1H/n5l06+V8cC1b+CUDcmXhWbfiHqAAiwYV4vn5dsoBSZcunGsxSI9ICWpSIvCsi60RktojkEZHajtDJ7yIyTUQKA4jIPBF5VkTmA3eJyM0islZEVovIAueYKBEZ44ik/C4iA91wMpxELAAQYWifzvTq0Ixpk8eHbg/vysALu5nd1+IxBdi9/wgAu/cfoVjh/AGfWyh/Hq5vcnmatbOkuPp8+TH322m0uCF4HVIfkRbQKgNvqurlmHQ/NwEfAQ84AihrgMf9jo9W1Waq+iLwGNBGVWsBvhzAtwGHHZGU+sDtIhKcBE8yhJOIBcB7n33Px9MX8MoHU/l84rv8umxRyDa9KgMv7IaTr8EQFZWNCc/04v+mLCQ+iHjm9vPlI+70aX756TuatUl/Cu5IC2hbVXWVs7wSqIgJWvOdbROApn7HT/FbXgSMF5HbgShnW2ugl4isApYCRTBB8xz8VZ/27duXppPhJGIBUKzERQDEFC1G89btWL/615BtelUGXtjN7L7uPXCUkkVMYClZpCD7DgbWb/Xmw135a8c+3pg8P+2DHbx4vnwsWziHytVqElO0eLptRFpA8+85jwei0zg+USjFkbl7BCgLrBKRIpjU20NVtbbzuURVz9Md81d9KlYsbXWecBKxOHniOMePHU1cXrpwLhWrpNwJHChelYEXdjO7rzPnr6VHO6Pr2qNdfWbMX5PmOY/fcT2F8ufmvhenBXwdL54vf36a+WVIzU2I/JfTDwMHRaSJk6yxJ5Dsz5GIVFTVpcBSEWmPCWzfA3eIyE+qGiciVYCdqpqaYlSahJOIxYHYfYy4wwjNx8fH06Z9Fxo2axmyr16VgRd2M5uv8z68i6LR+flz5iieemcWYyfMYeJzfejdsQE7dh+k+8jxicdumP4YBfLlImeO7LRvVoN2Q97i6PFTjLytNRu27mHxxPsAyJszGydOp97u9OL58nHq5AlW/jKfu594KSQ7ETttQ0TuA/IDXwHjgLzAFowAykERmQfcp6ornOO/xDQnBfgRGO4sPw20d5b3AZ1UNcUUFYFM20gPXmXbCGTaRrB4lW3DYginbBvBTtsIlJSmbURMDc0ROqnutz7Wb3eDZI5vnmQ9ubquAg85H4vFksmJtD40i8WShbEBzWKxRAw2oFkslojBBjSLxRIx2IBmsVgihogZ5cwsnIpLYMOukKapJUv5Yu4LrwAcO3Um7YOCxAOTgHciKV5NifEKL6ZYVL7uEddtAiyY7I3dlLA1NIvFEjHYgGaxWCIGG9AsFkvEYAOaxWKJGGxAs1gsEYMNaBaLJWKwAS0D+O/UKW65vhmdWjagXfN6vD7maVfsDuzfj3KlilO3tns6MeHkqw+3FZq8UjvKrHYHd23Mik/uZeXkexnSrTEAD/dvxV/fPMKSj+9mycd306ZRVQDKXVSYA/OfTdz+2gPpy2fmlrJYlp2HJiLbgHqqGptkewegmqq6p1WWhJy5cvHh5zPJly8/cXFx9OjUiiYtWlM7xPzsPXv3YdCdQ+jfr5dLnoaXr2Bytg0ePPgcJaUOHTqEpNAUlT07jz71/DlqR02aX5uq2lG42q1WoQR9O15Fk76vcfpMPNNf6c+sRRsAeP3Thbwy6fx0glt27qdBz5dD8hngrUnfBKwslhK2hpYEVZ3uZTADkzc+Xz4jZHEmLo64uDhXcsk3btKUmJiYkO34E06+gjcKTV6pHWVGu1XLl2DZ2u2c/C+O+PgEFv62hY7NMlQZMiiyREATkXwiMtNRdForIl2dXUNF5FcRWSMiVZ1j+4jIG87yeBEZJyILRWSTiASmyBoA8fHxdG7ZkMY1L6FR0xbUuqK+W6ZdJ5x89VpRyyu1o8xid92W3TSuU4GYgnnJkysH1zWqSpkSJmHnoC6NWDbxHsY9cnOimDFA+VIxLP5oOLPfGsTVtdOpIeSSsliWCGjAdcC/qlrLyWj7nbM9VlWvAN4C7kvh3PJAM+AGYJyI5E56gL9IysH9sUl3J0tUVBTT5ixm7sqNrFm1gk0b1gV5SxeOcPLVSyUlr9SOMpPdjdv28uJHc5nx+u1Mf7U/v2/+lzPxCbz75WKq3TSaq3q+zO7Yo4y+y/y27449QpUOz9Cw1ys88Oo3jH/yfxTIlytoX91SFssqAW0N0FJEnnf0BXwptL90/q7EBK7k+ExVE1R1MyaFd9WkB/iLpBQuUjQoxwoWiubKhk34ee6coM7LCMLBV68UmrxSO8qMdid8s5xGvV+l1aC3OHjkBH/uiGXvgWMkJCiqygdfL6VetXIAnI6LTxQ+/m3DTrb8s5/KZdMWCkqKW8piWSKgqeomoC4msD0nIo85u3xvJceT8gBJ0p/8kEUYDuzfx5HDhwA4dfIkixfO5ZJKVUI16wnh5Ct4o9DkldpRZrVbrLBJhFC2RDQdm9fgs9mrKFmkQOL+js2qs37LbgCKRucjWzZTAy5fKoZKZYuy9d/9QV3PTWWxLDHKKSKlgAOqOlFEjgF9gjj9ZhGZAFwCVAA2hurPvj17ePCuAcQnxJOQkMB17W/kmlZtQzVLrx63snD+PGJjY6lYvgyPPvYEffrdlmV8BW8UmrxSO8qsdieP7kVMoXzEnYln+JhpHDp6kvdHdaNm5VKowvZdBxg6+gsAGtepwKMDWnMmPoH4+ASGPv8FB4+cDMpfN5XFIkb1KTVEpA0wBkgA4oA7gKk40zZEpB4wVlWbi0gfZ/sQERkPHATqASWAe1R1RmrXql7rCp363ULX78Gr9EHb9oVPqiObPsg7wi190JUVoyNb9Sk1VPV7jMamP+X99q8AmjvL44HxfsctUtW7PXXQYrG4QpboQ7NYLFmDLFFDSy+q2iejfbBYLIFja2gWiyVisAHNYrFEDDagWSyWiMH2oblM7hzZqHqR+9MWvFCSAm+mWMQeDa9pELsOnvLEbv0KhTyx6wUHF43xxG7hhvd4YjclbA3NYrFEDDagWSyWiMEGNIvFEjHYgGaxWCIGG9AsFkvEYAOaxWKJGGxAyyDcVibySp0JvFFoyqyKR6nhljKRP24/B17aDfU5GNytCSs+HcHKKfcz5NamANSoXIp57w9j+eQRTH3ptsRst+UuKsyBhc+zZNK9LJl0L6+N7BLQNSIuoIlItIjc6ZKt5iKSarqg9OBTJpo1axbr169n8uTJrF+/PiSbPnWmr+YsYdoPi/l53hxWrVzmir89e/fh6xnfpX1gEPiUieYuXc3Xsxcw4f1xbNrwR6a16+OtSd8wacbPfPT1vJBtefEceGk3lOegWsWS9O3UgCa9X+HK/42lbeNqVCxblLceuYVH3pxJ/VvHMH3uGu7ueU3iOVt2xtKg+4s06P4iw0ZPDeg6ERfQgGjgvIAmIlEX3pXk8UKZyCt1JvBGoSkzKh5daLx4Dry0G8pzULV8CZat8VOT+vUvOjavQeVyxfn5178A+GnZJjpdUzMkHyMxoI0GKorIKhFZLiJzReQTYI2IlBeRtb4DReQ+ERnlLFcSkTmOMtSvIlLR36iI1BeR30SkQqgOeqVMFE7qTP5kFsWjNHFJmciHV8+B18pX6WHdX7uMmlQhn5rUZZQpEc36Lbto19RkFL7x2lqUKRGdeE75UjEsnngPs98eHLCaVCS++jQSqK6qtUWkOTDTWd8qIuVTOW8SMFpVpznKTtmAsgAi0gh4Heioqn8nPVFEBgADAMqVK5emg14pE/nUmY4cPsTQ225l04Z1VKkaWvppr8lMikdp8d5n31OsxEUciN3HkN6duLhiZa648up02/PqOfBS+Sq9JKpJvTGI4yf+S1STGvjkFF68rzMP9m/NzAXrOB0XDzhqUu2f4sDhE9SpWobPxvbliq4vcPR46q/VRWINLSnLVHVrageISAGgtKpOA1DVU6p6wtl9GfAO0D65YOYcn6j6VKxY2oo3XikT+QgHdSbInIpHqeGWMpEPr54Dr5+v9DJh+lIa9XyJVgPfdNSk9rFp+17aD32bq3u9zGezf2PrTiOwcjoungOHfWpS/xg1qXJpf7eyQkDzf6v7DOfes09jM7Wfr13AKaCOWw55oUwUbupMmVXxKCXcVCby4cVz4KXdUClW2PTxli0RTcdravDZ978lbhMRRvZrybtf/AIkUZMqHUOlssXYuvNAmteIxCbnUaBACvv2AMVFpAhwDGgHfKeqR0TkHxHppKpfiUguwDeIcAi4DZgtIsdVdV6oDnqhTOSVOhN4o9CUWRWPUsJNZSIfXjwHXtoN9TmY/HwfYgrlJe5MAsNf+JJDR08yuFsTBnYxzfav563ho2/MyHzjOhV5dNB1nDmTQHxCAkNHf87BIydSMw9EqOqTMwhQEzgJ7FHVdn77hgHDgK3ATmCbqo4SkcrA20BRjDLUzUA54D5VbSci5YBZQD9VXZrStevVq6crVqxw/Z5s+iDvsOmD4NQZb+x6lT7o1IqXs47qk6r+L5V9rwGvJbN9M9AiyeYtwDxn/99A5u5ht1iyOFmhD81isWQRbECzWCwRgw1oFoslYrABzWKxRAw2oFksloghIqdtZCQisg/YHuDhRYFYD9wIJ7vh5Gu42Q0nX4O1e7GqnvfqgA1oGYiIrEhuLk1WshtOvoab3XDy1S27tslpsVgiBhvQLBZLxGADWsbyjrUbVr6Gm91w8tUVu7YPzWKxRAy2hmaxWCIGG9AsFkvEYAOaJU1EJGyeE8noXNOWDCVsHlRLcLj1xRaRqsDjIpLfDXt+dqP8llNKyBmsTVGnU1hEXMswnNx1MrO9cCHpfbvxw2kDWoSQ9OFQF0Z7nAesDFAMuFtE8oZq07EbBbR0dE+HAb1FJOTcfH7BrCfwhIi4mmFRRC7xXceNIORnI7uzHrLUor9fbtasfXZFpJCIFHbJbOKPpIj0Ae4P1aANaBcYvwejiiONl8sNm35f5u4i8qiI3JRUii9Im9lUNUFV5wCrgOrAEJeCmgAFgTGY7MHfquoZN76AItIA6AQMV9XDoQYJv/9XZeBbEXkYQg9qvv+ZiFwJ/CEiJVQ1PhR/kzwHvYCRInKriIQsqur42gGYDXzvPGPptisiFwOTRcSntZgDk1A1JGxAu8D4PRifA4MwD0fdUG1CYnrx2zHpxR8B0p30XlUTHJvDMQFCgabA/SISUt5uVT0DLANOA78AVUUkj++awZCkRpILaA5UBm50vuDxoQQe5//VDhjl+HyLOFquoQQ159xrgbaYsp0nIiUdf9P1vfR7Dm4HBjr+vge0T489f0TkUsyzNRDoA9QnGUHvIDgJLAQeEpGamDIIvetBVe3nAn6AS4DvgMJAZ2ANEJNOWxX8lgthtEMFoxH6PUboJSeQNwib4rdcAvgRyOestwb+DxgRjM1krlHC+ZsLuNWxeauzrRpQMh2+lgOineVBwCsYHdXzjg3S12hgOdAYUwGoCSwCHgzxObgU2AY0xDTpxwB/+5VNtnTYzAbEYCaolgF6Aj8AUen5H2EClzi2vsLUzvI6+8sDm4Guwfrot1wUGA5MA6Y4ZVAPEyyv95VFMB9bQ7vwHMZ8Ie7A9Bl0VNUDItIimH4kEcmDaQKNcjYdwTx8ixybbVQ1HvNQ1w7QZjb1fftF2mAe5IswX2aAnxz/u2Gan0HXTkRkCDBRRMYAt6jqZGAF0EhEPgUmY36t08TP1+HA+8CnIvIK8AmwA2giIrf4H5sO4jEZILapqUGuc+zfJiKh6OQdB35S1cVArKqOAFYDc0WkmKomBFK+/seo6SI4APwJvAt0B1qrqfXdLyLXBOFfJUztOUZV/wG+dLa3EZEYVd2Gqf3lCdSgU2P21fxvBUoDnwFzgboYYaI2wAOY70bOIPw1hPIrYz8B/SL53sbI5fyDcgIfAr8B1Zx9TTFflMsCtFnG+VsF8yV4xFnvhBF1uclZ7+HYrRCkzw2BOZgA2RdTg2rkZ/N5oHg6yqIPJuCWdx7k1cD9zr5GwEPA5UHa7ISpOWQDxgJzne0FHXvPAfkD/V/5/b9KAbmc5ceBJUAeZ72tUwbTff/DIJ6DnM7fAs799/M7piumRjwLyB1kOQwFRjvLd2Kamw2c9S7OtaoEabMAMA6nNoqRc5zglHNH4C/g2nQ8B4OAtb7nElNDHQh8Heyzep7tUE62n4D/gR0wVfa3McpRNZ2H9lnny7IOaBeAHcFU098FCjvbKgDrMc3AAs6D/ZPzcKwKJEBgAmMhZ7k9sJezQbE6puN+o3PdP4P9Yjh26gE3YZraQzDN7mZOoEh38w3TZ9YGGOkEthx+fucgHc154DpgMfARMAm4GHgM+MMp5z+Bq53yqB6E3TaY5tU4TFP7YoxW7MOYboKFQBPgDYLrJrgH80NR3e85GQWMd8r5F6BGgM+XfzM+O6bp93+YQRYwtb5FmCZ9S2dbQM1jx35pYIHvGeLcH5CHMDX0PIHaPO8a6X2Q7Cfgh+1STK2pq19guAzTl9YXU7Vu4v/PDcBmbufBv9NZr+h82e5y1mOcaxQL4AHLBbyKEyCd7UuBxX7rURjl+OuBS9JRBnc4X+RKmF/jr4Cizr4vgW9862n5m4z/zYF/gOl+2/sDX+D0/QVgtzjwPyCv84Xb5JRvFef/swjzY9EN04S/HFOL/RUoF+A1GmB+eDpj+iK3OeVSGlOL/D+gBmYgZxmpBOIkQaeIc25xzI9bP0wgvhzTXVCNAGrTOLVRZ/ka5z6v8Vt/GxjmrPfBBPMbAi1j57xsQD7gW5xaM2drrKWce0lXf3LiNUI52X7S/AfWdL6so/y23QZsAK4O0la2JOvtMLWIfs56ReB34NkgbEY5f3MAV2JqBr4azgrgaxfKoIPj18XO+kWYGmQj50szMZBglsTmEOBF50tVBFNrWo+pAT3oXC/gpium1vE+0MsJKm/5lznwJtDd7/j6mJplrQDLt7AT0J7321cM0+yq5betMaajPcVaX5Jg1gvTfPsa0/k/HdP/NAX4IIj7L4ypxV3mBMLtGO3arzjb3GyOaW7e66w/hBmECrQ535izP8CfAFP99vXB/LAF1cxO9jqhGrCfVP+J+TFV6BmYDnZf9XoQZkQrhiBHoJwvU1lM7eQKYD7Q39lXxQlywQaIUpiAON/5QviC2gJMx3UoZTAIeMhZ9tm91ymXX9IKCn7++UbXBmP69ypg+oVe9rP5NKa2UjUdft4DvIUZdfsX6Ou370nfF9lZv5hURmIxfYTlneVrnUBzO7A0yXGvcLZvMsr5fwbUh4Rpwn/ut96RsyOkrTE14oCCjXPOw5gfgheAFs62KzDBcqTfvdT0O6dwKvZ8z3o2594GYGp5XTE14c+d52sMsNLfbkjPmxtG7Oe8f2J1oJbzj8yFqYW8DpT2O7ZMgDbrcrbG0Afzq/4V8DGmBlgb05E82DkmRwA2GwHdnOXBTmB40QkySzHNLF/wmR2orylcqy2mv/BSv23tnHvJE8D5pZ2yG4ipSd6Hqd3cC8zENL+j/PxNz3SH1phpLgsxtYdXMKOkDwE3YvoimwdoqzymBl4dqAp84Puy+pXv5Zim5VrgymCfMefZWo3p38ufZP9dzr40+8yc47M7f6P97ttX68/uPF8/AI/6nRPwjzBOkxwTxHpjan7/c7Z1xgzqVHLtO+iWoaz+4Www64D5xfkQ84t0BWdHNt8PNjhganY/Y0YFP3AevEswfT7TMfOFWmOatoUCtHkDZvLtE5hmRAXHxlBM7ecn4OX0BIdkrlUQU3N61glkPTDzugJ6iJ0vcB9MwO2H+XGYD3zq92UcgumPykaA/ZB+9os75XuZsz4YUyN7AhPcniaAARs/X7tg+iRrAYcwAwj+tb1XnefgR+CGYJ6tJNt6Yvr2mnC2aRwFPEWAo+V+tjph+gNLYUZI1+M02Tlbc6wbrK+Ove1AW2c9H2fnSPby/f/c/LhqLCt+nH+Sr4OzDqYaXRQzALAZM8nxSkxN7ROCnJbg2C2Nqfpv8NtWHNO309nnR5A2W2FqCJOc9VyYPpQXMbWSiaRjakYK17oI0/T8FlNLCah5wdkfiV6YZvt3TqCJ5Wx/TB/nC1g5nb4VxjTTmzrrOTB9c7MxzUTx9yUAe9HAbswPRmdMjXIs0MzvmBxAgWDsOsd2x4xe3on5obgVU3tqTAA18xRs1sbUQKv6bZuECfJBNQOTBLN7MKPa3TFTlFr77fvJec6i3Xi+/D92Ym0IOC8/jwbaORNdj2H6YGpjqtc9MIHiWeAqTMfyugDsZvNbzqmqOzEP8REReRdAVfdytvkBcCIY31X1B0y/yfUi0lVV/1PVPzAjkYdUtYdzjZBR1V2qOg5TE+itqr8HeJ6KSHdMzfEhTG0nHjOKN1xE3sIEnS6qujmdvh3E9Oc0F5HqqhqH6VTfDyxQ5xvo+xsARzBf4OyYGuNkzGs+bUSkhWMrTlWPBmNXRAZjyuEgZuT8e+fjmxeWXrWk/zABrZmIPCYiPwEJmMD8mQSRCcV3LyLSCjMIslxVJ2H6yV4SkRuc18iOAGNV9VA6fU7VCfsJ4YPps3gf82uc29n2IGf7Ce7A9HcF1Qxwzu2HGXl8EjP6VhZTc5iPqbXMJx0d4Emu0Q7zUvATmKbob0DFjC5XP/+eBEY4yzkxPxifYfrQihJgMzuNa5TBNNW+B57BzAtsHqLNi3Gam0BJTGf7GFLpSE9yvq8Z6ashjsOvvw0T4N9zlgcT4PSRZK6TH9NkX4SpmVfH/Hi2CNQmprXga6L2wdSYv0lyTBdMTfgnXBoASNaXjH5gw/XDue+kDXSC1o2Y5kRfzCtC/TC/fo3SYb87pknYCtP/9gKmg72084WbQwid9Umu1QlT8/kUZ3Qus3wc377Cr6mOGR19Fijo4nUKYPoR78GveRiizTqY+YEDMM3u9ExIruI8UzNw3qpwttckiKkZAVzHNx+snhOQWgRxbmXMD+0EzGtMPTH9yMOSHFeIILtGgr4PL41H6sfvV7OM37abMX0Pvj6t/phBgeuDtY3piH0eZ+4Tpp/nHs6OdpYCSrl8T81w5oplpg+m6fMMpnO+BaYWOZ0AX2DP6A9mlHproD8+nDsCPRRTyxvjlME/nB2B7I6p7UQT5EBICteNcnxdit9L/UGcPxbTlLzDWW/r/BANvZDlHXJSvayIqqqIXAeMFZFfgTjMw3cG6CwiOTAjkuPV5PlKzFOVHP77nb/xIvI30FFEFqjqDqfvbKaIlFPVvz24p/lu23QDVT0kIm9iar+PYMr4XlXdnbGeBYaqrhSRmur0mQVAYeA5MZmCy2AmC7fGDALMAZ4Wk433Gkymi0Mu+RkvIhswwXRrWs9sMozDTBe5R0QOqOoUEdkL/J+IxKpJQuA5NqClAyd/WVtM38VeTL/BV5j+qCKYSY7zVXUPpN3x69svIjdhmhiTMFX40phsrlMxnfUCBPrFiBhU9V/gDRH5EFMbOZbRPgVJwP6q6kwROQ28BCxR1b9E5APMiCGYEdR3MG+f7HfTSVU9jqlNpvnMJnPun8CfInIIeMb5mxuT826Jm36mhtXlDBC/DKOFMVkG1qlqEyfDqGKG+mep6tRAa1FJMoz2wExo/QVT9R+O6bBtgGlq/YfpQ1nl/t1ZMhsi0hHzTA1T1U+dke8+mB+2F9yqmXmB03oZg0mRdJsGMLLv2rVtQEsbv2DWFjOi8xdmTtRdqvq+c8wLwB5VfTEYm85ySUwTYrmq/unk92qFefdvgRNE41X1iOs3Z8m0iMgNmBfXn/ULavmCaL5mGCJSHFPR23chr2ubnAHgBLMrMSNun6rqz86v0I8iUh0zS78V5j3INEkSzIYAdwOnMB2y/VT1FRGJB8aIyAhVXeD+XVkyO07zMwF4R0TOqOpUwqTLQV2awxgstoaWAiJSATN0/Z6Tq/4zTDK/yn7HNMLM1P4JGKCqu0QkSk2m2ECu0RgzAfc5zByzAcCfqvq4s38gphnr+iCAJXxwJqr+paohi4hEOjagpYCIlMYEmS2quldEymFeP1qiqnf4HVcP85L0SFX9MJDRIafpUAGTEeEPzCTZBEzf2WBgl5qUzBaLJQjsq0/J4NSydmJeop4nIqOdWlJ7oKKIvOo7VlVXALdgxHijU7GZNPf7n5jZ7hdhhuXjME3Od4DCIlLU/TuzWCIbW0NLgt8AQEXMbP+8mCkZX6jqMyJSBvOu32pVvVNEsjtzzXKr6qkA7PfGzCDfy9n0zk9hslt8jZmakTMQWxaL5VzsoEASnGDWHjMzfRtmRPMh4GURiVfV0SLSDVOzQo3GJJhpFakiIoMwr0O9hWnOfoN5w+AJTPaBOFWdiRkgsFgsQWIDWhLEKG8/hhm1bIVpAp7EjES+49TInsYkwkskuX6zZAYILgYeUNW5zv4dwNOqerOIPIN5d9NisaQT24d2Pv9gsg3UxmTSqIWZ3NrTWV8YiBFn7lg1Z/l6ESmFqdV19ztsLvCf01ydqqrb3boJiyUrYgNaElT1H1VdjnlZe5LTeT8ek4NqparO9+/gT4UyQA8R+Qh4xXl9ZzhQW0TGOsc0xNTa8rl8GxZLlsQ2OVNmDTBQjJp5e0zWgL8h9ffcfIMKqrrGeZ9tGEYz0veidQfgKxH5GJNbvqfb7+RZLFkVO8qZAiJSEJO0sQPwvqp+G+T5jTHveJbA6FkuAL5z5rRFY/KPZVeTMdVisbiADWhp4DctI+B0KiJSDJO1Njem360lJh33VxgloKKYFDhnUrJhsViCxwa0NEhHXijfefUxObzyYoJbM0xga4AR+FjtqqMWi8UGNDcRkb4YebaHnfUrMKOaZ4BnVPWIiOQPw3xeFktYYEc5QyCZ0c55mIGEBwFU9VdM/v9WwMPOvDQbzCwWj7CjnOkkmRRA1TEjozcAM0QkQVWfx6R7mQu8HGgWDovFkj5skzNEROROoCumafk7RhhlGUZ+bh5wNdBGVTdmlI8WS1bB1tBCwJnacQXQDfNO5nLMRNnimJRAJzCvOv2TYU5aLFkIW0MLESf5Y1XM2wDXOLnO9mOyZ4xW1dMZ6qDFkoWwNbQQUdX/ROQEkF1EfOrmMzESdjaYWSwXEFtDcwGnljYcM8+sBHCLqm7IUKcsliyIDWguIUZcuCSQ4GS7tVgsFxgb0CwWS8RgJ9ZaLJaIwQY0i8USMdiAZrFYIgYb0CwWS8RgA5olrBGR5iIyw1nuICIjUzk22nlVLdhrjBKR+wLdnuSY8SLSJYhrlRcRK5aTTmxAs2RKRCQq2HNUdbqqjk7lkGiMAI4lQrEBzXJBcWogG0Rkgoj8LiJTRSSvs2+biDwmIj8DN4tIaxFZLCK/isjnIpLfOe46x8bPmCSaPtt9ROQNZ7mEiEwTkdXOpxEwGqN8v0pExjjHjRCR5Y4vT/jZelhENorIHIxATlr3dbtjZ7WIfOG7J4eWIrJQRDaJSDvn+CgRGeN37YGhlq3FBjRLxnAp8I6q1gSOcG6t6ZSqNgbmAI8ALVX1CmAFcI+I5AbexQjXNMFMZk6O14D5qloLk0BgHUas5i9Vra2qI0SkNVAZuBIjW1hXRJqKSF1MwoE6mIBZP4B7+lJV6zvX+wO4zW9feUzG4huAcc493AYcVtX6jv3bReSSAK5jSQX7LqclI9ihqouc5YkYZSyftN8U528DjK7pIiePZk5gMSYRwFZV3QwgIhOBAclcowUm4wlOHrrDjlaqP62dz2/Oen5MgCsATFPVE841pgdwT9VF5GlMszY/8L3fvs9UNQHYLCJbnHtoDdT0618r5Fx7UwDXsqSADWiWjCDp6yn+68edvwL8oKq3+h8oIrWTOT+9CPCcqr6d5BrD03GN8UAnVV0tIn2A5n77krtfwUgj+gc+RKR8kNe1+GGbnJaMoJyINHSWbwV+TuaYJcDVIlIJQETyikgVYANwiYhU9Ds/OX4E7nDOjXJy1x3F1L58fA/08+ubKy0ixTGSg51FJI+IFMA0b9OiALDLeae3e5J9N4tINsfnCsBG59p3OMcjIlVExApOh4gNaJaM4A+gt4j8DsQAbyU9QFX3AX2Ayc5xS4CqqnoK08Sc6QwKbE/hGncB14jIGmAlcLkj6LxIRNaKyBhVnQ18Aix2jpsKFHC0IKYAq4AvgIUB3NOjwFLgB0zQ9WcjMB+YBQxy7uE9YD3wqzNN421siylk7MvplguK06SaoarVM9oXS+Rha2gWiyVisDU0i8USMdgamsViiRhsQLNYLBGDDWgWiyVisAHNYrFEDDagWSyWiMEGNIvFEjH8P8U3q8lacHVAAAAAAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# %load ../code_lightningmodule/plot_confusion-matrix_basic.py\n",
"from torchmetrics import ConfusionMatrix\n",
"import matplotlib\n",
"from mlxtend.plotting import plot_confusion_matrix\n",
"\n",
"\n",
"cmat = ConfusionMatrix(num_classes=len(class_dict))\n",
"\n",
"for x, y in test_dataloader:\n",
"\n",
" with torch.no_grad():\n",
" pred = lightning_model(x)\n",
" cmat(pred, y)\n",
"\n",
"cmat_tensor = cmat.compute()\n",
"cmat = cmat_tensor.numpy()\n",
"\n",
"fig, ax = plot_confusion_matrix(\n",
" conf_mat=cmat,\n",
" class_names=class_dict.values(),\n",
" norm_colormap=matplotlib.colors.LogNorm() \n",
" # normed colormaps highlight the off-diagonals \n",
" # for high-accuracy models better\n",
")\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "d066f028",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"torchmetrics : 0.6.2\n",
"numpy : 1.22.2\n",
"matplotlib : 3.3.4\n",
"pytorch_lightning: 1.6.0.dev0\n",
"pandas : 1.2.5\n",
"torchvision : 0.11.2\n",
"sys : 3.8.12 | packaged by conda-forge | (default, Oct 12 2021, 21:59:51) \n",
"[GCC 9.4.0]\n",
"torch : 1.10.1\n",
"\n"
]
}
],
"source": [
"%watermark --iversions"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}