{"cells": [{"cell_type": "markdown", "id": "945cfe5e", "metadata": {"papermill": {"duration": 0.009871, "end_time": "2025-04-03T19:23:06.058462", "exception": false, "start_time": "2025-04-03T19:23:06.048591", "status": "completed"}, "tags": []}, "source": ["\n", "# Tutorial 7: Deep Energy-Based Generative Models\n", "\n", "* **Author:** Phillip Lippe\n", "* **License:** CC BY-SA\n", "* **Generated:** 2025-04-03T19:22:59.369888\n", "\n", "In this tutorial, we will look at energy-based deep learning models, and focus on their application as generative models.\n", "Energy models have been a popular tool before the huge deep learning hype around 2012 hit.\n", "However, in recent years, energy-based models have gained increasing attention because of improved training methods and tricks being proposed.\n", "Although they are still in a research stage, they have shown to outperform strong Generative Adversarial Networks\n", "in certain cases which have been the state of the art of generating images\n", "([blog post](https://ajolicoeur.wordpress.com/the-new-contender-to-gans-score-matching-with-langevin-sampling/)about strong energy-based models,\n", "[blog post](https://medium.com/syncedreview/nvidia-open-sources-hyper-realistic-face-generator-stylegan-f346e1a73826) about the power of GANs).\n", "Hence, it is important to be aware of energy-based models, and as the theory can be abstract sometimes,\n", "we will show the idea of energy-based models with a lot of examples.\n", "This notebook is part of a lecture series on Deep Learning at the University of Amsterdam.\n", "The full list of tutorials can be found at https://uvadlc-notebooks.rtfd.io.\n", "\n", "\n", "---\n", "Open in [![Open In Colab](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHUAAAAUCAYAAACzrHJDAAAIuUlEQVRoQ+1ZaVRURxb+qhdolmbTUVSURpZgmLhHbQVFZIlGQBEXcMvJhKiTEzfigjQg7oNEJ9GMGidnjnNMBs2czIzajksEFRE1xklCTKJiQLRFsUGkoUWw+82pamn79etGYoKek1B/4NW99/tu3e/dquJBAGD27NkHALxKf39WY39gyrOi+i3xqGtUoePJrFmznrmgtModorbTu8YRNZk5cybXTvCtwh7o6NR2KzuZMWNGh6jtVt7nA0ymT5/eJlF9POrh7PAQl6s8bGYa3PUum//htmebVtLRqW0q01M5keTk5FZFzU0oRle3+zxwg5Hgtb+PZiL/ZVohxCI+hL5JgjmfjPxZ26+33BG3dA+ealHPM4gQAo5rU59gsI8bRvl54t3Ca62mvHyUAhtOlLd5WSQpKcluBjumnoCLs1EARkVd9E8l3p9y2i7RbQ1B6pFwu/YDgW8KbHJHMTQrwnjz2oZm9M4pavOCfo5jWrgCaaMVcMs6/pNhDr0+AMN93XlxV7R6DNpyzi7W/OE+yIrsjU6rTrbKV5cd/pNyItOmTbMp6sbBB+EqaYJY4cWE3VUciNt1TpgfcRFv71Fi54xT5kSoyLvOBEJMOMxWXkFlBeBSX4u6Zkcs+3KszYRtiapbNRqF31UgetVuc8z9vBXIv1qD+F1f83B6uDlCUyfsZGepGPpmg01OB7EITQbhS9ribKy+DmP1DUiClLz4bnIHVOqa7BY+Z1wg5g3zgUvyehiNpnJKxSLc/ts76LKm0BzX3c0RNy1yXjDcB5lWoro4iNHQxM+f1kWeWQARAWQS++trISJTp061Kep25X/MycwtjuctSC5rxo7ppi7VNUox5+PhPHtrsS2O1qJ6yx1QujQUzm9sh6hbkBlvvGcN8hYnwjUjH6kjfZEd5c/jitz5Jc5U3ENnFynKl4eB7nyEgP2UZ+Yz3/rVEbyYr27qELrtC4FIC0J7sc7xWnmccdHfRRTs0VB+cA4lt+oFcRR/wUeH8FG5w2Mbx8FQ8TXEvv1xYf4wBP3O2WyL3/UVjpXWgIqaFeUPr+wTmDvUB7njH6/bOv+HRg4SqioAg5GDe1aB3ZeMTJkyRSBqkLsWqSEm0fZVBEN94zEZnYvrdx1JL5cxe+a+AbhSJecRRHW/ikTFRTa38dtQlNZ5CRKwFvUtZU/kvBoEF9Uxni/XqIM+dwKbTw3rhcxIf7gmr2M+H6SMwx8iBzJbw5oxeG3Lv5FX9B3AGaHPS8e8z77H7v9VMpvPG5ug1enh7eGK8h0LBTwUb+GInqzInlRUK65DmTPQu4c3+uQKjwKK77zwUxBX4Tq7yR1RuiwUsqlrABCM6esHdXoy47fk4+prYKy8ZF574x4V5BnHQBuf4g9Z9ld8U36L2aktZNNplNfw7zotwWTy5MkCUft4aLEopJj5/OPHl1BQqeAVOnHgNSQOqmBzq9V9cfEm/yx5ubMGKS9cYPZ3vx2OS/c6PVHUuUO7Y1Pci3BO/1zgq18byebfGemLtNF+6JRtOvMk926ibussZqM+1mNz4TWkH7rCbM5phwGRGDAaoF8fY5OHFnlldAA8sgoEXKnDukA1NgSeNjqkJT9brbN4pC9WRweYXyLugR73c+MYvyWfu0yC6+mjzN1Isfw3FKJS98CU/zI1IHFkFPR52cHL2FJk0sB6kMTERIGo9GzcPkLNfA0cwdwi/hfEYO86ZMd9w+y1egfM2T2Eh/vesMNwljSzuZRT420SW3eqy8N6aHMmwmnFUZ7/PGVPbIoNZvNU1BURdHs0bT2+HjL8sDSM2e6vi4Lj5NW8WOLVA6RTT2azxLV+bglaFNqLieqemS/gWkw7NyoAHo+2dEsiivengjKsPFoqWOvbSh/kxPaxyW/JRzH2Fl3EzD9/xjAefJqB3usKUFn/0Gb+S/d/jy3FN2yLOmnSJJtn6oehByEiHPSeXnDxFGPRnoFoaBJjcdQlbDwcjL1zTNuQpoxD7R0OG0uUTMi0fkVwdzBdYIwcwZunxrVJVLplNm54BZp7jfDfYLoNyqQi1K6KxIdHzmN+QQ2WjFIwUT2zTGdlRXo4NFXVUO4sgX5dFC7f0aP/ZlNeUjFBuL8Xjl6uRuP6aMjSjpjzsH62FDU7JhBuGccEXIvDfJFFBc/gHw80dklfCVYnRaDfpiJcutPA4F7qJsfJeUPQI+1fqMlNhFx1FM0GDqkjFVg7NojlQ0Vt4aM5ReSqcbpaCg8nCW5lRsBvbT4T1TLfFptsfh7gItzuKTdJSEiwKSrt1vcmnEXXrsLbYnWDA1bu+z2WKy9Arq+1KRqdfKsoBo0GcdtEpS/B1bO4v0cFiUhkjskvKcMrWwtAPHuwQq8Z+4LZ1vTQANfXt4J0DwZX9gWa9qh4XDM/voC9JXfwYEMMHJcfNtusn82ihvliVUwg5KrPGVf6GH94ZJpEZBen6EC4qYTHA1dXhW0JIex8txzv//c8lhzXIi/BFxOH9jGbQhZsRalTIBZZ8KkGyZAxeRQvXkFF1TWz/Hm46jNYUnjPbt3JxIkT7f6dSj8qfJJyVvBxgaIlblOyjtysNHWN9fjjqWi7glJfW3/S0Hlj2XnA8PhKT9w6g3Qx3XiXhvuxQsuT1proxBKI/AaZqY1Xz5muvY8G8XkRRCaHsfQsRAFDH/tZPbcYuHotOG0FRIqB4HR3wNVoIPLtz8ycTguu+jpEigE218vd1YCr5m+HpHMvEI9u4LTXwNWaLjl0iPwGAmIpeHx1VeCqTJdPs1/vweweQPO3HC24NhOhnTphwoQnfv6QSY2ICbkNmdSA4h87oaLaiYfn5diIEd4att2erOwJXbPUHp953p6orQVSUVWRAXBT8c/dJ5L9xhzaJGp71GR/wFP8P5V2z10NSC9T93QM2xUg8fHxT+zU9ijeU4naHon8CjFJXFzc8/kn+dN06q9QgF98SYSo2Xen2NjYZy5sR6f+4nLSK5Iam2PH/x87a1YN/t5sBgAAAABJRU5ErkJggg==){height=\"20px\" width=\"117px\"}](https://colab.research.google.com/github/PytorchLightning/lightning-tutorials/blob/publication/.notebooks/course_UvA-DL/07-deep-energy-based-generative-models.ipynb)\n", "\n", "Give us a \u2b50 [on Github](https://www.github.com/Lightning-AI/lightning/)\n", "| Check out [the documentation](https://lightning.ai/docs/)\n", "| Join us [on Discord](https://discord.com/invite/tfXFetEZxv)"]}, {"cell_type": "markdown", "id": "4a407e72", "metadata": {"papermill": {"duration": 0.008896, "end_time": "2025-04-03T19:23:06.075785", "exception": false, "start_time": "2025-04-03T19:23:06.066889", "status": "completed"}, "tags": []}, "source": ["## Setup\n", "This notebook requires some packages besides pytorch-lightning."]}, {"cell_type": "code", "execution_count": 1, "id": "6d4ee18f", "metadata": {"colab": {}, "colab_type": "code", "execution": {"iopub.execute_input": "2025-04-03T19:23:06.093383Z", "iopub.status.busy": "2025-04-03T19:23:06.093150Z", "iopub.status.idle": "2025-04-03T19:23:07.291349Z", "shell.execute_reply": "2025-04-03T19:23:07.289976Z"}, "id": "LfrJLKPFyhsK", "lines_to_next_cell": 0, "papermill": {"duration": 1.209946, "end_time": "2025-04-03T19:23:07.293929", "exception": false, "start_time": "2025-04-03T19:23:06.083983", "status": "completed"}, "tags": []}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable.It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.\u001b[0m\u001b[33m\r\n", "\u001b[0m"]}, {"name": "stdout", "output_type": "stream", "text": ["\r\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0.1\u001b[0m\r\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython -m pip install --upgrade pip\u001b[0m\r\n"]}], "source": ["! pip install --quiet \"numpy <3.0\" \"tensorboard\" \"torchmetrics >=1.0,<1.8\" \"pytorch-lightning >=2.0,<2.6\" \"torch >=1.8.1,<2.7\" \"torchvision\" \"seaborn\" \"matplotlib\""]}, {"cell_type": "markdown", "id": "c05c196e", "metadata": {"papermill": {"duration": 0.013464, "end_time": "2025-04-03T19:23:07.321630", "exception": false, "start_time": "2025-04-03T19:23:07.308166", "status": "completed"}, "tags": []}, "source": ["
\n", "First, let's import our standard libraries below."]}, {"cell_type": "code", "execution_count": 2, "id": "41544bd4", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:07.349988Z", "iopub.status.busy": "2025-04-03T19:23:07.349610Z", "iopub.status.idle": "2025-04-03T19:23:10.624170Z", "shell.execute_reply": "2025-04-03T19:23:10.622828Z"}, "papermill": {"duration": 3.291496, "end_time": "2025-04-03T19:23:10.626613", "exception": false, "start_time": "2025-04-03T19:23:07.335117", "status": "completed"}, "tags": []}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["Seed set to 42\n"]}], "source": ["# Standard libraries\n", "import os\n", "import random\n", "import urllib.request\n", "from urllib.error import HTTPError\n", "\n", "# Plotting\n", "import matplotlib\n", "import matplotlib.pyplot as plt\n", "\n", "%matplotlib inline\n", "import matplotlib_inline.backend_inline\n", "import numpy as np\n", "\n", "# PyTorch Lightning\n", "import pytorch_lightning as pl\n", "\n", "# PyTorch\n", "import torch\n", "import torch.nn as nn\n", "import torch.optim as optim\n", "import torch.utils.data as data\n", "\n", "# Torchvision\n", "import torchvision\n", "from pytorch_lightning.callbacks import Callback, LearningRateMonitor, ModelCheckpoint\n", "from torchvision import transforms\n", "from torchvision.datasets import MNIST\n", "\n", "matplotlib_inline.backend_inline.set_matplotlib_formats(\"svg\", \"pdf\") # For export\n", "matplotlib.rcParams[\"lines.linewidth\"] = 2.0\n", "\n", "# Path to the folder where the datasets are/should be downloaded (e.g. CIFAR10)\n", "DATASET_PATH = os.environ.get(\"PATH_DATASETS\", \"data\")\n", "# Path to the folder where the pretrained models are saved\n", "CHECKPOINT_PATH = os.environ.get(\"PATH_CHECKPOINT\", \"saved_models/tutorial8\")\n", "\n", "# Setting the seed\n", "pl.seed_everything(42)\n", "\n", "# Ensure that all operations are deterministic on GPU (if used) for reproducibility\n", "torch.backends.cudnn.deterministic = True\n", "torch.backends.cudnn.benchmark = False\n", "\n", "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")"]}, {"cell_type": "markdown", "id": "d2310e95", "metadata": {"papermill": {"duration": 0.013654, "end_time": "2025-04-03T19:23:10.654933", "exception": false, "start_time": "2025-04-03T19:23:10.641279", "status": "completed"}, "tags": []}, "source": ["We also have pre-trained models that we download below."]}, {"cell_type": "code", "execution_count": 3, "id": "62398548", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:10.682508Z", "iopub.status.busy": "2025-04-03T19:23:10.682091Z", "iopub.status.idle": "2025-04-03T19:23:11.018724Z", "shell.execute_reply": "2025-04-03T19:23:11.017381Z"}, "papermill": {"duration": 0.352597, "end_time": "2025-04-03T19:23:11.021206", "exception": false, "start_time": "2025-04-03T19:23:10.668609", "status": "completed"}, "tags": []}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["Downloading https://raw.githubusercontent.com/phlippe/saved_models/main/tutorial8/MNIST.ckpt...\n", "Downloading https://raw.githubusercontent.com/phlippe/saved_models/main/tutorial8/tensorboards/events.out.tfevents.MNIST...\n"]}], "source": ["# Github URL where saved models are stored for this tutorial\n", "base_url = \"https://raw.githubusercontent.com/phlippe/saved_models/main/tutorial8/\"\n", "# Files to download\n", "pretrained_files = [\"MNIST.ckpt\", \"tensorboards/events.out.tfevents.MNIST\"]\n", "\n", "# Create checkpoint path if it doesn't exist yet\n", "os.makedirs(CHECKPOINT_PATH, exist_ok=True)\n", "\n", "# For each file, check whether it already exists. If not, try downloading it.\n", "for file_name in pretrained_files:\n", " file_path = os.path.join(CHECKPOINT_PATH, file_name)\n", " if \"/\" in file_name:\n", " os.makedirs(file_path.rsplit(\"/\", 1)[0], exist_ok=True)\n", " if not os.path.isfile(file_path):\n", " file_url = base_url + file_name\n", " print(f\"Downloading {file_url}...\")\n", " try:\n", " urllib.request.urlretrieve(file_url, file_path)\n", " except HTTPError as e:\n", " print(\n", " \"Something went wrong. Please try to download the files manually,\"\n", " \" or contact the author with the full output including the following error:\\n\",\n", " e,\n", " )"]}, {"cell_type": "markdown", "id": "215f5e9b", "metadata": {"papermill": {"duration": 0.013807, "end_time": "2025-04-03T19:23:11.049110", "exception": false, "start_time": "2025-04-03T19:23:11.035303", "status": "completed"}, "tags": []}, "source": ["## Energy Models\n", "\n", "In the first part of this tutorial, we will review the theory of the energy-based models\n", "(the same theory has been discussed in Lecture 8).\n", "While most of the previous models had the goal of classification or regression,\n", "energy-based models are motivated from a different perspective: density estimation.\n", "Given a dataset with a lot of elements, we want to estimate the probability distribution over the whole data space.\n", "As an example, if we model images from CIFAR10, our goal would be to have a probability distribution\n", "over all possible images of size $32\\times32\\times3$ where those images have a high likelihood\n", "that look realistic and are one of the 10 CIFAR classes.\n", "Simple methods like interpolation between images don't work because images are extremely high-dimensional\n", "(especially for large HD images).\n", "Hence, we turn to deep learning methods that have performed well on complex data.\n", "\n", "However, how do we predict a probability distribution $p(\\mathbf{x})$ over so many dimensions using a simple neural network?\n", "The problem is that we cannot just predict a score between 0 and 1,\n", "because a probability distribution over data needs to fulfill two properties:\n", "\n", "1.\n", "The probability distribution needs to assign any possible value of\n", "$\\mathbf{x}$ a non-negative value: $p(\\mathbf{x}) \\geq 0$.\n", "2.\n", "The probability density must sum/integrate to 1 over **all** possible inputs:\n", "$\\int_{\\mathbf{x}} p(\\mathbf{x}) d\\mathbf{x} = 1$.\n", "\n", "Luckily, there are actually many approaches for this, and one of them are energy-based models.\n", "The fundamental idea of energy-based models is that you can turn any function\n", "that predicts values larger than zero into a probability distribution by dviding by its volume.\n", "Imagine we have a neural network, which has as output a single neuron, like in regression.\n", "We can call this network $E_{\\theta}(\\mathbf{x})$, where $\\theta$ are our parameters of the network,\n", "and $\\mathbf{x}$ the input data (e.g. an image).\n", "The output of $E_{\\theta}$ is a scalar value between $-\\infty$ and $\\infty$.\n", "Now, we can use basic probability theory to *normalize* the scores of all possible inputs:\n", "\n", "$$\n", "q_{\\theta}(\\mathbf{x}) = \\frac{\\exp\\left(-E_{\\theta}(\\mathbf{x})\\right)}{Z_{\\theta}} \\hspace{5mm}\\text{where}\\hspace{5mm}\n", "Z_{\\theta} = \\begin{cases}\n", " \\int_{\\mathbf{x}}\\exp\\left(-E_{\\theta}(\\mathbf{x})\\right) d\\mathbf{x} & \\text{if }x\\text{ is continuous}\\\\\n", " \\sum_{\\mathbf{x}}\\exp\\left(-E_{\\theta}(\\mathbf{x})\\right) & \\text{if }x\\text{ is discrete}\n", "\\end{cases}\n", "$$\n", "\n", "The $\\exp$-function ensures that we assign a probability greater than zero to any possible input.\n", "We use a negative sign in front of $E$ because we call $E_{\\theta}$ to be the energy function:\n", "data points with high likelihood have a low energy, while data points with low likelihood have a high energy.\n", "$Z_{\\theta}$ is our normalization terms that ensures that the density integrates/sums to 1.\n", "We can show this by integrating over $q_{\\theta}(\\mathbf{x})$:\n", "\n", "$$\n", "\\int_{\\mathbf{x}}q_{\\theta}(\\mathbf{x})d\\mathbf{x} =\n", "\\int_{\\mathbf{x}}\\frac{\\exp\\left(-E_{\\theta}(\\mathbf{x})\\right)}{\\int_{\\mathbf{\\tilde{x}}}\\exp\\left(-E_{\\theta}(\\mathbf{\\tilde{x}})\\right) d\\mathbf{\\tilde{x}}}d\\mathbf{x} =\n", "\\frac{\\int_{\\mathbf{x}}\\exp\\left(-E_{\\theta}(\\mathbf{x})\\right)d\\mathbf{x}}{\\int_{\\mathbf{\\tilde{x}}}\\exp\\left(-E_{\\theta}(\\mathbf{\\tilde{x}})\\right) d\\mathbf{\\tilde{x}}} = 1\n", "$$\n", "\n", "Note that we call the probability distribution $q_{\\theta}(\\mathbf{x})$ because this is the learned distribution by the model,\n", "and is trained to be as close as possible to the *true*, unknown distribution $p(\\mathbf{x})$.\n", "\n", "The main benefit of this formulation of the probability distribution is its great flexibility as we can choose\n", "$E_{\\theta}$ in whatever way we like, without any constraints.\n", "Nevertheless, when looking at the equation above, we can see a fundamental issue: How do we calculate $Z_{\\theta}$?\n", "There is no chance that we can calculate $Z_{\\theta}$ analytically for high-dimensional input\n", "and/or larger neural networks, but the task requires us to know $Z_{\\theta}$.\n", "Although we can't determine the exact likelihood of a point, there exist methods with which we can train energy-based models.\n", "Thus, we will look next at \"Contrastive Divergence\" for training the model."]}, {"cell_type": "markdown", "id": "f41a374b", "metadata": {"papermill": {"duration": 0.011494, "end_time": "2025-04-03T19:23:11.074370", "exception": false, "start_time": "2025-04-03T19:23:11.062876", "status": "completed"}, "tags": []}, "source": ["### Contrastive Divergence\n", "\n", "When we train a model on generative modeling, it is usually done by maximum likelihood estimation.\n", "In other words, we try to maximize the likelihood of the examples in the training set.\n", "As the exact likelihood of a point cannot be determined due to the unknown normalization constant $Z_{\\theta}$,\n", "we need to train energy-based models slightly different.\n", "We cannot just maximize the un-normalized probability $\\exp(-E_{\\theta}(\\mathbf{x}_{\\text{train}}))$\n", "because there is no guarantee that $Z_{\\theta}$ stays constant, or that $\\mathbf{x}_{\\text{train}}$\n", "is becoming more likely than the others.\n", "However, if we base our training on comparing the likelihood of points, we can create a stable objective.\n", "Namely, we can re-write our maximum likelihood objective where we maximize the probability\n", "of $\\mathbf{x}_{\\text{train}}$ compared to a randomly sampled data point of our model:\n", "\n", "$$\n", "\\begin{split}\n", " \\nabla_{\\theta}\\mathcal{L}_{\\text{MLE}}(\\mathbf{\\theta};p) & = -\\mathbb{E}_{p(\\mathbf{x})}\\left[\\nabla_{\\theta}\\log q_{\\theta}(\\mathbf{x})\\right]\\\\[5pt]\n", " & = \\mathbb{E}_{p(\\mathbf{x})}\\left[\\nabla_{\\theta}E_{\\theta}(\\mathbf{x})\\right] - \\mathbb{E}_{q_{\\theta}(\\mathbf{x})}\\left[\\nabla_{\\theta}E_{\\theta}(\\mathbf{x})\\right]\n", "\\end{split}\n", "$$\n", "\n", "Note that the loss is still an objective we want to minimize.\n", "Thus, we try to minimize the energy for data points from the dataset, while maximizing the energy for randomly\n", "sampled data points from our model (how we sample will be explained below).\n", "Although this objective sounds intuitive, how is it actually derived from our original distribution $q_{\\theta}(\\mathbf{x})$?\n", "The trick is that we approximate $Z_{\\theta}$ by a single Monte-Carlo sample.\n", "This gives us the exact same objective as written above.\n", "\n", "Visually, we can look at the objective as follows (figure credit - Stefano Ermon and Aditya Grover: lecture cs236/11):\n", "\n", "
\n", "\n", "$f_{\\theta}$ represents $\\exp(-E_{\\theta}(\\mathbf{x}))$ in our case.\n", "The point on the right, called \"correct answer\", represents a data point from the dataset\n", "(i.e. $x_{\\text{train}}$), and the left point, \"wrong answer\", a sample from our model (i.e. $x_{\\text{sample}}$).\n", "Thus, we try to \"pull up\" the probability of the data points in the dataset,\n", "while \"pushing down\" randomly sampled points.\n", "The two forces for pulling and pushing are in balance iff $q_{\\theta}(\\mathbf{x})=p(\\mathbf{x})$."]}, {"cell_type": "markdown", "id": "dfff9b15", "metadata": {"papermill": {"duration": 0.008414, "end_time": "2025-04-03T19:23:11.091227", "exception": false, "start_time": "2025-04-03T19:23:11.082813", "status": "completed"}, "tags": []}, "source": ["### Sampling from Energy-Based Models\n", "\n", "For sampling from an energy-based model, we can apply a Markov Chain Monte Carlo using Langevin Dynamics.\n", "The idea of the algorithm is to start from a random point, and slowly move towards the direction\n", "of higher probability using the gradients of $E_{\\theta}$.\n", "Nevertheless, this is not enough to fully capture the probability distribution.\n", "We need to add noise $\\omega$ at each gradient step to the current sample.\n", "Under certain conditions such as that we perform the gradient steps an infinite amount of times,\n", "we would be able to create an exact sample from our modeled distribution.\n", "However, as this is not practically possible, we usually limit the chain to $K$ steps\n", "($K$ a hyperparameter that needs to be finetuned).\n", "Overall, the sampling procedure can be summarized in the following algorithm:\n", "\n", "
"]}, {"cell_type": "markdown", "id": "b2feca54", "metadata": {"papermill": {"duration": 0.007102, "end_time": "2025-04-03T19:23:11.106731", "exception": false, "start_time": "2025-04-03T19:23:11.099629", "status": "completed"}, "tags": []}, "source": ["### Applications of Energy-based models beyond generation\n", "\n", "Modeling the probability distribution for sampling new data is not the only application of energy-based models.\n", "Any application which requires us to compare two elements is much simpler to learn\n", "because we just need to go for the higher energy.\n", "A couple of examples are shown below (figure credit - Stefano Ermon and Aditya Grover: lecture cs236/11).\n", "A classification setup like object recognition or sequence labeling can be considered as an energy-based\n", "task as we just need to find the $Y$ input that minimizes the output $E(X, Y)$ (hence maximizes probability).\n", "Similarly, a popular application of energy-based models is denoising of images.\n", "Given an image $X$ with a lot of noise, we try to minimize the energy by finding the true input image $Y$.\n", "\n", "
\n", "\n", "Nonetheless, we will focus on generative modeling here as in the next couple of lectures,\n", "we will discuss more generative deep learning approaches."]}, {"cell_type": "markdown", "id": "cb7b6d5a", "metadata": {"papermill": {"duration": 0.006077, "end_time": "2025-04-03T19:23:11.118923", "exception": false, "start_time": "2025-04-03T19:23:11.112846", "status": "completed"}, "tags": []}, "source": ["## Image generation\n", "\n", "
\n", "\n", "As an example for energy-based models, we will train a model on image generation.\n", "Specifically, we will look at how we can generate MNIST digits with a very simple CNN model.\n", "However, it should be noted that energy models are not easy to train and often diverge\n", "if the hyperparameters are not well tuned.\n", "We will rely on training tricks proposed in the paper\n", "[Implicit Generation and Generalization in Energy-Based Models](https://arxiv.org/abs/1903.08689)\n", "by Yilun Du and Igor Mordatch ([blog](https://openai.com/index/energy-based-models/)).\n", "The important part of this notebook is however to see how the theory above can actually be used in a model.\n", "\n", "### Dataset\n", "\n", "First, we can load the MNIST dataset below.\n", "Note that we need to normalize the images between -1 and 1 instead of mean 0 and std 1 because during sampling,\n", "we have to limit the input space.\n", "Scaling between -1 and 1 makes it easier to implement it."]}, {"cell_type": "code", "execution_count": 4, "id": "c45a5c65", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:11.132897Z", "iopub.status.busy": "2025-04-03T19:23:11.132510Z", "iopub.status.idle": "2025-04-03T19:23:13.673293Z", "shell.execute_reply": "2025-04-03T19:23:13.672305Z"}, "papermill": {"duration": 2.54975, "end_time": "2025-04-03T19:23:13.674790", "exception": false, "start_time": "2025-04-03T19:23:11.125040", "status": "completed"}, "tags": []}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz\n", "Failed to download (trying next):\n", "HTTP Error 404: Not Found\n", "\n", "Downloading https://ossci-datasets.s3.amazonaws.com/mnist/train-images-idx3-ubyte.gz\n"]}, {"name": "stdout", "output_type": "stream", "text": ["Downloading https://ossci-datasets.s3.amazonaws.com/mnist/train-images-idx3-ubyte.gz to /__w/11/s/.datasets/MNIST/raw/train-images-idx3-ubyte.gz\n"]}, {"name": "stderr", "output_type": "stream", "text": ["\r", " 0%| | 0/9912422 [00:00 make them a tensor and normalize between -1 and 1\n", "transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])\n", "\n", "# Loading the training dataset. We need to split it into a training and validation part\n", "train_set = MNIST(root=DATASET_PATH, train=True, transform=transform, download=True)\n", "\n", "# Loading the test set\n", "test_set = MNIST(root=DATASET_PATH, train=False, transform=transform, download=True)\n", "\n", "# We define a set of data loaders that we can use for various purposes later.\n", "# Note that for actually training a model, we will use different data loaders\n", "# with a lower batch size.\n", "train_loader = data.DataLoader(train_set, batch_size=128, shuffle=True, drop_last=True, num_workers=4, pin_memory=True)\n", "test_loader = data.DataLoader(test_set, batch_size=256, shuffle=False, drop_last=False, num_workers=4)"]}, {"cell_type": "markdown", "id": "803ca18b", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.009937, "end_time": "2025-04-03T19:23:13.695308", "exception": false, "start_time": "2025-04-03T19:23:13.685371", "status": "completed"}, "tags": []}, "source": ["### CNN Model\n", "\n", "First, we implement our CNN model.\n", "The MNIST images are of size 28x28, hence we only need a small model.\n", "As an example, we will apply several convolutions with stride 2 that downscale the images.\n", "If you are interested, you can also use a deeper model such as a small ResNet, but for simplicity,\n", "we will stick with the tiny network.\n", "\n", "It is a good practice to use a smooth activation function like Swish instead of ReLU in the energy model.\n", "This is because we will rely on the gradients we get back with respect to the input image, which should not be sparse."]}, {"cell_type": "code", "execution_count": 5, "id": "36984381", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:13.711322Z", "iopub.status.busy": "2025-04-03T19:23:13.710621Z", "iopub.status.idle": "2025-04-03T19:23:13.718616Z", "shell.execute_reply": "2025-04-03T19:23:13.717722Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.017411, "end_time": "2025-04-03T19:23:13.719873", "exception": false, "start_time": "2025-04-03T19:23:13.702462", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class CNNModel(nn.Module):\n", " def __init__(self, hidden_features=32, out_dim=1, **kwargs):\n", " super().__init__()\n", " # We increase the hidden dimension over layers. Here pre-calculated for simplicity.\n", " c_hid1 = hidden_features // 2\n", " c_hid2 = hidden_features\n", " c_hid3 = hidden_features * 2\n", "\n", " # Series of convolutions and Swish activation functions\n", " self.cnn_layers = nn.Sequential(\n", " nn.Conv2d(1, c_hid1, kernel_size=5, stride=2, padding=4), # [16x16] - Larger padding to get 32x32 image\n", " nn.SiLU(),\n", " nn.Conv2d(c_hid1, c_hid2, kernel_size=3, stride=2, padding=1), # [8x8]\n", " nn.SiLU(),\n", " nn.Conv2d(c_hid2, c_hid3, kernel_size=3, stride=2, padding=1), # [4x4]\n", " nn.SiLU(),\n", " nn.Conv2d(c_hid3, c_hid3, kernel_size=3, stride=2, padding=1), # [2x2]\n", " nn.SiLU(),\n", " nn.Flatten(),\n", " nn.Linear(c_hid3 * 4, c_hid3),\n", " nn.SiLU(),\n", " nn.Linear(c_hid3, out_dim),\n", " )\n", "\n", " def forward(self, x):\n", " x = self.cnn_layers(x).squeeze(dim=-1)\n", " return x"]}, {"cell_type": "markdown", "id": "72b153d0", "metadata": {"papermill": {"duration": 0.007136, "end_time": "2025-04-03T19:23:13.734208", "exception": false, "start_time": "2025-04-03T19:23:13.727072", "status": "completed"}, "tags": []}, "source": ["In the rest of the notebook, the output of the model will actually not represent\n", "$E_{\\theta}(\\mathbf{x})$, but $-E_{\\theta}(\\mathbf{x})$.\n", "This is a standard implementation practice for energy-based models, as some people also write the energy probability\n", "density as $q_{\\theta}(\\mathbf{x}) = \\frac{\\exp\\left(f_{\\theta}(\\mathbf{x})\\right)}{Z_{\\theta}}$.\n", "In that case, the model would actually represent $f_{\\theta}(\\mathbf{x})$.\n", "In the training loss etc., we need to be careful to not switch up the signs."]}, {"cell_type": "markdown", "id": "d6f0ccd9", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.007107, "end_time": "2025-04-03T19:23:13.748459", "exception": false, "start_time": "2025-04-03T19:23:13.741352", "status": "completed"}, "tags": []}, "source": ["### Sampling buffer\n", "\n", "In the next part, we look at the training with sampled elements.\n", "To use the contrastive divergence objective, we need to generate samples during training.\n", "Previous work has shown that due to the high dimensionality of images, we need a lot of iterations\n", "inside the MCMC sampling to obtain reasonable samples.\n", "However, there is a training trick that significantly reduces the sampling cost: using a sampling buffer.\n", "The idea is that we store the samples of the last couple of batches in a buffer,\n", "and reuse those as the starting point of the MCMC algorithm for the next batches.\n", "This reduces the sampling cost because the model requires a significantly\n", "lower number of steps to converge to reasonable samples.\n", "However, to not solely rely on previous samples and allow novel samples as well,\n", "we re-initialize 5% of our samples from scratch (random noise between -1 and 1).\n", "\n", "Below, we implement the sampling buffer.\n", "The function `sample_new_exmps` returns a new batch of \"fake\" images.\n", "We refer to those as fake images because they have been generated, but are not actually part of the dataset.\n", "As mentioned before, we use initialize 5% randomly, and 95% are randomly picked from our buffer.\n", "On this initial batch, we perform MCMC for 60 iterations to improve the image quality\n", "and come closer to samples from $q_{\\theta}(\\mathbf{x})$.\n", "In the function `generate_samples`, we implemented the MCMC for images.\n", "Note that the hyperparameters of `step_size`, `steps`, the noise standard deviation\n", "$\\sigma$ are specifically set for MNIST, and need to be finetuned for a different dataset if you want to use such."]}, {"cell_type": "code", "execution_count": 6, "id": "11bbcb96", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:13.764020Z", "iopub.status.busy": "2025-04-03T19:23:13.763702Z", "iopub.status.idle": "2025-04-03T19:23:13.783928Z", "shell.execute_reply": "2025-04-03T19:23:13.782778Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.029715, "end_time": "2025-04-03T19:23:13.785348", "exception": false, "start_time": "2025-04-03T19:23:13.755633", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class Sampler:\n", " def __init__(self, model, img_shape, sample_size, max_len=8192):\n", " \"\"\"Sampler.\n", "\n", " Args:\n", " model: Neural network to use for modeling E_theta\n", " img_shape: Shape of the images to model\n", " sample_size: Batch size of the samples\n", " max_len: Maximum number of data points to keep in the buffer\n", "\n", " \"\"\"\n", " super().__init__()\n", " self.model = model\n", " self.img_shape = img_shape\n", " self.sample_size = sample_size\n", " self.max_len = max_len\n", " self.examples = [(torch.rand((1,) + img_shape) * 2 - 1) for _ in range(self.sample_size)]\n", "\n", " def sample_new_exmps(self, steps=60, step_size=10):\n", " \"\"\"Function for getting a new batch of \"fake\" images.\n", "\n", " Args:\n", " steps: Number of iterations in the MCMC algorithm\n", " step_size: Learning rate nu in the algorithm above\n", "\n", " \"\"\"\n", " # Choose 95% of the batch from the buffer, 5% generate from scratch\n", " n_new = np.random.binomial(self.sample_size, 0.05)\n", " rand_imgs = torch.rand((n_new,) + self.img_shape) * 2 - 1\n", " old_imgs = torch.cat(random.choices(self.examples, k=self.sample_size - n_new), dim=0)\n", " inp_imgs = torch.cat([rand_imgs, old_imgs], dim=0).detach().to(device)\n", "\n", " # Perform MCMC sampling\n", " inp_imgs = Sampler.generate_samples(self.model, inp_imgs, steps=steps, step_size=step_size)\n", "\n", " # Add new images to the buffer and remove old ones if needed\n", " self.examples = list(inp_imgs.to(torch.device(\"cpu\")).chunk(self.sample_size, dim=0)) + self.examples\n", " self.examples = self.examples[: self.max_len]\n", " return inp_imgs\n", "\n", " @staticmethod\n", " def generate_samples(model, inp_imgs, steps=60, step_size=10, return_img_per_step=False):\n", " \"\"\"Function for sampling images for a given model.\n", "\n", " Args:\n", " model: Neural network to use for modeling E_theta\n", " inp_imgs: Images to start from for sampling. If you want to generate new images, enter noise between -1 and 1.\n", " steps: Number of iterations in the MCMC algorithm.\n", " step_size: Learning rate nu in the algorithm above\n", " return_img_per_step: If True, we return the sample at every iteration of the MCMC\n", "\n", " \"\"\"\n", " # Before MCMC: set model parameters to \"required_grad=False\"\n", " # because we are only interested in the gradients of the input.\n", " is_training = model.training\n", " model.eval()\n", " for p in model.parameters():\n", " p.requires_grad = False\n", " inp_imgs.requires_grad = True\n", "\n", " # Enable gradient calculation if not already the case\n", " had_gradients_enabled = torch.is_grad_enabled()\n", " torch.set_grad_enabled(True)\n", "\n", " # We use a buffer tensor in which we generate noise each loop iteration.\n", " # More efficient than creating a new tensor every iteration.\n", " noise = torch.randn(inp_imgs.shape, device=inp_imgs.device)\n", "\n", " # List for storing generations at each step (for later analysis)\n", " imgs_per_step = []\n", "\n", " # Loop over K (steps)\n", " for _ in range(steps):\n", " # Part 1: Add noise to the input.\n", " noise.normal_(0, 0.005)\n", " inp_imgs.data.add_(noise.data)\n", " inp_imgs.data.clamp_(min=-1.0, max=1.0)\n", "\n", " # Part 2: calculate gradients for the current input.\n", " out_imgs = -model(inp_imgs)\n", " out_imgs.sum().backward()\n", " inp_imgs.grad.data.clamp_(-0.03, 0.03) # For stabilizing and preventing too high gradients\n", "\n", " # Apply gradients to our current samples\n", " inp_imgs.data.add_(-step_size * inp_imgs.grad.data)\n", " inp_imgs.grad.detach_()\n", " inp_imgs.grad.zero_()\n", " inp_imgs.data.clamp_(min=-1.0, max=1.0)\n", "\n", " if return_img_per_step:\n", " imgs_per_step.append(inp_imgs.clone().detach())\n", "\n", " # Reactivate gradients for parameters for training\n", " for p in model.parameters():\n", " p.requires_grad = True\n", " model.train(is_training)\n", "\n", " # Reset gradient calculation to setting before this function\n", " torch.set_grad_enabled(had_gradients_enabled)\n", "\n", " if return_img_per_step:\n", " return torch.stack(imgs_per_step, dim=0)\n", " else:\n", " return inp_imgs"]}, {"cell_type": "markdown", "id": "36de51b3", "metadata": {"papermill": {"duration": 0.010126, "end_time": "2025-04-03T19:23:13.802753", "exception": false, "start_time": "2025-04-03T19:23:13.792627", "status": "completed"}, "tags": []}, "source": ["The idea of the buffer becomes a bit clearer in the following algorithm."]}, {"cell_type": "markdown", "id": "7464a5c9", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.007151, "end_time": "2025-04-03T19:23:13.817261", "exception": false, "start_time": "2025-04-03T19:23:13.810110", "status": "completed"}, "tags": []}, "source": ["### Training algorithm\n", "\n", "With the sampling buffer being ready, we can complete our training algorithm.\n", "Below is shown a summary of the full training algorithm of an energy model on image modeling:\n", "\n", "
\n", "\n", "The first few statements in each training iteration concern the sampling of the real and fake data,\n", "as we have seen above with the sample buffer.\n", "Next, we calculate the contrastive divergence objective using our energy model $E_{\\theta}$.\n", "However, one additional training trick we need is to add a regularization loss on the output of $E_{\\theta}$.\n", "As the output of the network is not constrained and adding a large bias or not to the output\n", "doesn't change the contrastive divergence loss, we need to ensure somehow else that the output values are in a reasonable range.\n", "Without the regularization loss, the output values will fluctuate in a very large range.\n", "With this, we ensure that the values for the real data are around 0, and the fake data likely slightly lower\n", "(for noise or outliers the score can be still significantly lower).\n", "As the regularization loss is less important than the Contrastive Divergence, we have a weight factor\n", "$\\alpha$ which is usually quite some smaller than 1.\n", "Finally, we perform an update step with an optimizer on the combined loss and add the new samples to the buffer.\n", "\n", "Below, we put this training dynamic into a PyTorch Lightning module:"]}, {"cell_type": "code", "execution_count": 7, "id": "32986a5c", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:13.863485Z", "iopub.status.busy": "2025-04-03T19:23:13.863129Z", "iopub.status.idle": "2025-04-03T19:23:13.879514Z", "shell.execute_reply": "2025-04-03T19:23:13.878400Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.026524, "end_time": "2025-04-03T19:23:13.880966", "exception": false, "start_time": "2025-04-03T19:23:13.854442", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class DeepEnergyModel(pl.LightningModule):\n", " def __init__(self, img_shape, batch_size, alpha=0.1, lr=1e-4, beta1=0.0, **CNN_args):\n", " super().__init__()\n", " self.save_hyperparameters()\n", "\n", " self.cnn = CNNModel(**CNN_args)\n", " self.sampler = Sampler(self.cnn, img_shape=img_shape, sample_size=batch_size)\n", " self.example_input_array = torch.zeros(1, *img_shape)\n", "\n", " def forward(self, x):\n", " z = self.cnn(x)\n", " return z\n", "\n", " def configure_optimizers(self):\n", " # Energy models can have issues with momentum as the loss surfaces changes with its parameters.\n", " # Hence, we set it to 0 by default.\n", " optimizer = optim.Adam(self.parameters(), lr=self.hparams.lr, betas=(self.hparams.beta1, 0.999))\n", " scheduler = optim.lr_scheduler.StepLR(optimizer, 1, gamma=0.97) # Exponential decay over epochs\n", " return [optimizer], [scheduler]\n", "\n", " def training_step(self, batch, batch_idx):\n", " # We add minimal noise to the original images to prevent the model from focusing on purely \"clean\" inputs\n", " real_imgs, _ = batch\n", " small_noise = torch.randn_like(real_imgs) * 0.005\n", " real_imgs.add_(small_noise).clamp_(min=-1.0, max=1.0)\n", "\n", " # Obtain samples\n", " fake_imgs = self.sampler.sample_new_exmps(steps=60, step_size=10)\n", "\n", " # Predict energy score for all images\n", " inp_imgs = torch.cat([real_imgs, fake_imgs], dim=0)\n", " real_out, fake_out = self.cnn(inp_imgs).chunk(2, dim=0)\n", "\n", " # Calculate losses\n", " reg_loss = self.hparams.alpha * (real_out**2 + fake_out**2).mean()\n", " cdiv_loss = fake_out.mean() - real_out.mean()\n", " loss = reg_loss + cdiv_loss\n", "\n", " # Logging\n", " self.log(\"loss\", loss)\n", " self.log(\"loss_regularization\", reg_loss)\n", " self.log(\"loss_contrastive_divergence\", cdiv_loss)\n", " self.log(\"metrics_avg_real\", real_out.mean())\n", " self.log(\"metrics_avg_fake\", fake_out.mean())\n", " return loss\n", "\n", " def validation_step(self, batch, batch_idx):\n", " # For validating, we calculate the contrastive divergence between purely random images and unseen examples\n", " # Note that the validation/test step of energy-based models depends on what we are interested in the model\n", " real_imgs, _ = batch\n", " fake_imgs = torch.rand_like(real_imgs) * 2 - 1\n", "\n", " inp_imgs = torch.cat([real_imgs, fake_imgs], dim=0)\n", " real_out, fake_out = self.cnn(inp_imgs).chunk(2, dim=0)\n", "\n", " cdiv = fake_out.mean() - real_out.mean()\n", " self.log(\"val_contrastive_divergence\", cdiv)\n", " self.log(\"val_fake_out\", fake_out.mean())\n", " self.log(\"val_real_out\", real_out.mean())"]}, {"cell_type": "markdown", "id": "09ed0efc", "metadata": {"papermill": {"duration": 0.007182, "end_time": "2025-04-03T19:23:13.895419", "exception": false, "start_time": "2025-04-03T19:23:13.888237", "status": "completed"}, "tags": []}, "source": ["We do not implement a test step because energy-based, generative models are usually not evaluated on a test set.\n", "The validation step however is used to get an idea of the difference between ennergy/likelihood\n", "of random images to unseen examples of the dataset."]}, {"cell_type": "markdown", "id": "a7e35b14", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.007192, "end_time": "2025-04-03T19:23:13.910001", "exception": false, "start_time": "2025-04-03T19:23:13.902809", "status": "completed"}, "tags": []}, "source": ["### Callbacks\n", "\n", "To track the performance of our model during training, we will make extensive use of PyTorch Lightning's callback framework.\n", "Remember that callbacks can be used for running small functions at any point of the training,\n", "for instance after finishing an epoch.\n", "Here, we will use three different callbacks we define ourselves.\n", "\n", "The first callback, called `GenerateCallback`, is used for adding image generations to the model during training.\n", "After every $N$ epochs (usually $N=5$ to reduce output to TensorBoard), we take a small batch\n", "of random images and perform many MCMC iterations until the model's generation converges.\n", "Compared to the training that used 60 iterations, we use 256 here because\n", "(1) we only have to do it once compared to the training that has to do it every iteration, and\n", "(2) we do not start from a buffer here, but from scratch.\n", "It is implemented as follows:"]}, {"cell_type": "code", "execution_count": 8, "id": "c6007f74", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:13.925886Z", "iopub.status.busy": "2025-04-03T19:23:13.925534Z", "iopub.status.idle": "2025-04-03T19:23:13.936945Z", "shell.execute_reply": "2025-04-03T19:23:13.935817Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.021136, "end_time": "2025-04-03T19:23:13.938375", "exception": false, "start_time": "2025-04-03T19:23:13.917239", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class GenerateCallback(Callback):\n", " def __init__(self, batch_size=8, vis_steps=8, num_steps=256, every_n_epochs=5):\n", " super().__init__()\n", " self.batch_size = batch_size # Number of images to generate\n", " self.vis_steps = vis_steps # Number of steps within generation to visualize\n", " self.num_steps = num_steps # Number of steps to take during generation\n", " # Only save those images every N epochs (otherwise tensorboard gets quite large)\n", " self.every_n_epochs = every_n_epochs\n", "\n", " def on_epoch_end(self, trainer, pl_module):\n", " # Skip for all other epochs\n", " if trainer.current_epoch % self.every_n_epochs == 0:\n", " # Generate images\n", " imgs_per_step = self.generate_imgs(pl_module)\n", " # Plot and add to tensorboard\n", " for i in range(imgs_per_step.shape[1]):\n", " step_size = self.num_steps // self.vis_steps\n", " imgs_to_plot = imgs_per_step[step_size - 1 :: step_size, i]\n", " grid = torchvision.utils.make_grid(\n", " imgs_to_plot, nrow=imgs_to_plot.shape[0], normalize=True, value_range=(-1, 1)\n", " )\n", " trainer.logger.experiment.add_image(f\"generation_{i}\", grid, global_step=trainer.current_epoch)\n", "\n", " def generate_imgs(self, pl_module):\n", " pl_module.eval()\n", " start_imgs = torch.rand((self.batch_size,) + pl_module.hparams[\"img_shape\"]).to(pl_module.device)\n", " start_imgs = start_imgs * 2 - 1\n", " imgs_per_step = Sampler.generate_samples(\n", " pl_module.cnn, start_imgs, steps=self.num_steps, step_size=10, return_img_per_step=True\n", " )\n", " pl_module.train()\n", " return imgs_per_step"]}, {"cell_type": "markdown", "id": "ef3df449", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.007238, "end_time": "2025-04-03T19:23:13.952912", "exception": false, "start_time": "2025-04-03T19:23:13.945674", "status": "completed"}, "tags": []}, "source": ["The second callback is called `SamplerCallback`, and simply adds a randomly picked subset of images\n", "in the sampling buffer to the TensorBoard.\n", "This helps to understand what images are currently shown to the model as \"fake\"."]}, {"cell_type": "code", "execution_count": 9, "id": "1d32b15b", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:13.968867Z", "iopub.status.busy": "2025-04-03T19:23:13.968517Z", "iopub.status.idle": "2025-04-03T19:23:13.976524Z", "shell.execute_reply": "2025-04-03T19:23:13.975393Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.017742, "end_time": "2025-04-03T19:23:13.977957", "exception": false, "start_time": "2025-04-03T19:23:13.960215", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class SamplerCallback(Callback):\n", " def __init__(self, num_imgs=32, every_n_epochs=5):\n", " super().__init__()\n", " self.num_imgs = num_imgs # Number of images to plot\n", " # Only save those images every N epochs (otherwise tensorboard gets quite large)\n", " self.every_n_epochs = every_n_epochs\n", "\n", " def on_epoch_end(self, trainer, pl_module):\n", " if trainer.current_epoch % self.every_n_epochs == 0:\n", " exmp_imgs = torch.cat(random.choices(pl_module.sampler.examples, k=self.num_imgs), dim=0)\n", " grid = torchvision.utils.make_grid(exmp_imgs, nrow=4, normalize=True, value_range=(-1, 1))\n", " trainer.logger.experiment.add_image(\"sampler\", grid, global_step=trainer.current_epoch)"]}, {"cell_type": "markdown", "id": "73246f33", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.007291, "end_time": "2025-04-03T19:23:13.992568", "exception": false, "start_time": "2025-04-03T19:23:13.985277", "status": "completed"}, "tags": []}, "source": ["Finally, our last callback is `OutlierCallback`.\n", "This callback evaluates the model by recording the (negative) energy assigned to random noise.\n", "While our training loss is almost constant across iterations,\n", "this score is likely showing the progress of the model to detect \"outliers\"."]}, {"cell_type": "code", "execution_count": 10, "id": "4559d70a", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:14.008675Z", "iopub.status.busy": "2025-04-03T19:23:14.008325Z", "iopub.status.idle": "2025-04-03T19:23:14.016176Z", "shell.execute_reply": "2025-04-03T19:23:14.015143Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.018164, "end_time": "2025-04-03T19:23:14.018064", "exception": false, "start_time": "2025-04-03T19:23:13.999900", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class OutlierCallback(Callback):\n", " def __init__(self, batch_size=1024):\n", " super().__init__()\n", " self.batch_size = batch_size\n", "\n", " def on_epoch_end(self, trainer, pl_module):\n", " with torch.no_grad():\n", " pl_module.eval()\n", " rand_imgs = torch.rand((self.batch_size,) + pl_module.hparams[\"img_shape\"]).to(pl_module.device)\n", " rand_imgs = rand_imgs * 2 - 1.0\n", " rand_out = pl_module.cnn(rand_imgs).mean()\n", " pl_module.train()\n", "\n", " trainer.logger.experiment.add_scalar(\"rand_out\", rand_out, global_step=trainer.current_epoch)"]}, {"cell_type": "markdown", "id": "46d6054d", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.007314, "end_time": "2025-04-03T19:23:14.032850", "exception": false, "start_time": "2025-04-03T19:23:14.025536", "status": "completed"}, "tags": []}, "source": ["### Running the model\n", "\n", "Finally, we can add everything together to create our final training function.\n", "The function is very similar to any other PyTorch Lightning training function we have seen so far.\n", "However, there is the small difference of that we do not test the model on a test set\n", "because we will analyse the model afterward by checking its prediction and ability to perform outlier detection."]}, {"cell_type": "code", "execution_count": 11, "id": "6674cc5b", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:14.048994Z", "iopub.status.busy": "2025-04-03T19:23:14.048640Z", "iopub.status.idle": "2025-04-03T19:23:14.057602Z", "shell.execute_reply": "2025-04-03T19:23:14.056491Z"}, "papermill": {"duration": 0.01879, "end_time": "2025-04-03T19:23:14.059001", "exception": false, "start_time": "2025-04-03T19:23:14.040211", "status": "completed"}, "tags": []}, "outputs": [], "source": ["def train_model(**kwargs):\n", " # Create a PyTorch Lightning trainer with the generation callback\n", " trainer = pl.Trainer(\n", " default_root_dir=os.path.join(CHECKPOINT_PATH, \"MNIST\"),\n", " accelerator=\"auto\",\n", " devices=1,\n", " max_epochs=60,\n", " gradient_clip_val=0.1,\n", " callbacks=[\n", " ModelCheckpoint(save_weights_only=True, mode=\"min\", monitor=\"val_contrastive_divergence\"),\n", " GenerateCallback(every_n_epochs=5),\n", " SamplerCallback(every_n_epochs=5),\n", " OutlierCallback(),\n", " LearningRateMonitor(\"epoch\"),\n", " ],\n", " )\n", " # Check whether pretrained model exists. If yes, load it and skip training\n", " pretrained_filename = os.path.join(CHECKPOINT_PATH, \"MNIST.ckpt\")\n", " if os.path.isfile(pretrained_filename):\n", " print(\"Found pretrained model, loading...\")\n", " model = DeepEnergyModel.load_from_checkpoint(pretrained_filename)\n", " else:\n", " pl.seed_everything(42)\n", " model = DeepEnergyModel(**kwargs)\n", " trainer.fit(model, train_loader, test_loader)\n", " model = DeepEnergyModel.load_from_checkpoint(trainer.checkpoint_callback.best_model_path)\n", " # No testing as we are more interested in other properties\n", " return model"]}, {"cell_type": "code", "execution_count": 12, "id": "ab5aa5ef", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:14.075219Z", "iopub.status.busy": "2025-04-03T19:23:14.074868Z", "iopub.status.idle": "2025-04-03T19:23:14.712453Z", "shell.execute_reply": "2025-04-03T19:23:14.711295Z"}, "papermill": {"duration": 0.648288, "end_time": "2025-04-03T19:23:14.714711", "exception": false, "start_time": "2025-04-03T19:23:14.066423", "status": "completed"}, "tags": []}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["GPU available: True (cuda), used: True\n"]}, {"name": "stderr", "output_type": "stream", "text": ["TPU available: False, using: 0 TPU cores\n"]}, {"name": "stderr", "output_type": "stream", "text": ["HPU available: False, using: 0 HPUs\n"]}, {"name": "stdout", "output_type": "stream", "text": ["Found pretrained model, loading...\n"]}, {"name": "stderr", "output_type": "stream", "text": ["Lightning automatically upgraded your loaded checkpoint from v1.0.2 to v2.4.0. To apply the upgrade to your files permanently, run `python -m pytorch_lightning.utilities.upgrade_checkpoint saved_models/tutorial8/MNIST.ckpt`\n"]}], "source": ["model = train_model(img_shape=(1, 28, 28), batch_size=train_loader.batch_size, lr=1e-4, beta1=0.0)"]}, {"cell_type": "markdown", "id": "ce6dbdcf", "metadata": {"papermill": {"duration": 0.016957, "end_time": "2025-04-03T19:23:14.748772", "exception": false, "start_time": "2025-04-03T19:23:14.731815", "status": "completed"}, "tags": []}, "source": ["## Analysis\n", "\n", "In the last part of the notebook, we will try to take the trained energy-based generative model,\n", "and analyse its properties."]}, {"cell_type": "markdown", "id": "d3e9fa38", "metadata": {"papermill": {"duration": 0.010689, "end_time": "2025-04-03T19:23:14.775651", "exception": false, "start_time": "2025-04-03T19:23:14.764962", "status": "completed"}, "tags": []}, "source": ["### TensorBoard\n", "\n", "The first thing we can look at is the TensorBoard generate during training.\n", "This can help us to understand the training dynamic even better, and shows potential issues.\n", "Let's load the TensorBoard below:"]}, {"cell_type": "code", "execution_count": 13, "id": "1ba8f1ab", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:14.797808Z", "iopub.status.busy": "2025-04-03T19:23:14.797601Z", "iopub.status.idle": "2025-04-03T19:23:15.820450Z", "shell.execute_reply": "2025-04-03T19:23:15.819513Z"}, "papermill": {"duration": 1.035353, "end_time": "2025-04-03T19:23:15.821694", "exception": false, "start_time": "2025-04-03T19:23:14.786341", "status": "completed"}, "tags": []}, "outputs": [{"data": {"text/html": ["\n", " \n", " \n", " "], "text/plain": [""]}, "metadata": {}, "output_type": "display_data"}], "source": ["# Uncomment the following two lines to open a tensorboard in the notebook.\n", "# Adjust the path to your CHECKPOINT_PATH if needed.\n", "%load_ext tensorboard\n", "%tensorboard --logdir ../saved_models/tutorial8/tensorboards/"]}, {"cell_type": "markdown", "id": "34794d15", "metadata": {"papermill": {"duration": 0.007791, "end_time": "2025-04-03T19:23:15.837464", "exception": false, "start_time": "2025-04-03T19:23:15.829673", "status": "completed"}, "tags": []}, "source": ["
"]}, {"cell_type": "markdown", "id": "9d9df084", "metadata": {"papermill": {"duration": 0.007748, "end_time": "2025-04-03T19:23:15.853196", "exception": false, "start_time": "2025-04-03T19:23:15.845448", "status": "completed"}, "tags": []}, "source": ["We see that the contrastive divergence as well as the regularization converge quickly to 0.\n", "However, the training continues although the loss is always close to zero.\n", "This is because our \"training\" data changes with the model by sampling.\n", "The progress of training can be best measured by looking at the samples across iterations,\n", "and the score for random images that decreases constantly over time."]}, {"cell_type": "markdown", "id": "20e3fd9e", "metadata": {"papermill": {"duration": 0.007741, "end_time": "2025-04-03T19:23:15.868686", "exception": false, "start_time": "2025-04-03T19:23:15.860945", "status": "completed"}, "tags": []}, "source": ["### Image Generation\n", "\n", "Another way of evaluating generative models is by sampling a few generated images.\n", "Generative models need to be good at generating realistic images as this truly shows that they have modeled the true data distribution.\n", "Thus, let's sample a few images of the model below:"]}, {"cell_type": "code", "execution_count": 14, "id": "0f3a410d", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:15.886253Z", "iopub.status.busy": "2025-04-03T19:23:15.885377Z", "iopub.status.idle": "2025-04-03T19:23:16.785122Z", "shell.execute_reply": "2025-04-03T19:23:16.784107Z"}, "papermill": {"duration": 0.910721, "end_time": "2025-04-03T19:23:16.787132", "exception": false, "start_time": "2025-04-03T19:23:15.876411", "status": "completed"}, "tags": []}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["Seed set to 43\n"]}], "source": ["model.to(device)\n", "pl.seed_everything(43)\n", "callback = GenerateCallback(batch_size=4, vis_steps=8, num_steps=256)\n", "imgs_per_step = callback.generate_imgs(model)\n", "imgs_per_step = imgs_per_step.cpu()"]}, {"cell_type": "markdown", "id": "bc9e6eab", "metadata": {"papermill": {"duration": 0.00796, "end_time": "2025-04-03T19:23:16.803203", "exception": false, "start_time": "2025-04-03T19:23:16.795243", "status": "completed"}, "tags": []}, "source": ["The characteristic of sampling with energy-based models is that they require the iterative MCMC algorithm.\n", "To gain an insight in how the images change over iterations, we plot a few intermediate samples in the MCMC as well:"]}, {"cell_type": "code", "execution_count": 15, "id": "27d6130f", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:16.820471Z", "iopub.status.busy": "2025-04-03T19:23:16.820081Z", "iopub.status.idle": "2025-04-03T19:23:17.338777Z", "shell.execute_reply": "2025-04-03T19:23:17.337715Z"}, "papermill": {"duration": 0.529158, "end_time": "2025-04-03T19:23:17.340172", "exception": false, "start_time": "2025-04-03T19:23:16.811014", "status": "completed"}, "tags": []}, "outputs": [{"data": {"application/pdf": "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IDE3OTQgMTIzMyBdIC9Gb250TWF0cml4IFsgMC4wMDEgMCAwIDAuMDAxIDAgMCBdCi9DaGFyUHJvY3MgMTcgMCBSCi9FbmNvZGluZyA8PCAvVHlwZSAvRW5jb2RpbmcKL0RpZmZlcmVuY2VzIFsgMzIgL3NwYWNlIDQ4IC96ZXJvIC9vbmUgL3R3byAvdGhyZWUgL2ZvdXIgL2ZpdmUgL3NpeCA1NiAvZWlnaHQgL25pbmUgNzEKL0cgOTcgL2EgMTAxIC9lIDEwNSAvaSAxMTAgL24gL28gMTE0IC9yIDExNiAvdCBdCj4+Ci9XaWR0aHMgMTQgMCBSID4+CmVuZG9iagoxNSAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0ZvbnROYW1lIC9CTVFRRFYrRGVqYVZ1U2FucyAvRmxhZ3MgMzIKL0ZvbnRCQm94IFsgLTEwMjEgLTQ2MyAxNzk0IDEyMzMgXSAvQXNjZW50IDkyOSAvRGVzY2VudCAtMjM2IC9DYXBIZWlnaHQgMAovWEhlaWdodCAwIC9JdGFsaWNBbmdsZSAwIC9TdGVtViAwIC9NYXhXaWR0aCAxMzQyID4+CmVuZG9iagoxNCAwIG9iagpbIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMzE4IDQwMSA0NjAgODM4IDYzNgo5NTAgNzgwIDI3NSAzOTAgMzkwIDUwMCA4MzggMzE4IDM2MSAzMTggMzM3IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYKNjM2IDYzNiAzMzcgMzM3IDgzOCA4MzggODM4IDUzMSAxMDAwIDY4NCA2ODYgNjk4IDc3MCA2MzIgNTc1IDc3NSA3NTIgMjk1CjI5NSA2NTYgNTU3IDg2MyA3NDggNzg3IDYwMyA3ODcgNjk1IDYzNSA2MTEgNzMyIDY4NCA5ODkgNjg1IDYxMSA2ODUgMzkwIDMzNwozOTAgODM4IDUwMCA1MDAgNjEzIDYzNSA1NTAgNjM1IDYxNSAzNTIgNjM1IDYzNCAyNzggMjc4IDU3OSAyNzggOTc0IDYzNCA2MTIKNjM1IDYzNSA0MTEgNTIxIDM5MiA2MzQgNTkyIDgxOCA1OTIgNTkyIDUyNSA2MzYgMzM3IDYzNiA4MzggNjAwIDYzNiA2MDAgMzE4CjM1MiA1MTggMTAwMCA1MDAgNTAwIDUwMCAxMzQyIDYzNSA0MDAgMTA3MCA2MDAgNjg1IDYwMCA2MDAgMzE4IDMxOCA1MTggNTE4CjU5MCA1MDAgMTAwMCA1MDAgMTAwMCA1MjEgNDAwIDEwMjMgNjAwIDUyNSA2MTEgMzE4IDQwMSA2MzYgNjM2IDYzNiA2MzYgMzM3CjUwMCA1MDAgMTAwMCA0NzEgNjEyIDgzOCAzNjEgMTAwMCA1MDAgNTAwIDgzOCA0MDEgNDAxIDUwMCA2MzYgNjM2IDMxOCA1MDAKNDAxIDQ3MSA2MTIgOTY5IDk2OSA5NjkgNTMxIDY4NCA2ODQgNjg0IDY4NCA2ODQgNjg0IDk3NCA2OTggNjMyIDYzMiA2MzIgNjMyCjI5NSAyOTUgMjk1IDI5NSA3NzUgNzQ4IDc4NyA3ODcgNzg3IDc4NyA3ODcgODM4IDc4NyA3MzIgNzMyIDczMiA3MzIgNjExIDYwNQo2MzAgNjEzIDYxMyA2MTMgNjEzIDYxMyA2MTMgOTgyIDU1MCA2MTUgNjE1IDYxNSA2MTUgMjc4IDI3OCAyNzggMjc4IDYxMiA2MzQKNjEyIDYxMiA2MTIgNjEyIDYxMiA4MzggNjEyIDYzNCA2MzQgNjM0IDYzNCA1OTIgNjM1IDU5MiBdCmVuZG9iagoxNyAwIG9iago8PCAvRyAxOCAwIFIgL2EgMTkgMCBSIC9lIDIwIDAgUiAvZWlnaHQgMjEgMCBSIC9maXZlIDIyIDAgUiAvZm91ciAyMyAwIFIKL2kgMjQgMCBSIC9uIDI1IDAgUiAvbmluZSAyNiAwIFIgL28gMjcgMCBSIC9vbmUgMjggMCBSIC9yIDI5IDAgUgovc2l4IDMwIDAgUiAvc3BhY2UgMzEgMCBSIC90IDMyIDAgUiAvdGhyZWUgMzMgMCBSIC90d28gMzQgMCBSIC96ZXJvIDM1IDAgUgo+PgplbmRvYmoKMyAwIG9iago8PCAvRjEgMTYgMCBSID4+CmVuZG9iago0IDAgb2JqCjw8IC9BMSA8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IGYgCjAwMDAwMDAwMTYgMDAwMDAgbiAKMDAwMDAyNTg2MyAwMDAwMCBuIAowMDAwMDA4MDUyIDAwMDAwIG4gCjAwMDAwMDgwODQgMDAwMDAgbiAKMDAwMDAwODE4MyAwMDAwMCBuIAowMDAwMDA4MjA0IDAwMDAwIG4gCjAwMDAwMDgyMjUgMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAwMDAwMzQyIDAwMDAwIG4gCjAwMDAwMDA5NjggMDAwMDAgbiAKMDAwMDAwMDIwOCAwMDAwMCBuIAowMDAwMDAwOTQ4IDAwMDAwIG4gCjAwMDAwMDgyNTcgMDAwMDAgbiAKMDAwMDAwNjc2NyAwMDAwMCBuIAowMDAwMDA2NTYwIDAwMDAwIG4gCjAwMDAwMDYxMzQgMDAwMDAgbiAKMDAwMDAwNzgyMCAwMDAwMCBuIAowMDAwMDAwOTg4IDAwMDAwIG4gCjAwMDAwMDEzMDggMDAwMDAgbiAKMDAwMDAwMTY4OCAwMDAwMCBuIAowMDAwMDAyMDEwIDAwMDAwIG4gCjAwMDAwMDI0NzggMDAwMDAgbiAKMDAwMDAwMjgwMCAwMDAwMCBuIAowMDAwMDAyOTY2IDAwMDAwIG4gCjAwMDAwMDMxMTAgMDAwMDAgbiAKMDAwMDAwMzM0NiAwMDAwMCBuIAowMDAwMDAzNzQxIDAwMDAwIG4gCjAwMDAwMDQwMzIgMDAwMDAgbiAKMDAwMDAwNDE4NyAwMDAwMCBuIAowMDAwMDA0NDIwIDAwMDAwIG4gCjAwMDAwMDQ4MTMgMDAwMDAgbiAKMDAwMDAwNDkwMyAwMDAwMCBuIAowMDAwMDA1MTA5IDAwMDAwIG4gCjAwMDAwMDU1MjIgMDAwMDAgbiAKMDAwMDAwNTg0NiAwMDAwMCBuIAowMDAwMDI1ODQxIDAwMDAwIG4gCjAwMDAwMjU5MjMgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAzOCAvUm9vdCAxIDAgUiAvSW5mbyAzNyAwIFIgPj4Kc3RhcnR4cmVmCjI2MDc0CiUlRU9GCg==", "image/svg+xml": ["\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-04-03T19:23:16.888018\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.2, https://matplotlib.org/\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", " \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", " \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", " \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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n"], "text/plain": ["
"]}, "metadata": {}, "output_type": "display_data"}, {"data": {"application/pdf": "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IDE3OTQgMTIzMyBdIC9Gb250TWF0cml4IFsgMC4wMDEgMCAwIDAuMDAxIDAgMCBdCi9DaGFyUHJvY3MgMTcgMCBSCi9FbmNvZGluZyA8PCAvVHlwZSAvRW5jb2RpbmcKL0RpZmZlcmVuY2VzIFsgMzIgL3NwYWNlIDQ4IC96ZXJvIC9vbmUgL3R3byAvdGhyZWUgL2ZvdXIgL2ZpdmUgL3NpeCA1NiAvZWlnaHQgL25pbmUgNzEKL0cgOTcgL2EgMTAxIC9lIDEwNSAvaSAxMTAgL24gL28gMTE0IC9yIDExNiAvdCBdCj4+Ci9XaWR0aHMgMTQgMCBSID4+CmVuZG9iagoxNSAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0ZvbnROYW1lIC9CTVFRRFYrRGVqYVZ1U2FucyAvRmxhZ3MgMzIKL0ZvbnRCQm94IFsgLTEwMjEgLTQ2MyAxNzk0IDEyMzMgXSAvQXNjZW50IDkyOSAvRGVzY2VudCAtMjM2IC9DYXBIZWlnaHQgMAovWEhlaWdodCAwIC9JdGFsaWNBbmdsZSAwIC9TdGVtViAwIC9NYXhXaWR0aCAxMzQyID4+CmVuZG9iagoxNCAwIG9iagpbIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMzE4IDQwMSA0NjAgODM4IDYzNgo5NTAgNzgwIDI3NSAzOTAgMzkwIDUwMCA4MzggMzE4IDM2MSAzMTggMzM3IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYKNjM2IDYzNiAzMzcgMzM3IDgzOCA4MzggODM4IDUzMSAxMDAwIDY4NCA2ODYgNjk4IDc3MCA2MzIgNTc1IDc3NSA3NTIgMjk1CjI5NSA2NTYgNTU3IDg2MyA3NDggNzg3IDYwMyA3ODcgNjk1IDYzNSA2MTEgNzMyIDY4NCA5ODkgNjg1IDYxMSA2ODUgMzkwIDMzNwozOTAgODM4IDUwMCA1MDAgNjEzIDYzNSA1NTAgNjM1IDYxNSAzNTIgNjM1IDYzNCAyNzggMjc4IDU3OSAyNzggOTc0IDYzNCA2MTIKNjM1IDYzNSA0MTEgNTIxIDM5MiA2MzQgNTkyIDgxOCA1OTIgNTkyIDUyNSA2MzYgMzM3IDYzNiA4MzggNjAwIDYzNiA2MDAgMzE4CjM1MiA1MTggMTAwMCA1MDAgNTAwIDUwMCAxMzQyIDYzNSA0MDAgMTA3MCA2MDAgNjg1IDYwMCA2MDAgMzE4IDMxOCA1MTggNTE4CjU5MCA1MDAgMTAwMCA1MDAgMTAwMCA1MjEgNDAwIDEwMjMgNjAwIDUyNSA2MTEgMzE4IDQwMSA2MzYgNjM2IDYzNiA2MzYgMzM3CjUwMCA1MDAgMTAwMCA0NzEgNjEyIDgzOCAzNjEgMTAwMCA1MDAgNTAwIDgzOCA0MDEgNDAxIDUwMCA2MzYgNjM2IDMxOCA1MDAKNDAxIDQ3MSA2MTIgOTY5IDk2OSA5NjkgNTMxIDY4NCA2ODQgNjg0IDY4NCA2ODQgNjg0IDk3NCA2OTggNjMyIDYzMiA2MzIgNjMyCjI5NSAyOTUgMjk1IDI5NSA3NzUgNzQ4IDc4NyA3ODcgNzg3IDc4NyA3ODcgODM4IDc4NyA3MzIgNzMyIDczMiA3MzIgNjExIDYwNQo2MzAgNjEzIDYxMyA2MTMgNjEzIDYxMyA2MTMgOTgyIDU1MCA2MTUgNjE1IDYxNSA2MTUgMjc4IDI3OCAyNzggMjc4IDYxMiA2MzQKNjEyIDYxMiA2MTIgNjEyIDYxMiA4MzggNjEyIDYzNCA2MzQgNjM0IDYzNCA1OTIgNjM1IDU5MiBdCmVuZG9iagoxNyAwIG9iago8PCAvRyAxOCAwIFIgL2EgMTkgMCBSIC9lIDIwIDAgUiAvZWlnaHQgMjEgMCBSIC9maXZlIDIyIDAgUiAvZm91ciAyMyAwIFIKL2kgMjQgMCBSIC9uIDI1IDAgUiAvbmluZSAyNiAwIFIgL28gMjcgMCBSIC9vbmUgMjggMCBSIC9yIDI5IDAgUgovc2l4IDMwIDAgUiAvc3BhY2UgMzEgMCBSIC90IDMyIDAgUiAvdGhyZWUgMzMgMCBSIC90d28gMzQgMCBSIC96ZXJvIDM1IDAgUgo+PgplbmRvYmoKMyAwIG9iago8PCAvRjEgMTYgMCBSID4+CmVuZG9iago0IDAgb2JqCjw8IC9BMSA8PCAvVHlwZSAvRXh0R1N0YXRlIC9DQSAwIC9jYSAxID4+Ci9BMiA8PCAvVHlwZSAvRXh0R1N0YXRlIC9DQSAxIC9jYSAxID4+ID4+CmVuZG9iago1IDAgb2JqCjw8ID4+CmVuZG9iago2IDAgb2JqCjw8ID4+CmVuZG9iago3IDAgb2JqCjw8IC9JMSAxMyAwIFIgPj4KZW5kb2JqCjEzIDAgb2JqCjw8IC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggNjIwIC9IZWlnaHQgNzMKL0NvbG9yU3BhY2UgWyAvSW5kZXhlZCAvRGV2aWNlUkdCIDI1NQoo/////f39+/v7+fn59/f39fX18/Pz8fHx7+/v7e3t6+vr6enp5+fn5eXl4+Pj4eHh39/f3d3d29vb2dnZ19fX1dXV09PT0dHRz8/Pzc3Ny8vLycnJx8fHxcXFw8PDwcHBv7+/vb29u7u7ubm5t7e3tbW1s7OzsbGxr6+vra2tq6urqampp6enpaWlo6OjoaGhn5+fnZ2dm5ubmZmZl5eXlZWVk5OTkZGRj4+PjY2Ni4uLiYmJh4eHhYWFg4ODgYGBf39/fX19e3t7eXl5d3d3dXV1c3NzcXFxb29vbW1ta2traWlpZ2dnZWVlY2NjYWFhX19fXV1dW1tbWVlZV1dXVVVVU1NTUVFRT09PTU1NS0tLSUlJR0dHRUVFQ0NDQUFBPz8/PT09Ozs7OTk5Nzc3NTU1MzMzMTExLy8vLS0tKysrXClcKVwpJycnJSUlIyMjISEhHx8fHR0dGxsbGRkZFxcXFRUVExMTERERDw8PXHJcclxyCwsLCQkJBwcHBQUFAwMDAQEB/v7+/Pz8+vr6+Pj49vb29PT08vLy8PDw7u7u7Ozs6urq6Ojo5ubm5OTk4uLi4ODg3t7e3Nzc2tra2NjY1tbW1NTU0tLS0NDQzs7OzMzMysrKyMjIxsbGxMTEwsLCwMDAvr6+vLy8urq6uLi4tra2tLS0srKysLCwrq6urKysqqqqqKiopqampKSkoqKioKCgnp6enJycmpqamJiYlpaWlJSUkpKSkJCQjo6OjIyMioqKiIiIhoaGhISEgoKCgICAfn5+fHx8enp6eHh4dnZ2dHR0cnJycHBwbm5ubGxsampqaGhoZmZmZGRkYmJiYGBgXl5eXFxcXFxcWlpaWFhYVlZWVFRUUlJSUFBQTk5OTExMSkpKSEhIRkZGREREQkJCQEBAPj4+PDw8Ojo6ODg4NjY2NDQ0MjIyMDAwLi4uLCwsKioqXChcKFwoJiYmJCQkIiIiICAgHh4eHBwcGhoaGBgYFhYWFBQUEhISEBAQDg4ODAwMXG5cblxuCAgIBgYGBAQEAgICAAAAKQpdCi9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUKL0RlY29kZVBhcm1zIDw8IC9QcmVkaWN0b3IgMTAgL0NvbG9ycyAxIC9Db2x1bW5zIDYyMCAvQml0c1BlckNvbXBvbmVudCA4ID4+Ci9MZW5ndGggMzYgMCBSID4+CnN0cmVhbQp4nO29dUBU3db4/8wwdIdSgk0ooJIC0i0loQImYAIqiHRMEdIdApISEiIhKQgSgoQCSokoChioGEiDvzMgcmbmjM9V39/3vu+9z/rjPtfNPmt2fM7aa++99j5/Kf4j/8j/I/nr312Af+S/R/76dxfgH/nvkb/+3QX4R/575C/c/8hKFgplZ/JLayiVVqhraTU3ad7ZIdqo1/FIvUi8rFymouFBi2p13jZ5baViBdMjZr2td1sPdyuUScvsPXxAU7Wy7Dago9H06R+JsbKiYm3nn+kw0wQKon34z5Q8qFFUVD34Zzq6VRUVax78mY7D94HKaPb/mRLDWkXFu8a/+fCR5f+YNgIFaR34o3IcafsBm2R2WhQLXUCBvrJIsa5Rl3GngULCJr2jI9a66Rk7C8WKW8x7tapimfccVBaomliYutSvZjY3XrWzQOyx2weDJsmd0oCONofFPxKrekVFldN/pmPqIVCQg3N/pMPzuZKiotbHPyuIbZOiopL5sj5Pz9/T4XYAqIzB1J8VZFRFUVHt7e89u1JwBxwo/R6/9qgnfsLCwA/YquWKUzdcy2wYMFCs6zzYP2DW0yIm0dLVbdIsKV2nWlbUaNLTrXeD//be3ZvEjr2+OGFUqnfxlfQNeY3+C5ZNSoV5uwEdeo7f/kiscbC9+jMd0wZAQXrm/0yJOQ62T3+mww4H29Cf6XDvxsHmsvJPJPJ3lJzGwTb2Q8fi7yhxxMF2yHNFh6fnT3NDy+KRH7AZnRlQUh60snf98mb02bE3H96Onn5t0SArmqP09OW4TX1Bxd39Xycs+qqEUtZw55S8nFDmKDAzyt/e//WEwb2i/G1Zkv/RsCF/XQc+bL/Xx3N4sCE9PBZ/Qwk+bB5zC3//CBHV+LAtzLqRKMjPXgfPVdgen7doaLQ4ZzcxfuZEX6/l61MvT4wc11QoFq63PGM7piYmVdF2YdzycEV6MneiYOHguApvYVfrtoyDF4/tvVu8S2i71D+w4QsYNiQwivyGCjzYkIueJGBD/tzigWFb9JwnBRv4dfgpbEjPeRKwIZE/qyYIts5XR+qV6tXramuqK0V3ld1WaVbI3mU6Otj35JiZzr07sju2XBcvVbiznXeHSr26Zsfj/Y/01WU5w3Nlb1crNzfJV1T9h8IGDBm/N3qBYEO6z86T6gXAtyGtHjyMeky7eEBmRS4seHh4ku5lEGyL005zkBmRngtuLnOkCwKCDenmBBQEKtPCnJvrrCdJ9EHDqMGJfrU7Zbd2ieQJZ2/ZnCUkIb+Tbf0zhwvWw0+MqsrlFXO5111NuVmUziPZ1fXwgXaz2aveGvEIuoT0fBllIyN1pZr/WNgWfmaUSP8JDBvQkdBKkEicuSKpBAybu+MUtGFbnHefmwNoI6UEBJvn5IQbZB6kh7vLpCvJcuDBNjPhDF3i+RmXqWkPksYNBJt2z8H9esIb82WFopNqNOtVSrK3xm/RH7T69KR6j6x85xP5TWl8fFvSZTT2mRnISOTnFZaUV8vmbRMSllJuGzllYqj5fwy2n45r4GGUpF1b8JibdV8g6SqDYfNwX4DSglycn3VxdHKdIwUKGDZPN0hgkYvuU5P2nx2d50gVBAQb0s0VchBFLjhNfHz/aXqWVEHAsLnPQJrARU/ni7Y25yam3KH++g0PtsY2Y4u+LcwiatvJo7uH+x/t5k5IybqrO+K0PzNbuvbFJ+3M67nX4+L2njlxTF9gA1dMBFOKnKJy7W4xOc0DXxxOPWv7vwXbzw3WvzIbRc7PTTvNzJN0t8E+GwmyFz1dpybsLjpNk1KCNxuFpn7Rc/bSp3djH7+4QP0VJ2CfjcSYjfT4fN5qdOzLJKmCgGHzhH7BFuYnbM6+OHH+sysJHSDY7lTXtTXxce3p3rOGR7FZ31BFPDdxs7xmzwudvHyZO52HFNJF5HYnxSsefGRQG782YUNWvlRdQ5OGaIZCn+nBA12G9/4WNnfniyeGzM2PHRk0f/n2/aUp4lfx72FbdHUafXrkyMDhpydfO0A23N/DhnRxeNV94EC3ianl2GfoV/nvYZu9+Larrf2B4aMn1rbQNgVvggAFyqL7J5vevXubtdsNR8anIHX8LWyLC1+sBvdqqNXf29t/4RK0lQXDhoSoL3Jheuxke72yYl3Tw7efoYdZ/AkChJLF+fOnHtfVVlXXN5l/doYoKR5sElnZO25kCRh8fJzHz5tU1dZlVs8VJ6V0t06+ZPee2xXSeZskHutnJNysur1H+LJPcq7mMRPdts4HgmzKX44KZUrJKfwtbE42A+VFYoXCWbli0todFmMORDn+Hrb5i1aK1wWzMtOv31Y7CTmv+nvYFj+cqIuN4eLmWV/aNgid8WewIXGyePGpzlpfxogojqxWE+KK4GQVNhImad7piAEfhR8DIzO7UvcYVBbCdTaioizOu71oKab1uUztT5vb/QIaFPylD2JZcDuvpxTjTUHhQxmjO/gFMg/+0gdESeadD9ZnUHgDQl357B20b7kKW3GmwHXBrXwPPnZlbdmQIl7V+ECZb2uhlFSptGy5hLh4kXBmuZnRtg2SqrI3r132y5bea9J+R1GjceeWvfbPJQqqVWqJYFv0cHOwP2/z9s3rU6dOnx49Nfi4aTtf+tZkno38QjJ39A68vPh1fgEJfoIkbPMTF63PnD516pRlf9fNqzw86+J4b0g+fHnm/UUi3kjD5jH3xfrN6KlTJ3v0i0KCmcMi1myT0xkd+/zVnSjrT2CbPW/9amTkZH9zRRCaKiCIkWePuvmYvQuxdQP7bAR/WrQ/9+bUyZeDWtXcKDJfKj/GQjVTG7vZecJ8P4Vt+oPN6ZGXFm0y/F4wMqwXeUqDwdlxKNx+ApvH5w9vTp2wOHi7gBGFgsHQTPJtluNOEBl/BpvTx3NAQZ6pFsfDUICQ3dB7cuELhB0AwXZrG//GJO54jdfq4dH5hVz0nFvF2rS2xnJyCqnfTuJOzy4o0zA3E8vWfraHJSQouvmopqQAS8SGzKYnL8dePT18+FALEWxuDmPGLVJ5Apt5o6JiOaMjWcOCqal8fX0oqBkY6OlZ1uTdO/DJCa9QJGGz61AXvMoZFRXJFs5MQwGINyV9SGTsNQkNIltKErbFiQ8611Oj16yJZGHyx5JhsQgv2tDolO1aj8aJ8v4ENuvdOeui1kSGhwRi0XAMGRklY8SWXG3L80Qv8092EGZbdqWtiWRjZaT3RsHQcDiCMTJFROXtRaJS/ww2C+kbcUCDMNFRwQAlaDRt9PoCOSimfgLbJU3pLdFRbGGBNFgAExjaJ5rnZuVhCLv0E9g8B2oLYtdGRjD4U+BYQ8FC47fJ600SZwTBVnYzm3cdd0LjKzWW6ALxSARj3I0DD5NDw9m2aciv59oiWFDeZHFIQljPUo4xOHxd67O723ioaNiT7luefHXm7OuRl/pEsDm/f6FRxRcfxeSPRnuRw//6IWS+FGgUmRevtNbZj3gWARK2RU8351d1UtE05OilN2dZYAhycnKWtLLzrgQtQAK2Rbdpm+GqGCY4CiRk5JcZOWU0Xs8TtiIJ2DzmXJ3NM69cxpUDsAPopYJgfSLibveMeiAJMpOAbdHDfeZzVVLo97rAlnR5U4UniD+3miXMTAo2oE1merJ4KJdbBFcUGIzcn3mjsIUL8WtGCjbkwuw7mSxmDHqJMzjAKxxBx5SS83CaeLZJEjak+3SH6AYv+LIOOK4gl4PibyjZuhFlBsGm/3wvx5odFT3ne6VFU9cnJSVcub63/grdOv6dexS1NEvyMjdJ9j6SEN6jriAlLpKzdVMMI1NYJE+yoIii0dGJqcmJbiLYRlTKUrgZaXwpECgUGg5bhQ2GwQBFgwdEbdrTZAd+Ago2wCA9Ks3jiryMxeME0AiH+wTGVbdcwM9PAjaHx9pSwnGXvWFgHTA4mbdfTJKWxThB60LD5vnaTEcmj4maDOheoH+BpoXhjAqG0o9boNF+msAgkIDt68gRNdkEWgrUEiFk5F5eWDgaQ0ZJy1FQY0uYmQRsCxPjBxt2MNFiARVwDMIXEAScDEHJEFlc95LoF5dgsyZK9nCzbq9NCPUFgIWRIWjoaP18EQhvH/qwnHu9RNSThM11QP8GGz0caA8sOU1IMK0fOZacgm7N5nvGRM0Hgu2J66FI5vL7xz+9bK/hZku/kRbLX1cd7Z8iWnRL6dhzxZupUUJdDyWECyVrdJvkxJlQqL+oo7mSN8awCGn2uiKRHmZEsD0RSqGnwvxFSlAwDP1mMbw3Dgo2zwun7kQyYNEoQllSQnNNdBSJl58EbOM1onHBviuQwXC4fP//XjSlXacJQIGGzWPgXmEsM9nSSwwMoRjMMm6AXGYofu9A4KaQgO1jb0sWj/8S6UAXkftS+niTwXHMUnNcf0OYmQRs8x9eqQhyYnCDJ8CYD20ArT8FoASN9Y3nO4AkzE0CNnfn5yXXA7HAb6PQXj7BLEwMtN5eOO7ZhdWI5sYkYXNqKePGYnDvvjdVCPua0GBfcjI0gjK8QOEtYVYQbI/G9qfEC4jsPd7fqStfXrRzA1NKfYNkQW2rXFauTJWScm7s5ltllXJychpGhu3qnBRkKCq2q9I1yir1jRpN2gf7CXw2pLN9e2I0lRf6J7ChKVk3P58CuecQsC3M7FfIoPWFf0cDTe6NBfoYMNfLsHlHJCh14VULErZLlkZZCYy+iCUVGL9gOurLvpRUVOTAEALDUKQW7R1+5wHODwXbwldbTZEkemr0kkWkiYxkYqSnY2Ci9yGHw7x8UzSNPzrj6SAB22i1WGwo4N0Av0vNFsu+NpI1Yk1k4GUvGDn9leYndviZScA23bNXiJ0BZ068qVh5eeK4OGK44tn8qcgQTOwKQ+8ImIAeRpE2/Q0psb4YNAzhy5i8edPG9Ty8G9aFBJDDGeJFX5wjsG0kYHM+9aQoNRRoRTilPw9/pgBf8oaUFPYQWi9aXsE+u2n8zCDYdA+35/OvYSrU6+juszRXLljnE9/Q1vPE8rVGXHR4bO0jqXVXohJV2jTr20wPD5mm0XmjKJk3GlmMOx2rL46IELpViQ/bou0ppVB/+HcDBAkbrtPCHn8AFYkYNuTchHQU3Y+xD0ZGQ+vjhcBiyTDLwzJA35VrXUhwR0DBdkbtVggFfNmokXlFXI0NC2VgYAql8cKZKXRA2HatXrylSCjY5qwtCllpl1wsYMgIzxJIjI+N5k6OC6TGAiMR/YaCF7Z4PUQCtidpnFRkOGARNExZBdlbNyenZgnEMl8GykGdKUGQnwRslxSy2RAYnEnyC75WXpwjmL51x60MtmAMDOGTcbeXYHYNDdviE9nrtD4YwML7hlyVVy4puJFbuOcW71oqlNdl3tY+guWcJdj6iaaYttryXLQ41wQbxCapWVtRKipWdUeINxxORs1yz4LgzQHBpqKuXF4iIqTWq1d9R6OxSDCOjqvktnqz7oMKXp716fcPVSSkioir7VVVbN5vbNByc2tCFG+OhOGh0+8H26viYrftKseHbcHigWiAL/o7ERgfqtAoHr4U9rWcXCy0fpQUmCXLhIIx93wC9TIxbG5vngkHU+EogWPpI+P5soTzsgUFs/hS1kezBvggcP75msSHSNATELB5uB0V56dFoFEYBB13It91cdnSwoKdOwsKrm+KC6LBwKjottR04vUoFGzO/XrXmWnQcCxlzPpr18VU7laWl0qWy5WJZEUzUqL8YrJMT+MtGkDBhrQ/q5sc40uG8ArbcC23QEVLVVFBrlrlbmlBcggtmW/iNjNXvJJDwjZrO1yWyYpAYGkSNuXsVNRvqVepUbynU1uczRbs45Uo8YBgGQYKtkXnL8ZSGf6U5BTRKVm7ZA33t2ppNDQ/1JEV5wmhpYip0iaoPCRsC7NvG2Vi/SkRweu33BDX6Xukr6t1v8OoofI6cxBVkMy+1wS/uQpb3hVB3f1Do9Yf7tFT0wWxccSwx8RcSd6cyJ2UniOrPHCmlrfE4rmWkqyUUqtq3o6Wg9o1uuZH27U7Dw5YGGxPzxQkiGebU98Uifk+1qERvqyxorUm9qfU77Y+kNzEExXmg0UvGbewI9OgsYcYts9qEmuWp0sUfvzynZ8mHBwmADlvblYns3nJzsDp2XSQoCcgYHOyux8eQAbk9aFLM3hyfsLRafLrkpwdvC/ASwm8Cxy7NPBAgYLNTjo9JtgPS+7Ppj7wZsLR2dlpctJx0unr57Ny2awo7OWYBuOPePkhYPPsq9yxbq0vgjqw+Php+6/O085TU05Tzs6TDh03NlCQB0fdP/8VXBlI2Gz3NeSmhlFQUl/tPmn7dWrGxRnQMu0y5XiibHsQLDiummC/CAq2+VcDDTtTaalpQ+tO2DhMurq6AEWZnnGZtNPYcQVOm7SDwH2EHEadx59Xi0X7+9NsHxy9+NXFzXXGZdplxtXZyXTnZl/y9bndSLzsINgKNu7QP2A+cmq05jIFLT1zRMy6OHbOrQJXo3n48pQ0j4wo8kidtKgtLdolfVfmWmb7YEdjh+XRJtWHPSa9bZKFYuKyYNgWXS/JxTAsj34+dAxhUamCSg9OIj8bPzQ7olYgtIU36DLZEochXe+cV4tDCJuHy9vy6yGADkRAcDR3ic7xlVdr5v3pjqZ8XhbAlUP7M6lPza5Wixg2pN2oMr0vBk7DEMVTNHgG1BUTb3tKsmkBJ59VsAavk4lh85x7V5QcHRLKzBZ/zfgsaJBBekxol3PByLzDZZvPgZ+AhK1bMvcqFxvrlat17+zBXYc8WpVNifAPVRr6AC4HJGwXWu8KX4tfw34l76Ud3iLuuEYZM4qWTfKCEx4VULC5j/SpFQhyccYnd3yc+v6LS/9xM67aiKaKyTCfwntfIWFzOndMsWQzNze3jPVnvNzD1Tcuk8Wk6uObabwQowFt9crSYtHMmISbBRz+3EI513d19MteS9uU2/ygo6MoJueB5roQDp74K+wsXC3PHtY3aCjf3PnobEOS6NOTVlaGYNhmjhtn+Hotu/Rpteq6nS/PXrB3+TY/8cVx0tZ6ZGDf9vW0S7D5bL45uFocQtg+mWmvD/MBlLAp7H168t3FlWb55unm8sW2rznXBwtDkXmLdFmumkdi2BZM9mT6UXrTFu81GRlzmgG1mIfrl1f7OX0wKEqGnA/geEBi2JxO9xekJXDcbH9s+erSDHgmgJz/9LaAHAv3jb12HPwEBGyLHmZyEgI72w4eHxmfxXcrnT600pJhvZN2GYLHKkjYPho27xZrNn164o2zO94ses7OkheFoExQ0MPzuCAt2+mBVvnmwaGXI/bueIOjp/27cjiGKvyOoQ04GRI2R2vzFu2nJ4eHz7nib35MvesKgVEF7rawAesGwXZo5u296p3bNvMmJmVUVa+jSRQTK5B59qY+OyMlV9ugvVX0SraWIjOCiYM1KIgxtuX4g1pFeekswf3n7wRte+s4P4+39DHVrckLeM3AQAn32tn95OUbPNfZ9ZPl7m3MZHDg79gwrserfyCE7Z2u/BpqLKCDp8ucaBPF82x/Ga0PMMSitzb0rfrERLAh3fWFE/0u+7Oom38k1AHYzpMbaL2AX0izcgY1DDFsDs/3i2ZsSpQfeQ+xOeFeedkbhqVjP4QEJULBNj9QK7ND5qUtVGCEabAXGh2xXhMMMiRsFx+3VcseuugEEUnyeQscgwnPq8YrOiRsrwcN6g9OzS0QBTMsetzFwjG0YqqnwKkkYHthYGwPEfG+6GHOiibzyjc9Ba4MOJ7tYFNmVrOxEH3qXZXbFVKSSjr3G+vKJUukSiSlZBSevD766LGJgVT+rfKy0j2NOoMna7cU7lUvzNcwbqpsOPTc+n0XGLbJDmVuGG4m6sW7vf38x0v4oSsLM1+G+hR2cgITSrh/mOHqHwhhOyEpSE+OgW1QeWjzmWgDE+lo2yMl6Au4c9xiuqswE8K2cNFGUzhtTXKDwavPEEvxHrbKBazAtJjL4Bhoh4UYNhebE83K7d0nJpwhNnMWDEQSMBjq8IefQFNrCNiQnu+OPj3y4pKLxzdieZm7gQrNGKsKhhkSNtfzb0+8sHWFCBtDTpQmMKAZ+crwVochJwiOn2xGP7hDBCEvLujGhmKpc2RfgFMhYZtz+mJDuEayXA7PkY2hPpis1qfgXgPBplCVzxQ7YF+ISh8wqZTSPmA2ePiANm9orqKyWrVwwcmFxW9fLY926ht0Puo+On7x3Gup4CyjfeXFt2v1n/bpPxx80Q6GzVGvinNp1cO3UOMkRGmAV+u5QTYAG8w7QH81kRC2p9e4fOFo9K2Pk9CRQB96lAOAKS3bVtWZH2mEsM2dPa6Sx3+10A5KASBTh/SuAhaYVV4XlIMYNveJD2YHLpDQ4fm8WRgLpwxpegWKmYBc+pi2/+EKEIr1XXF6GF2E0t/CRloWJ9V3RqMCk4vwCvp3UR/4gvR8JBCPoOQrfgZO/buoD0IlZ3O4qWGb63rAE2MQbHtKtwWyaPTtYubXbKqp0T/QVNFwxOxO6d29e5vv3hA94Xbp3Kk+0yOHG6Ur5O5b2749JcXEr91cISkmqn64R2dv0z0VAssWtzTbpFF5Og5VmkX3M0duAhNSOHWIwWoqIWxHtnBSwn38bjuSCFj+/FyLHgA2VmTv6rhECJv7W4u6XGERRejQGcBkDT1OBorKrtMPcnSIYZu7ZHdm9CsJHYsnOwoRcJ8QfTvQbAcStjln6DAgQN7fr2SE0bIo/gFsyCldaW5UwNVdH8CpvwbbomfvzU3kgC99FJz6q7C9LUihhW2QNwbXFrwRn59KSS0oIZJ1fbuopp5x9w6fjNFx2wtDJo8e3rspZuE83LmvxXDsgxTb2tgdJ96dfiHFuuWO0p4yvvhys/2aSoIbCwl8Np4l2IL6F6CMEnLe7fM5aQA2DENU12oyIWwDqTEUcIYodVLxo1PnjIIB2NbLdq5WihC2+XMnVbdLqndBBc7gxM36+TWgqDzP3oMGBAjYvkzMkTyZsmhzpNwLTcHUC87wi+dGkXYHGsJgfiHVfwDbt5lu9Y0omit558GJvwibx6Dcdgrv9dufgFN/EbZv5yq2M8DWSbaDB1kQbLK3roeE5VdI785Py20xbK7np9706Onrtwfu6R3UL9vdZd6/32hfl/lQ5ZYEtu0vx573VyRtl69RVpLMv9tj1FQrkCSKPxvt2oTbcSdjegLZQx4THy1MbwCwkXOmma4mQwyjfhQR6/ZCV3Jx4V13bcBff6Ez7x8hPUHw+GjVWqLc+ZRUjzmZtiQA8931w2CvkBi2eUcnUsgDPttxLdwwGtYHTvw12JCe1g1SDLCA8Jrfhw3p6agtxYWi5bn5B5Zt3u0gzrKl5j8Fp/4abJ7urws2BcASZTtIwFanIX89p9HA9FgNa7Jxf054dNy6RH6tzhtrpF+/1GvYnlRrbv7MVEG65aBkcPqL1/vU6pTvyNYY9Y3YDD7Qu6+Ws7kIf53t8w0ANjKa6L5pqDjGqcGum1dDAKfOv7T57GoyIWzHt6ewhm7KNYKupOukTkQgBhiK5R1ckD9SCWFDuk6NmLy46EiqocauBXsDE4TN4wurOiBg+9kh8MXZKobLMLKA6EPg1F+DbcHddI0/GTqUu+FvZ6OkdUzbCPh7w0IyZfCm3b8EG3L6Uq0/JZxaWM4SnPxrsLnam7FTYtAZ9w+TmCDUaSgVSer1WFg1sqzvMhMIupKeFH6lRnsrTeEZy7a6zWvkh18865GVeDgkS5d2/JS2YsNeld3VPc8/zZ42bG+uy+OTwN9BcC2Eo1FktNGd5+2dp13dCOzb10f3Uhl8AdjolB6DTD4hbBa7+NeyXrvRMTMHccYCOXFOEYHb8iKrAysngs3DbezZWacZ6CmGh7NFNKADQ873GZwMHfVBQhanPokCVUGExA2Ak38NNpfP7dQoFDwyRev3YXMbH7oKTM5Zbty5CE7+JdgWP1nthqPQ/mL1o+DkX4Pt65l9ITAYfLvhENjS4J1BkOzqOzb0YfrAZoG7msoKLb3KUWvFb6cw8t+rTrkqUvJgtE9Zdb+ZyUEx33WGvY0K9Vqy13YOWDl5Tp4/WllSunSLEQi22QpGahQacXlj7i151faez/ixdOdEk4PJMUAPhRif+8kOwvt9ygnhCaky+5+eJ176mO+UWA/HzWf9GpGgZOJ1toV3xy1GrIljv3Fy5s5NYCBGBXBKTICTfwm2Sc1idqAqfulieBPvX4IN2VOQgkChsAJKT8AN9WuwWZdmBQKwXdU1wwsR+iXYXO9tZ4cB7o/OS7wZ1a/Bdjg7kQLm5Stn+xX8ioNgE7my86X16Mgl5FMhofJqve6XHzvZI0VubWBOkcqloy3S6Bl9VFQxNHbYcAc5x/0OVfk6Tal4wWMfXJAL7iMSN28THlJ2q15LjwtLuBzAvnFbmZrNlDt4SefsxiDyf2Fv9MuzfUnhHOtE7radHJshvMFgrpYzGAZ4bFT0TeB04h2ExXPHBw+/xD2/iCQ85nR0M4c34LGFpsnhzTShYUP+ELzkzzvX0gA6AgsU8TYUScIGpWRRg5kWjUJ5FXacBPcPadiWj93gm+sX8YEIFAyWNvAKb/GLNGwQlZkSo/MBjASriT3ewvNPYINQ8oCOAg3zoVXHTwXBdnN9kcXw3ppHL3Wub03akCO6u3pnRPSt6s1MsWnJ0TF5u1V0VYtK9hoce7XHl1W8vFx617Zt10uGbIYOD587bWqkJENw/cKcekoEDBeaSBEQuoZnc0mVdter1d9+xU2Ji6qEwSOeg3dcCGGbsX2aHBLMwMmXU1rZ0Lz3fo/1x1U03WQCcQMxWQTPPnClIGAb3d8iX6v3sL3tgWGnkenFWZCnbxpFh4sySpDbhxd8BR1idNLi2aH9j4yND5i8A7kFi7aZtOQoNNla/Wd41hESNpdLtlajh00PPu7usQTZWg+3WmpvGNo7QOX1Z3BlSMDmYf/hxIDZgQMH+0HmZ8Ht6RofDNDHO6y/4C0ak4Bt1vGDxbE+k95eq9UeWHS1y6XAosiDeY/jbcmRgm1xzvnsi8MHe3qfry50It2cmy9jYZhQTl0kfuZV2MS2lJgfFUm4pSXLf9UHTsPAEBTMFCunwccYwhS5cUvm9R3i4mJiRaUW8000QVdT88UT6XhK606c1ZZpOfZ6bkKtqAIfNnfdvLiV6FpccLoXt+C+1bKeilpa8kVjo/CimImjPt6mBJKjyGlo/OlYo6Jjdh0cWn3fZsWWwnW91gubgJ8ghs3z+d7yjclpaet5UvgyMsWHv4JWGo0vLxVQ4MALvLgcKNimulvUakpzt1/fdkPUbPWyC+TC+0RcoB3F+jF8O0MixGjosV55UX7ejl2aq3gjZ50qgcbC+LN04eeHhg05e3qwueLWjRs7pc6sps459TICTU0XWUGQnwRsX98dbVCUEC0U27/68nlcssoAKnOZU/AMfmYSsHk4fTTSkMnfVXjX/kfa4uTHOnIYDBGXgRdnSHBIufXta/Vyza7GQiGeWLawID/mjYJ3m4vSEjliYq8kpuTckqm9e7fhhYMWG3uagIRMkYi0tn53d5203snRV+Y1xbL4sHn0qwgsHYNAwbG4CD0MS3xpr/nFSdz74j55NGJpG546Lgdv5CGG7X0upx+KzMeHkiqQgTEkpbK+b2h57dXz6/m8pYg4X1GNYfATEJZtpEtu3ZUrnGsioq9wcW9WM+g3P7/cDFO2eylxMSU+u17Y/G2krkNrtcSOTF6ehISkTVWP+46P4sYq5KLLuadcuNiW4Iz3+G0LCdsbEz2FMoHNyYkbUnZ1mh4dwk1LkAtz504WAsOAFxtvL35+SNhcbIbbG8QztyQlJadr9Dx5ZrWAu4Nh1taymQ6YVkek1hHsIEHB5ml/7ui++p051zalbpbp7jv6ArcMuTA78eJgEgBsUKYUQX5I2FzsrPq7ZG9mJm9MzdM3GTiGC1hBzjqPmkkiAG89Q/IJfnYQbD0XHT3mHb+8PzvQ3KTVIHglmIyjtqlNv1V7Tyavr1dQeEaZ+pHj5kPDp5ozBXcW3WkYsLW1PSEnViJt/OnFnfJSqT34sCEn3t+lWTpe4k3jg/sPBuvHxNdzAjcdcBjWD12CLebeY7yRhxi2i7W7wlEr50vgCEq6eH7zpT+4WhxIww3EGIbuGbzFFYgQo48j9REMvt5YDBkZGdaLyp9rq/YSWsjThpLeS5G6tbP4i2jQ8Wx8MQx+CCwWi0BQ0kSk3RoH3BWAE10FFqB69EkSBBtikCFGPaXX2UIoyRGADgq/oKsZpjgdrhNdyhuBNqLi/5cidc81ViStCSD3QiAQXpf916bUTH/z9PhqZyaX6wtY2E1V+6EidQnOIMyaNe/iYvX19vLyAioTsu76COB2zdgOKxaGAx5BTF2HPX5+SNhsHqlt4aajIAd0ePsFcCTpAs6FxyfrpvwEOMaPucqIICYOBJvZ1OTnTx9txy8c02yoq7lxLQLOrnjvgWFHh2ohHyUZW8K2EiUjk+EzwxZtEgVCeRVKTx1szwyU3xQv0T1pIiNZVk7gsyGdLqr542CDMcZzRkaEMlKgyCi4NDqHbWxsLIyUgpZgi67bd/bi19UdHAjYlG4CXQnzCY9kY2Nh9od5hcY9sMHJ6YfquD0KGDa484sTOFwHwrK9P36Hyd/Li5GNjS2ChRGBDomtfIPTMfb4bo4XABt9hNIkKCLuGxRsHlNnbl5lvkwfzsrKGsZMhaKOEThiM2Zt9fqQvCgDAFvw5pILHng6iGFDzk625awPpAtjDQ8PC6WDY1m4msbGxqxGh1TFuXAx3tt24y1uQcI2P3NCWjgqiImFhSUsNJgcFRAlOjL21spysDk/lQKF8dpaa/K3sC26TejJbg1lXtIRQo0iZ+Yxth4bG31qVMgfjCLzjru3/xK+DgjYPOZeqEnFsoaFMTOHhgSSwekjqqzGbN4cM5VJi4JjaSNqDhJu/q/CZmL/UqGipt7SbbA4e21UuQ4/miFLzOCJaU9Pjwqdr5RuZU56nKClvWXvkRc6a4KTr98fMbolLi29K1coZ2f5nto6ghPxSIcPyr5YGAqNFT82NGxu3JKAOwPLsuZKfHw855pQ7BJsfgmbxcp1TF+vODvEsF0o2hgI6Eg8dHL4xJNH4gi0F2VkPE64Ill8AQ1wSvr8mq6T51ebASKerV8xywcLp1EfHh4279NmBYZNxjicDu61zAG4ECVG9lt9w3/js9ntb2Cn8sJkHx4cfNr7KBOF8fGPiefm5o5jDwnEAqaXKUNq5CLevicxbHMnTERoqbBsugMDAyZGspfR5JTh3Nzx3FyxzEGUKDg5vVA5wUE8CNhsnzVGBnj7lJj2mZkYNseisBT0uDa9whFOR41G+9JuUzMjWEYnHkZnXh/ZFkbrldxp0tPdoZeDQXv5RnEDbcoRRU+DQFEGpzQfmMDXQQzb4sW3dWuZfIJrHhkZPmxXCIYjvJlwleGIZqSmgJGHcCj/BLYDF57kZeZLPPU8tusaDY3cwTwM/eYbnYNmBwcsWxmolfrvZMRTx1k6mRs9u2BE73Vli9rz5q0ZpbI7t6Vyb628U1evTARbrQ8GBUP4Kju6IufGzLfCluLbfhzCwwk5I2vS1krt4yuhd8Swnd8R74/C+gp+wQ3MNioUMBS+Brgv3aa8erOTLj8Cbohh8+gqTiZDIxhxm0lun49z4h0dBVShGWPyW80c59zdfzQmMWw2mmUMgPsp6TDt7GRnI4bGVwJDM/FJDL51dJ9fnTkQw+Z6SCcVBcPEDn11dPxopROAXi0Dzs+gCMouPT4HqFgNMoOA7a1xBRUKTVH/6aL9x7ODG9BLhwlXziWiL9Nvq+uZdvfwAF1XRAyb07NOHiwZnP+17YUPZ06UYfErczks9Z6RnTtQjNW1JmLYPG3MpbzJ0MEGY1avT580iCBD/6gM4EmTh8Yqdp1xn18ABTGBYNPQr8vm4xPo+HSyc2/xzd17rkdnNLb1P9Us0xzQCqUWkNwUEsGdc/qrTmGlRgl9oKhKx1NtESGRHWISsjVNJl27thbjw/ZtbloTsGzkqbtM3Re+eU7ZFgb5EsEGp6CiZ4xdX231yYMEbO+FgQkCh5gWztVzc9ZnpcXga4BhyYNZeQVuVNxb2QGAgE0vmwtOm1VyGtdEs2fTGbzxYYP5+EWmbNtT06T7Y+eMGLYRCX4aDKeAzoz7vLvLV/mgy/innWGUTBwiEir3DUyGV36aGLbJepE1KLr1BVYzs3MukybRtGRg2NAIyjD2fMUmo4PHT64syhLDhuzbtckLEXn1ocPU7IyjTW6QL0AbbBk4YBzxpmLhzlbR6j504uyPVRFi2N5X5obA6dlLzk84OjpMNDLR4J3/9qYNS+Sraek+NjJ+acWVJYZtrq1gHYYi9KqJ7WeHiUvPNuA2/ZaYXzrhhKANTtiyu8Xo+Yi980qDgGCTKxcX2JqUpPXm7GtLg70S1/m3lB61PD5QuaXCpJGFmp2HARXMX2o1UZ2QJrSZPuxuT98THfEd/BnFctpmx8eeXwvZrkh4SFnnMhZGJdW2PIl2rVxLt8oISIAiChx9PUcCtnM5MdQovn2DywNUTzwLluBpnFVB+NCEblk5PEoM2/zeLWvRzEoGyxGF43nR1EQ6MOQ0azjThX/sbRLDZp4ZT4nNUjqEWxZcnFOLYsA/NQ20s1dQWLKguILRylyQGLaJW1x0qAjRu+O4oMXF47xh5HiwYTAwNGNsulRV66OV7SYI2PSuMGN8Nub14jzdxa8SUQErtg13wh6N9cIAOPPfVu08ZIMkCdvpNFYfWMTWGrup2TnPbw85QslW6wFMzikpyHw3ZN++/3jk3ZL7BxgnYthmpFloUFRcmUc+TwM28E3WWiqgJ1beQDQZJRU5IiZbSvextf1Kg4BvMRK4qdZYvefew/0DA/2PxZJ5ubPutgydbpao62nNubYlLdIn5pac7sOaErEdgvHJ9wcGDjemZZRXV1c3GRnqawrw7CKAbWHuPjBB8BFWxLU3ct6xJJQaGjYULN10eJYEbO9F4mhQKY09rksaO8L9MYRPA+2DQVDQ8Fh+34qAsGw6/BzwENn7uE3YBdfX1+i9iXSgsRSBjOwJRivjBgRsWesosXy3TT2Q3xanv9wOpCKwbDAYGTVdVFyKQN3K8hkxbJeWYVOxW1j85jbZE0UDtmwwNAYOQ/szc24RuFlhRRK2xbbYUIxP2s0nwKRoYeqcMAMV/HsX42hDk2HhKKo1cVl5t2TMVjxhYthGN4Z6w6KzGxxm5z1mnJpC/TGrJ3PhGIS3F5w8kltAdHdN+0r0MgRspUzUKP9NOy2n5jznpiySgihWrgcAdCC8KCiwGMa4LRIyatorcxMQbNuYc99+Pm3ekC/bajw6fHNNeEhkYu7LicPa+7qNWzVvCSUEpzWpZW6q670ntuuG+H7LZ0cUGLk7jrbUqDUrZgsIiZQRwOY6qRVEhSZPFsG5Sp7TdjupyUnAhtrc+cyVBGwfChIDUPEy7bgenJ1s9oGhiJ5eqh6arW98hhRs7Tlx8KAiZVyl3S7ifDZiHUBPwRG+WiseFzFsQ9d5KMlSpbqBcWXB7k0BvpeDe6cBq4KgpKL2v7HSBkSwIb9I4GArrMON+I5jrbQ/lCxdD4DGXcfg5UMdQBcY+4wUbEjP1pgQuC+/xDPgvXD78CIVQYZZGQNhAChwXPiDrx9jaAijysoQSAzbCG+QFyyuQGcGeHO+vJOnIIPjdCw3JpYcgQV8bXLKoPCwEIELJGFzkaT3RQUJVbwFnEOXC71sGLLvl7EstSQlAosG5i4BUWtZ2Q8QwyYQlPFs1LSz+kalXoeJcW5MHG9y+o3Oo5332x89VL1TvEMgRbRdK3ODnP49BfmqO9r72nVlE/lb96tIy8hKCPAL3SCAbfHDSzlaCjSWI1XVfMji+eED13wQQKOShUaF+AexsHFyMgf6LHU6Cg1P6xicgYZt0UYolhoVmVN5eGjI/KlZqdfSE36szPQMkexcCVGBft9bGsZ68N00CdjmmzdHoWn4RTuGhoaeHmwKX3qAPDSciTGSKz4xPjTQe/nuD7h3o6s7KdgGN631xnBtUz4+NHT8wL705cGCLpyZMZw7gZc3OpSWDGhtcm8Kyhz7BSQ0bIsXb7JRo0Iyi00shobMOmSogGKjUJTMzEzMV3gTk+LZQn0R5N4+VFSXI498N7FEsC16NLPQwSkSBfcClTlqfJ8LgwHwwjIwh4ZGJ67fsJ4jMtCbwsfXP4CGRtEDSQI25AlufywsSqDyqIWFuYnhDcTSnSU0YWHMEevWb9zEw85C5ePjQxMYQJP2njRsRTQUsIAt+caWFkMDj1QYAS8AjfIODQ9njduQci2FK5qOkpKShokpkNkISQRbum/MnmrhjNxddx7r7uDftEFMvU6udEviLbW9+xoy0/IlG7oOHu7M3ZS9s/7psyGzfJ6klALt5tul29OuRq/L3CZE+IUX9wcFV4EJytLeaBhreCijz9JpK5rK9t18N2ubzJ7ICbEv3aCA8vJNbz/sAgmb59ypdZQYYDbqH8rMHMoU4rf0BCy1vuqG6F6jY6fbhVN8vr/WYR2jjiRgc68MoETBKS8zMAP9yhiIXepj5tt15be0B0+cPyGbG062jCy25pMTkgRsPQwINFDUAOYw5lBGhuVf9cpRkStRtThz7v0+6XQ/CiwZ4DTB+ca+R1kSwoZcGE8DXn6EH10YKwtzCAMNMGrCYSjO2/Llckfen7/wXHV3TCCVFxYOxwT3znpAwzbvWkuOQaEp/ULYWMNCg+m9loxyQIH87cqO9xfGrTvUtoUz+JADpgojO+cJDduix/Fw4Icpg5jY2ADrxUC19KphtigqyGuMjo+PD7bsiV8TSO0NcMyzsgVHBBvS+QZAqBc9U3TsGpbQ4ACypSGUbY+ysuqRcVvbs4+0BWPD6f29vbDU7d/HCxBs1yjCbxYJbs0TV2hvSOfdsHH3g5a7FfHhOVXKTXf40sRvPwAMVE/+lmyReyMjFr3Z7HFXC7seVpVsv8azJkEkP4fgoxvIWU2+tSuXysAAS790CQPCN7zpiLq4wr4eK+uWii101AgyGIqCJqvzGLRlW3Ad5kQsHZ1f9gaWlFDS3OhqlasxffFh6mnlDtZASgQc8BJYjV5NkoJN5vKKJ75sBTFYSloe7U5N1f7zE4uXmis2hAT4eMFQGO9au0lSsHXTon940EtuCZbcP7S8o0XN6KLzgueze0Vrw2gvY1FwBL/1JAnYPC5swk0YcReVLN/shvbypqHPaGnV1DnnufjNtrNxKycznS8cjmAydQXDBooRmHdVxM3HASuK/e5nAY1Kz6HYqr3XHOhSt+fGu5M4gwOwQFtXupGCbf4ZM/AgwtfHCwGYxb9wtxhRBDCK6uu1duN2rd733xdMiWa5jMZgea0XkKRgE8btCFNRU1N7oZcmKFivy/Qb7xsYdOKOaju/7CtJT2QPJcci/Nq/n0wFwbbFyy86Wd1Yu64onnv9hkRemW5DrZpN7FFssYmZihoHnr5x+OpoJXujRmfA9llx3s6C3VV1rQ/2P9ZWU5RRefzw+rqbiniRuhNKiSwrV7KhlpfYfEPXSSq9/GTzyvqjvYvLhTeDhorc4eQwOjaZC189IWFzd3ge70u26poBwzBtmGhd/6fxt2NfJmc9HKxOPX18Y10Qyptho+X3I9wQsCmyBoB8LAyWnlW4vff9p/PvLgHDpvsHq6HDatevkpMxRre7fd8hJYbNLJIGs6oDTuYfvVnb5IzdhXOf5haQyK/nXx19VCbCjA6Ikvj8fckPwrKlUwAGAP39ti4YhiKCW8HsxYXx8xdwB3rcPr23fNoks8WXJnLj8e9fPCCCzXNeGXd7GG4u8J16hrj87mNj4xc+OCJxJ/QunjV/fFeSmYqZvcHVA7kKG3gHATnEvPTKAe7eshIq7nTtw6dtbcc/4+rveunC8DH9xs2XGdbm2ny/NZ94GHXOw7UDhY8XdlkJZm3y7f6hC3Z2S5e3LEx+eW1pql8WQhfO2Tk9RwjbNW+fAA6jsyb3b3hRrUu+mlBhul+nji8uAO1Nm9DSMzw2Mb/w7bOSuHbfyKXDG64UVjW0amvpPXtptv9hy6PXxwWjRMCweTp/kudmgv1YEFuqkn80v3b3R7cfu5Az9mYZcb6wkCt3V/ZXCGFzs3+W4IcFWyUvptjGYxfAFEwpC0TAqNYIWC+3LJTPVhfLiP5+xSPQ1wiK8Pg7Hybwtl6Oy2b7eq1N2r/yb2LYnnAGI1anA1jvkGTRNzN4G6pf2hU5yJjX33b8PvIQw2YrQO21Qj3gInpRr8voxb95e+HFw0JaRt7sE3g+Gwg2pGcd+Sr0wDiMieSrIzzEfOh+LN2VFG3X71+VId6usmDBNQQcvmyS0PBAfgmCfUz3N89u0q9JLn43u9xOELCJ4MIVyckx6OWda/INOx4TRENfeqMTxRy36bHT8sIVCLYq2WL+rD0q1bKiW9M2Jm9MEWvQ2qevVb+Zjilqw+3aqj3K98xmvva0G3R2dmoV5GZn1+5XvyFa3/JkeODRUfu3xRvFwLAh3SdrrzITwObDwKvywHb1tJXHjNX9PaEY3gKDlYgLomF05tQ1ZsplTMgQlH609CzJ13vwr3F3f7E/nz6hXPMni7o6/Fw+wIBBhqWgomOLTki6efuxE/5e6MdjOpuS77T9aHEi2JBD2Yl+wOiH8aakCYyOTxW8pf340jxe47qeOSa9Vbbjmdt3zcQThC+lVxmAysApgJpE8KTmiWvvP4dXDGAOcfbhTim9gytBbUSwfVvUX8dKBjQHOZUfLWPc+pxC1f2WBNtTLh9eVEtqGo3Of99EIJ6NnsmMoYLBybx8qfwD2XmzbikYHya4IsvTwbZDVrXj8KTHsg5i2FyruRlhaKBXgIKEJ14rlm3vIwxjmnU4oaaqZzQ2RzSMPrI+qljKvzFTWPLu7fTktPRc8equvtdWZVFXEjffEIkLW8NRPuFsM9qto1RcqlS1mVN+oDY6Vkhy4POZw6fmJxRyCD6UNle/IZwANjKfaFktvLPaLtZmnIjt946uWAii2Sjy3fYYmqX1G7S3L30YGwfvDulRwtP+nk0x+f0nV6L3ILer0vx9MXByH3+GtenXC6V0zKwI3sFv397KyIw4/djBJoQNuTgqIxzsBUd5+QWGs28Tq9YysXMkOm3ldkDl+arij0TrbE7qO6NxC3L+9CyR1yQVDPuhzqGOGTxZtVR4sC1VG7eDQA6YND9GZrZ1u8o7nuJdRLPSBs8PX1y9FYEYtnMVOcGA10kZGBzBvn23zgkbqPuux098WIULYgdBr3AdMMUhow0OY0uVrrcYmybW8c3V9tNqVAAINnXddoO28oLt6VnCQoKCO8UL8sv1Hr85r10ouqtYYc/V4LDIEvuLxi3dTw/otj3QlS/TNlNgu1Jaq9/9xNzyjEV9uRw+bB491QL+vggEdUDoGvY4bi6uK5zcV4UfPsFr37mLFpuCKvrfkN6It7uzMyEsKo5n07XcnUUlZbIK9w0uELbuotF2xVPnVzbSIYInX+jdTku9xpebL1oso9rY+uDp6U+EOr7Ztbe/X40zIrZsFwwbt6WkCwgVFJVWaOjufzIySXyEZn7YBNSny5YN/EOuffcLE1MFc0TFpcrq9PdbvIKK9/5sfmY1JoDYsn0bbZFPTc4SKpAoKavS6Rh6M0GkAXcW9ozT6ucXiGH7YqghlMSfl19UvLtC8+HR83gXKq3U2OH9xGrhiWHzONZatjEtO1e0uKRM2aD3HeTXOtwdQRdvgGDLjRa9MHHowS5OZgrGHWWNbRWZuxrarS+NjRzp6HryONU/MFjU7pXguoPubi4Tb16fHx86IBsar9tdcq3h7NE6ZT2iL7zMOOjFsdHSxq4XLlfQatZoVFNVU3/0Ff/anW+LtqLr969eo0MM28zL/ioh6XvtR158mnKenp52mSW+hRp5svXI6p3hUJcBzp7VNzQ/BWhwnp5xnXVzh/jgmLu9PeiObGKfzdPtUn/Xy/MXcaVwnZ1z94D6kgbetzyXYDMH50K6z5wwfGpr7+Ts7DwzO0fwEYjvsgj+QBEEbB6zFw72XsBd6uYMNMY85Bnwbwtg1cSwLbpNPu9+5TQ1NQVUxm0e+htri+BkiBCj+Vnr3uP2k0BJpoHKQJfjG3gUAp9BSCq3nz5hJhXPwcp1s/SOalGqiLr+mfEXfWaHzLrbk/yCwgptLLMSTIHJip219WeHI1q31m5s6y7NqBnokCrR1FMn3K5yNxPOiOO+frNKS8fQyPiRUaeR8TMi+i/V7Dq2+i9i2OZsTrbINT1+8vo91AUmy4K07h352ZVZgNgdGhz7SFoDrrjT4A9ILcFGEAw5O3L8/BTJyxOIhRg2oKjvB8/OQNwIQ0ogYPv2bdJyGGrIIimQtxi9ffFLH4qGDJ60H7Z2/5tvnYIFBJtO34uvzo72LUJyj/UlchPYIiIydIyeHCpcW/V5uEQwnGrNxlt9B3aLmS+caTM+ZWX7UZl7k7C4ZmvjXantW9Zy5BKGhQNG3OndSJfRCZtx+7FjFnZfvzp8/Up4ezvwntq9/8lRPtw7OPPlo73j1CzJD9cB4jY5s1pjSNjmp5zd3H+igfAQMhRsizPTc6S/s0gsJO76mP3Z1wAJBTJSd8FlBmLYIy1QsCHdID6Y8BOBhG1+ZmUy9C8JCDZjq3OfPk86PhTTfHVEPJONJjAkTduw9yA/uYTDybwNEQzcGSWG++T3WLgOqbY8P/VhvCJ4XUGZpk5ra3Ece1gkP+F21ZJMnzrpuID85jh85qdW5Yf87/reKKl7j/5F+f/hG/G/J792/QK0gL/K97s6wDdPDvdWVdTcVa3fa9jAs1ZYmj8yQbjsubVKhkRTfWlpc8ddiVtSe3Q7u01N+/aV3z55SX1DAgd//6vnAyX0G7T1Ve8oQsDm4fgVN2a4O5D8tCC+/AMbgfyvge3rL14sAyUg2B481+Fh5920Z19LvVRwgNzBUg6OuKwR50eVEkI3q9TH3A/L38rYceC5vmrXaaPk1MFJ3e08vutOuZwbLfVKv3DpwP16CNh+Vf53wfZLTg2x/AMbgYBg0+pquyNbICJ5u3ngoGJ1/9lHinLS1b3Pex5W8CTnS1tMnHhkqKvXaXg7v+axocY9417ZzRyU0e1Pn5hJheW+ftfVrPoPbPjyHwXbr16ZBSUg2GrrHlidab6945rGrKeHh+eis531sT5N1f63Sv5BiYIHxs5/dJj/oleTsfa6osGkw72irZwslEyitxvul6RIHLfc11T3D2z48p8HG/FHN35J8K45rX/0WL/l9s294xfHz78+Zf3xpXZ9maRGV9Fluqv8+hbPj1ktOB1sKRcpa9AfGdaSk8znW8slJKbaVpklfeS4sX7jP7Dhy38ebP9zlk26IDvhWv+HowaGRg8163YJNL3Ri2Zaw87ByewTsG7LHR2FIt1Z93Ovrd4+f9QiVdpuav6qu1IsOenuAc2y2u7+wWP/x74R/3P5z4ON+ENpvyT/w7DJSuSsTTS9cMzIyKitqjSdR2GoMcSPkZk1kjmQNT23VltaoMHV7eyJ12MvetpKSo2Ojbw1rZLcmlbzsHGPilH3kUHdf2DDl/882P7nhlHtHu0dN9R078o8sDUXWp+UlLencD1XWOj1Sqldtwcsnx3ZHSU9/akyR2Snitngq9evTnXUFKdu1zGUEiisVlJTb9L6Z4JAIP+7YPsf8dnwP63xqwKCreOkSbmknEJJvp7b6/S1V1P4c7P5NkWEFbU01rR9nh47Ucoo7vQuKzI6RrL/5Kz7hTNaO/g4Mp4Mi8VsB/w9haVlNsU2h8U/EiscbKf/TMfUQ6AgB93+SIfncxxstn9WEFscbM89Fz09f1+H2wEcbFN4ZftlfaM42N7+fiFwMoEbuPrcPH71t8HiMfADNk0DbbnK6juVZY2HOotyd4oWS0mKi+Zky6ipKKr3mBk/3HO9wvSRhJBwXmWrwaEnjztVd4vnFbcayORJKireWWZNUb33yB9JlzIwKzb8Mx19uIiA+4f+SMeAfo2iouqBPyvIAcDW1+gP4OS3dRzai+uZPnDRBn5ZY0etoqJy12+XYUl6cVvfOocO/35Vjhw5rPsDtn/kH/l/IX/9uwvwj/z3yF//7gL8I/898te/uwD/yH+P/H9cpj8ZCmVuZHN0cmVhbQplbmRvYmoKMzYgMCBvYmoKMTY2MTUKZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9LaWRzIFsgMTEgMCBSIF0gL0NvdW50IDEgPj4KZW5kb2JqCjM3IDAgb2JqCjw8IC9DcmVhdG9yIChNYXRwbG90bGliIHYzLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZykKL1Byb2R1Y2VyIChNYXRwbG90bGliIHBkZiBiYWNrZW5kIHYzLjkuMikgL0NyZWF0aW9uRGF0ZSAoRDoyMDI1MDQwMzE5MjMxN1opCj4+CmVuZG9iagp4cmVmCjAgMzgKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE2IDAwMDAwIG4gCjAwMDAwMjU5NDUgMDAwMDAgbiAKMDAwMDAwODA1MiAwMDAwMCBuIAowMDAwMDA4MDg0IDAwMDAwIG4gCjAwMDAwMDgxODMgMDAwMDAgbiAKMDAwMDAwODIwNCAwMDAwMCBuIAowMDAwMDA4MjI1IDAwMDAwIG4gCjAwMDAwMDAwNjUgMDAwMDAgbiAKMDAwMDAwMDM0MiAwMDAwMCBuIAowMDAwMDAwOTY4IDAwMDAwIG4gCjAwMDAwMDAyMDggMDAwMDAgbiAKMDAwMDAwMDk0OCAwMDAwMCBuIAowMDAwMDA4MjU3IDAwMDAwIG4gCjAwMDAwMDY3NjcgMDAwMDAgbiAKMDAwMDAwNjU2MCAwMDAwMCBuIAowMDAwMDA2MTM0IDAwMDAwIG4gCjAwMDAwMDc4MjAgMDAwMDAgbiAKMDAwMDAwMDk4OCAwMDAwMCBuIAowMDAwMDAxMzA4IDAwMDAwIG4gCjAwMDAwMDE2ODggMDAwMDAgbiAKMDAwMDAwMjAxMCAwMDAwMCBuIAowMDAwMDAyNDc4IDAwMDAwIG4gCjAwMDAwMDI4MDAgMDAwMDAgbiAKMDAwMDAwMjk2NiAwMDAwMCBuIAowMDAwMDAzMTEwIDAwMDAwIG4gCjAwMDAwMDMzNDYgMDAwMDAgbiAKMDAwMDAwMzc0MSAwMDAwMCBuIAowMDAwMDA0MDMyIDAwMDAwIG4gCjAwMDAwMDQxODcgMDAwMDAgbiAKMDAwMDAwNDQyMCAwMDAwMCBuIAowMDAwMDA0ODEzIDAwMDAwIG4gCjAwMDAwMDQ5MDMgMDAwMDAgbiAKMDAwMDAwNTEwOSAwMDAwMCBuIAowMDAwMDA1NTIyIDAwMDAwIG4gCjAwMDAwMDU4NDYgMDAwMDAgbiAKMDAwMDAyNTkyMyAwMDAwMCBuIAowMDAwMDI2MDA1IDAwMDAwIG4gCnRyYWlsZXIKPDwgL1NpemUgMzggL1Jvb3QgMSAwIFIgL0luZm8gMzcgMCBSID4+CnN0YXJ0eHJlZgoyNjE1NgolJUVPRgo=", "image/svg+xml": ["\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-04-03T19:23:17.068454\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.2, https://matplotlib.org/\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", " \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", " \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", " \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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n"], "text/plain": ["
"]}, "metadata": {}, "output_type": "display_data"}, {"data": {"application/pdf": "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IDE3OTQgMTIzMyBdIC9Gb250TWF0cml4IFsgMC4wMDEgMCAwIDAuMDAxIDAgMCBdCi9DaGFyUHJvY3MgMTcgMCBSCi9FbmNvZGluZyA8PCAvVHlwZSAvRW5jb2RpbmcKL0RpZmZlcmVuY2VzIFsgMzIgL3NwYWNlIDQ4IC96ZXJvIC9vbmUgL3R3byAvdGhyZWUgL2ZvdXIgL2ZpdmUgL3NpeCA1NiAvZWlnaHQgL25pbmUgNzEKL0cgOTcgL2EgMTAxIC9lIDEwNSAvaSAxMTAgL24gL28gMTE0IC9yIDExNiAvdCBdCj4+Ci9XaWR0aHMgMTQgMCBSID4+CmVuZG9iagoxNSAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0ZvbnROYW1lIC9CTVFRRFYrRGVqYVZ1U2FucyAvRmxhZ3MgMzIKL0ZvbnRCQm94IFsgLTEwMjEgLTQ2MyAxNzk0IDEyMzMgXSAvQXNjZW50IDkyOSAvRGVzY2VudCAtMjM2IC9DYXBIZWlnaHQgMAovWEhlaWdodCAwIC9JdGFsaWNBbmdsZSAwIC9TdGVtViAwIC9NYXhXaWR0aCAxMzQyID4+CmVuZG9iagoxNCAwIG9iagpbIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMzE4IDQwMSA0NjAgODM4IDYzNgo5NTAgNzgwIDI3NSAzOTAgMzkwIDUwMCA4MzggMzE4IDM2MSAzMTggMzM3IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYKNjM2IDYzNiAzMzcgMzM3IDgzOCA4MzggODM4IDUzMSAxMDAwIDY4NCA2ODYgNjk4IDc3MCA2MzIgNTc1IDc3NSA3NTIgMjk1CjI5NSA2NTYgNTU3IDg2MyA3NDggNzg3IDYwMyA3ODcgNjk1IDYzNSA2MTEgNzMyIDY4NCA5ODkgNjg1IDYxMSA2ODUgMzkwIDMzNwozOTAgODM4IDUwMCA1MDAgNjEzIDYzNSA1NTAgNjM1IDYxNSAzNTIgNjM1IDYzNCAyNzggMjc4IDU3OSAyNzggOTc0IDYzNCA2MTIKNjM1IDYzNSA0MTEgNTIxIDM5MiA2MzQgNTkyIDgxOCA1OTIgNTkyIDUyNSA2MzYgMzM3IDYzNiA4MzggNjAwIDYzNiA2MDAgMzE4CjM1MiA1MTggMTAwMCA1MDAgNTAwIDUwMCAxMzQyIDYzNSA0MDAgMTA3MCA2MDAgNjg1IDYwMCA2MDAgMzE4IDMxOCA1MTggNTE4CjU5MCA1MDAgMTAwMCA1MDAgMTAwMCA1MjEgNDAwIDEwMjMgNjAwIDUyNSA2MTEgMzE4IDQwMSA2MzYgNjM2IDYzNiA2MzYgMzM3CjUwMCA1MDAgMTAwMCA0NzEgNjEyIDgzOCAzNjEgMTAwMCA1MDAgNTAwIDgzOCA0MDEgNDAxIDUwMCA2MzYgNjM2IDMxOCA1MDAKNDAxIDQ3MSA2MTIgOTY5IDk2OSA5NjkgNTMxIDY4NCA2ODQgNjg0IDY4NCA2ODQgNjg0IDk3NCA2OTggNjMyIDYzMiA2MzIgNjMyCjI5NSAyOTUgMjk1IDI5NSA3NzUgNzQ4IDc4NyA3ODcgNzg3IDc4NyA3ODcgODM4IDc4NyA3MzIgNzMyIDczMiA3MzIgNjExIDYwNQo2MzAgNjEzIDYxMyA2MTMgNjEzIDYxMyA2MTMgOTgyIDU1MCA2MTUgNjE1IDYxNSA2MTUgMjc4IDI3OCAyNzggMjc4IDYxMiA2MzQKNjEyIDYxMiA2MTIgNjEyIDYxMiA4MzggNjEyIDYzNCA2MzQgNjM0IDYzNCA1OTIgNjM1IDU5MiBdCmVuZG9iagoxNyAwIG9iago8PCAvRyAxOCAwIFIgL2EgMTkgMCBSIC9lIDIwIDAgUiAvZWlnaHQgMjEgMCBSIC9maXZlIDIyIDAgUiAvZm91ciAyMyAwIFIKL2kgMjQgMCBSIC9uIDI1IDAgUiAvbmluZSAyNiAwIFIgL28gMjcgMCBSIC9vbmUgMjggMCBSIC9yIDI5IDAgUgovc2l4IDMwIDAgUiAvc3BhY2UgMzEgMCBSIC90IDMyIDAgUiAvdGhyZWUgMzMgMCBSIC90d28gMzQgMCBSIC96ZXJvIDM1IDAgUgo+PgplbmRvYmoKMyAwIG9iago8PCAvRjEgMTYgMCBSID4+CmVuZG9iago0IDAgb2JqCjw8IC9BMSA8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MyAwMDAwMCBuIAowMDAwMDA4MjA0IDAwMDAwIG4gCjAwMDAwMDgyMjUgMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAwMDAwMzQyIDAwMDAwIG4gCjAwMDAwMDA5NjggMDAwMDAgbiAKMDAwMDAwMDIwOCAwMDAwMCBuIAowMDAwMDAwOTQ4IDAwMDAwIG4gCjAwMDAwMDgyNTcgMDAwMDAgbiAKMDAwMDAwNjc2NyAwMDAwMCBuIAowMDAwMDA2NTYwIDAwMDAwIG4gCjAwMDAwMDYxMzQgMDAwMDAgbiAKMDAwMDAwNzgyMCAwMDAwMCBuIAowMDAwMDAwOTg4IDAwMDAwIG4gCjAwMDAwMDEzMDggMDAwMDAgbiAKMDAwMDAwMTY4OCAwMDAwMCBuIAowMDAwMDAyMDEwIDAwMDAwIG4gCjAwMDAwMDI0NzggMDAwMDAgbiAKMDAwMDAwMjgwMCAwMDAwMCBuIAowMDAwMDAyOTY2IDAwMDAwIG4gCjAwMDAwMDMxMTAgMDAwMDAgbiAKMDAwMDAwMzM0NiAwMDAwMCBuIAowMDAwMDAzNzQxIDAwMDAwIG4gCjAwMDAwMDQwMzIgMDAwMDAgbiAKMDAwMDAwNDE4NyAwMDAwMCBuIAowMDAwMDA0NDIwIDAwMDAwIG4gCjAwMDAwMDQ4MTMgMDAwMDAgbiAKMDAwMDAwNDkwMyAwMDAwMCBuIAowMDAwMDA1MTA5IDAwMDAwIG4gCjAwMDAwMDU1MjIgMDAwMDAgbiAKMDAwMDAwNTg0NiAwMDAwMCBuIAowMDAwMDI1NzQ4IDAwMDAwIG4gCjAwMDAwMjU4MzAgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAzOCAvUm9vdCAxIDAgUiAvSW5mbyAzNyAwIFIgPj4Kc3RhcnR4cmVmCjI1OTgxCiUlRU9GCg==", "image/svg+xml": ["\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-04-03T19:23:17.163799\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.2, https://matplotlib.org/\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", " \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", " \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", " \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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n"], "text/plain": ["
"]}, "metadata": {}, "output_type": "display_data"}, {"data": {"application/pdf": "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IDE3OTQgMTIzMyBdIC9Gb250TWF0cml4IFsgMC4wMDEgMCAwIDAuMDAxIDAgMCBdCi9DaGFyUHJvY3MgMTcgMCBSCi9FbmNvZGluZyA8PCAvVHlwZSAvRW5jb2RpbmcKL0RpZmZlcmVuY2VzIFsgMzIgL3NwYWNlIDQ4IC96ZXJvIC9vbmUgL3R3byAvdGhyZWUgL2ZvdXIgL2ZpdmUgL3NpeCA1NiAvZWlnaHQgL25pbmUgNzEKL0cgOTcgL2EgMTAxIC9lIDEwNSAvaSAxMTAgL24gL28gMTE0IC9yIDExNiAvdCBdCj4+Ci9XaWR0aHMgMTQgMCBSID4+CmVuZG9iagoxNSAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0ZvbnROYW1lIC9CTVFRRFYrRGVqYVZ1U2FucyAvRmxhZ3MgMzIKL0ZvbnRCQm94IFsgLTEwMjEgLTQ2MyAxNzk0IDEyMzMgXSAvQXNjZW50IDkyOSAvRGVzY2VudCAtMjM2IC9DYXBIZWlnaHQgMAovWEhlaWdodCAwIC9JdGFsaWNBbmdsZSAwIC9TdGVtViAwIC9NYXhXaWR0aCAxMzQyID4+CmVuZG9iagoxNCAwIG9iagpbIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMzE4IDQwMSA0NjAgODM4IDYzNgo5NTAgNzgwIDI3NSAzOTAgMzkwIDUwMCA4MzggMzE4IDM2MSAzMTggMzM3IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYKNjM2IDYzNiAzMzcgMzM3IDgzOCA4MzggODM4IDUzMSAxMDAwIDY4NCA2ODYgNjk4IDc3MCA2MzIgNTc1IDc3NSA3NTIgMjk1CjI5NSA2NTYgNTU3IDg2MyA3NDggNzg3IDYwMyA3ODcgNjk1IDYzNSA2MTEgNzMyIDY4NCA5ODkgNjg1IDYxMSA2ODUgMzkwIDMzNwozOTAgODM4IDUwMCA1MDAgNjEzIDYzNSA1NTAgNjM1IDYxNSAzNTIgNjM1IDYzNCAyNzggMjc4IDU3OSAyNzggOTc0IDYzNCA2MTIKNjM1IDYzNSA0MTEgNTIxIDM5MiA2MzQgNTkyIDgxOCA1OTIgNTkyIDUyNSA2MzYgMzM3IDYzNiA4MzggNjAwIDYzNiA2MDAgMzE4CjM1MiA1MTggMTAwMCA1MDAgNTAwIDUwMCAxMzQyIDYzNSA0MDAgMTA3MCA2MDAgNjg1IDYwMCA2MDAgMzE4IDMxOCA1MTggNTE4CjU5MCA1MDAgMTAwMCA1MDAgMTAwMCA1MjEgNDAwIDEwMjMgNjAwIDUyNSA2MTEgMzE4IDQwMSA2MzYgNjM2IDYzNiA2MzYgMzM3CjUwMCA1MDAgMTAwMCA0NzEgNjEyIDgzOCAzNjEgMTAwMCA1MDAgNTAwIDgzOCA0MDEgNDAxIDUwMCA2MzYgNjM2IDMxOCA1MDAKNDAxIDQ3MSA2MTIgOTY5IDk2OSA5NjkgNTMxIDY4NCA2ODQgNjg0IDY4NCA2ODQgNjg0IDk3NCA2OTggNjMyIDYzMiA2MzIgNjMyCjI5NSAyOTUgMjk1IDI5NSA3NzUgNzQ4IDc4NyA3ODcgNzg3IDc4NyA3ODcgODM4IDc4NyA3MzIgNzMyIDczMiA3MzIgNjExIDYwNQo2MzAgNjEzIDYxMyA2MTMgNjEzIDYxMyA2MTMgOTgyIDU1MCA2MTUgNjE1IDYxNSA2MTUgMjc4IDI3OCAyNzggMjc4IDYxMiA2MzQKNjEyIDYxMiA2MTIgNjEyIDYxMiA4MzggNjEyIDYzNCA2MzQgNjM0IDYzNCA1OTIgNjM1IDU5MiBdCmVuZG9iagoxNyAwIG9iago8PCAvRyAxOCAwIFIgL2EgMTkgMCBSIC9lIDIwIDAgUiAvZWlnaHQgMjEgMCBSIC9maXZlIDIyIDAgUiAvZm91ciAyMyAwIFIKL2kgMjQgMCBSIC9uIDI1IDAgUiAvbmluZSAyNiAwIFIgL28gMjcgMCBSIC9vbmUgMjggMCBSIC9yIDI5IDAgUgovc2l4IDMwIDAgUiAvc3BhY2UgMzEgMCBSIC90IDMyIDAgUiAvdGhyZWUgMzMgMCBSIC90d28gMzQgMCBSIC96ZXJvIDM1IDAgUgo+PgplbmRvYmoKMyAwIG9iago8PCAvRjEgMTYgMCBSID4+CmVuZG9iago0IDAgb2JqCjw8IC9BMSA8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IG4gCjAwMDAwMDgwODQgMDAwMDAgbiAKMDAwMDAwODE4MyAwMDAwMCBuIAowMDAwMDA4MjA0IDAwMDAwIG4gCjAwMDAwMDgyMjUgMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAwMDAwMzQyIDAwMDAwIG4gCjAwMDAwMDA5NjggMDAwMDAgbiAKMDAwMDAwMDIwOCAwMDAwMCBuIAowMDAwMDAwOTQ4IDAwMDAwIG4gCjAwMDAwMDgyNTcgMDAwMDAgbiAKMDAwMDAwNjc2NyAwMDAwMCBuIAowMDAwMDA2NTYwIDAwMDAwIG4gCjAwMDAwMDYxMzQgMDAwMDAgbiAKMDAwMDAwNzgyMCAwMDAwMCBuIAowMDAwMDAwOTg4IDAwMDAwIG4gCjAwMDAwMDEzMDggMDAwMDAgbiAKMDAwMDAwMTY4OCAwMDAwMCBuIAowMDAwMDAyMDEwIDAwMDAwIG4gCjAwMDAwMDI0NzggMDAwMDAgbiAKMDAwMDAwMjgwMCAwMDAwMCBuIAowMDAwMDAyOTY2IDAwMDAwIG4gCjAwMDAwMDMxMTAgMDAwMDAgbiAKMDAwMDAwMzM0NiAwMDAwMCBuIAowMDAwMDAzNzQxIDAwMDAwIG4gCjAwMDAwMDQwMzIgMDAwMDAgbiAKMDAwMDAwNDE4NyAwMDAwMCBuIAowMDAwMDA0NDIwIDAwMDAwIG4gCjAwMDAwMDQ4MTMgMDAwMDAgbiAKMDAwMDAwNDkwMyAwMDAwMCBuIAowMDAwMDA1MTA5IDAwMDAwIG4gCjAwMDAwMDU1MjIgMDAwMDAgbiAKMDAwMDAwNTg0NiAwMDAwMCBuIAowMDAwMDI0ODgxIDAwMDAwIG4gCjAwMDAwMjQ5NjMgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAzOCAvUm9vdCAxIDAgUiAvSW5mbyAzNyAwIFIgPj4Kc3RhcnR4cmVmCjI1MTE0CiUlRU9GCg==", "image/svg+xml": ["\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-04-03T19:23:17.271001\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.2, https://matplotlib.org/\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", " \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", " \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", " \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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n"], "text/plain": ["
"]}, "metadata": {}, "output_type": "display_data"}], "source": ["for i in range(imgs_per_step.shape[1]):\n", " step_size = callback.num_steps // callback.vis_steps\n", " imgs_to_plot = imgs_per_step[step_size - 1 :: step_size, i]\n", " imgs_to_plot = torch.cat([imgs_per_step[0:1, i], imgs_to_plot], dim=0)\n", " grid = torchvision.utils.make_grid(\n", " imgs_to_plot, nrow=imgs_to_plot.shape[0], normalize=True, value_range=(-1, 1), pad_value=0.5, padding=2\n", " )\n", " grid = grid.permute(1, 2, 0)\n", " plt.figure(figsize=(8, 8))\n", " plt.imshow(grid)\n", " plt.xlabel(\"Generation iteration\")\n", " plt.xticks(\n", " [(imgs_per_step.shape[-1] + 2) * (0.5 + j) for j in range(callback.vis_steps + 1)],\n", " labels=[1] + list(range(step_size, imgs_per_step.shape[0] + 1, step_size)),\n", " )\n", " plt.yticks([])\n", " plt.show()"]}, {"cell_type": "markdown", "id": "fe7e7d64", "metadata": {"papermill": {"duration": 0.014428, "end_time": "2025-04-03T19:23:17.370520", "exception": false, "start_time": "2025-04-03T19:23:17.356092", "status": "completed"}, "tags": []}, "source": ["We see that although starting from noise in the very first step, the sampling algorithm obtains reasonable shapes after only 32 steps.\n", "Over the next 200 steps, the shapes become clearer and changed towards realistic digits.\n", "The specific samples can differ when you run the code on Colab, hence the following description is specific to the plots shown on the website.\n", "The first row shows an 8, where we remove unnecessary white parts over iterations.\n", "The transformation across iterations can be seen at best for the second sample, which creates a digit of 2.\n", "While the first sample after 32 iterations looks a bit like a digit, but not really,\n", "the sample is transformed more and more to a typical image of the digit 2."]}, {"cell_type": "markdown", "id": "4b33d4b3", "metadata": {"papermill": {"duration": 0.014423, "end_time": "2025-04-03T19:23:17.398884", "exception": false, "start_time": "2025-04-03T19:23:17.384461", "status": "completed"}, "tags": []}, "source": ["### Out-of-distribution detection\n", "\n", "A very common and strong application of energy-based models is out-of-distribution detection\n", "(sometimes referred to as \"anomaly\" detection).\n", "As more and more deep learning models are applied in production and applications,\n", "a crucial aspect of these models is to know what the models don't know.\n", "Deep learning models are usually overconfident, meaning that they classify even random images sometimes with 100% probability.\n", "Clearly, this is not something that we want to see in applications.\n", "Energy-based models can help with this problem because they are trained to detect images that do not fit the training dataset distribution.\n", "Thus, in those applications, you could train an energy-based model along with the classifier,\n", "and only output predictions if the energy-based models assign a (unnormalized) probability higher than $\\delta$ to the image.\n", "You can actually combine classifiers and energy-based objectives in a single model,\n", "as proposed in this [paper](https://arxiv.org/abs/1912.03263).\n", "\n", "In this part of the analysis, we want to test the out-of-distribution capability of our energy-based model.\n", "Remember that a lower output of the model denotes a low probability.\n", "Thus, we hope to see low scores if we enter random noise to the model:"]}, {"cell_type": "code", "execution_count": 16, "id": "fce8c186", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:17.428680Z", "iopub.status.busy": "2025-04-03T19:23:17.428464Z", "iopub.status.idle": "2025-04-03T19:23:17.491413Z", "shell.execute_reply": "2025-04-03T19:23:17.490431Z"}, "papermill": {"duration": 0.079868, "end_time": "2025-04-03T19:23:17.492683", "exception": false, "start_time": "2025-04-03T19:23:17.412815", "status": "completed"}, "tags": []}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["Average score for random images: -17.878559112548828\n"]}], "source": ["with torch.no_grad():\n", " rand_imgs = torch.rand((128,) + model.hparams.img_shape).to(model.device)\n", " rand_imgs = rand_imgs * 2 - 1.0\n", " rand_out = model.cnn(rand_imgs).mean()\n", " print(f\"Average score for random images: {rand_out.item()}\")"]}, {"cell_type": "markdown", "id": "5990fa0f", "metadata": {"papermill": {"duration": 0.014063, "end_time": "2025-04-03T19:23:17.520975", "exception": false, "start_time": "2025-04-03T19:23:17.506912", "status": "completed"}, "tags": []}, "source": ["As we hoped, the model assigns very low probability to those noisy images.\n", "As another reference, let's look at predictions for a batch of images from the training set:"]}, {"cell_type": "code", "execution_count": 17, "id": "e7779be6", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:17.550127Z", "iopub.status.busy": "2025-04-03T19:23:17.549923Z", "iopub.status.idle": "2025-04-03T19:23:17.903348Z", "shell.execute_reply": "2025-04-03T19:23:17.902213Z"}, "papermill": {"duration": 0.370192, "end_time": "2025-04-03T19:23:17.905145", "exception": false, "start_time": "2025-04-03T19:23:17.534953", "status": "completed"}, "tags": []}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["Average score for training images: -0.01\n"]}], "source": ["with torch.no_grad():\n", " train_imgs, _ = next(iter(train_loader))\n", " train_imgs = train_imgs.to(model.device)\n", " train_out = model.cnn(train_imgs).mean()\n", " print(f\"Average score for training images: {train_out.item():4.2f}\")"]}, {"cell_type": "markdown", "id": "42ead070", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.020048, "end_time": "2025-04-03T19:23:17.945686", "exception": false, "start_time": "2025-04-03T19:23:17.925638", "status": "completed"}, "tags": []}, "source": ["The scores are close to 0 because of the regularization objective that was added to the training.\n", "So clearly, the model can distinguish between noise and real digits.\n", "However, what happens if we change the training images a little, and see which ones gets a very low score?"]}, {"cell_type": "code", "execution_count": 18, "id": "5a4e8a71", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:17.981955Z", "iopub.status.busy": "2025-04-03T19:23:17.981542Z", "iopub.status.idle": "2025-04-03T19:23:17.992024Z", "shell.execute_reply": "2025-04-03T19:23:17.991070Z"}, "papermill": {"duration": 0.028035, "end_time": "2025-04-03T19:23:17.993346", "exception": false, "start_time": "2025-04-03T19:23:17.965311", "status": "completed"}, "tags": []}, "outputs": [], "source": ["@torch.no_grad()\n", "def compare_images(img1, img2):\n", " imgs = torch.stack([img1, img2], dim=0).to(model.device)\n", " score1, score2 = model.cnn(imgs).cpu().chunk(2, dim=0)\n", " grid = torchvision.utils.make_grid(\n", " [img1.cpu(), img2.cpu()], nrow=2, normalize=True, value_range=(-1, 1), pad_value=0.5, padding=2\n", " )\n", " grid = grid.permute(1, 2, 0)\n", " plt.figure(figsize=(4, 4))\n", " plt.imshow(grid)\n", " plt.xticks([(img1.shape[2] + 2) * (0.5 + j) for j in range(2)], labels=[\"Original image\", \"Transformed image\"])\n", " plt.yticks([])\n", " plt.show()\n", " print(f\"Score original image: {score1}\")\n", " print(f\"Score transformed image: {score2}\")"]}, {"cell_type": "markdown", "id": "3b544f22", "metadata": {"papermill": {"duration": 0.014267, "end_time": "2025-04-03T19:23:18.021845", "exception": false, "start_time": "2025-04-03T19:23:18.007578", "status": "completed"}, "tags": []}, "source": ["We use a random test image for this. Feel free to change it to experiment with the model yourself."]}, {"cell_type": "code", "execution_count": 19, "id": "4682c38f", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:18.052015Z", "iopub.status.busy": "2025-04-03T19:23:18.051650Z", "iopub.status.idle": "2025-04-03T19:23:18.422281Z", "shell.execute_reply": "2025-04-03T19:23:18.420665Z"}, "papermill": {"duration": 0.388112, "end_time": "2025-04-03T19:23:18.424359", "exception": false, "start_time": "2025-04-03T19:23:18.036247", "status": "completed"}, "tags": []}, "outputs": [], "source": ["test_imgs, _ = next(iter(test_loader))\n", "exmp_img = test_imgs[0].to(model.device)"]}, {"cell_type": "markdown", "id": "ca27f72b", "metadata": {"papermill": {"duration": 0.01431, "end_time": "2025-04-03T19:23:18.453377", "exception": false, "start_time": "2025-04-03T19:23:18.439067", "status": "completed"}, "tags": []}, "source": ["The first transformation is to add some random noise to the image:"]}, {"cell_type": "code", "execution_count": 20, "id": "0e973c65", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:18.484315Z", "iopub.status.busy": "2025-04-03T19:23:18.483899Z", "iopub.status.idle": "2025-04-03T19:23:18.595407Z", "shell.execute_reply": "2025-04-03T19:23:18.594325Z"}, "papermill": {"duration": 0.129024, "end_time": "2025-04-03T19:23:18.597017", "exception": false, "start_time": "2025-04-03T19:23:18.467993", "status": "completed"}, "tags": []}, "outputs": [{"data": {"application/pdf": "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675IsZnCeV04s/4MU2a1eSfPcqLUqQjvsWdL0NA5rp69lllodJsTvKSEz8ZOT06+VzPrITkVCaliWlfBaRSZYgnbEl9TUVOaehn++/Lu8Tt+/gEsc3xzCmVuZHN0cmVhbQplbmRvYmoKMzIgMCBvYmoKPDwgL0xlbmd0aCAxOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJwzNrRQMIDDFEOuNAAd5gNSCmVuZHN0cmVhbQplbmRvYmoKMTYgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL0Jhc2VGb250IC9CTVFRRFYrRGVqYVZ1U2FucyAvRmlyc3RDaGFyIDAgL0xhc3RDaGFyIDI1NQovRm9udERlc2NyaXB0b3IgMTUgMCBSIC9TdWJ0eXBlIC9UeXBlMyAvTmFtZSAvQk1RUURWK0RlamFWdVNhbnMKL0ZvbnRCQm94IFsgLTEwMjEgLTQ2MyAxNzk0IDEyMzMgXSAvRm9udE1hdHJpeCBbIDAuMDAxIDAgMCAwLjAwMSAwIDAgXQovQ2hhclByb2NzIDE3IDAgUgovRW5jb2RpbmcgPDwgL1R5cGUgL0VuY29kaW5nCi9EaWZmZXJlbmNlcyBbIDMyIC9zcGFjZSA3OSAvTyA4NCAvVCA5NyAvYSAxMDAgL2QgL2UgL2YgL2cgMTA1IC9pIDEwOCAvbCAvbSAvbiAvbyAxMTQKL3IgL3MgXQo+PgovV2lkdGhzIDE0IDAgUiA+PgplbmRvYmoKMTUgMCBvYmoKPDwgL1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9Gb250TmFtZSAvQk1RUURWK0RlamFWdVNhbnMgL0ZsYWdzIDMyCi9Gb250QkJveCBbIC0xMDIxIC00NjMgMTc5NCAxMjMzIF0gL0FzY2VudCA5MjkgL0Rlc2NlbnQgLTIzNiAvQ2FwSGVpZ2h0IDAKL1hIZWlnaHQgMCAvSXRhbGljQW5nbGUgMCAvU3RlbVYgMCAvTWF4V2lkdGggMTM0MiA+PgplbmRvYmoKMTQgMCBvYmoKWyA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMAo2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDMxOCA0MDEgNDYwIDgzOCA2MzYKOTUwIDc4MCAyNzUgMzkwIDM5MCA1MDAgODM4IDMxOCAzNjEgMzE4IDMzNyA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2CjYzNiA2MzYgMzM3IDMzNyA4MzggODM4IDgzOCA1MzEgMTAwMCA2ODQgNjg2IDY5OCA3NzAgNjMyIDU3NSA3NzUgNzUyIDI5NQoyOTUgNjU2IDU1NyA4NjMgNzQ4IDc4NyA2MDMgNzg3IDY5NSA2MzUgNjExIDczMiA2ODQgOTg5IDY4NSA2MTEgNjg1IDM5MCAzMzcKMzkwIDgzOCA1MDAgNTAwIDYxMyA2MzUgNTUwIDYzNSA2MTUgMzUyIDYzNSA2MzQgMjc4IDI3OCA1NzkgMjc4IDk3NCA2MzQgNjEyCjYzNSA2MzUgNDExIDUyMSAzOTIgNjM0IDU5MiA4MTggNTkyIDU5MiA1MjUgNjM2IDMzNyA2MzYgODM4IDYwMCA2MzYgNjAwIDMxOAozNTIgNTE4IDEwMDAgNTAwIDUwMCA1MDAgMTM0MiA2MzUgNDAwIDEwNzAgNjAwIDY4NSA2MDAgNjAwIDMxOCAzMTggNTE4IDUxOAo1OTAgNTAwIDEwMDAgNTAwIDEwMDAgNTIxIDQwMCAxMDIzIDYwMCA1MjUgNjExIDMxOCA0MDEgNjM2IDYzNiA2MzYgNjM2IDMzNwo1MDAgNTAwIDEwMDAgNDcxIDYxMiA4MzggMzYxIDEwMDAgNTAwIDUwMCA4MzggNDAxIDQwMSA1MDAgNjM2IDYzNiAzMTggNTAwCjQwMSA0NzEgNjEyIDk2OSA5NjkgOTY5IDUzMSA2ODQgNjg0IDY4NCA2ODQgNjg0IDY4NCA5NzQgNjk4IDYzMiA2MzIgNjMyIDYzMgoyOTUgMjk1IDI5NSAyOTUgNzc1IDc0OCA3ODcgNzg3IDc4NyA3ODcgNzg3IDgzOCA3ODcgNzMyIDczMiA3MzIgNzMyIDYxMSA2MDUKNjMwIDYxMyA2MTMgNjEzIDYxMyA2MTMgNjEzIDk4MiA1NTAgNjE1IDYxNSA2MTUgNjE1IDI3OCAyNzggMjc4IDI3OCA2MTIgNjM0CjYxMiA2MTIgNjEyIDYxMiA2MTIgODM4IDYx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olLb+Q5IcKUjBXT0iApjrBdjv1/fwmQRWZOEyRGfnSq4hWRbxvTYrzHaom0R0RZtDSwRbduLAfvpDsVRsT0inznL8Vz45L2r5FS/r4+Jl9vEAaKveZSX3pm/61P2hHRlSLRFW7R1RFsTc61t/dEXVSnBQxaLrfxZGR8DJk98yqAbA3a+wB6OtMdWjVMLCKMt2qKtI9qa2IC0heFEWxPR1kS0NRFtTURbE9HWRLQ1EW1NRFsT/wKsE4p0CmVuZHN0cmVhbQplbmRvYmoKMzMgMCBvYmoKMTcxNwplbmRvYmoKMiAwIG9iago8PCAvVHlwZSAvUGFnZXMgL0tpZHMgWyAxMSAwIFIgXSAvQ291bnQgMSA+PgplbmRvYmoKMzQgMCBvYmoKPDwgL0NyZWF0b3IgKE1hdHBsb3RsaWIgdjMuOS4yLCBodHRwczovL21hdHBsb3RsaWIub3JnKQovUHJvZHVjZXIgKE1hdHBsb3RsaWIgcGRmIGJhY2tlbmQgdjMuOS4yKSAvQ3JlYXRpb25EYXRlIChEOjIwMjUwNDAzMTkyMzE4WikKPj4KZW5kb2JqCnhyZWYKMCAzNQowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTYgMDAwMDAgbiAKMDAwMDAwOTIyNSAwMDAwMCBuIAowMDAwMDA2NTE1IDAwMDAwIG4gCjAwMDAwMDY1NDcgMDAwMDAgbiAKMDAwMDAwNjY0NiAwMDAwMCBuIAowMDAwMDA2NjY3IDAwMDAwIG4gCjAwMDAwMDY2ODggMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAwMDAwMzM5IDAwMDAwIG4gCjAwMDAwMDA3NjkgMDAwMDAgbiAKMDAwMDAwMDIwOCAwMDAwMCBuIAowMDAwMDAwNzQ5IDAwMDAwIG4gCjAwMDAwMDY3MjAgMDAwMDAgbiAKMDAwMDAwNTI4NiAwMDAwMCBuIAowMDAwMDA1MDc5IDAwMDAwIG4gCjAwMDAwMDQ2OTUgMDAwMDAgbiAKMDAwMDAwNjMzOSAwMDAwMCBuIAowMDAwMDAwNzg5IDAwMDAwIG4gCjAwMDAwMDEwNzcgMDAwMDAgbiAKMDAwMDAwMTIxNSAwMDAwMCBuIAowMDAwMDAxNTk1IDAwMDAwIG4gCjAwMDAwMDE4OTkgMDAwMDAgbiAKMDAwMDAwMjIyMSAwMDAwMCBuIAowMDAwMDAyNDMwIDAwMDAwIG4gCjAwMDAwMDI4NDQgMDAwMDAgbiAKMDAwMDAwMjk4OCAwMDAwMCBuIAowMDAwMDAzMTA3IDAwMDAwIG4gCjAwMDAwMDM0MzggMDAwMDAgbiAKMDAwMDAwMzY3NCAwMDAwMCBuIAowMDAwMDAzOTY1IDAwMDAwIG4gCjAwMDAwMDQxOTggMDAwMDAgbiAKMDAwMDAwNDYwNSAwMDAwMCBuIAowMDAwMDA5MjA0IDAwMDAwIG4gCjAwMDAwMDkyODUgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAzNSAvUm9vdCAxIDAgUiAvSW5mbyAzNCAwIFIgPj4Kc3RhcnR4cmVmCjk0MzYKJSVFT0YK", "image/svg+xml": ["\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-04-03T19:23:18.544758\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.2, https://matplotlib.org/\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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n"], "text/plain": ["
"]}, "metadata": {}, "output_type": "display_data"}, {"name": "stdout", "output_type": "stream", "text": ["Score original image: tensor([0.0304])\n", "Score transformed image: tensor([-0.0746])\n"]}], "source": ["img_noisy = exmp_img + torch.randn_like(exmp_img) * 0.3\n", "img_noisy.clamp_(min=-1.0, max=1.0)\n", "compare_images(exmp_img, img_noisy)"]}, {"cell_type": "markdown", "id": "d06b5110", "metadata": {"papermill": {"duration": 0.020627, "end_time": "2025-04-03T19:23:18.638559", "exception": false, "start_time": "2025-04-03T19:23:18.617932", "status": "completed"}, "tags": []}, "source": ["We can see that the score considerably drops.\n", "Hence, the model can detect random Gaussian noise on the image.\n", "This is also to expect as initially, the \"fake\" samples are pure noise images.\n", "\n", "Next, we flip an image and check how this influences the score:"]}, {"cell_type": "code", "execution_count": 21, "id": "88f1028e", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:18.674580Z", "iopub.status.busy": "2025-04-03T19:23:18.674315Z", "iopub.status.idle": "2025-04-03T19:23:18.771248Z", "shell.execute_reply": "2025-04-03T19:23:18.770121Z"}, "papermill": {"duration": 0.114667, "end_time": "2025-04-03T19:23:18.772878", "exception": false, "start_time": "2025-04-03T19:23:18.658211", "status": "completed"}, "tags": []}, "outputs": [{"data": {"application/pdf": "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675IsZnCeV04s/4MU2a1eSfPcqLUqQjvsWdL0NA5rp69lllodJsTvKSEz8ZOT06+VzPrITkVCaliWlfBaRSZYgnbEl9TUVOaehn++/Lu8Tt+/gEsc3xzCmVuZHN0cmVhbQplbmRvYmoKMzIgMCBvYmoKPDwgL0xlbmd0aCAxOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJwzNrRQMIDDFEOuNAAd5gNSCmVuZHN0cmVhbQplbmRvYmoKMTYgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL0Jhc2VGb250IC9CTVFRRFYrRGVqYVZ1U2FucyAvRmlyc3RDaGFyIDAgL0xhc3RDaGFyIDI1NQovRm9udERlc2NyaXB0b3IgMTUgMCBSIC9TdWJ0eXBlIC9UeXBlMyAvTmFtZSAvQk1RUURWK0RlamFWdVNhbnMKL0ZvbnRCQm94IFsgLTEwMjEgLTQ2MyAxNzk0IDEyMzMgXSAvRm9udE1hdHJpeCBbIDAuMDAxIDAgMCAwLjAwMSAwIDAgXQovQ2hhclByb2NzIDE3IDAgUgovRW5jb2RpbmcgPDwgL1R5cGUgL0VuY29kaW5nCi9EaWZmZXJlbmNlcyBbIDMyIC9zcGFjZSA3OSAvTyA4NCAvVCA5NyAvYSAxMDAgL2QgL2UgL2YgL2cgMTA1IC9pIDEwOCAvbCAvbSAvbiAvbyAxMTQKL3IgL3MgXQo+PgovV2lkdGhzIDE0IDAgUiA+PgplbmRvYmoKMTUgMCBvYmoKPDwgL1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9Gb250TmFtZSAvQk1RUURWK0RlamFWdVNhbnMgL0ZsYWdzIDMyCi9Gb250QkJveCBbIC0xMDIxIC00NjMgMTc5NCAxMjMzIF0gL0FzY2VudCA5MjkgL0Rlc2NlbnQgLTIzNiAvQ2FwSGVpZ2h0IDAKL1hIZWlnaHQgMCAvSXRhbGljQW5nbGUgMCAvU3RlbVYgMCAvTWF4V2lkdGggMTM0MiA+PgplbmRvYmoKMTQgMCBvYmoKWyA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMAo2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDMxOCA0MDEgNDYwIDgzOCA2MzYKOTUwIDc4MCAyNzUgMzkwIDM5MCA1MDAgODM4IDMxOCAzNjEgMzE4IDMzNyA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2CjYzNiA2MzYgMzM3IDMzNyA4MzggODM4IDgzOCA1MzEgMTAwMCA2ODQgNjg2IDY5OCA3NzAgNjMyIDU3NSA3NzUgNzUyIDI5NQoyOTUgNjU2IDU1NyA4NjMgNzQ4IDc4NyA2MDMgNzg3IDY5NSA2MzUgNjExIDczMiA2ODQgOTg5IDY4NSA2MTEgNjg1IDM5MCAzMzcKMzkwIDgzOCA1MDAgNTAwIDYxMyA2MzUgNTUwIDYzNSA2MTUgMzUyIDYzNSA2MzQgMjc4IDI3OCA1NzkgMjc4IDk3NCA2MzQgNjEyCjYzNSA2MzUgNDExIDUyMSAzOTIgNjM0IDU5MiA4MTggNTkyIDU5MiA1MjUgNjM2IDMzNyA2MzYgODM4IDYwMCA2MzYgNjAwIDMxOAozNTIgNTE4IDEwMDAgNTAwIDUwMCA1MDAgMTM0MiA2MzUgNDAwIDEwNzAgNjAwIDY4NSA2MDAgNjAwIDMxOCAzMTggNTE4IDUxOAo1OTAgNTAwIDEwMDAgNTAwIDEwMDAgNTIxIDQwMCAxMDIzIDYwMCA1MjUgNjExIDMxOCA0MDEgNjM2IDYzNiA2MzYgNjM2IDMzNwo1MDAgNTAwIDEwMDAgNDcxIDYxMiA4MzggMzYxIDEwMDAgNTAwIDUwMCA4MzggNDAxIDQwMSA1MDAgNjM2IDYzNiAzMTggNTAwCjQwMSA0NzEgNjEyIDk2OSA5NjkgOTY5IDUzMSA2ODQgNjg0IDY4NCA2ODQgNjg0IDY4NCA5NzQgNjk4IDYzMiA2MzIgNjMyIDYzMgoyOTUgMjk1IDI5NSAyOTUgNzc1IDc0OCA3ODcgNzg3IDc4NyA3ODcgNzg3IDgzOCA3ODcgNzMyIDczMiA3MzIgNzMyIDYxMSA2MDUKNjMwIDYxMyA2MTMgNjEzIDYxMyA2MTMgNjEzIDk4MiA1NTAgNjE1IDYxNSA2MTUgNjE1IDI3OCAyNzggMjc4IDI3OCA2MTIgNjM0CjYxMiA2MTIgNjEyIDYxMiA2MTIgODM4IDYx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8LImHQc2H6ojskXIFiFbhGyR7tmWpeB+uvUD+xyvD7JFyBYhW4RskU7ZZmfRV5GtAtkiZIuQLTIxG8qRLUK2CNkiZIuQLUK2CNkiZIuQLfIH7alBRAplbmRzdHJlYW0KZW5kb2JqCjMzIDAgb2JqCjk5NgplbmRvYmoKMiAwIG9iago8PCAvVHlwZSAvUGFnZXMgL0tpZHMgWyAxMSAwIFIgXSAvQ291bnQgMSA+PgplbmRvYmoKMzQgMCBvYmoKPDwgL0NyZWF0b3IgKE1hdHBsb3RsaWIgdjMuOS4yLCBodHRwczovL21hdHBsb3RsaWIub3JnKQovUHJvZHVjZXIgKE1hdHBsb3RsaWIgcGRmIGJhY2tlbmQgdjMuOS4yKSAvQ3JlYXRpb25EYXRlIChEOjIwMjUwNDAzMTkyMzE4WikKPj4KZW5kb2JqCnhyZWYKMCAzNQowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTYgMDAwMDAgbiAKMDAwMDAwODIyMyAwMDAwMCBuIAowMDAwMDA2NTE1IDAwMDAwIG4gCjAwMDAwMDY1NDcgMDAwMDAgbiAKMDAwMDAwNjY0NiAwMDAwMCBuIAowMDAwMDA2NjY3IDAwMDAwIG4gCjAwMDAwMDY2ODggMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAwMDAwMzM5IDAwMDAwIG4gCjAwMDAwMDA3NjkgMDAwMDAgbiAKMDAwMDAwMDIwOCAwMDAwMCBuIAowMDAwMDAwNzQ5IDAwMDAwIG4gCjAwMDAwMDY3MjAgMDAwMDAgbiAKMDAwMDAwNTI4NiAwMDAwMCBuIAowMDAwMDA1MDc5IDAwMDAwIG4gCjAwMDAwMDQ2OTUgMDAwMDAgbiAKMDAwMDAwNjMzOSAwMDAwMCBuIAowMDAwMDAwNzg5IDAwMDAwIG4gCjAwMDAwMDEwNzcgMDAwMDAgbiAKMDAwMDAwMTIxNSAwMDAwMCBuIAowMDAwMDAxNTk1IDAwMDAwIG4gCjAwMDAwMDE4OTkgMDAwMDAgbiAKMDAwMDAwMjIyMSAwMDAwMCBuIAowMDAwMDAyNDMwIDAwMDAwIG4gCjAwMDAwMDI4NDQgMDAwMDAgbiAKMDAwMDAwMjk4OCAwMDAwMCBuIAowMDAwMDAzMTA3IDAwMDAwIG4gCjAwMDAwMDM0MzggMDAwMDAgbiAKMDAwMDAwMzY3NCAwMDAwMCBuIAowMDAwMDAzOTY1IDAwMDAwIG4gCjAwMDAwMDQxOTggMDAwMDAgbiAKMDAwMDAwNDYwNSAwMDAwMCBuIAowMDAwMDA4MjAzIDAwMDAwIG4gCjAwMDAwMDgyODMgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAzNSAvUm9vdCAxIDAgUiAvSW5mbyAzNCAwIFIgPj4Kc3RhcnR4cmVmCjg0MzQKJSVFT0YK", "image/svg+xml": ["\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-04-03T19:23:18.729499\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.2, https://matplotlib.org/\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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n"], "text/plain": ["
"]}, "metadata": {}, "output_type": "display_data"}, {"name": "stdout", "output_type": "stream", "text": ["Score original image: tensor([0.0304])\n", "Score transformed image: tensor([-0.0004])\n"]}], "source": ["img_flipped = exmp_img.flip(dims=(1, 2))\n", "compare_images(exmp_img, img_flipped)"]}, {"cell_type": "markdown", "id": "19958fcc", "metadata": {"papermill": {"duration": 0.021629, "end_time": "2025-04-03T19:23:18.817148", "exception": false, "start_time": "2025-04-03T19:23:18.795519", "status": "completed"}, "tags": []}, "source": ["If the digit can only be read in this way, for example, the 7, then we can see that the score drops.\n", "However, the score only drops slightly.\n", "This is likely because of the small size of our model.\n", "Keep in mind that generative modeling is a much harder task than classification,\n", "as we do not only need to distinguish between classes but learn **all** details/characteristics of the digits.\n", "With a deeper model, this could eventually be captured better (but at the cost of greater training instability).\n", "\n", "Finally, we check what happens if we reduce the digit significantly in size:"]}, {"cell_type": "code", "execution_count": 22, "id": "1f976db5", "metadata": {"execution": {"iopub.execute_input": "2025-04-03T19:23:18.853184Z", "iopub.status.busy": "2025-04-03T19:23:18.852980Z", "iopub.status.idle": "2025-04-03T19:23:18.929501Z", "shell.execute_reply": "2025-04-03T19:23:18.928554Z"}, "papermill": {"duration": 0.094483, "end_time": "2025-04-03T19:23:18.931027", "exception": false, "start_time": "2025-04-03T19:23:18.836544", "status": "completed"}, "tags": []}, "outputs": [{"data": {"application/pdf": "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675IsZnCeV04s/4MU2a1eSfPcqLUqQjvsWdL0NA5rp69lllodJsTvKSEz8ZOT06+VzPrITkVCaliWlfBaRSZYgnbEl9TUVOaehn++/Lu8Tt+/gEsc3xzCmVuZHN0cmVhbQplbmRvYmoKMzIgMCBvYmoKPDwgL0xlbmd0aCAxOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJwzNrRQMIDDFEOuNAAd5gNSCmVuZHN0cmVhbQplbmRvYmoKMTYgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL0Jhc2VGb250IC9CTVFRRFYrRGVqYVZ1U2FucyAvRmlyc3RDaGFyIDAgL0xhc3RDaGFyIDI1NQovRm9udERlc2NyaXB0b3IgMTUgMCBSIC9TdWJ0eXBlIC9UeXBlMyAvTmFtZSAvQk1RUURWK0RlamFWdVNhbnMKL0ZvbnRCQm94IFsgLTEwMjEgLTQ2MyAxNzk0IDEyMzMgXSAvRm9udE1hdHJpeCBbIDAuMDAxIDAgMCAwLjAwMSAwIDAgXQovQ2hhclByb2NzIDE3IDAgUgovRW5jb2RpbmcgPDwgL1R5cGUgL0VuY29kaW5nCi9EaWZmZXJlbmNlcyBbIDMyIC9zcGFjZSA3OSAvTyA4NCAvVCA5NyAvYSAxMDAgL2QgL2UgL2YgL2cgMTA1IC9pIDEwOCAvbCAvbSAvbiAvbyAxMTQKL3IgL3MgXQo+PgovV2lkdGhzIDE0IDAgUiA+PgplbmRvYmoKMTUgMCBvYmoKPDwgL1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9Gb250TmFtZSAvQk1RUURWK0RlamFWdVNhbnMgL0ZsYWdzIDMyCi9Gb250QkJveCBbIC0xMDIxIC00NjMgMTc5NCAxMjMzIF0gL0FzY2VudCA5MjkgL0Rlc2NlbnQgLTIzNiAvQ2FwSGVpZ2h0IDAKL1hIZWlnaHQgMCAvSXRhbGljQW5nbGUgMCAvU3RlbVYgMCAvTWF4V2lkdGggMTM0MiA+PgplbmRvYmoKMTQgMCBvYmoKWyA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMAo2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDMxOCA0MDEgNDYwIDgzOCA2MzYKOTUwIDc4MCAyNzUgMzkwIDM5MCA1MDAgODM4IDMxOCAzNjEgMzE4IDMzNyA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2CjYzNiA2MzYgMzM3IDMzNyA4MzggODM4IDgzOCA1MzEgMTAwMCA2ODQgNjg2IDY5OCA3NzAgNjMyIDU3NSA3NzUgNzUyIDI5NQoyOTUgNjU2IDU1NyA4NjMgNzQ4IDc4NyA2MDMgNzg3IDY5NSA2MzUgNjExIDczMiA2ODQgOTg5IDY4NSA2MTEgNjg1IDM5MCAzMzcKMzkwIDgzOCA1MDAgNTAwIDYxMyA2MzUgNTUwIDYzNSA2MTUgMzUyIDYzNSA2MzQgMjc4IDI3OCA1NzkgMjc4IDk3NCA2MzQgNjEyCjYzNSA2MzUgNDExIDUyMSAzOTIgNjM0IDU5MiA4MTggNTkyIDU5MiA1MjUgNjM2IDMzNyA2MzYgODM4IDYwMCA2MzYgNjAwIDMxOAozNTIgNTE4IDEwMDAgNTAwIDUwMCA1MDAgMTM0MiA2MzUgNDAwIDEwNzAgNjAwIDY4NSA2MDAgNjAwIDMxOCAzMTggNTE4IDUxOAo1OTAgNTAwIDEwMDAgNTAwIDEwMDAgNTIxIDQwMCAxMDIzIDYwMCA1MjUgNjExIDMxOCA0MDEgNjM2IDYzNiA2MzYgNjM2IDMzNwo1MDAgNTAwIDEwMDAgNDcxIDYxMiA4MzggMzYxIDEwMDAgNTAwIDUwMCA4MzggNDAxIDQwMSA1MDAgNjM2IDYzNiAzMTggNTAwCjQwMSA0NzEgNjEyIDk2OSA5NjkgOTY5IDUzMSA2ODQgNjg0IDY4NCA2ODQgNjg0IDY4NCA5NzQgNjk4IDYzMiA2MzIgNjMyIDYzMgoyOTUgMjk1IDI5NSAyOTUgNzc1IDc0OCA3ODcgNzg3IDc4NyA3ODcgNzg3IDgzOCA3ODcgNzMyIDczMiA3MzIgNzMyIDYxMSA2MDUKNjMwIDYxMyA2MTMgNjEzIDYxMyA2MTMgNjEzIDk4MiA1NTAgNjE1IDYxNSA2MTUgNjE1IDI3OCAyNzggMjc4IDI3OCA2MTIgNjM0CjYxMiA2MTIgNjEyIDYxMiA2MTIgODM4IDYx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dHBzOi8vbWF0cGxvdGxpYi5vcmcpCi9Qcm9kdWNlciAoTWF0cGxvdGxpYiBwZGYgYmFja2VuZCB2My45LjIpIC9DcmVhdGlvbkRhdGUgKEQ6MjAyNTA0MDMxOTIzMThaKQo+PgplbmRvYmoKeHJlZgowIDM1CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNiAwMDAwMCBuIAowMDAwMDA3OTk3IDAwMDAwIG4gCjAwMDAwMDY1MTUgMDAwMDAgbiAKMDAwMDAwNjU0NyAwMDAwMCBuIAowMDAwMDA2NjQ2IDAwMDAwIG4gCjAwMDAwMDY2NjcgMDAwMDAgbiAKMDAwMDAwNjY4OCAwMDAwMCBuIAowMDAwMDAwMDY1IDAwMDAwIG4gCjAwMDAwMDAzMzkgMDAwMDAgbiAKMDAwMDAwMDc2OSAwMDAwMCBuIAowMDAwMDAwMjA4IDAwMDAwIG4gCjAwMDAwMDA3NDkgMDAwMDAgbiAKMDAwMDAwNjcyMCAwMDAwMCBuIAowMDAwMDA1Mjg2IDAwMDAwIG4gCjAwMDAwMDUwNzkgMDAwMDAgbiAKMDAwMDAwNDY5NSAwMDAwMCBuIAowMDAwMDA2MzM5IDAwMDAwIG4gCjAwMDAwMDA3ODkgMDAwMDAgbiAKMDAwMDAwMTA3NyAwMDAwMCBuIAowMDAwMDAxMjE1IDAwMDAwIG4gCjAwMDAwMDE1OTUgMDAwMDAgbiAKMDAwMDAwMTg5OSAwMDAwMCBuIAowMDAwMDAyMjIxIDAwMDAwIG4gCjAwMDAwMDI0MzAgMDAwMDAgbiAKMDAwMDAwMjg0NCAwMDAwMCBuIAowMDAwMDAyOTg4IDAwMDAwIG4gCjAwMDAwMDMxMDcgMDAwMDAgbiAKMDAwMDAwMzQzOCAwMDAwMCBuIAowMDAwMDAzNjc0IDAwMDAwIG4gCjAwMDAwMDM5NjUgMDAwMDAgbiAKMDAwMDAwNDE5OCAwMDAwMCBuIAowMDAwMDA0NjA1IDAwMDAwIG4gCjAwMDAwMDc5NzcgMDAwMDAgbiAKMDAwMDAwODA1NyAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDM1IC9Sb290IDEgMCBSIC9JbmZvIDM0IDAgUiA+PgpzdGFydHhyZWYKODIwOAolJUVPRgo=", "image/svg+xml": ["\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-04-03T19:23:18.881241\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.9.2, https://matplotlib.org/\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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n"], "text/plain": ["
"]}, "metadata": {}, "output_type": "display_data"}, {"name": "stdout", "output_type": "stream", "text": ["Score original image: tensor([0.0304])\n", "Score transformed image: tensor([-0.0154])\n"]}], "source": ["img_tiny = torch.zeros_like(exmp_img) - 1\n", "img_tiny[:, exmp_img.shape[1] // 2 :, exmp_img.shape[2] // 2 :] = exmp_img[:, ::2, ::2]\n", "compare_images(exmp_img, img_tiny)"]}, {"cell_type": "markdown", "id": "9e36062c", "metadata": {"papermill": {"duration": 0.022054, "end_time": "2025-04-03T19:23:18.975198", "exception": false, "start_time": "2025-04-03T19:23:18.953144", "status": "completed"}, "tags": []}, "source": ["The score again drops but not by a large margin, although digits in the MNIST dataset usually are much larger.\n", "\n", "Overall, we can conclude that our model is good for detecting Gaussian noise and smaller transformations to existing digits.\n", "Nonetheless, to obtain a very good out-of-distribution model, we would need to train deeper models and for more iterations."]}, {"cell_type": "markdown", "id": "44c03299", "metadata": {"papermill": {"duration": 0.016248, "end_time": "2025-04-03T19:23:19.009791", "exception": false, "start_time": "2025-04-03T19:23:18.993543", "status": "completed"}, "tags": []}, "source": ["### Instability\n", "\n", "Finally, we should discuss the possible instabilities of energy-based models,\n", "in particular for the example of image generation that we have implemented in this notebook.\n", "In the process of hyperparameter search for this notebook, there have been several models that diverged.\n", "Divergence in energy-based models means that the models assign a high probability to examples of the training set which is a good thing.\n", "However, at the same time, the sampling algorithm fails and only generates noise images that obtain minimal probability scores.\n", "This happens because the model has created many local maxima in which the generated noise images fall.\n", "The energy surface over which we calculate the gradients to reach data points with high probability has \"diverged\" and is not useful for our MCMC sampling.\n", "\n", "Besides finding the optimal hyperparameters, a common trick in energy-based models is to reload stable checkpoints.\n", "If we detect that the model is diverging, we stop the training, load the model from one epoch ago where it did not diverge yet.\n", "Afterward, we continue training and hope that with a different seed the model is not diverging again.\n", "Nevertheless, this should be considered as the \"last hope\" for stabilizing the models,\n", "and careful hyperparameter tuning is the better way to do so.\n", "Sensitive hyperparameters include `step_size`, `steps` and the noise standard deviation in the sampler,\n", "and the learning rate and feature dimensionality in the CNN model."]}, {"cell_type": "markdown", "id": "720e54dc", "metadata": {"papermill": {"duration": 0.016346, "end_time": "2025-04-03T19:23:19.042366", "exception": false, "start_time": "2025-04-03T19:23:19.026020", "status": "completed"}, "tags": []}, "source": ["## Conclusion\n", "\n", "In this tutorial, we have discussed energy-based models for generative modeling.\n", "The concept relies on the idea that any strictly positive function can be turned into a probability\n", "distribution by normalizing over the whole dataset.\n", "As this is not reasonable to calculate for high dimensional data like images,\n", "we train the model using contrastive divergence and sampling via MCMC.\n", "While the idea allows us to turn any neural network into an energy-based model,\n", "we have seen that there are multiple training tricks needed to stabilize the training.\n", "Furthermore, the training time of these models is relatively long as, during every training iteration,\n", "we need to sample new \"fake\" images, even with a sampling buffer.\n", "In the next lectures and assignment, we will see different generative models (e.g. VAE, GAN, NF)\n", "that allow us to do generative modeling more stably, but with the cost of more parameters."]}, {"cell_type": "markdown", "id": "27a98b28", "metadata": {"papermill": {"duration": 0.01609, "end_time": "2025-04-03T19:23:19.074551", "exception": false, "start_time": "2025-04-03T19:23:19.058461", "status": "completed"}, "tags": []}, "source": ["## Congratulations - Time to Join the Community!\n", "\n", "Congratulations on completing this notebook tutorial! If you enjoyed this and would like to join the Lightning\n", "movement, you can do so in the following ways!\n", "\n", "### Star [Lightning](https://github.com/Lightning-AI/lightning) on GitHub\n", "The easiest way to help our community is just by starring the GitHub repos! This helps raise awareness of the cool\n", "tools we're building.\n", "\n", "### Join our [Discord](https://discord.com/invite/tfXFetEZxv)!\n", "The best way to keep up to date on the latest advancements is to join our community! Make sure to introduce yourself\n", "and share your interests in `#general` channel\n", "\n", "\n", "### Contributions !\n", "The best way to contribute to our community is to become a code contributor! At any time you can go to\n", "[Lightning](https://github.com/Lightning-AI/lightning) or [Bolt](https://github.com/Lightning-AI/lightning-bolts)\n", "GitHub Issues page and filter for \"good first issue\".\n", "\n", "* [Lightning good first issue](https://github.com/Lightning-AI/lightning/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)\n", "* [Bolt good first issue](https://github.com/Lightning-AI/lightning-bolts/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)\n", "* You can also contribute your own notebooks with useful examples !\n", "\n", "### Great thanks from the entire Pytorch Lightning Team for your interest !\n", "\n", "[![Pytorch Lightning](data:image/png;base64,NDA0OiBOb3QgRm91bmQ=){height=\"60px\" width=\"240px\"}](https://pytorchlightning.ai)"]}, {"cell_type": "raw", "metadata": {"raw_mimetype": "text/restructuredtext"}, "source": [".. customcarditem::\n", " :header: Tutorial 7: Deep Energy-Based Generative Models\n", " :card_description: In this tutorial, we will look at energy-based deep learning models, and focus on their application as generative models. Energy models have been a popular tool before the...\n", " :tags: Image,GPU/TPU,UvA-DL-Course\n", " :image: _static/images/course_UvA-DL/07-deep-energy-based-generative-models.jpg"]}], "metadata": {"jupytext": {"cell_metadata_filter": "colab,colab_type,id,-all", "formats": "ipynb,py:percent", "main_language": "python"}, "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.10.12"}, "papermill": {"default_parameters": {}, "duration": 16.797735, "end_time": "2025-04-03T19:23:22.011023", "environment_variables": {}, "exception": null, "input_path": "course_UvA-DL/07-deep-energy-based-generative-models/notebook.ipynb", "output_path": ".notebooks/course_UvA-DL/07-deep-energy-based-generative-models.ipynb", "parameters": {}, "start_time": "2025-04-03T19:23:05.213288", "version": "2.6.0"}}, "nbformat": 4, "nbformat_minor": 5}