"
]
},
"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": "d8f13c32",
"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": "e3b3241a",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Restoring states from the checkpoint path at logs/my-model/version_2/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_2/checkpoints/epoch=15-step=6863.ckpt\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "059ea2ee2d4444869afa2801e8857642",
"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.9879000186920166 │\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.9879000186920166 \u001b[0m\u001b[35m \u001b[0m│\n",
"└───────────────────────────┴───────────────────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[{'test_acc': 0.9879000186920166}]"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"trainer.test(model=lightning_model, datamodule=data_module, ckpt_path='best')"
]
},
{
"cell_type": "markdown",
"id": "433906c5",
"metadata": {},
"source": [
"## Predicting labels of new data"
]
},
{
"cell_type": "markdown",
"id": "0087d833",
"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": "6d19af28",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"logs/my-model/version_2/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": "0fc7c925",
"metadata": {},
"outputs": [],
"source": [
"lightning_model = LightningModel.load_from_checkpoint(path, model=pytorch_model)\n",
"lightning_model.eval();"
]
},
{
"cell_type": "markdown",
"id": "1bf6cd82",
"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": "63c2db97",
"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": "77491b8a",
"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": "d49d1cc4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Test accuracy: 0.9879 (98.79%)\n"
]
}
],
"source": [
"test_acc = acc.compute()\n",
"print(f'Test accuracy: {test_acc:.4f} ({test_acc*100:.2f}%)')"
]
},
{
"cell_type": "markdown",
"id": "80e7461b",
"metadata": {},
"source": [
"## Inspecting Failure Cases"
]
},
{
"cell_type": "markdown",
"id": "7dd9e65a",
"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": "11eb66f6",
"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": "5de41c23",
"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": "8d7b767d",
"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": "cdae5045",
"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_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": "6d55360a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"torchmetrics : 0.6.2\n",
"matplotlib : 3.3.4\n",
"numpy : 1.22.2\n",
"torchvision : 0.11.2\n",
"pandas : 1.2.5\n",
"pytorch_lightning: 1.6.0.dev0\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
}