{"cells": [{"cell_type": "markdown", "id": "e7c29085", "metadata": {"papermill": {"duration": 0.012321, "end_time": "2023-10-11T16:06:20.651062", "exception": false, "start_time": "2023-10-11T16:06:20.638741", "status": "completed"}, "tags": []}, "source": ["\n", "# Tutorial 7: Deep Energy-Based Generative Models\n", "\n", "* **Author:** Phillip Lippe\n", "* **License:** CC BY-SA\n", "* **Generated:** 2023-10-11T16:04:04.126072\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,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){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://pytorch-lightning.readthedocs.io/en/stable/)\n", "| Join us [on Slack](https://www.pytorchlightning.ai/community)"]}, {"cell_type": "markdown", "id": "8c47b1ee", "metadata": {"papermill": {"duration": 0.008095, "end_time": "2023-10-11T16:06:20.667558", "exception": false, "start_time": "2023-10-11T16:06:20.659463", "status": "completed"}, "tags": []}, "source": ["## Setup\n", "This notebook requires some packages besides pytorch-lightning."]}, {"cell_type": "code", "execution_count": 1, "id": "5a8ec6b2", "metadata": {"colab": {}, "colab_type": "code", "execution": {"iopub.execute_input": "2023-10-11T16:06:20.686406Z", "iopub.status.busy": "2023-10-11T16:06:20.685655Z", "iopub.status.idle": "2023-10-11T16:08:04.396471Z", "shell.execute_reply": "2023-10-11T16:08:04.395355Z"}, "id": "LfrJLKPFyhsK", "lines_to_next_cell": 0, "papermill": {"duration": 103.723648, "end_time": "2023-10-11T16:08:04.399332", "exception": false, "start_time": "2023-10-11T16:06:20.675684", "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. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\r\n", "\u001b[0m"]}], "source": ["! pip install --quiet \"pytorch-lightning>=1.4, <2.1.0\" \"setuptools>=68.0.0, <68.3.0\" \"torchvision\" \"torch>=1.8.1, <2.1.0\" \"tensorboard\" \"ipython[notebook]>=8.0.0, <8.17.0\" \"torchmetrics>=0.7, <1.3\" \"urllib3\" \"matplotlib\" \"matplotlib>=3.0.0, <3.9.0\" \"lightning>=2.0.0\""]}, {"cell_type": "markdown", "id": "d1a391e6", "metadata": {"papermill": {"duration": 0.00843, "end_time": "2023-10-11T16:08:04.418583", "exception": false, "start_time": "2023-10-11T16:08:04.410153", "status": "completed"}, "tags": []}, "source": ["
\n", "First, let's import our standard libraries below."]}, {"cell_type": "code", "execution_count": 2, "id": "0d3ee052", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:04.436628Z", "iopub.status.busy": "2023-10-11T16:08:04.436183Z", "iopub.status.idle": "2023-10-11T16:08:08.539921Z", "shell.execute_reply": "2023-10-11T16:08:08.538987Z"}, "papermill": {"duration": 4.11557, "end_time": "2023-10-11T16:08:08.542238", "exception": false, "start_time": "2023-10-11T16:08:04.426668", "status": "completed"}, "tags": []}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["Global 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", "# PyTorch Lightning\n", "import lightning as L\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\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 lightning.pytorch.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", "L.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": "8a33d25d", "metadata": {"papermill": {"duration": 0.010176, "end_time": "2023-10-11T16:08:08.561587", "exception": false, "start_time": "2023-10-11T16:08:08.551411", "status": "completed"}, "tags": []}, "source": ["We also have pre-trained models that we download below."]}, {"cell_type": "code", "execution_count": 3, "id": "4c85ff5c", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:08.634156Z", "iopub.status.busy": "2023-10-11T16:08:08.630487Z", "iopub.status.idle": "2023-10-11T16:08:09.046115Z", "shell.execute_reply": "2023-10-11T16:08:09.045244Z"}, "papermill": {"duration": 0.428468, "end_time": "2023-10-11T16:08:09.048230", "exception": false, "start_time": "2023-10-11T16:08:08.619762", "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(\"Downloading %s...\" % 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": "3ecc9a9f", "metadata": {"papermill": {"duration": 0.010196, "end_time": "2023-10-11T16:08:09.067680", "exception": false, "start_time": "2023-10-11T16:08:09.057484", "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": "8293bdcf", "metadata": {"papermill": {"duration": 0.00834, "end_time": "2023-10-11T16:08:09.084298", "exception": false, "start_time": "2023-10-11T16:08:09.075958", "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": "b76d6691", "metadata": {"papermill": {"duration": 0.008606, "end_time": "2023-10-11T16:08:09.101095", "exception": false, "start_time": "2023-10-11T16:08:09.092489", "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": "cb7c87dc", "metadata": {"papermill": {"duration": 0.008221, "end_time": "2023-10-11T16:08:09.117576", "exception": false, "start_time": "2023-10-11T16:08:09.109355", "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": "87ee45bc", "metadata": {"papermill": {"duration": 0.008193, "end_time": "2023-10-11T16:08:09.134015", "exception": false, "start_time": "2023-10-11T16:08:09.125822", "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/blog/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": "cc0a4b48", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:09.152200Z", "iopub.status.busy": "2023-10-11T16:08:09.151743Z", "iopub.status.idle": "2023-10-11T16:08:10.521946Z", "shell.execute_reply": "2023-10-11T16:08:10.521248Z"}, "papermill": {"duration": 1.384388, "end_time": "2023-10-11T16:08:10.526629", "exception": false, "start_time": "2023-10-11T16:08:09.142241", "status": "completed"}, "tags": []}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz\n", "Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz to /__w/15/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": "6dee6dc6", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.018508, "end_time": "2023-10-11T16:08:10.565644", "exception": false, "start_time": "2023-10-11T16:08:10.547136", "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": "33914651", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:10.587189Z", "iopub.status.busy": "2023-10-11T16:08:10.586873Z", "iopub.status.idle": "2023-10-11T16:08:10.597916Z", "shell.execute_reply": "2023-10-11T16:08:10.597240Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.024372, "end_time": "2023-10-11T16:08:10.599573", "exception": false, "start_time": "2023-10-11T16:08:10.575201", "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": "e39b1aef", "metadata": {"papermill": {"duration": 0.009443, "end_time": "2023-10-11T16:08:10.618513", "exception": false, "start_time": "2023-10-11T16:08:10.609070", "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": "1f724be4", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.009237, "end_time": "2023-10-11T16:08:10.637335", "exception": false, "start_time": "2023-10-11T16:08:10.628098", "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": "8d685ef8", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:10.658904Z", "iopub.status.busy": "2023-10-11T16:08:10.658622Z", "iopub.status.idle": "2023-10-11T16:08:10.674150Z", "shell.execute_reply": "2023-10-11T16:08:10.673559Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.02897, "end_time": "2023-10-11T16:08:10.675835", "exception": false, "start_time": "2023-10-11T16:08:10.646865", "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", " 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", " # 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", " # 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": "e56583c6", "metadata": {"papermill": {"duration": 0.009516, "end_time": "2023-10-11T16:08:10.695678", "exception": false, "start_time": "2023-10-11T16:08:10.686162", "status": "completed"}, "tags": []}, "source": ["The idea of the buffer becomes a bit clearer in the following algorithm."]}, {"cell_type": "markdown", "id": "169c04cf", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.009423, "end_time": "2023-10-11T16:08:10.714813", "exception": false, "start_time": "2023-10-11T16:08:10.705390", "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": "a1af6f92", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:10.745474Z", "iopub.status.busy": "2023-10-11T16:08:10.744824Z", "iopub.status.idle": "2023-10-11T16:08:10.763035Z", "shell.execute_reply": "2023-10-11T16:08:10.762239Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.034255, "end_time": "2023-10-11T16:08:10.765236", "exception": false, "start_time": "2023-10-11T16:08:10.730981", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class DeepEnergyModel(L.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": "95fa74ec", "metadata": {"papermill": {"duration": 0.012163, "end_time": "2023-10-11T16:08:10.790352", "exception": false, "start_time": "2023-10-11T16:08:10.778189", "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": "f137b417", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.012123, "end_time": "2023-10-11T16:08:10.815391", "exception": false, "start_time": "2023-10-11T16:08:10.803268", "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": "cef2254e", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:10.842119Z", "iopub.status.busy": "2023-10-11T16:08:10.841807Z", "iopub.status.idle": "2023-10-11T16:08:10.858684Z", "shell.execute_reply": "2023-10-11T16:08:10.857488Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.032652, "end_time": "2023-10-11T16:08:10.860595", "exception": false, "start_time": "2023-10-11T16:08:10.827943", "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, range=(-1, 1)\n", " )\n", " trainer.logger.experiment.add_image(\"generation_%i\" % 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": "2365c926", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.012059, "end_time": "2023-10-11T16:08:10.885582", "exception": false, "start_time": "2023-10-11T16:08:10.873523", "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": "a3257948", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:10.911115Z", "iopub.status.busy": "2023-10-11T16:08:10.910868Z", "iopub.status.idle": "2023-10-11T16:08:10.916861Z", "shell.execute_reply": "2023-10-11T16:08:10.915989Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.020848, "end_time": "2023-10-11T16:08:10.918458", "exception": false, "start_time": "2023-10-11T16:08:10.897610", "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, range=(-1, 1))\n", " trainer.logger.experiment.add_image(\"sampler\", grid, global_step=trainer.current_epoch)"]}, {"cell_type": "markdown", "id": "276f4a66", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.014339, "end_time": "2023-10-11T16:08:10.944636", "exception": false, "start_time": "2023-10-11T16:08:10.930297", "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": "79f797b5", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:10.965924Z", "iopub.status.busy": "2023-10-11T16:08:10.965640Z", "iopub.status.idle": "2023-10-11T16:08:10.971304Z", "shell.execute_reply": "2023-10-11T16:08:10.970459Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.017447, "end_time": "2023-10-11T16:08:10.972600", "exception": false, "start_time": "2023-10-11T16:08:10.955153", "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": "de964556", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.009684, "end_time": "2023-10-11T16:08:10.992029", "exception": false, "start_time": "2023-10-11T16:08:10.982345", "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": "ce209d76", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:11.012659Z", "iopub.status.busy": "2023-10-11T16:08:11.012431Z", "iopub.status.idle": "2023-10-11T16:08:11.019008Z", "shell.execute_reply": "2023-10-11T16:08:11.017479Z"}, "papermill": {"duration": 0.018448, "end_time": "2023-10-11T16:08:11.020288", "exception": false, "start_time": "2023-10-11T16:08:11.001840", "status": "completed"}, "tags": []}, "outputs": [], "source": ["def train_model(**kwargs):\n", " # Create a PyTorch Lightning trainer with the generation callback\n", " trainer = L.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", " L.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": "672d4ba2", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:11.040733Z", "iopub.status.busy": "2023-10-11T16:08:11.040526Z", "iopub.status.idle": "2023-10-11T16:08:11.887107Z", "shell.execute_reply": "2023-10-11T16:08:11.886250Z"}, "papermill": {"duration": 0.85863, "end_time": "2023-10-11T16:08:11.888616", "exception": false, "start_time": "2023-10-11T16:08:11.029986", "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": ["IPU available: False, using: 0 IPUs\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.0.9.post0. To apply the upgrade to your files permanently, run `python -m lightning.pytorch.utilities.upgrade_checkpoint --file 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": "04f43c1a", "metadata": {"papermill": {"duration": 0.010113, "end_time": "2023-10-11T16:08:11.910277", "exception": false, "start_time": "2023-10-11T16:08:11.900164", "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": "2f9f8ae5", "metadata": {"papermill": {"duration": 0.010064, "end_time": "2023-10-11T16:08:11.934631", "exception": false, "start_time": "2023-10-11T16:08:11.924567", "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": "c5740701", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:11.957262Z", "iopub.status.busy": "2023-10-11T16:08:11.956654Z", "iopub.status.idle": "2023-10-11T16:08:13.982321Z", "shell.execute_reply": "2023-10-11T16:08:13.981562Z"}, "papermill": {"duration": 2.038866, "end_time": "2023-10-11T16:08:13.984015", "exception": false, "start_time": "2023-10-11T16:08:11.945149", "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": "04ff3444", "metadata": {"papermill": {"duration": 0.010275, "end_time": "2023-10-11T16:08:14.005577", "exception": false, "start_time": "2023-10-11T16:08:13.995302", "status": "completed"}, "tags": []}, "source": ["
"]}, {"cell_type": "markdown", "id": "ef9a8311", "metadata": {"papermill": {"duration": 0.012552, "end_time": "2023-10-11T16:08:14.028446", "exception": false, "start_time": "2023-10-11T16:08:14.015894", "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": "d7bf188d", "metadata": {"papermill": {"duration": 0.011746, "end_time": "2023-10-11T16:08:14.053878", "exception": false, "start_time": "2023-10-11T16:08:14.042132", "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": "a04051e4", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:14.080878Z", "iopub.status.busy": "2023-10-11T16:08:14.080680Z", "iopub.status.idle": "2023-10-11T16:08:15.277516Z", "shell.execute_reply": "2023-10-11T16:08:15.274959Z"}, "papermill": {"duration": 1.212781, "end_time": "2023-10-11T16:08:15.279444", "exception": false, "start_time": "2023-10-11T16:08:14.066663", "status": "completed"}, "tags": []}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["Global seed set to 43\n"]}], "source": ["model.to(device)\n", "L.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": "3278d60d", "metadata": {"papermill": {"duration": 0.010299, "end_time": "2023-10-11T16:08:15.300852", "exception": false, "start_time": "2023-10-11T16:08:15.290553", "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": "80ee3cda", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:15.323294Z", "iopub.status.busy": "2023-10-11T16:08:15.322764Z", "iopub.status.idle": "2023-10-11T16:08:15.973815Z", "shell.execute_reply": "2023-10-11T16:08:15.973222Z"}, "papermill": {"duration": 0.671307, "end_time": "2023-10-11T16:08:15.982474", "exception": false, "start_time": "2023-10-11T16:08:15.311167", "status": "completed"}, "tags": []}, "outputs": [{"data": {"application/pdf": "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IDE3OTQgMTIzMyBdIC9Gb250TWF0cml4IFsgMC4wMDEgMCAwIDAuMDAxIDAgMCBdCi9DaGFyUHJvY3MgMTcgMCBSCi9FbmNvZGluZyA8PCAvVHlwZSAvRW5jb2RpbmcKL0RpZmZlcmVuY2VzIFsgMzIgL3NwYWNlIDQ4IC96ZXJvIC9vbmUgL3R3byAvdGhyZWUgL2ZvdXIgL2ZpdmUgL3NpeCA1NiAvZWlnaHQgL25pbmUgNzEKL0cgOTcgL2EgMTAxIC9lIDEwNSAvaSAxMTAgL24gL28gMTE0IC9yIDExNiAvdCBdCj4+Ci9XaWR0aHMgMTQgMCBSID4+CmVuZG9iagoxNSAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0ZvbnROYW1lIC9CTVFRRFYrRGVqYVZ1U2FucyAvRmxhZ3MgMzIKL0ZvbnRCQm94IFsgLTEwMjEgLTQ2MyAxNzk0IDEyMzMgXSAvQXNjZW50IDkyOSAvRGVzY2VudCAtMjM2IC9DYXBIZWlnaHQgMAovWEhlaWdodCAwIC9JdGFsaWNBbmdsZSAwIC9TdGVtViAwIC9NYXhXaWR0aCAxMzQyID4+CmVuZG9iagoxNCAwIG9iagpbIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMzE4IDQwMSA0NjAgODM4IDYzNgo5NTAgNzgwIDI3NSAzOTAgMzkwIDUwMCA4MzggMzE4IDM2MSAzMTggMzM3IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYKNjM2IDYzNiAzMzcgMzM3IDgzOCA4MzggODM4IDUzMSAxMDAwIDY4NCA2ODYgNjk4IDc3MCA2MzIgNTc1IDc3NSA3NTIgMjk1CjI5NSA2NTYgNTU3IDg2MyA3NDggNzg3IDYwMyA3ODcgNjk1IDYzNSA2MTEgNzMyIDY4NCA5ODkgNjg1IDYxMSA2ODUgMzkwIDMzNwozOTAgODM4IDUwMCA1MDAgNjEzIDYzNSA1NTAgNjM1IDYxNSAzNTIgNjM1IDYzNCAyNzggMjc4IDU3OSAyNzggOTc0IDYzNCA2MTIKNjM1IDYzNSA0MTEgNTIxIDM5MiA2MzQgNTkyIDgxOCA1OTIgNTkyIDUyNSA2MzYgMzM3IDYzNiA4MzggNjAwIDYzNiA2MDAgMzE4CjM1MiA1MTggMTAwMCA1MDAgNTAwIDUwMCAxMzQyIDYzNSA0MDAgMTA3MCA2MDAgNjg1IDYwMCA2MDAgMzE4IDMxOCA1MTggNTE4CjU5MCA1MDAgMTAwMCA1MDAgMTAwMCA1MjEgNDAwIDEwMjMgNjAwIDUyNSA2MTEgMzE4IDQwMSA2MzYgNjM2IDYzNiA2MzYgMzM3CjUwMCA1MDAgMTAwMCA0NzEgNjEyIDgzOCAzNjEgMTAwMCA1MDAgNTAwIDgzOCA0MDEgNDAxIDUwMCA2MzYgNjM2IDMxOCA1MDAKNDAxIDQ3MSA2MTIgOTY5IDk2OSA5NjkgNTMxIDY4NCA2ODQgNjg0IDY4NCA2ODQgNjg0IDk3NCA2OTggNjMyIDYzMiA2MzIgNjMyCjI5NSAyOTUgMjk1IDI5NSA3NzUgNzQ4IDc4NyA3ODcgNzg3IDc4NyA3ODcgODM4IDc4NyA3MzIgNzMyIDczMiA3MzIgNjExIDYwNQo2MzAgNjEzIDYxMyA2MTMgNjEzIDYxMyA2MTMgOTgyIDU1MCA2MTUgNjE1IDYxNSA2MTUgMjc4IDI3OCAyNzggMjc4IDYxMiA2MzQKNjEyIDYxMiA2MTIgNjEyIDYxMiA4MzggNjEyIDYzNCA2MzQgNjM0IDYzNCA1OTIgNjM1IDU5MiBdCmVuZG9iagoxNyAwIG9iago8PCAvRyAxOCAwIFIgL2EgMTkgMCBSIC9lIDIwIDAgUiAvZWlnaHQgMjEgMCBSIC9maXZlIDIyIDAgUiAvZm91ciAyMyAwIFIKL2kgMjQgMCBSIC9uIDI1IDAgUiAvbmluZSAyNiAwIFIgL28gMjcgMCBSIC9vbmUgMjggMCBSIC9yIDI5IDAgUgovc2l4IDMwIDAgUiAvc3BhY2UgMzEgMCBSIC90IDMyIDAgUiAvdGhyZWUgMzMgMCBSIC90d28gMzQgMCBSIC96ZXJvIDM1IDAgUgo+PgplbmRvYmoKMyAwIG9iago8PCAvRjEgMTYgMCBSID4+CmVuZG9iago0IDAgb2JqCjw8IC9BMSA8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MDAwMCA2NTUzNSBmIAowMDAwMDAwMDE2IDAwMDAwIG4gCjAwMDAwMjU4NzMgMDAwMDAgbiAKMDAwMDAwODA1MiAwMDAwMCBuIAowMDAwMDA4MDg0IDAwMDAwIG4gCjAwMDAwMDgxODMgMDAwMDAgbiAKMDAwMDAwODIwNCAwMDAwMCBuIAowMDAwMDA4MjI1IDAwMDAwIG4gCjAwMDAwMDAwNjUgMDAwMDAgbiAKMDAwMDAwMDM0MiAwMDAwMCBuIAowMDAwMDAwOTY4IDAwMDAwIG4gCjAwMDAwMDAyMDggMDAwMDAgbiAKMDAwMDAwMDk0OCAwMDAwMCBuIAowMDAwMDA4MjU3IDAwMDAwIG4gCjAwMDAwMDY3NjcgMDAwMDAgbiAKMDAwMDAwNjU2MCAwMDAwMCBuIAowMDAwMDA2MTM0IDAwMDAwIG4gCjAwMDAwMDc4MjAgMDAwMDAgbiAKMDAwMDAwMDk4OCAwMDAwMCBuIAowMDAwMDAxMzA4IDAwMDAwIG4gCjAwMDAwMDE2ODggMDAwMDAgbiAKMDAwMDAwMjAxMCAwMDAwMCBuIAowMDAwMDAyNDc4IDAwMDAwIG4gCjAwMDAwMDI4MDAgMDAwMDAgbiAKMDAwMDAwMjk2NiAwMDAwMCBuIAowMDAwMDAzMTEwIDAwMDAwIG4gCjAwMDAwMDMzNDYgMDAwMDAgbiAKMDAwMDAwMzc0MSAwMDAwMCBuIAowMDAwMDA0MDMyIDAwMDAwIG4gCjAwMDAwMDQxODcgMDAwMDAgbiAKMDAwMDAwNDQyMCAwMDAwMCBuIAowMDAwMDA0ODEzIDAwMDAwIG4gCjAwMDAwMDQ5MDMgMDAwMDAgbiAKMDAwMDAwNTEwOSAwMDAwMCBuIAowMDAwMDA1NTIyIDAwMDAwIG4gCjAwMDAwMDU4NDYgMDAwMDAgbiAKMDAwMDAyNTg1MSAwMDAwMCBuIAowMDAwMDI1OTMzIDAwMDAwIG4gCnRyYWlsZXIKPDwgL1NpemUgMzggL1Jvb3QgMSAwIFIgL0luZm8gMzcgMCBSID4+CnN0YXJ0eHJlZgoyNjA4NAolJUVPRgo=", "image/svg+xml": ["\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2023-10-11T16:08:15.382789\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.8.0, 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+CnN0cmVhbQp4nO29d0AUS9bwfSeQc5AgQUUkKKASBURyThJUwAgYARVFcphEkJyDgARRQQGRIElBkCBIUEBJIooCoqgYkAx+PSDSM9PjXfX53n2e3Xv+2Ls21Weqqn99zqmqU9V/qfwj/8j/I/nr312Bf+S/R/76d1fgH/nvkb/+3RX4R/575C/8/yjKFohdzxSW11YtKdfS1W1s0Lm7WbLeqO2xVqF0aZlCed3DJo3K3I079FWLlC33W3U332ve16lcKq+gt2+3jsbt0juAjnrLZ38k5moqKtXtf6bDSgeoiP6+P1PysEpFRWPPn+no1FBRqXr4Zzr2PQAao9P7Z0pMq1VU7pn/5s37l/5jWQ9UpLnvj+qxv+UHbLLXM2JZ6YPzjdUkigzNOszbTZSTBYwODNkbXrm6pUCqqMm6W7cigWX7HjWRivH5yXO9mlazYxVb8qWeeH4waZDdIg/oaHFe+COxq1VRUT/2ZzomHwEV2TP7Rzp8XqiqqOh+/LOKODaoqKhaL+nz8fk9HZ67gcaYTP5ZRYbVVVQ03/7evcsVd8aD0uv9a7f6EF6Y7/sBW6VS0aW1lzPr+kxUatr39PZZdTVJyTR1dFo0ysrXaJQW1lt0dRrdEL6jt01A6uDI2XGzEqOzr+Vv7NDuPW3boFqQuw3QYeTy7Y/EHg/b6z/TMWUCVKRr7s+UWONh+/RnOs7gYRv4Mx1enXjY3Jf/iUL9jpJjeNhGf+hY+B0lLnjY9vos6/Dx+WlpaFnY/wM2s+N9qmr9dk4eX94MPz/45sPb4WMjNnWKktmqz16NOdTml9/b9XXcpqdCLH0VT3bxq3E1rnwrs7xNvV8Pm9wvzNuYJfsfDRvq13UQwvZ7z3iWADaUt/fCbyghhM17dv7vbyGhmhC2+RlPMhX52evgswLbk1M2dfU2J8+Mjx0/3NNtO3L01eGhQzrKReK1tscdRzWl5MpbTo/Z7iu/ksaTIlrQP6bOX9DRvPHqnrMH9e4VbRXbJPcPbIQChg0FeJHfUEEAG2rBhwxsKNRPTR4YtgWfOXKwgV+Hn8KG8pkjAxsK5fOTZoJga3+9v1a1VqumuqrytuTW0jvqjcrXt1oO9/c8PWhlcP+u4mbBa9Ilync38W+u0dTSaXuy67GxliJ3VI7inUq1xoYd5RX/obABLuP3vBcINpTXzBy5pwDENuTVg92o95S7N2RR1Ly399xPnjIItoUp11nIgiifeU/3WfIVAcGG8nQFKgJVaH7W02PGhyz5IDdqcrhX827pra0SueLXBddnicns2MK+5rnzafvBp2YVZTtUcnh4L6bfLLzCJ9vR8eihfqPV6+4q6Wj65Ct5CmpmZlqqVf+xsM3/zCiR/xMYNuBBQisBbAFgrsgqAcPm5TLpDVlwYc5rdtbbh6yHBcHmMzHuCVkG5e3lPuFBth4EsE2Pu0HXeG7afXLKm6wNB8Gm37Vnl5H4ujxFsbjUKp1a9eLrG5IEjfvtPj2t3K64o/3pDoEMISHBKwraO61MFGTycguKyyoVczeKicuptQwdtTDV+T8G20/9GtiNkrVr896zM17zZENlMGzeXvNQWlALczPuLq4es+RAAcPm4wkJLGrBa3LC6bOL2yy5ioBgQ3l6QDpR1Lzr+Mf3n6Y8yFUEDJvXNKQJXPBxO+vocHJ80gvqr98IYKtvMbfpEWSR0NxEEdc52Pt4G09yetY9wyHXXZnX5atfftLPvJZzLTFR7/jhg8Yia1fHRzOnK1WpVW+TUtLZ/cX56POW/1uw/dxg/SujUdTc7JTr9BzZcBscs5Ehe8HHY3L8zNmJKXJKCEaj0NQv+Myc+/Ru1PHLFLmKgGM2Mj4b5f35lN3w6JcJchUBw+YD/YLNz407nHh5+NRnDzI6QLDdraxpaRBK3N65fRWfSqOxqbp0Tsr6HTpdLw1y8xTutu9VviKhtC01SWXPY5PqJI7ktVl5cjV1DdqSV5V7LPfs7jC9/7ewebmdPTxgbX1wf7/1q7fvz02Svop/D9uCh+vws/37+/Y9OzLiDNlxfw8byn38defu3Z0Wlrajn6Ff5b+Hbebs2w7D1oemj5/aO0LbFIIBAhQoC15nHLr19Br1W02HxiYhdfwtbAvzX+z69bRra+/r9Z4+B21lwbChINq7MD81eqS1Vk1FveHR28/QbpZwgAClZO7U0Sc11RWVtQ3Wn90gakoAm0zW9c03skRMPj7JFeZPrWjpsKpdnSineq9mR/G27XfK5XMFZJ4YX02+WXFnu/h5/7QcnYMWhi3tD0XZ1b4cEMuUU1L+W9hc3/WVFUoViGflSMnrt9mMOpOU+HvY5s7aqVwTzcq8cu2O5hHIcdXfw7bw4XBNQvxqHr41JS0HoQv+DDb82A+1cPaZQWwAU3QsV1azBWlD8LICGxmTNDex/5EQZSAjEwunaucoVBHieTaSqizMeb5sKqLzP09DS5fT+RIaFMKpD1KZ9zxlpMrp50fpTxVv2P8Fsgzh1AdETebc9tQKUfoBQnP7+TvIVxgEW1GmyDXRDUIPP3ZkCa5Nl66of6gmdKVATq5EXrFMRlq6UDyzzMps41pZDcWbl88HXpfXs2i9q6Jdv0VQz+mFTH6lejUJbAvens5Opxzevhk5evTYseGj/U8aNgld2ZDGt05YTOGu0e5XZ7/OzaPAd5CFbW78rP3xY0ePHrXt7bh5kY+PN5H/huyjV8ffnyXhjTxs3rNf7N8MHz16pMu4MDyMJTJ61UYlg+HRz1+9SIr+BLaZU/avh4aO9DaWh2Kog0OZ+LZrWY86uZNaN3DMRvSnBaeTb44eedWvW8mDRgRQBzIVaFo6nJmZIy73U9imPjgcG3pl06Ig7AvD4pAU6XUmJ8agcPsJbN6fP7w5ethmz518JjQaBsMw72ixHXOFKPgz2Fw/ngQq8rymKAmGBgRxw+jp6S8QdgAE262NwutSeZK0R7Si4vIKVjNwb5Bq0d2QwM0tpnUnlefK9fxSbWsrqev6z7ezhofGNR7QkRVhjV6b2fD01ejrZ/v27W0igc3TedS8SS5XZD1/bGwCd1wMW2QYDXVAgD8lDSMjAwPrqlyd3Z9cCSpFFrYzJlqiF7ljY2PYo1hoKQHxo2IIj0m4LKNNYkvJwrYw/sHg2qW4VatiWJmDcAgcDulLFxGXvkn38RhJ2Z/AZr8tmzd2VUxUeAgOA8ciEFRM0YI5+ranSF7mn6wgzDRtzVgVw87GxOCHhmHgcCRTTLqE+tuzJLX+GWw28psTgQ5hpqeGAUowGLq4NflKUEz9BLZzOvKCcbHskSG0OAATGMY/ju/m9n0QduknsPn0VecncMREMwZR4llDwyKSNu4wmiAtCIKt9OZ1fl6e5PrXmqxx+dIxSKbEG7sfpUVEsW/U3rFmtaBovkKDzV4ZcSNbJaawKN7m5/c2JlPTcqY+sD3y+viJkaFXxiSwub1/qV0hlBTLHITB+FLA//ohiABKDBrhyy+ve4Iw3oGEbcHH0+11jVwcLQVm8c1ZEhiSgoKCNaP0lAdRD5CBbcFzanSwIp4ZjgYJguI8E7eC9sgccS+Sgc171sPNOvPCeXw9ADuAWawIzj868U7XsDeKqDAZ2Ba8vaY/V6RGfG8LbFGXH3VUsvQLuxniwuRgW/CZne7K4qNa6hF8VWAwClqWdeI27qSvGTnYUPMz7xSyWLCYRc7gAK9wJD1zevajKdLRJlnYUF5TbZJrfeFLOuD4ipwPTdqs6uhJUhgEm/ELPa5Vm8u7TnXLS15ak5qafOGaXu0Fel7hLdtVdHWKczMFZLsfy4hv11KWk5bI3iAQz8QcGcOXJiqhYnZgfHJivJMEtiH10nQeJtoASiQajYHDVmCDYbFA1eDBsQK3G86A74CCbcH5w66S3NUx53EEnAAa4XD/kMTKptOE5cnA5vxEX0488bwfDKwDBkf4Bcan6tqMEfUuNGw+I1YGCrnMNAjg8QLPF+haGN6oYKloeUTqnaaIDAIZ2L4O7ddUTKajBG4EtCAofH1xcAwWQUXHlV/lSFyYDGzz42N76jYz0+GAZwvHIgMAQcIRSCrGmKKaVyS/uAibPcllb0/71urkiAAAWBgCSUtPFxiARPr5M0Rm3+8moZ4sbB59xjfYGeBAf+AoaMPD6AIpcBSU9KvW3zcn6T4QbE899sawlD049OlVaxUP+5UbGQnCNZVxQemShbdUD75QuXkpVqzjkYx4gWyVYYOSNDMa/RdN3Oq0dfGsYjrdHiiUtxUJbE/F0hmosX+REzQMy7BeiuCNg4LN5/TRuzGMOAyaWBaV0F6WHEYRlCcD21iVZGJYwDJkMDwu3/+/L21JxzEiUKBh8+67X5DAglh8iQEXisUu4QbIecai985EYQoZ2D52N2XxBS2SDjwiigAqfz8EHM8sDde1N8SFycA29+G1uig3Fu88Acb86YLpgigBJRhcQJLQbhRxaTKweU29KN4YggN+G43x9Q9jZWak80PiuecU1yQZG5OFzbWplAeHxb/7ftTh8asiwgIoEBgkVVS+8lvioiDYHo/uSk8SkdA71NtuuKOscMta5vTaOtn86malrByFClW1nIT1t0pvKykpaZuZtmpxUyLQ1OwX5avU1GvrtRv09/QSxWwoN6fWlDhqX8xPYMNQsV164QoKzyFg85nepXyVLgD+HQ0MhR8OeMaAuV6CzS86WbWDoFmQsJ2zNRNNZgpALqrABobR05wPoKKmpgBcCAxLealQb/CdN7g8FGzzLo4NEqkMNJhFi0gbE8PMxEDPyMzgTwGH+Qak65h/dCPQQQa2YWUp7gggugF+l4Y9gZMjhi16VUzIeV8YBcOFxqdnCAuTgW2qS0+MkxFvTvyo2fj5Eldzxa9OYg+iRiCZOZUH3hExAe1GUQ69WukJAVgMDBnAlLZeIH0NH/9a3vBgCjhjkuTLk0S2jQxsbkefFl6KAHoRThXEJ5wpIpS2Nj2dM5zOl45ftOcM0cwfCDbDfa15wquYC4zaOntsrdXyef2T6lq6ntqOaCfGRSVUP5bjvRCbot6iU9tiuW/AMoPeD03Fss7MZsz1YG1RdLTYrduEsC04DqlGBMG/GyBI2PAPLXLXB1CVSGFDzY7Lc9D/8H0wBC2dvy8Sh0Ngl9wyQN+Fyx0o8IOAgu245q1wSuySUUP4Rl9MiIxgZGSOCPLFmylMcOQm3W6CqUgo2GbtbQrY6BZDLMBlRGWJpCQlxPGkJYbQ4ABPxLA2/6UjwRMiA9u+DG5qBB5YJC1zVv71DevTLmWJJLCcB+pBkylDVJ4MbOeUr7MjsXiTRBt2uawoW/TKhs23rrKHYWFI/6v3LIhG19CwLTxVvEbnjwUsfED4xR1qxfk3cgq23+LnoEb7nudv7iGazlmErZdkiOnYtGM1HT40wYWyyzZUl5dISlXcFeOPgiNoWO/bEL05INjUtdTKiiXENLuNKu9q1xeKJtKvLr6j1Wj4sJyfb82VB3vLky9JSGvqaag07jI3abq5ITmWP1vGdO+x9/2tFYkJG7eWEcI2b/NQkj4A850IrD91RCyfUDonB/dqVrpAKkrsomVCw1i6PoGeMilsnnbPxcOo8ZTAcQwxSUJZ4rnXRUWzhNLXxLEF+yPx8XlMyiMU6A4I2Lw9D0gL0yExaCySnidF6Jq0YklB/pYt+fnXBBJDabEwanrBqnaCJwoFm1uv0TUWWgwcRxW/5vI1KfV7t8tKZMuUSiWy4pio0IHxWZbDBJMGULChnE4YpsUHIJC+kWsv5+Sr62qoKCtVqt8ryU8Lp0MEpGzs8SCoOSRsM46DpZlsSCSONlkge4uKcVOtepXKfYPqousxYVS+/DIPiaZhoGBbcPtiLnc1iIqCMi49a6ui6a5mXe26xkcGitJ84XSU8RX6RI2HhG1+5q22QkIQFTJsjeAN6eaexw8NdR+0mdXdvsYSSh2qsPM40W+uwJZ7QdRw18Cw/Yf7DDT0oexc8Zzx8RfS1qfwpF7JVlTrO17NX2zzQldVUU61WSN3c9Me/SpD6wOt+u17+mxMNl3JFCXKZ5vVEojBfvd1GGRAVIJktYXTUa17zQ9lBfhiI/1xmEXjFrl/CuR7SGH7rCmzamm4RBkoXNH+adzZeRyQU9ZWNQrrF+0MnIG9CQW6AwI21zMPooIRQFl/+gyTp6fGXVwnvi7Kif4HWSlUwLsQv1WbABQo2M7IX4kPC8RRBLFr9Z0Yd3Fzc52YcJlw/fr5hNJ1NjTufHyd+UeC8hCw+Vjd3szLEYCkCSk6dMzpq9uU2+Sk66Sb24Rz2400Soqw2AenvoIbAwmb406tnEuRlFQ0FzuPOH6dnHZ3A7RMuU+6HC7dFAoLS6wkWi+Cgm3udV/dlkt0NHTMNYcdnCc8PNyBqkxNu0+c0d58AU6XupkofIR0o25jLyql4oKCaDcdGD771d3TY9p9yn3aw83Vcsv6AIo1OZ0oguIg2PLXbTbebT10dLjqPCUdA0t0PG8iJ/cGkYtxfEK5qjr7h+7yyR2xqS4p3Cp/T+FyZmt/W32b7YEGjUddFt0tsgVS0opg2BY8zilxMS55P396RpbYS6KqD4+gPps/stqvmS8myB96HrHIYXjHO1AwSgybt/tbhWvhgA5kcBgHT7HBoeVXa/r9sbaGPH5WIJTDBDFrTc6sNIsUNtSZYTWGACycljGWr7D/OOhRjNt3yV2nA4J8tqwqgodMCpvP7LvCtLjwCBZ2nsvmJ0BOBuU9rl+2GoPwi1LUPQm+AxK2Ttmci6vZ2S5crHnnBH50qAM7NgUgg5irBk6B6wEJ2+nme+KXk1ZxXsh9dYZgEndMuzQSTRcte9qVgAoo2LyGrDTzRVdzJ6W1fXT9/ouL//E037EOQx1/1XqSwBlDwub6/rlK8XoeHh4F+88Eb/dg5Q0aRPwlYw8CHQQpRn36WrdLiiQz45Nv5nMF8YhlX9va1qt4OUMgp/FhW1thfPZDHd5wLr6kC5ysq5ueP6qt01a7ueXxibpUyWdH7OxMwbBNHzK/GuC7FNJnVGsZtr86cdrJ/dvcuS8uE472Q307N62hW4TNf/2W/pXqEMP2yUp/TaQ/oIRdWe/ZkXdnJ5cfhI+n+xfHnkZxfxwMjfCT6Hi5Yh5JYZu32J5JS+VHV6RnMTTqOg3qMW+PL6+fcPsj0P6M2admQCNSUthcj/XmCyZzbWl9Yvv63DR4JIDyPvs2nwIHD0i4fAh8BwRswJhdSUZkS0vnoaGxGcKw0vVDczAC55e61RTsqyBh+2jauE1K1/LZ4TduXgSj6NkztvxoJBWvcgtBxAVp2Y71Ne9o7B94NeREuOjn4/SuDI6ljrpr6gC+DAmbi711k/6zI4ODJz0IMz0m33WEw6hDttk4gHWDYNs7/fZ+5ZaN6/lTUq9WVPLSpkhJ5Ss8f1N7/Wp6jr5Ja7Pkheu6KixIZi620FCmhKZDD6tVdshnie46dTd041uXuTmCqY/JTh1+IGoGHCXcd0vn01dvCEJnj0+22zayIODA33GRq5+s/IEYtnctlatocIAOPrMXJIsoPid6S+n8AReL2VDXs/IKkcCG8jIWTwk8H8Sq9YJkHuvbvPvQWjpf4Bcy7CZBHUMKm/OLXQVXBVJ2DL2HWJzwun3eD4agj+tFgS5CwLYw11etcEPh1RhUYkQPky8Gw7bmPhhkSNjOPmmpVNx71hUik+SzIByLjRKvJKg6JGwj/Sa1na6z8yTJDAve6jg4lk5K4yj4KhnYbE3MnSAy3he8rdkwCN+87iFwY8D5bHsaMrMazcUYLt1Tv1MuJ6tq8KC+pky2WK5YVk5B+enIgcdPLEzk8m6VlZZsrzfoP1ItWKCnVZCnbd5wu27vC/v3HWDYJtrUeGD4kagv/6bWUx/PEaauzE9/GehR3nIBGFDCgyJNV/5ADNth2WsMFFjYWvVHDp9JFjBRLo5dcqIBQDjHI2W4AjMxbPNnHXTEM1al1Zm8/gwxFe/teE+SDRgWr350EDRJSAqb+7vDjWqtnYfH3SAWc+ZNJJKxWJqoneDRPpRlW3h34Nn+l1/cvb+RyivxtdQYJq4aMMyQsHmcenv4pSORMVnSP17Cx4hhEtpG8FZBDhBcPjkMf/CCyO9d8DFMYMHRZCvagK9Cwjbr+sWBeI5kqR4+Q+kR/liR5mfgpwaCTbkijzmhz6kAfaXP4rac/m6r/n279fkjclTUNCvF84/ML3z7anug3dik/XHngbGzJ0fkwrLMdpYV3ak2ftZj/Kj/ZSsYNhejCu7FWY+AAu0jELUBXi3rtusAbDC/YOOVi8SwPduwOgCOwdz6OAGdCfShSy0YGNJGb9CY/nGNGLbZE4fUc4UvFpyBUgCI29PWi4AFZtvRDCpBCpuX8wer3afJ6PCx1svFwf3DG445rVyEnPqYcvoRChCLvXpRKIyeTfVvYSMvCxP1NznRIWmFBBX9u6wPQkH57MriRVIJFT0HX/27rA9iJSfEkmhg62u6wANjEGzbSzaGsGr3bGUR1mmoqjLe3VBet9/qbsk9Pb3GezckD3ueO3m0x3L/vnr5cqUH9o5vj8oxC+s3lstKSWrt6zLQa7ivTmzZFkebtOrPxqBqs+B1fP9NYEAKpwk3WblKDNt+QW4quH/gHRcyCcufXzQyAMAmSDSu+CVi2Lze2tTkiEuoQKfOACbLZncaUFXOJitQoEMK2+y5M8eHv5LRsTBkWoDE+Icbn3FbuQgJ26wbdBoQIO/1bzPB6CJV/gA2lJthGQ86+OLWD+Crvwbbgo/l1ksU/utvPgNf/VXY7CUFgmFrd3SAWwteiM+7REUjKiORdW2TpI6Reedm/6vDY46nByweP7p/U8rGbbB9Z5Pp6Ac5do6EzYffHXspxyZ4V3V7qVBSmdUuHVXRdQUEMduehouLsIX2zkMZJZS35+f38gBs2NDYjpXLxLD1XYqnhDPGapHLH3V73xEGwLam3HSlUcSwzZ08orFJVqsDKnEGL7Oj1peBqvIdfA9yCBCwfRmfJbszBeXwTMEX48fcDS7wi/tGUZ86tVhhgeGVfwDbN4899evQtBdyT4Ev/iJs8/0Vmyj9UjY9BV/9Rdi+vVfMDoPxyhqBnSwINsVb18Ij88rlt+Vl5DSZNtYK0wg8fjbydvd9oz3Gpds6rHt3me3ssB64LZjMvunV6Ive8tRNO6rUVGXz7nWZNVSLpEoSjkY7BPAr7gjmp5BPyNv5jE3PZgA234QMy5XLJG708upAymhePehGLsyf7KwO/usvTOaDPvIDBO+Pds3Fau3PyD2xyR6DZGC8u2YQHBWSwjbn4koOeSBme9EIuFGqyB7wxV+DDeVjryXHCAtmrfp92FA+E00lq9F0fDf/wLLNeXZtFaDwF8j7A8vm4zUieSkYlqLYRga2Gu0d17LrTSwPVrGlmfdmR8Ul8qYI67bfWCU/8qq1blNqtbX1c0tl+aY9smFXXo7s1KxRu6tYZdYz5ND/0OiBZvb6QsJ5NqcbAGwI2rieKdLUROAJ95vfvBgOBHVBco0nVi4Tw3ZoUzpbhECOGXQjPSYMokOwgCve4eyO+nGVGDaUx+SQxcuzX8l11OjlMD9ggLB+zHtFBwRsP9sEvjBTwXgehgjm2Au++muwzXtZrgpCYCJ46v52NEpex5SDCJ0fLDyzjGB2+ZdgQ02dq6ajgtOI37EFX/412DycrDipsJirevvIDBBqtFULZY26bOzqWVM6rERCL1xJjbpQpb+BtuC4bUvN+lU7Bl8+71KUeTSgSJ9x6Ki+Sp2e+rbKrhefZo6ZtjZq5ArJEK4geBTAMWhEEEf7KSe3KQ9PIvv29fH9S4wBAGz0qk9AJp8YNputwhxsgjfapmch9ligxk+qIPFLXogasHIS2Lw9R5+fmJiGHmJ4u9nEATqwFEKfwZehsz7IyMLkJ0mgKcjwxD7w5V+Dzf1zKw0aDY9Zp/v7sHmODVwEBuesEnf/duqDrCx8stsGR2OCCv6FqQ+y4jKyMxwGg28ytQabaYI9CLIdPQcHPkztXi9yT0dNualbLZZD+k46k/D9yvSLEsUPh3vUNHZZWeyRCuA17a5XrtVVvLylz87VZ+LUgdvFJYunGIFgmylnokHDkOfX5dzaodHa9Zkwl+6k5LowCiwav4JwEhRTE8P2fqcab1SygMKuZ6dIpz7m2mXWwPHj2cB6FOgy6Tzb/LtDNkfsoQzst28jd7cCjhgdzC0zDr78S7BN6BRxAk0JvCJFMPD+JdhQFvnpSDQaJ6L6FNxRvwabfYloCADbRUMrghShX4LNQ2cTJwwIf5psCUZUvwbbvk0plDDfACXHr+BXHASbxIUtr+yHh86hnomJlVUadb762M4ZI3FrLUu6XA49XaF21/DjwvKB0X2mmym4HrRp7KjRkUsSPfjBHTXvNSRz8w7xJmXPSg4GfFrC+WDOdRtLNR0mvcDbPk6sC6VYXhsFcUEM25fnO1OjuHgl7rUcGZ0mPsFgVo2bCQZEbNQMDeDrpCsICycPHdj3Cn//AslBBQcyuPyAiC0iQ4lgpAkNG+qHEFz+fJODFtARkn+XYEGRLGxQShbuRwZj0GhfSZNB8PMhD9vSthtCc/2SNwSJhsEy9r0mmPwiDxtEYyal6P3RGBybBeGOvJ/ABqHkYQglBuYfpEV4FQTbzTWFNoN6VY9fGVzbkLo2W3Jb5ZbouFuV65kTMtLi4nO3qRtqFBbrtR18vT2ATbqsTH7rxo3XigccBvYNnjxmaaaqQHT8wqxWejQMn5pIGRyxim99cYV+x+uV337NQ4XPqoTBo194gVpADNu047O08DBGbqHsktt1jXoPuuw/rjgZz/IQvCNGRPPtBDcKArbhx007qo0etbY8NG03szw7A4r0LTno8VlGvEoPCZKvIFOM3h6xeb5312Nz806LdyDuFxwz6SjQGERs60EC6wgJm/s5R7vhfZZ7nnR22YJsrbdndSAlDONHpz7yGdwYMrB5O3043Ge1e/eeXpD5mfd8tsofC/On22z/hWDSmAxsMy4fbA72WHR3260gu+BxRpwSh6YI4z9EOPFMBraFWbcTL/ft6ep+sTLRifJ0a6TBwbARCYYowsIrsEkJFlsfkEi+pasofNEfTsvIGBrGnKCkLcQUzhyzTjDz2mZpaSmpwhKbuQba0IuX8qRT6PlKag6f0FdoOjgyO65ZWE4Im5dhbuJydi0+Od2XR3TnSl2Pxi5O+WJwsQRZzKRZH2/TQyjQFLRBQfRssXHxW/fYrLxvM1KL6bq+a8S7wHeQwuZzSE9+XVpGxhq+dCFhEenBr6CZRvPzixUUefKSIC8HCrbJzibNqpKcTRs33pC0WjnsAjX/PgWfaEe5ZpQwMIVOMRoZeGJUVpiXm5evs4I3asb1NtBZWFrWDsLy0LChZo71N5bfunFjixwoi2fWtZsJ6OrgmHKi8mRg+/ruQJ2KjGSB1K6Vl8/7nN1VoDHnuUWJ0oPIwObt+tFMWyFva8G9ldnshYmPNRQwGDLxKkGeIdEm5ea3I1plOh31BWJ8CeyRoYGR60TvNRZmpHDFJ1xISc++pVB9717dS2ddds4MERmFQgl5fePOzhp5oyPDr62rihQJYfPuVRdZ3AaBhuPwGXpYVt6SbuuzE/j3xWviQPTiMjxNYjaB5yGF7X0OdyAa4e9PRR3CyBSefru2Z2Bp7tXn66ncxYy4AEntQfAdEJZtyEyJ98IF7lXRcRdW86zXNOm1/p5aMflRjwqfU+J/86XD32bqOjdXymzO5OdLTk4VqHhidWgY76tQC+4nn63G57aEXX1P2LeQsL2xMFIuFVmflrI2fWu7Zf8AfliCmp89eaQAcAO+7PzdhOUhYXN3GGzVlM4UTE1Nu6Ld9fS53Tz+DIYZR9tGemBYHX2phmgFCQo2H6eTB3bWbsm+LHBpvUJnz4GX+GnI+Znxl3tSAWBDM4uJykPC5n7GrrdD8WZmWvqlXGOLvoMfUPgXwW24VxaJQZ6/KruXsDgItq6zLt5zLl/en+hrbNCtE70QhuCqbmgxbtbfnskf4BsadbVUa/8h64HBo42ZolsK79b1OTo6HlaSKpY3//TyblmJ3HZC2ICx4j3axe0lfrT++P9gcYERQhaD+OGA86BxxCJs8fefEHgeUtjOVm+NQi/vL4EjqeiThK0X/+BhszsD74ixjJ3TBEvjEClGH4c0ohkD/HBYBAKB86UOStygv4gW6nW7rN9ipm71DOEkGnQ+m1A8YyASh8MhkVS00RmyY0C4AnDSoswKNI8hVYZoQQwyxair5Bp7OBUFEtBBGRh68WoPXofHeMe9dUAfUQv/S5m6J+vLU1cFU/gikUjf80Ec6VXu33y8v56xqhAPACysQMUuqExdoj0IM1aNW1ezBfj5+voCjQlPvjYEhF3TjoNVUlFARBBf0+ZEWB4SNofHmoI89JQUgA6/QHquVEPAtHt/sm/IS4ZjA1kqzIhy4kCwWU1OfP700XHs9EGdupqqG5ej4Zwq9x+atrVpFAhRIdiTNxarmlkMHh+0aZHJF8stV33m7Hi8r+ymdLHhEQsF2dIyopgN5XpWcxE2GFMSd0x0BBMlGkG5+r7ZoIODg42ZaugibHE1O0fOfl1ZwYGATfUm8Chh/lEx7OysLEEw34jEhw54OfZIiw8PGy6s3cl1BtS9kAOEu8xBvr5M7Ozs0axMSEw49+03eB2jT+5l+wKwMUSrToAy4r5BweY9efzmRZbzDFFsbGyRLNRomniR/Q6j9nYje3dIMgKwha0vPu1NoIMUNtTMREv2mhD6SLaoqMgIejiONbFhdHTUbnhAowiwjpjAjdsIJrcgYZubPiwvHhvKzMrKGhkRRoEO5pAcGn1rZ9vfuOUSJRrru6EaMi2cALYFz3EjxQ0RLIs6wmnQFCx85vajo8PPzAqEw9AIv8T7u84R6oCAzXv2paZcAltkJAtLRHgIAs4QXWE36vDmoKWCYCwcRxddtYd48X8FNgunV8rlVbW2nv1F1zliywyEMYxZUiZPLbu6utTpA+QMb2dfSRS1dbLt3v/SYFVY2rUHQ2a3pEvlt+aIbdpStr26hmhHPMr5g1oADgYMbKQPWg9amzcl4/fAsq66kJSUxL0qArcIW2Dyeqkyg+6R5QiVFLbThetCgFctZe+RwcNPH0sjMb5UMUl4WR3DGgBogFMx5KmYDZ5a6QaIfLZelSx/HJxWa3Bw0LpHnw1wm0yJeB08HCz4ISCGifOW5eDfxGwfd9VxUvtir+/r73/W/TgTjfUPik/i4eFJ5AwPwQGml/mq3NBZgnVPUthmD1tI0FHj2A37+voszBTPYyioonh4knhWJ7CEUqHhFAxiZUQb8SBgczxYHxPs519s2WNlYdqYgMb5M+D79AJXFD0NBhNAt1HTiigJitSNTo/s3xhJ55vWbtHV2WaUjcX4BsTyAH3KFctAi0RThaU37h4n1EEK28LZtzUczP5hVY/NTB+1KofBkX7M+MZwxTHRUMIowrnUfgLb7tNPczPzZA74HNx6mZZWaU8ulmH9jfZ+qz19ts2MNKq9d68m0STaulqbPT9txuB7QVDzReOGqyWKWzZeStxw+25NrRoJbNX+WDQMGaDm4oGaHbXeAFvMb/uxCQ8vFExsqRsU9Z8vnztACtupzUlBaFyA6Be8Y3ZQp4ShCTXAA+gFxGt7jrj/SLghhc27oygNgUEy4ReTPD8f4ibYOgqowjDF5xn0uMx6rQyMSWFz0CllBMJPWecpN9czDlIYQiUwDLOQTL+di9fcysiBFDaPvU2X0DBswsBXF5ePdgbBmJU64OMMytDrJYdmARUrSWYQsL01L6dGYyhrP511+niify1mcTPh8r5EzHmGjTVdU17e3qDjikhhc31uyodDwIVHHE9/OH54G46wMecjL903O+MFVGNlzE0Km4+DtZwfAhNmMmo3cmzQJBqB+dEYIJKmiEhQ6TjuNTcPOkkRBJu2cc11ISGRtk9H2vWKbm7bfi3uan1L7zOdUp0+3QgaEVmB8Gie7GNfDQpuaxczhEiqtz3TlxCT2Cwlo1jVYNGxdUMRIWzfZqd0AMtGcWmrpdf8N59Jx4LQABLY4JTUIUxcayrtPnmTge29ODBA4JLSxYd6nm7GbMFYQg0wHEUYG7/IjXLt5RUACNiMrq+G02UVH8N30cyJK4yUhLDB/ANj0jdur2ow/LFyRgrbUJEwLZZbxGDaa87L/euO0POEu51hVMxcEjLqD0wsBpd/mhS2iVqJVWj6Nfl20zOz7hMWcXQIMGwYJFUkZ55Kg9meQ0eWJ2VJYUP1bBXwRcZcfOQ8OTPt4pATGoDf67wEHOBH/KhZea6r63buPXzix6wIKWzvb+eEwxk4i0+Nu7g4j9cz0xLs//aji0wRqmrqPDg0dm45lCWFbbYlnxdLGXHRwvGz8/i552vxi36LzC/ucELShSULbmsyezHk5LbcISDYlMqkRTakpuq+OTFia6Inc01YsOSA7aG+24LlFvWsNJx8jOgw4RK78crkDLH1DJH3unqeGkhvFr5apKRvdWj0xeXwTSrEm5QNzuNg1HItS4Noj9sc9CuMgASoosiBkVkysJ3MjqdBC+3sX3JQXUmsOKK78VYF6U8bIbi8eZQUtjk9QQ4Mi6rJUkbhWG4cDYkOLAXtKu4r4j+GT6SwvchMosJlqe7FJ2IvzGrGMhLumgb62Tc0Mk1UWtlseSxICtv4rdX06GjJe2NewPu+cIg/koIANiwWhmFKuCJX0fz4LHnYjC6wYP3X5XbjI92FrzKxwcu2DX8GAwbniwVwFr6j0b7XAUUWtmPr2fxh0RuqzkzOzPp8e5QQgVhpBzA4p6JEBKy9fufBk6F3i+EfYJxIYZuWZ6VFU6/O3P95CrCBb7I4qPF7/L+rwSCoqCmQ8dflDJ/YOy13CPgUI5GbmvWV2+8/2tXX1/tEKo2fJ+te08CxRpmarubsy4IZMf7xt5QMH1UVS20WTUp70Ne3rz7jalllZWWDmamxjgjfViLY5mcfBPnB/MVV8P2NmnMpjqCBhg0Nu2I5OEMGtvcSibTo9Pouj0WNbVFBWOK7gf7BIilp+Wy/b9OCsGwGwlzw8NsP8Iuw8x4jlxn8SHRgcJQhTJzJZst+gxQ26yxeKpzQHUtv1LeFqXN3GKiJLBsMhqChj01MF1Ffnj4jhe3cEmzqZ+YXvnlOdHHQgi0bDIOFwzBBLNyCIjfL7cjCtmCYEIH1z7i5b2bu2/zkSXFGavj3R4ynDYPAwdHUqxJFc28pWC1HwqSwDa+L8IPFXa9znpnznnZtiAjCruzMhWORfr5wihgeEcltVa3L58NAwFbCTIMOEthiOznrMztpkxpKuXw8AKAD6UtJicMyJQrKKGjqL49NQLBtZMl5+/mYdV2eYrP58ODNVVHhMSk5r8b36e/sNG/WuSWWHJbRoJkpUNN9X2rrDeldts/3KzPxtB1oqtJsVLkuIiZRSgSbx4RuKDWGIk0CHyr5TJ3ZQkNBBjb0+vbnHmRg+5CfEoxOUmjFP8GZiUZ/GJrk7sXmYdh7xqbJwdaanQgPLbyHb/RSzEaqA3hScGSA7nLyHSlsA9f4qBCXSjoBvzJ/5k0+YZSzeG4HBoekoqYJurHcBySwob7I4GErqMF7fJdRQ7ofShaPB8Dgj2Pw9acJpg9JeE4ONpRPM2c4PEBY5hDwXnh+eHkJicAu+0AYAAocn/4QEMgUEc6kvuwCSWEb4g/1hSVKGkwDb86XdzsoEXC8jqXOxFEgcUCsTUEVGhUZLnKaLGzusgwB6FAxxbdAcOh+upsdi/h+GMtiT1IhcRg0jjI4loONczcpbCKhV58PW7ZX3rht1GZhnhOfyJ925Ub7gfYHrY8fadwt2iySLtmqm7lWyfi+8o6Ku/o7Ww0VU4Sbd6nLKyjKiAiL3SCCbeHDKyU6SgyO65KG9YCN9b7dl/2RQKciImLDg0JZ2bm5Wej9Fx86GgPPaOufhoZtwUEsgQYdk31738CA9TOrEt/FOwLZWBgYYzhXJ8eGBH7vaRjbnndTZGCba1wfi6EVlmwbGBg4sKchavEGiogoZqaY1UkpSREhfktnf8D96pf3npHC1i/A4YddvVHt0MDAod07ryw5C/ooFqYonmR+/rgIOgTQ2xR+lFTZTvMoaNgWzt5kp0GHZxZZ2AwMWLUpUAPVRqOpIliYWS7wp6QmsUcEICn8/Kmpz8fs/25iSWBb8G5kpYdTplzTwzfG/MFqLBbACxfKEhERl7Jm7RqumBA/Sv+AoGBaWhVvFBnYUId5gnCwWJHtB2xsrC3aNyMXzyyhjYxkieZds06Aj5OV2t/fnzYkmDbjPXnYCmn9YMGCeea2NgN9j9WZgCgAg/aLYI1iS0xNv5y+Oo6eioqKlpk5hGV5IQEE25WA+O2V4ldztt59YrhZWGCtlFaNUolgyi1NvZ11mRl5snUde/a15whc31L77PmAVR5fanq+fuOdkk0ZF+N4MzeKEX/hxeth/kVggLK4NhrJFhXB5L+424pW0Wib0E3VBqunSmKciycooH0DNrTuc4eEzWf2KC8VFhiNBkWwsEQwhwcu3gG7VFtxQ1LPrP9Yq3i6//fXOrJt2IUMbF63g6nQcKrzjCwsLMxMIbjFZ8yyvabsln7/4VOHFXOiEEvI4qo+fd9DSQpbFyMSA1Q1mCWSJYKJcelXfbPvKRVr2Bw/+X6n/BUaShwCCJrgQqPfsyyJYUPNj2UALz8ykD6SjZUlnJEW8JpwGJr7TkWZ0v6Tp06/0NgWH0Lti4PDsWHdM97QsM15VFNg0RiqwHB2tsiIMAbfRaMcnL/jzu2296fH7Ns0N0Yx+lMApgqrOOsDDduC96Eo4IepQpnZ2QHrxUi9+KphBVWUd2gPj42N9TdtT1oVQuMHcMw3ukAGNpTbDYBQXwbmuIRVrBFhwYhFF8q+XU1NY/+Yo+MJ8weiCVEMQX6+OJrW7yN0EGyXKaNuFopuyJVWbq27wr923baHTffKk6KyK9Qa7gplSN95CBiorjzBjRL3h4Zsuq9zJl4s6HhUUbzpMt+qZIm8bKKPbqBmdIQ4lg+VwR+RtXgIAzIgqmG/lrTyzi47+6ZyQXoaJAKGpqTNaj8IbdnmPQa5kYtb55eigUUlVLQ3OpqVqixffph8dnszWwgVEg5ECWxmryfIwaZw3o/A52FxVHR8D9p1NHpPjS+cayxfGx7s7wtDY/2qP02Qg62TDvMjgl4MS3AUQRFlbU2a7Wfd5n2eaxdyRNKdx6HhSOHRCTKweZ8WwA8Y8QeVLJ3shvH1o2W42tSs03QS8N+O7fUbAHsfAIcjmS09wLCBcgTmPFTw43HAiuK+x1lApzJwqTTr61kDj9Tzhfm2VO6wYBzQ17c9ycE295wFuBEZ4O+LBMziX/hTjCiDmSRbjZo78atW73sfiKbHsZ7HYHH89t9nUCBgE8evCFPT0ND4YhYHKDjf8wzrHjwyacdv1XZ71VN8hZ8zggKHDGz1mieGTdA3MC5Ny1y/pjCJZ83aFH6FTlPdKgHOWPaElEwV7d3P3jh/dbFTvFFl0Of4vCh3S/62iprmh7ue6GuqKKg/eXSN96YKQabuuGoK6/KRbOilKbaACF5Z1VefHF7bf3Rydz/9pt9UhSeKAkbPrvDhex4tMWxeX62TAhAroRnghulYJGt6P429Hf0yMePtbHf02ZMbvKFoP8Y028k5crCpsNGDYiwsjoFNvLX7/adT784BbtPrg93APs1rFykQTHGtnt9XSElhs4qhxa7ogCOCONbrW7w+c/rkp9l5FOrrqdcHHpdKsGCCY2U+f5/yg7BsVygBA4D5floXDEsZzaNs9fL02KnTQPD0zfPTe9tnDQqCAbQx6w59/5QLCWw+c2r408PwY4Hv1DMm5nUeHB07/cEFhd+hd/aE9ZN7sizULJx1Ht6oFdjAKwgLAyyLrxwQ7i0poebZoL/vmKPj2Gd8+z3OnR48aFy//jwjR47D91PzSd2oWy6+Hyj9fXFLSrAcaXd6B06fObN4eMv8xJcRW0vj0nD6KO72qVli2C77+QdzmZ2weHDDl5o37WJyueUugxqhxGCMH11yU9fg6Pjc/LfPqtL6PUPn9q29UFBR16yva/T8ldWuR02PRw6JxkqAYfNx+7SDhxn2Y0JssUlBccL6nY6eP1Yhp52sriYGwMIv3FteXyGGzdPpeXIgDmyVfJkT6g+eBlMwqSYSDaNeJWK/1LNQMVtNAhPm+xGPwLNGUkYlKZ8aJ1h6OaR4PcCXI3XX8r9JYXt6IQy5MhzA+YWvlXzjTrCg+qVVhQvBsuaOy3fPQwqbowiN7zL1QIjoS8Mr1E148vb8y0cFdGEXrx8miNlAsKF8aihWoAf8MDZGqIZ4E/PeBwn03On6Ht+/KkO6XGXDiu8IOHzJJGHgIVdliNYxvd48v8mwKq3o3cxSP0HAJoFPV6SgwGKWVq4p1m5+QpQNfe6NQSxLosAT16WJKxBsFYpFwlnb1SsVJTdkrEtbly5Vp/vQWLd2PT1z7No71RXb1e5bTX/tajVpb2/Xzc+5fr16l9YNydqmp4N9jw84vS1aJwWGDeXlWn2RhQg2f0Z+9YeOK7utvKftHmyPwPLnmyxnXJC40emjl1moljBBIKkC6RhY067tITzG3evlrjyG5DKdn0zqGmSu9gccBgJHSU3PHpecenP7E1fCtdCPBw0E0u62/OhxEthQA9dTAgHvh/Wjog2JS7okeuvBk3NzBJ3rcfyg/AZFk+ee3zWTDhC+lFxkBBoDpwRaEs0nkCutv+skQTWAMcSJR1vkWvYsJ7WRwPZtwZiXDQF0BwV1IB1T4prsAo1dtkTLU+4fbCtldcyG5767QNLR6PHMeGoYHOEbQB0UwsmfdUvZfB/REVk+zo5tihpt+ya8l3SQwuZRycMEwwBPBahIVMrlIsVWS+I0phnnw3UaRmajsyRu9LH9AZUS4XUi4rL37lxJy7iSI13Z0TNiVxp7IWX9DYnEyFVcZefcHIY7DVSLSlQr1nPv6KuOSxCT7ft8fN/RuXHlbKIPpc3Wro0igg3hH6eoS7BX293eihu5SfvAsoUgGY2i3m2Kp12cv8H4BTBEsnPxb5YfJt7F7dMQn9d7ZDl7D3K5KiMoAAun8A9i5LhyrUDOwOoNyY6EtwoKR1bOJSSGDbUwrCAe5gtH+waGRHFulKrUtTjzlWS3ledu9Rcrij+SzLO5am2Jw0/IBTGwxlyWVTbthdqHOmrydMVSEcC22Gz8CgIFYNICmVjYebeWtT37gCLVMfVi39mVUxFIYTtZnh0GRJ1UIWHRnJu2GRx2gDrveuzwhxW4IFYQjAp4gSEOgi4skv2SfK3NKNRHPzw+flrJCgDBpmXYatJSlr/pSpa4mKjoFun8vDKjJ29O6RdIbi1S3n4xLDKm2OmseVPns92GLQ8Nd5TqWymzXyipNu58am173Ka2TIkQNu+uSpGgACSSJjhiFWciz+rVF7h5Loo/ekrQv7NnbQRCy3t/PHrSebYzd7cks8Qm8glcztlSWFyqqPzA5DRx7y6YbVI5emp5IR0iefKl0Z2MS5eFcvIkixQ06psfPjv2iVjHtzOtre9XPrVDatlOm9ZvTN8gIpZfWFKubbjr6ZAL6RaauUEL0DNdsmzgH/Lo0S9IuSSaLSktV1pjvGvgNVS+92fr4ys5AaSW7dtw045LaVli+TLFpRUGbQNvxkk0ANTbj7iufH6BFLYvptpiqcK5eYVF28p1Hh04RXCg0nKLnd+Pr1SeFDbvg82l6zKu50gWFZeqmXS/g/xah5cL6OANEGw5cfmnx/c+3MrNQsm0ubS+pTxza12r/bnRof1tHU+fXAoKCZM881qUd4+Xp/v4m5FTYwO7FSOSDDuLL9edOFCjZkTyhZdpZ6NEdjq6hDXiZcq6jdr1mhqaWo+/Eh67823BUXLNLq8f9SGFbfpVb4WY/P3W/S8/Tbq5TU25z5CeQo060rx/5cxwqMMAZ04Ym744uqhh2mPG0wviS4peTk6gM7JJYzYfz3O9Ha/en50EKuExM+vlDfUlDYJveS7CZg0uhfKaPmz6zNHJ1c3NbXpmlugjEN9lAfyBIgjYvGdO7+k+jT/UzQ3ojDnIPeDf5sGqSWFb8Jx4sfu16+TkJNAYzznob6wtgC9DpBjNzdh3H3KaAGoyBTQGuh7fwF4IvAchtcxp6rCVXBIX2+qbJXc1Ci9JaBkfH3vZY7XXqrM1NTA0ssDBNivZEhisnLG3/+y8X/cWx7qWzpKrVX1tcsU6RlrEy1VeVuJXExOv3axoMDBtNzc3azczf05C/7mqrQdX/kUK26zDkSalhidPRyAPMFkSlD34tBzIY07P7D0w+pG8Bnx1p8AfkFqEjSgZcmbo0KlJsocnkAopbEBV3/efmIY4EYacQMD27duE7SDZ71RBCeQpRm9f/tKHoiGTJ50G7b1+/qlTAgHBZtDz8qubi1OTmNITY5mcZPbo6KsGZk/3FnBUfB4sFo2iXrXuVs/ubVLW88dbzI/aOX5U4xEQl9Zprr8nt0mQgyuHOC0cMOKu7450tB8eHXMaPWhz5utX569fiU9vB97TM+9/spUP/w5Of/no5DI5Q/bDdYB4TkyvtBgStrlJN0+vn2gg3oQMBdvC9NQs+e8skgqZsz5mfvJ9NhKBzNSdd5+GcHvkBQo2lCfEBxN+IpCwzU0vD4b+JQHBZm538tPnCZdHUjqv90tnstOGhGfom3bvEaaQcT6SuzaakedqsenOHdttPAY0ml4c/TBWHsabX6pj0NxclMgZGSNMvFy1KFNHj7jMo759HTz+U6vyQ/53fW+U3LlH/6L8//CN+N+TXzt+AVrAX+X7XR3gkycHuyvKq+5p1OqZ1vFxiMsLxySLl76wV78q01BbUtLYdk/mltx2w/ZOS8uenWV3jpzTWpvMJdz7+kVfMcNafWONuyoQsHm7fMX7DC9nsp8WJJR/YCOS/zWwff3Fg2WgBATbwxcGfJz8Att3NtXKhQUr7Snh4krMGnJ7fFtG7GaF1qjXvh23rm7ufGGs0XHMLO1S/4ThJr4A3qPuJ4dLfK+cPrf7QS0EbL8q/7tg+6WghlT+gY1IQLDpdrTcVcyXkL3T2LdHpbL3xGMVJfnK7hddj8r50vLkbcYPPzY1NGo3vZNX9cRU+755t+J6Lqq41mdPreQic0bedTRq/AMbofxHwfarR2ZBCQi26pqHdscb72y+rD3j4+3ts+B2xv5gj45G71vVoNAU0d2jpz46z30xqrrKcU3FZML5fuEGblYqZsk7dQ+K02UO2e5sqPkHNkL5z4ON9KMbvyQEx5zWPn5i3HTnpt7Y2bFTI0ftP77Sry2V1e4oPE9/UdjY5sVBu3nXPU1lEqV1xkODukqyeUIcq8WkNFpuZ8nvP2RuXP8PbITynwfb/5xlk8+/nny598MBE1OzRzo1W0Ua3hjFMa/i5OJm8Q/mFbxroFxoOON1csTu7YvHTXIlrZbWrztvS6Wl3tutU1rd2dt/8P/YN+J/Lv95sJF+KO2X5H8YNkWZbI4Uy9MHzczMWipKrvApD9SHBzKxsMWwhLBdyanWlxep8/A8cXhk9GVXS3GJ2cGht5YVshsyqh7Vb1c369zfb/gPbITynwfb/5wb1e/S33xD0/CewkNHa7E1qam52wvWrI6MuHZbbuudPtvn+7fFyk99up0tsUXdqv/1yOujbVVFlzYZmMqJFFSqamo16P4zQCCS/12w/Y/EbMv7e39PQLC1HbEok1VSLs4z8hy5wnExXTjnupBAdGRhU31Vy+ep0cMlTNKu77Ji4uJle4/MeJ0+rrtZiOvq00Gp+E1AvKe8OM2m0uK88Edih4ft2J/pmHwEVGSP5x/p8HmBh83xzyriiIfthc+Cj8/v6/DcjYdtkqBuv6xvGA/b29+vBF7G8Y6rx9P7V38bLN59P2DTMdFXul1593Zp/d72wpwtkkVystKS2dcVNNVVtLqszB9tv1Zu+VhGTDz3drPJ3qdP2jW2SecWNZso5MqqqNxdYk1Fq3v/H0mHGjAqNv0zHT34jIAHe/9IR59xlYqKxu4/q8huwNZXGffh5bd17NXDP5kecNX6flljW7WKilrHb9dhUbrxS98Ge/f9flP2799n+AO2f+Qf+X8hf/27K/CP/PfIX//uCvwj/z3y17+7Av/If4/8fynvMR4KZW5kc3RyZWFtCmVuZG9iagozNiAwIG9iagoxNjYyMwplbmRvYmoKMiAwIG9iago8PCAvVHlwZSAvUGFnZXMgL0tpZHMgWyAxMSAwIFIgXSAvQ291bnQgMSA+PgplbmRvYmoKMzcgMCBvYmoKPDwgL0NyZWF0b3IgKE1hdHBsb3RsaWIgdjMuOC4wLCBodHRwczovL21hdHBsb3RsaWIub3JnKQovUHJvZHVjZXIgKE1hdHBsb3RsaWIgcGRmIGJhY2tlbmQgdjMuOC4wKSAvQ3JlYXRpb25EYXRlIChEOjIwMjMxMDExMTYwODE1WikKPj4KZW5kb2JqCnhyZWYKMCAzOAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTYgMDAwMDAgbiAKMDAwMDAyNTk1MyAwMDAwMCBuIAowMDAwMDA4MDUyIDAwMDAwIG4gCjAwMDAwMDgwODQgMDAwMDAgbiAKMDAwMDAwODE4MyAwMDAwMCBuIAowMDAwMDA4MjA0IDAwMDAwIG4gCjAwMDAwMDgyMjUgMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAwMDAwMzQyIDAwMDAwIG4gCjAwMDAwMDA5NjggMDAwMDAgbiAKMDAwMDAwMDIwOCAwMDAwMCBuIAowMDAwMDAwOTQ4IDAwMDAwIG4gCjAwMDAwMDgyNTcgMDAwMDAgbiAKMDAwMDAwNjc2NyAwMDAwMCBuIAowMDAwMDA2NTYwIDAwMDAwIG4gCjAwMDAwMDYxMzQgMDAwMDAgbiAKMDAwMDAwNzgyMCAwMDAwMCBuIAowMDAwMDAwOTg4IDAwMDAwIG4gCjAwMDAwMDEzMDggMDAwMDAgbiAKMDAwMDAwMTY4OCAwMDAwMCBuIAowMDAwMDAyMDEwIDAwMDAwIG4gCjAwMDAwMDI0NzggMDAwMDAgbiAKMDAwMDAwMjgwMCAwMDAwMCBuIAowMDAwMDAyOTY2IDAwMDAwIG4gCjAwMDAwMDMxMTAgMDAwMDAgbiAKMDAwMDAwMzM0NiAwMDAwMCBuIAowMDAwMDAzNzQxIDAwMDAwIG4gCjAwMDAwMDQwMzIgMDAwMDAgbiAKMDAwMDAwNDE4NyAwMDAwMCBuIAowMDAwMDA0NDIwIDAwMDAwIG4gCjAwMDAwMDQ4MTMgMDAwMDAgbiAKMDAwMDAwNDkwMyAwMDAwMCBuIAowMDAwMDA1MTA5IDAwMDAwIG4gCjAwMDAwMDU1MjIgMDAwMDAgbiAKMDAwMDAwNTg0NiAwMDAwMCBuIAowMDAwMDI1OTMxIDAwMDAwIG4gCjAwMDAwMjYwMTMgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAzOCAvUm9vdCAxIDAgUiAvSW5mbyAzNyAwIFIgPj4Kc3RhcnR4cmVmCjI2MTY0CiUlRU9GCg==", "image/svg+xml": ["\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2023-10-11T16:08:15.609788\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.8.0, 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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MDAgbiAKMDAwMDAwODE4MyAwMDAwMCBuIAowMDAwMDA4MjA0IDAwMDAwIG4gCjAwMDAwMDgyMjUgMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAwMDAwMzQyIDAwMDAwIG4gCjAwMDAwMDA5NjggMDAwMDAgbiAKMDAwMDAwMDIwOCAwMDAwMCBuIAowMDAwMDAwOTQ4IDAwMDAwIG4gCjAwMDAwMDgyNTcgMDAwMDAgbiAKMDAwMDAwNjc2NyAwMDAwMCBuIAowMDAwMDA2NTYwIDAwMDAwIG4gCjAwMDAwMDYxMzQgMDAwMDAgbiAKMDAwMDAwNzgyMCAwMDAwMCBuIAowMDAwMDAwOTg4IDAwMDAwIG4gCjAwMDAwMDEzMDggMDAwMDAgbiAKMDAwMDAwMTY4OCAwMDAwMCBuIAowMDAwMDAyMDEwIDAwMDAwIG4gCjAwMDAwMDI0NzggMDAwMDAgbiAKMDAwMDAwMjgwMCAwMDAwMCBuIAowMDAwMDAyOTY2IDAwMDAwIG4gCjAwMDAwMDMxMTAgMDAwMDAgbiAKMDAwMDAwMzM0NiAwMDAwMCBuIAowMDAwMDAzNzQxIDAwMDAwIG4gCjAwMDAwMDQwMzIgMDAwMDAgbiAKMDAwMDAwNDE4NyAwMDAwMCBuIAowMDAwMDA0NDIwIDAwMDAwIG4gCjAwMDAwMDQ4MTMgMDAwMDAgbiAKMDAwMDAwNDkwMyAwMDAwMCBuIAowMDAwMDA1MTA5IDAwMDAwIG4gCjAwMDAwMDU1MjIgMDAwMDAgbiAKMDAwMDAwNTg0NiAwMDAwMCBuIAowMDAwMDI1NzYzIDAwMDAwIG4gCjAwMDAwMjU4NDUgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAzOCAvUm9vdCAxIDAgUiAvSW5mbyAzNyAwIFIgPj4Kc3RhcnR4cmVmCjI1OTk2CiUlRU9GCg==", "image/svg+xml": ["\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2023-10-11T16:08:15.741653\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.8.0, 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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IAowMDAwMDA4MDUyIDAwMDAwIG4gCjAwMDAwMDgwODQgMDAwMDAgbiAKMDAwMDAwODE4MyAwMDAwMCBuIAowMDAwMDA4MjA0IDAwMDAwIG4gCjAwMDAwMDgyMjUgMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAwMDAwMzQyIDAwMDAwIG4gCjAwMDAwMDA5NjggMDAwMDAgbiAKMDAwMDAwMDIwOCAwMDAwMCBuIAowMDAwMDAwOTQ4IDAwMDAwIG4gCjAwMDAwMDgyNTcgMDAwMDAgbiAKMDAwMDAwNjc2NyAwMDAwMCBuIAowMDAwMDA2NTYwIDAwMDAwIG4gCjAwMDAwMDYxMzQgMDAwMDAgbiAKMDAwMDAwNzgyMCAwMDAwMCBuIAowMDAwMDAwOTg4IDAwMDAwIG4gCjAwMDAwMDEzMDggMDAwMDAgbiAKMDAwMDAwMTY4OCAwMDAwMCBuIAowMDAwMDAyMDEwIDAwMDAwIG4gCjAwMDAwMDI0NzggMDAwMDAgbiAKMDAwMDAwMjgwMCAwMDAwMCBuIAowMDAwMDAyOTY2IDAwMDAwIG4gCjAwMDAwMDMxMTAgMDAwMDAgbiAKMDAwMDAwMzM0NiAwMDAwMCBuIAowMDAwMDAzNzQxIDAwMDAwIG4gCjAwMDAwMDQwMzIgMDAwMDAgbiAKMDAwMDAwNDE4NyAwMDAwMCBuIAowMDAwMDA0NDIwIDAwMDAwIG4gCjAwMDAwMDQ4MTMgMDAwMDAgbiAKMDAwMDAwNDkwMyAwMDAwMCBuIAowMDAwMDA1MTA5IDAwMDAwIG4gCjAwMDAwMDU1MjIgMDAwMDAgbiAKMDAwMDAwNTg0NiAwMDAwMCBuIAowMDAwMDI0ODk5IDAwMDAwIG4gCjAwMDAwMjQ5ODEgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAzOCAvUm9vdCAxIDAgUiAvSW5mbyAzNyAwIFIgPj4Kc3RhcnR4cmVmCjI1MTMyCiUlRU9GCg==", "image/svg+xml": ["\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2023-10-11T16:08:15.875240\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.8.0, 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, 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": "b079b0bd", "metadata": {"papermill": {"duration": 0.020562, "end_time": "2023-10-11T16:08:16.032763", "exception": false, "start_time": "2023-10-11T16:08:16.012201", "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": "b776b4f4", "metadata": {"papermill": {"duration": 0.021021, "end_time": "2023-10-11T16:08:16.074587", "exception": false, "start_time": "2023-10-11T16:08:16.053566", "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": "331c3b01", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:16.117920Z", "iopub.status.busy": "2023-10-11T16:08:16.117085Z", "iopub.status.idle": "2023-10-11T16:08:16.134285Z", "shell.execute_reply": "2023-10-11T16:08:16.133721Z"}, "papermill": {"duration": 0.040849, "end_time": "2023-10-11T16:08:16.135550", "exception": false, "start_time": "2023-10-11T16:08:16.094701", "status": "completed"}, "tags": []}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["Average score for random images: -17.88\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(\"Average score for random images: %4.2f\" % (rand_out.item()))"]}, {"cell_type": "markdown", "id": "028b0669", "metadata": {"papermill": {"duration": 0.017763, "end_time": "2023-10-11T16:08:16.171701", "exception": false, "start_time": "2023-10-11T16:08:16.153938", "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": "3db38094", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:16.215211Z", "iopub.status.busy": "2023-10-11T16:08:16.214233Z", "iopub.status.idle": "2023-10-11T16:08:16.949913Z", "shell.execute_reply": "2023-10-11T16:08:16.949014Z"}, "papermill": {"duration": 0.760522, "end_time": "2023-10-11T16:08:16.951394", "exception": false, "start_time": "2023-10-11T16:08:16.190872", "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(\"Average score for training images: %4.2f\" % (train_out.item()))"]}, {"cell_type": "markdown", "id": "299f1d1c", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.017675, "end_time": "2023-10-11T16:08:16.987482", "exception": false, "start_time": "2023-10-11T16:08:16.969807", "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": "f323aa34", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:17.024498Z", "iopub.status.busy": "2023-10-11T16:08:17.024011Z", "iopub.status.idle": "2023-10-11T16:08:17.035503Z", "shell.execute_reply": "2023-10-11T16:08:17.034827Z"}, "papermill": {"duration": 0.032008, "end_time": "2023-10-11T16:08:17.036838", "exception": false, "start_time": "2023-10-11T16:08:17.004830", "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, 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(\"Score original image: %4.2f\" % score1)\n", " print(\"Score transformed image: %4.2f\" % score2)"]}, {"cell_type": "markdown", "id": "2da181cf", "metadata": {"papermill": {"duration": 0.017785, "end_time": "2023-10-11T16:08:17.072555", "exception": false, "start_time": "2023-10-11T16:08:17.054770", "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": "4eea2a4e", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:17.110214Z", "iopub.status.busy": "2023-10-11T16:08:17.109648Z", "iopub.status.idle": "2023-10-11T16:08:17.682636Z", "shell.execute_reply": "2023-10-11T16:08:17.681648Z"}, "papermill": {"duration": 0.59446, "end_time": "2023-10-11T16:08:17.684687", "exception": false, "start_time": "2023-10-11T16:08:17.090227", "status": "completed"}, "tags": []}, "outputs": [], "source": ["test_imgs, _ = next(iter(test_loader))\n", "exmp_img = test_imgs[0].to(model.device)"]}, {"cell_type": "markdown", "id": "1a664126", "metadata": {"papermill": {"duration": 0.017809, "end_time": "2023-10-11T16:08:17.720830", "exception": false, "start_time": "2023-10-11T16:08:17.703021", "status": "completed"}, "tags": []}, "source": ["The first transformation is to add some random noise to the image:"]}, {"cell_type": "code", "execution_count": 20, "id": "0f83edba", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:17.761045Z", "iopub.status.busy": "2023-10-11T16:08:17.760825Z", "iopub.status.idle": "2023-10-11T16:08:17.883793Z", "shell.execute_reply": "2023-10-11T16:08:17.882836Z"}, "papermill": {"duration": 0.157188, "end_time": "2023-10-11T16:08:17.898248", "exception": false, "start_time": "2023-10-11T16:08:17.741060", "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+PgplbmRvYmoKMzQgMCBvYmoKPDwgL0NyZWF0b3IgKE1hdHBsb3RsaWIgdjMuOC4wLCBodHRwczovL21hdHBsb3RsaWIub3JnKQovUHJvZHVjZXIgKE1hdHBsb3RsaWIgcGRmIGJhY2tlbmQgdjMuOC4wKSAvQ3JlYXRpb25EYXRlIChEOjIwMjMxMDExMTYwODE3WikKPj4KZW5kb2JqCnhyZWYKMCAzNQowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTYgMDAwMDAgbiAKMDAwMDAwOTIyNSAwMDAwMCBuIAowMDAwMDA2NTE1IDAwMDAwIG4gCjAwMDAwMDY1NDcgMDAwMDAgbiAKMDAwMDAwNjY0NiAwMDAwMCBuIAowMDAwMDA2NjY3IDAwMDAwIG4gCjAwMDAwMDY2ODggMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAwMDAwMzM5IDAwMDAwIG4gCjAwMDAwMDA3NjkgMDAwMDAgbiAKMDAwMDAwMDIwOCAwMDAwMCBuIAowMDAwMDAwNzQ5IDAwMDAwIG4gCjAwMDAwMDY3MjAgMDAwMDAgbiAKMDAwMDAwNTI4NiAwMDAwMCBuIAowMDAwMDA1MDc5IDAwMDAwIG4gCjAwMDAwMDQ2OTUgMDAwMDAgbiAKMDAwMDAwNjMzOSAwMDAwMCBuIAowMDAwMDAwNzg5IDAwMDAwIG4gCjAwMDAwMDEwNzcgMDAwMDAgbiAKMDAwMDAwMTIxNSAwMDAwMCBuIAowMDAwMDAxNTk1IDAwMDAwIG4gCjAwMDAwMDE4OTkgMDAwMDAgbiAKMDAwMDAwMjIyMSAwMDAwMCBuIAowMDAwMDAyNDMwIDAwMDAwIG4gCjAwMDAwMDI4NDQgMDAwMDAgbiAKMDAwMDAwMjk4OCAwMDAwMCBuIAowMDAwMDAzMTA3IDAwMDAwIG4gCjAwMDAwMDM0MzggMDAwMDAgbiAKMDAwMDAwMzY3NCAwMDAwMCBuIAowMDAwMDAzOTY1IDAwMDAwIG4gCjAwMDAwMDQxOTggMDAwMDAgbiAKMDAwMDAwNDYwNSAwMDAwMCBuIAowMDAwMDA5MjA0IDAwMDAwIG4gCjAwMDAwMDkyODUgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAzNSAvUm9vdCAxIDAgUiAvSW5mbyAzNCAwIFIgPj4Kc3RhcnR4cmVmCjk0MzYKJSVFT0YK", "image/svg+xml": ["\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2023-10-11T16:08:17.813068\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.8.0, 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: 0.03\n", "Score transformed image: -0.07\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": "ce5dc06e", "metadata": {"papermill": {"duration": 0.031228, "end_time": "2023-10-11T16:08:17.981963", "exception": false, "start_time": "2023-10-11T16:08:17.950735", "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": "8bc3c6c5", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:18.052520Z", "iopub.status.busy": "2023-10-11T16:08:18.052150Z", "iopub.status.idle": "2023-10-11T16:08:18.143526Z", "shell.execute_reply": "2023-10-11T16:08:18.142931Z"}, "papermill": {"duration": 0.125461, "end_time": "2023-10-11T16:08:18.146934", "exception": false, "start_time": "2023-10-11T16:08:18.021473", "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+PgplbmRvYmoKMzQgMCBvYmoKPDwgL0NyZWF0b3IgKE1hdHBsb3RsaWIgdjMuOC4wLCBodHRwczovL21hdHBsb3RsaWIub3JnKQovUHJvZHVjZXIgKE1hdHBsb3RsaWIgcGRmIGJhY2tlbmQgdjMuOC4wKSAvQ3JlYXRpb25EYXRlIChEOjIwMjMxMDExMTYwODE4WikKPj4KZW5kb2JqCnhyZWYKMCAzNQowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTYgMDAwMDAgbiAKMDAwMDAwODIyMyAwMDAwMCBuIAowMDAwMDA2NTE1IDAwMDAwIG4gCjAwMDAwMDY1NDcgMDAwMDAgbiAKMDAwMDAwNjY0NiAwMDAwMCBuIAowMDAwMDA2NjY3IDAwMDAwIG4gCjAwMDAwMDY2ODggMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAwMDAwMzM5IDAwMDAwIG4gCjAwMDAwMDA3NjkgMDAwMDAgbiAKMDAwMDAwMDIwOCAwMDAwMCBuIAowMDAwMDAwNzQ5IDAwMDAwIG4gCjAwMDAwMDY3MjAgMDAwMDAgbiAKMDAwMDAwNTI4NiAwMDAwMCBuIAowMDAwMDA1MDc5IDAwMDAwIG4gCjAwMDAwMDQ2OTUgMDAwMDAgbiAKMDAwMDAwNjMzOSAwMDAwMCBuIAowMDAwMDAwNzg5IDAwMDAwIG4gCjAwMDAwMDEwNzcgMDAwMDAgbiAKMDAwMDAwMTIxNSAwMDAwMCBuIAowMDAwMDAxNTk1IDAwMDAwIG4gCjAwMDAwMDE4OTkgMDAwMDAgbiAKMDAwMDAwMjIyMSAwMDAwMCBuIAowMDAwMDAyNDMwIDAwMDAwIG4gCjAwMDAwMDI4NDQgMDAwMDAgbiAKMDAwMDAwMjk4OCAwMDAwMCBuIAowMDAwMDAzMTA3IDAwMDAwIG4gCjAwMDAwMDM0MzggMDAwMDAgbiAKMDAwMDAwMzY3NCAwMDAwMCBuIAowMDAwMDAzOTY1IDAwMDAwIG4gCjAwMDAwMDQxOTggMDAwMDAgbiAKMDAwMDAwNDYwNSAwMDAwMCBuIAowMDAwMDA4MjAzIDAwMDAwIG4gCjAwMDAwMDgyODMgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAzNSAvUm9vdCAxIDAgUiAvSW5mbyAzNCAwIFIgPj4Kc3RhcnR4cmVmCjg0MzQKJSVFT0YK", "image/svg+xml": ["\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2023-10-11T16:08:18.088913\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.8.0, 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: 0.03\n", "Score transformed image: -0.00\n"]}], "source": ["img_flipped = exmp_img.flip(dims=(1, 2))\n", "compare_images(exmp_img, img_flipped)"]}, {"cell_type": "markdown", "id": "493da1ad", "metadata": {"papermill": {"duration": 0.019061, "end_time": "2023-10-11T16:08:18.191207", "exception": false, "start_time": "2023-10-11T16:08:18.172146", "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": "b84617d5", "metadata": {"execution": {"iopub.execute_input": "2023-10-11T16:08:18.238548Z", "iopub.status.busy": "2023-10-11T16:08:18.238069Z", "iopub.status.idle": "2023-10-11T16:08:18.341662Z", "shell.execute_reply": "2023-10-11T16:08:18.341062Z"}, "papermill": {"duration": 0.130581, "end_time": "2023-10-11T16:08:18.343790", "exception": false, "start_time": "2023-10-11T16:08:18.213209", "status": "completed"}, "tags": []}, "outputs": [{"data": {"application/pdf": "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675IsZnCeV04s/4MU2a1eSfPcqLUqQjvsWdL0NA5rp69lllodJsTvKSEz8ZOT06+VzPrITkVCaliWlfBaRSZYgnbEl9TUVOaehn++/Lu8Tt+/gEsc3xzCmVuZHN0cmVhbQplbmRvYmoKMzIgMCBvYmoKPDwgL0xlbmd0aCAxOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJwzNrRQMIDDFEOuNAAd5gNSCmVuZHN0cmVhbQplbmRvYmoKMTYgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL0Jhc2VGb250IC9CTVFRRFYrRGVqYVZ1U2FucyAvRmlyc3RDaGFyIDAgL0xhc3RDaGFyIDI1NQovRm9udERlc2NyaXB0b3IgMTUgMCBSIC9TdWJ0eXBlIC9UeXBlMyAvTmFtZSAvQk1RUURWK0RlamFWdVNhbnMKL0ZvbnRCQm94IFsgLTEwMjEgLTQ2MyAxNzk0IDEyMzMgXSAvRm9udE1hdHJpeCBbIDAuMDAxIDAgMCAwLjAwMSAwIDAgXQovQ2hhclByb2NzIDE3IDAgUgovRW5jb2RpbmcgPDwgL1R5cGUgL0VuY29kaW5nCi9EaWZmZXJlbmNlcyBbIDMyIC9zcGFjZSA3OSAvTyA4NCAvVCA5NyAvYSAxMDAgL2QgL2UgL2YgL2cgMTA1IC9pIDEwOCAvbCAvbSAvbiAvbyAxMTQKL3IgL3MgXQo+PgovV2lkdGhzIDE0IDAgUiA+PgplbmRvYmoKMTUgMCBvYmoKPDwgL1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9Gb250TmFtZSAvQk1RUURWK0RlamFWdVNhbnMgL0ZsYWdzIDMyCi9Gb250QkJveCBbIC0xMDIxIC00NjMgMTc5NCAxMjMzIF0gL0FzY2VudCA5MjkgL0Rlc2NlbnQgLTIzNiAvQ2FwSGVpZ2h0IDAKL1hIZWlnaHQgMCAvSXRhbGljQW5nbGUgMCAvU3RlbVYgMCAvTWF4V2lkdGggMTM0MiA+PgplbmRvYmoKMTQgMCBvYmoKWyA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMAo2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDMxOCA0MDEgNDYwIDgzOCA2MzYKOTUwIDc4MCAyNzUgMzkwIDM5MCA1MDAgODM4IDMxOCAzNjEgMzE4IDMzNyA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2CjYzNiA2MzYgMzM3IDMzNyA4MzggODM4IDgzOCA1MzEgMTAwMCA2ODQgNjg2IDY5OCA3NzAgNjMyIDU3NSA3NzUgNzUyIDI5NQoyOTUgNjU2IDU1NyA4NjMgNzQ4IDc4NyA2MDMgNzg3IDY5NSA2MzUgNjExIDczMiA2ODQgOTg5IDY4NSA2MTEgNjg1IDM5MCAzMzcKMzkwIDgzOCA1MDAgNTAwIDYxMyA2MzUgNTUwIDYzNSA2MTUgMzUyIDYzNSA2MzQgMjc4IDI3OCA1NzkgMjc4IDk3NCA2MzQgNjEyCjYzNSA2MzUgNDExIDUyMSAzOTIgNjM0IDU5MiA4MTggNTkyIDU5MiA1MjUgNjM2IDMzNyA2MzYgODM4IDYwMCA2MzYgNjAwIDMxOAozNTIgNTE4IDEwMDAgNTAwIDUwMCA1MDAgMTM0MiA2MzUgNDAwIDEwNzAgNjAwIDY4NSA2MDAgNjAwIDMxOCAzMTggNTE4IDUxOAo1OTAgNTAwIDEwMDAgNTAwIDEwMDAgNTIxIDQwMCAxMDIzIDYwMCA1MjUgNjExIDMxOCA0MDEgNjM2IDYzNiA2MzYgNjM2IDMzNwo1MDAgNTAwIDEwMDAgNDcxIDYxMiA4MzggMzYxIDEwMDAgNTAwIDUwMCA4MzggNDAxIDQwMSA1MDAgNjM2IDYzNiAzMTggNTAwCjQwMSA0NzEgNjEyIDk2OSA5NjkgOTY5IDUzMSA2ODQgNjg0IDY4NCA2ODQgNjg0IDY4NCA5NzQgNjk4IDYzMiA2MzIgNjMyIDYzMgoyOTUgMjk1IDI5NSAyOTUgNzc1IDc0OCA3ODcgNzg3IDc4NyA3ODcgNzg3IDgzOCA3ODcgNzMyIDczMiA3MzIgNzMyIDYxMSA2MDUKNjMwIDYxMyA2MTMgNjEzIDYxMyA2MTMgNjEzIDk4MiA1NTAgNjE1IDYxNSA2MTUgNjE1IDI3OCAyNzggMjc4IDI3OCA2MTIgNjM0CjYxMiA2MTIgNjEyIDYxMiA2MTIgODM4IDYxMiA2MzQgNjM0IDYzNCA2MzQgNTkyIDYzNSA1OTIgXQplbmRvYmoKMTcgMCBvYmoKPDwgL08gMTggMCBSIC9UIDE5IDAgUiAvYSAyMCAwIFIgL2QgMjEgMCBSIC9lIDIyIDAgUiAvZiAyMyAwIFIgL2cgMjQgMCBSCi9pIDI1IDAgUiAvbCAyNiAwIFIgL20gMjcgMCBSIC9uIDI4IDAgUiAvbyAyOSAwIFIgL3IgMzAgMCBSIC9zIDMxIDAgUgovc3BhY2UgMzIgMCBSID4+CmVuZG9iagozIDAgb2JqCjw8IC9GMSAxNiAwIFIgPj4KZW5kb2JqCjQgMCBvYmoKPDwgL0ExIDw8IC9UeXBlIC9FeHRHU3RhdGUgL0NBIDAgL2NhIDEgPj4KL0EyIDw8IC9UeXBlIC9FeHRHU3RhdGUgL0NBIDEgL2NhIDEgPj4gPj4KZW5kb2JqCjUgMCBvYmoKPDwgPj4KZW5kb2JqCjYgMCBvYmoKPDwgPj4KZW5kb2JqCjcgMCBvYmoKPDwgL0kxIDEzIDAgUiA+PgplbmRvYmoKMTMgMCBvYmoKPDwgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAzMTAgL0hlaWdodCAxNjEKL0NvbG9yU3BhY2UgWyAvSW5kZXhlZCAvRGV2aWNlUkdCIDcxCij////9/f37+/v5+fnx8fHp6enl5eXj4+Ph4eHd3d3b29vR0dHPz8/Nzc3Ly8u7u7u5ubmjo6Ofn5+Xl5eFhYWBgYF/f395eXlzc3NTU1NNTU1LS0tDQ0M9PT07Ozs5OTkzMzMrKysnJyclJSUjIyMVFRURERFcclxyXHL+/v76+vr4+Pjy8vLw8PDu7u7s7Ozg4ODe3t7Gxsa2traqqqqmpqaMjIx+fn5ycnJqampUVFRISEhCQkI8PDw6Ojo4ODgiIiIeHh4UFBQSEhIQEBAICAgEBAQCAgIAAAApCl0KL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZQovRGVjb2RlUGFybXMgPDwgL1ByZWRpY3RvciAxMCAvQ29sb3JzIDEgL0NvbHVtbnMgMzEwIC9CaXRzUGVyQ29tcG9uZW50IDggPj4KL0xlbmd0aCAzMyAwIFIgPj4Kc3RyZWFtCnic7dzHbttAAEVRp/feEydO7733nvj//yh4AxiKCMsY3iEpG7hnZXhBPV0t1EitnBewsuwBO5PZELMhZkPMhpgNMRtiNsRsyH/Z1reR7b7KbD2YDTEbYjbEbIjZELMhZkPMhpgNMRtiNsRsiNkQsyFmQ8yGmA0xG2I2xGyI2RCzIWZDzIaYDTEbYjbEbIjZELMhZkPMhpgNAdk+xMk4HWfiWtyO8QYOfeQWZkPMhpgNMRsCsj2P+5vYGy8qvYrrUTtwuDvdzmyI2RCzIWZDQLbVeBcfo/x1Kg5ECXgwOlEfxP6Y/e9N1A4c7k63MxtiNsRsiNkQkG2hX/Ep7sXqvC/xI55GyfY+agfCVaMwG2I2xGyI2ZAhs1W4FLviSNyN2oHjrerPbIjZELMhZkOmy3Yn9sVKlIC9Bo6yCjIbYjbEbIjZkOmynYvylupJ3IheA0dZBZkNMRtiNsRsyCTZykdte6Jkuxr9Bw69qoXZELMhZkPMhpgNmSTb2SjFTsSf6D9w6FUtzIaYDTEbYjZk7Gy/41g8jLWAAwdc1cxsiNkQsyFmQ8bO9jbKk+jLaBk44KpmZkPMhpgNMRsyYrYrsTsex9doGTjMqo7OVZ4LL+FcuMpsZqtmNsRsyLbK9jMORRnzOuChRs7WUa7hmV25Uy7aKXdh4SqzrZsNMhtiNmRp2f7G8Sg3dzi+BTzetNk6yhnam52cbbatmA0xG2I2ZLpst2L2buVytBxvWdnKyWWbPYl2VpltjtkQsyFmQ6bL9j2eRbm5i9EwvDuw+VC9lDMJFp5EYLYFzIaYDTEbMl222Sm6RcWP6lZYQrby3VH52qhildk2mA0xG2I2ZLpsn+NR7Oxs5dPCsn7rzwjNNsdsiNkQsyETZ7sQs2Lli5eb0XAXugObD1WhvDWseFdotjlmQ8yGmA1ZWrajUfF7urUmy1ZeDNS+BDDbBrMhZkPMhiwj23gmW1Ue+fKg91plNrMBZkPMhrRnUz2zIWZDzIaYDTEbYjbEbIjZELMh/wDa2GgmCmVuZHN0cmVhbQplbmRvYmoKMzMgMCBvYmoKNzcwCmVuZG9iagoyIDAgb2JqCjw8IC9UeXBlIC9QYWdlcyAvS2lkcyBbIDExIDAgUiBdIC9Db3VudCAxID4+CmVuZG9iagozNCAwIG9iago8PCAvQ3JlYXRvciAoTWF0cGxvdGxpYiB2My44LjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcpCi9Qcm9kdWNlciAoTWF0cGxvdGxpYiBwZGYgYmFja2VuZCB2My44LjApIC9DcmVhdGlvbkRhdGUgKEQ6MjAyMzEwMTExNjA4MThaKQo+PgplbmRvYmoKeHJlZgowIDM1CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNiAwMDAwMCBuIAowMDAwMDA3OTk3IDAwMDAwIG4gCjAwMDAwMDY1MTUgMDAwMDAgbiAKMDAwMDAwNjU0NyAwMDAwMCBuIAowMDAwMDA2NjQ2IDAwMDAwIG4gCjAwMDAwMDY2NjcgMDAwMDAgbiAKMDAwMDAwNjY4OCAwMDAwMCBuIAowMDAwMDAwMDY1IDAwMDAwIG4gCjAwMDAwMDAzMzkgMDAwMDAgbiAKMDAwMDAwMDc2OSAwMDAwMCBuIAowMDAwMDAwMjA4IDAwMDAwIG4gCjAwMDAwMDA3NDkgMDAwMDAgbiAKMDAwMDAwNjcyMCAwMDAwMCBuIAowMDAwMDA1Mjg2IDAwMDAwIG4gCjAwMDAwMDUwNzkgMDAwMDAgbiAKMDAwMDAwNDY5NSAwMDAwMCBuIAowMDAwMDA2MzM5IDAwMDAwIG4gCjAwMDAwMDA3ODkgMDAwMDAgbiAKMDAwMDAwMTA3NyAwMDAwMCBuIAowMDAwMDAxMjE1IDAwMDAwIG4gCjAwMDAwMDE1OTUgMDAwMDAgbiAKMDAwMDAwMTg5OSAwMDAwMCBuIAowMDAwMDAyMjIxIDAwMDAwIG4gCjAwMDAwMDI0MzAgMDAwMDAgbiAKMDAwMDAwMjg0NCAwMDAwMCBuIAowMDAwMDAyOTg4IDAwMDAwIG4gCjAwMDAwMDMxMDcgMDAwMDAgbiAKMDAwMDAwMzQzOCAwMDAwMCBuIAowMDAwMDAzNjc0IDAwMDAwIG4gCjAwMDAwMDM5NjUgMDAwMDAgbiAKMDAwMDAwNDE5OCAwMDAwMCBuIAowMDAwMDA0NjA1IDAwMDAwIG4gCjAwMDAwMDc5NzcgMDAwMDAgbiAKMDAwMDAwODA1NyAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDM1IC9Sb290IDEgMCBSIC9JbmZvIDM0IDAgUiA+PgpzdGFydHhyZWYKODIwOAolJUVPRgo=", "image/svg+xml": ["\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2023-10-11T16:08:18.278322\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.8.0, 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: 0.03\n", "Score transformed image: -0.02\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": "7a179daa", "metadata": {"papermill": {"duration": 0.020612, "end_time": "2023-10-11T16:08:18.389685", "exception": false, "start_time": "2023-10-11T16:08:18.369073", "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": "2ac68ff3", "metadata": {"papermill": {"duration": 0.019538, "end_time": "2023-10-11T16:08:18.428887", "exception": false, "start_time": "2023-10-11T16:08:18.409349", "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": "8a8e6e7e", "metadata": {"papermill": {"duration": 0.020289, "end_time": "2023-10-11T16:08:18.469031", "exception": false, "start_time": "2023-10-11T16:08:18.448742", "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": "e3cac67d", "metadata": {"papermill": {"duration": 0.018854, "end_time": "2023-10-11T16:08:18.507903", "exception": false, "start_time": "2023-10-11T16:08:18.489049", "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 [Slack](https://www.pytorchlightning.ai/community)!\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_type,id,colab,-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": 121.832756, "end_time": "2023-10-11T16:08:21.450188", "environment_variables": {}, "exception": null, "input_path": "course_UvA-DL/07-deep-energy-based-generative-models/Deep_Energy_Models.ipynb", "output_path": ".notebooks/course_UvA-DL/07-deep-energy-based-generative-models.ipynb", "parameters": {}, "start_time": "2023-10-11T16:06:19.617432", "version": "2.4.0"}}, "nbformat": 4, "nbformat_minor": 5}