{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "bukochgPFg7s" }, "source": [ "# Getting Started!\n", "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/understandable-machine-intelligence-lab/Quantus/main?labpath=tutorials%2FTutorial_Getting_Started.ipynb)\n", "\n", "\n", "This notebook shows how to get started with Quantus, using a very simple example. For this purpose, we use a LeNet model and MNIST dataset.\n", "\n", "- Make sure to have GPUs enabled to speed up computation." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "id": "4Y7_mNf9Bic0" }, "outputs": [], "source": [ "from IPython.display import clear_output\n", "!pip install torch torchvision captum quantus seaborn\n", "clear_output()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "id": "RV7X-Ss9-16F" }, "outputs": [], "source": [ "import pathlib\n", "import numpy as np\n", "import pandas as pd\n", "import quantus\n", "import torch\n", "import torchvision\n", "from captum.attr import *\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "sns.set()\n", "\n", "# Enable GPU.\n", "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\") \n", "clear_output()" ] }, { "cell_type": "markdown", "metadata": { "id": "mGhP4bTuoWYF" }, "source": [ "## 1) Preliminaries" ] }, { "cell_type": "markdown", "metadata": { "id": "XqKzag4VFjHT" }, "source": [ "### 1.1 Load datasets\n", "\n", "We will then load a batch of input, output pairs that we generate explanations for, then to evaluate." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 423, "referenced_widgets": [ "e83b82b532ae41cb8c5ea2174c16cc08", "147093205d8d44c5ac4c620666f14494", "a847cf16d837428c96fb83c5fb343db8", "f29b0791c47047cda06f717f13b72408", "4773e1086f2e474cb08255d32c832463", "40c671a8807c47e29b5441916992599f", "f34de86120004b8381d160be350a379c", "f42923edb1be415db102f3403dc08883", "3c0de11db45a477384385e0774386fd4", "41ce3124b7834e6e98f595db48128777", "f132c540c8e141ce9aeaccd97fe3b73a", "8e1f92e1cd8e4efb9a058100faead72f", "d994fef356354bf58d4d05fd6f9a87d1", "346e3a743b944ee0aaed6cc93806f7b2", "5a07ed378e3142f28538f317431dd309", "1fccfa6575284f298dc7463850d931f8", "15ef3b2f2f5647d98f8992462427dcc5", "66d5db69f68d4d36b8126dea6d32e7e6", "5322bafd984d4cb292685cdb18d0d7ab", "2f4eb4e9a357487b9dead1e821ddd591", "1ae7b9a0dd9e40b9b8b850d3b78c66a9", "fa5d6bd45df14a7988896b362da8e6bb", "ec07c6581e9146ac9c44ade89191185a", "b13c7dd7a557447192b8eb1c4f7f357f", "87900229b261458a82558f08715c35d6", "2aa9e8b2c8204edd80757d46ff51e8b6", "a255b429665e4e5f8e82f13aebdd9a2c", "25091e652b7e4e7cb48fd4f453a9d240", "ce337f24bd9b41e6bff4f88a92d4264b", "cd4ae70adc714f4bb12b457c1de8493b", "3bb0b2b1bcc04ddbacd04b38c0fc889c", "ec754f5742ef426f92a6c8c074d629f4", "0eff6746f7b741b2a774a1b363c3a79d", "2bb77a7c4c6d4a178946bd49691f6d98", "49aa9bbcce91465c8f299c8121660a50", "b338e19ab9cc4492881708e1b05be1c3", "a6038c3a9e72403e83d0eb4cf7015146", "88c45a260afe4a83a06399109e272740", "b8455132e9a04542881e18ba996badb7", "733eb2712ae94b0a920e1b2a735c2d24", "7cc311962cb946268a7c53d8ededcd79", "0bddd893a61a43379a2468b976e11f46", "4131166f9c1d474cbbfb7553de12b9a5", "6970ae8b3cc54c2b8d9029609276d48a" ] }, "executionInfo": { "elapsed": 8767, "status": "ok", "timestamp": 1665156018107, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "TmsZxFhuc0mm", "outputId": "386071bc-8741-4371-d680-a4a56ba92f4a" }, "outputs": [], "source": [ "# Load datasets and make loaders.\n", "test_samples = 24\n", "transformer = torchvision.transforms.Compose([torchvision.transforms.ToTensor()])\n", "train_set = torchvision.datasets.MNIST(root='./sample_data', train=True, transform=transformer, download=True)\n", "test_set = torchvision.datasets.MNIST(root='./sample_data', train=False, transform=transformer, download=True)\n", "train_loader = torch.utils.data.DataLoader(train_set, batch_size=128, shuffle=True, pin_memory=True) # num_workers=4,\n", "test_loader = torch.utils.data.DataLoader(test_set, batch_size=200, pin_memory=True)\n", "\n", "# Load a batch of inputs and outputs to use for evaluation.\n", "x_batch, y_batch = iter(test_loader).next()\n", "x_batch, y_batch = x_batch.to(device), y_batch.to(device)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 191 }, "executionInfo": { "elapsed": 10, "status": "ok", "timestamp": 1665156018109, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "aAR67-cnOS67", "outputId": "6169de25-bb8f-400f-e0f7-2f8085266abf" }, "outputs": [ { "data": { "text/plain": "
", "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1MAAACsCAYAAACelPbNAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAODUlEQVR4nO3de4iU1f8H8I+uqUQ3jcpuIBWufyxkBCKWmAhZ6rquZCUWUmAWllZsraUWEkgZGOUfQheoxBumaIqhIJUEppaR2QWzq0VqpEYoeMnz/SPaX/tr13bOrjuzO6/Xf84+z+N53M+cmfecOR+7pJRSAAAAUJCuxR4AAABARyRMAQAAZBCmAAAAMghTAAAAGYQpAACADMIUAABAhpIMUz/99FNUVlbGXXfd9a+fzZgxIyorK+PgwYMNx61YsaLRMa+99lrMmDEjIiK2bt0ao0ePbvjZe++9F3fccUeMGTMmRo0aFdOnT499+/ZFRMS0adOipqYmampqorKyMqqrq6OmpibuvvvuFo/977EVw549exrGX1NTE9XV1VFZWRkbN24synjKiZrNt3PnzrjzzjsbanbNmjVFG0s5UbOt99Zbb8X9999f7GGUDTWb7/vvv4+JEyfGyJEj47bbbotvvvmmaGMpN+q29fbu3RsDBw6Mzz77rNhDaVK3Yg+gOT169Ijvvvsufv7557j88ssjIuLo0aOxY8eORsd17do1nnvuubj++uvjqquuOu019+/fH/X19bFq1aqGay5cuDAefvjhWLZsWbz00ksNx1ZWVsYbb7wRvXv3buM7O3OuueaaRm9En3322ejXr1/cfPPNRRxV+VCzhUspxbRp02Lu3LkxePDg2LdvX9TW1sa1114bffv2LfbwOj01m+fw4cMxf/78WLt2bQwcOLDYwykrajZPXV1dTJo0Kaqrq+P999+P6dOnx9q1a6NLly7FHlpZULf5jh07Fo899licOHGi2ENpVkmuTEVEVFRUxK233hpr165teGzjxo0xfPjwRsf17Nkz7rnnnqirq4vjx4+f9pqHDh2KEydOxNGjRxsemzRpUkyZMqXg8X366acxfvz4GD16dNTW1saWLVsa/fzo0aPx+OOPxx133BEjRoyIcePGxbfffttwH7W1tTFu3LgYP358bN++/bSP5/joo49iw4YNMWfOnOxrUBg1W3jNHj9+PKZO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\n" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot some inputs!\n", "nr_images = 5\n", "fig, axes = plt.subplots(nrows=1, ncols=nr_images, figsize=(nr_images*3, int(nr_images*2/3)))\n", "for i in range(nr_images):\n", " axes[i].imshow((np.reshape(x_batch[i].cpu().numpy(), (28, 28)) * 255).astype(np.uint8), vmin=0.0, vmax=1.0, cmap=\"gray\")\n", " axes[i].title.set_text(f\"MNIST class - {y_batch[i].item()}\")\n", " axes[i].axis(\"off\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "vmccxpA0n6MY" }, "source": [ "### 1.2 Train a LeNet model\n", "\n", "(or any other model of choice). \n", "Network architecture from: https://github.com/ChawDoe/LeNet5-MNIST-PyTorch." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 8, "status": "ok", "timestamp": 1665156018110, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "CUghaOhXddLU", "outputId": "7ba0cf49-d0da-44d4-c5ef-6df5fc036d57" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " Model architecture: LeNet(\n", " (conv_1): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))\n", " (pool_1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", " (relu_1): ReLU()\n", " (conv_2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))\n", " (pool_2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", " (relu_2): ReLU()\n", " (fc_1): Linear(in_features=256, out_features=120, bias=True)\n", " (relu_3): ReLU()\n", " (fc_2): Linear(in_features=120, out_features=84, bias=True)\n", " (relu_4): ReLU()\n", " (fc_3): Linear(in_features=84, out_features=10, bias=True)\n", ")\n", "\n" ] } ], "source": [ "class LeNet(torch.nn.Module):\n", " \"\"\"Network architecture from: https://github.com/ChawDoe/LeNet5-MNIST-PyTorch.\"\"\"\n", " def __init__(self):\n", " super().__init__()\n", " self.conv_1 = torch.nn.Conv2d(1, 6, 5)\n", " self.pool_1 = torch.nn.MaxPool2d(2, 2)\n", " self.relu_1 = torch.nn.ReLU()\n", " self.conv_2 = torch.nn.Conv2d(6, 16, 5)\n", " self.pool_2 = torch.nn.MaxPool2d(2, 2)\n", " self.relu_2 = torch.nn.ReLU()\n", " self.fc_1 = torch.nn.Linear(256, 120)\n", " self.relu_3 = torch.nn.ReLU()\n", " self.fc_2 = torch.nn.Linear(120, 84)\n", " self.relu_4 = torch.nn.ReLU()\n", " self.fc_3 = torch.nn.Linear(84, 10)\n", "\n", " def forward(self, x):\n", " x = self.pool_1(self.relu_1(self.conv_1(x)))\n", " x = self.pool_2(self.relu_2(self.conv_2(x)))\n", " x = x.view(x.shape[0], -1)\n", " x = self.relu_3(self.fc_1(x))\n", " x = self.relu_4(self.fc_2(x))\n", " x = self.fc_3(x)\n", " return x\n", "\n", "# Load model architecture.\n", "model = LeNet()\n", "print(f\"\\n Model architecture: {model.eval()}\\n\")" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "id": "olAfyOHzevne" }, "outputs": [], "source": [ "def train_model(model, \n", " train_data: torchvision.datasets,\n", " test_data: torchvision.datasets, \n", " device: torch.device, \n", " epochs: int = 20,\n", " criterion: torch.nn = torch.nn.CrossEntropyLoss(), \n", " optimizer: torch.optim = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9), \n", " evaluate: bool = False):\n", " \"\"\"Train torch model.\"\"\"\n", " \n", " model.train()\n", " \n", " for epoch in range(epochs):\n", "\n", " for images, labels in train_data:\n", " images, labels = images.to(device), labels.to(device)\n", " \n", " optimizer.zero_grad()\n", " \n", " logits = model(images)\n", " loss = criterion(logits, labels)\n", " loss.backward()\n", " optimizer.step()\n", "\n", " # Evaluate model!\n", " if evaluate:\n", " predictions, labels = evaluate_model(model, test_data, device)\n", " test_acc = np.mean(np.argmax(predictions.cpu().numpy(), axis=1) == labels.cpu().numpy())\n", " \n", " print(f\"Epoch {epoch+1}/{epochs} - test accuracy: {(100 * test_acc):.2f}% and CE loss {loss.item():.2f}\")\n", "\n", " return model\n", "\n", "def evaluate_model(model, data, device):\n", " \"\"\"Evaluate torch model.\"\"\"\n", " model.eval()\n", " logits = torch.Tensor().to(device)\n", " targets = torch.LongTensor().to(device)\n", "\n", " with torch.no_grad():\n", " for images, labels in data:\n", " images, labels = images.to(device), labels.to(device)\n", " logits = torch.cat([logits, model(images)])\n", " targets = torch.cat([targets, labels])\n", " \n", " return torch.nn.functional.softmax(logits, dim=1), targets" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 83532, "status": "ok", "timestamp": 1665156101636, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "t6_qEwhee1WH", "outputId": "bb872f39-3308-42f5-d7c2-c9988ba7f3df" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/1 - test accuracy: 95.71% and CE loss 0.24\n", "Model test accuracy: 95.71%\n" ] } ], "source": [ "# Train and evaluate model.\n", "model = train_model(model=model.to(device),\n", " train_data=train_loader,\n", " test_data=test_loader,\n", " device=device,\n", " epochs=1,\n", " criterion=torch.nn.CrossEntropyLoss().to(device),\n", " optimizer=torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9),\n", " evaluate=True)\n", "\n", "# Model to GPU and eval mode.\n", "model.to(device)\n", "model.eval()\n", "\n", "# Check test set performance.\n", "predictions, labels = evaluate_model(model, test_loader, device)\n", "test_acc = np.mean(np.argmax(predictions.cpu().numpy(), axis=1) == labels.cpu().numpy()) \n", "print(f\"Model test accuracy: {(100 * test_acc):.2f}%\")" ] }, { "cell_type": "markdown", "metadata": { "id": "4vY9mZQanaxr" }, "source": [ "### 1.3 Generate explanations\n", "\n", "There exist multiple ways to generate explanations for neural network models e.g., using `captum` or `innvestigate` libraries. In this example, we rely on the `quantus.explain` functionality (a simple wrapper around `captum`) however use whatever approach or library you'd like to create your explanations." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 843, "status": "ok", "timestamp": 1665156102476, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "gNxAtc2Co1pL", "outputId": "25573a18-e66a-45d7-b686-56c181ecdbce" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/homebrew/Caskroom/miniforge/base/envs/quantus/lib/python3.8/site-packages/captum/_utils/gradient.py:56: UserWarning: Input Tensor 0 did not already require gradients, required_grads has been set automatically.\n", " warnings.warn(\n" ] } ], "source": [ "# Generate normalised Saliency and Integrated Gradients attributions of the first batch of the test set.\n", "a_batch_saliency = quantus.normalise_func.normalise_by_negative(Saliency(model).attribute(inputs=x_batch, target=y_batch, abs=True).sum(axis=1).cpu().numpy())\n", "a_batch_intgrad = quantus.normalise_func.normalise_by_negative(IntegratedGradients(model).attribute(inputs=x_batch, target=y_batch, baselines=torch.zeros_like(x_batch)).sum(axis=1).cpu().numpy())\n", "\n", "# Save x_batch and y_batch as numpy arrays that will be used to call metric instances.\n", "x_batch, y_batch = x_batch.cpu().numpy(), y_batch.cpu().numpy()\n", "\n", "# Quick assert.\n", "assert [isinstance(obj, np.ndarray) for obj in [x_batch, y_batch, a_batch_saliency, a_batch_intgrad]]" ] }, { "cell_type": "markdown", "metadata": { "id": "iRDwzUUp8bR2" }, "source": [ "Visualise attributions given model and pairs of input-output." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 630 }, "executionInfo": { "elapsed": 329, "status": "ok", "timestamp": 1665156102804, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "82WWNmyoilXo", "outputId": "6f9ba1de-16e5-4678-9932-b59b57b464de" }, "outputs": [ { "data": { "text/plain": "
", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhAAAAJfCAYAAAAuDu8wAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABcwElEQVR4nO3de5zPZf7/8efHmEwZJbJWql3EKJQlpU05tSHDsCm22Ekpla102hmiWkpIKJUcSr6lfCMltduKspVTlERuTr8cxuYUzTib0/X7w83nm/1cr8llZzDjcf+rnnO5PtfnMOM1b9frfUWcc04AAAABSp3oBQAAgOKHAgIAAASjgAAAAMEoIAAAQDAKCAAAEIwCAgAABCtxBcSmTZuUlJSkrl27xnwtPT1dSUlJ2rlzZ3TclClTjhjzyiuvKD09XZK0cOFCJScnR782Z84cde7cWe3bt1fbtm11//33a8uWLZKk++67TykpKUpJSVFSUpLatWunlJQUdevWrcD17ty5U0lJSZKk2bNn68knnyxw/NatW9WlSxdJUkZGhu69917vuC5dukTXk5KSoksuueQX50bx9s0336hbt25q166dkpOT1aNHD61Zs6bAP5Oenq5XXnlFkpSSkqJdu3Ydj6XiJNOiRQstW7aswDG7d+/Wn//85+O0IumFF17QrFmzgv/c7373O23atMn7tVWrVum+++7TddddpzZt2qht27aaMGGCCuNuBocfd9myZbrvvvv+q7luu+027dy5879eU1ErfaIXUBTKlCmjdevW6d///reqVq0qSdq3b5++/vrrI8aVKlVKQ4YMUcOGDVW9evUC59y6davS0tI0bdq06JyjR49W7969NXnyZD3//PPRsUlJSZo4caIqVKgQtO6WLVuqZcuWBY6pXLmyJk+eLEn64YcftG7dOu+4w2OkQ4XJs88+q/vvvz9oPSg+srOz1bNnT7366quqU6eOJGn69Om64447NHv2bMXFxf3iHNOnTy/qZaIYy8rK+sUiozAtXLhQF154YaHNt3LlSnXv3l0DBw6M/rzeuXOn7rnnHklS9+7dC+Vx6tWrd8TfB8di7ty5hbKWolYiC4i4uDi1adNGM2bM0F133SVJmjlzplq2bKlXX301Oi4hIUHdu3fXww8/rMmTJ+u0004z5/zpp5+Uk5Ojffv2RbPU1FTVrl07eH0zZ87UiBEjdPrpp6tu3brRfNq0afrnP/+pMWPGaMOGDerbt6+ysrJUqVIlOefUvn17XX755WrXrp0WL16sfv36aevWrbr99tujv0X+p8zMTD3++OMaPXq0ypUrF7xWFA/79+/X7t27j/h8tm/fXomJicrLy9PTTz+tpUuXau/evXLO6cknn1TDhg2PmCMpKUnz589XhQoVNGXKFL311lvKz89X+fLl1b9/f9WoUUPp6elKTEzUqlWrtGXLFiUlJWnIkCEqW7asli5dqieffFL79+9XfHy8/vrXv2r79u168803jyh6b7rpJn3yyScFfr/hxKlXr57uvPNOzZ07V9u2bVOPHj108803q0+fPjpw4IBSUlI0bdo0rV+/Xk899ZQyMzOVl5enbt26qVOnTpKksWPHaurUqSpbtqwuu+wyzZ49W5988onS09OVmZmpjIwMNWvWTJ06ddKAAQO0d+9ebd++XbVr19bIkSM1depULV++XEOHDlVcXJyaNm2qYcOGadGiRcrLy9PFF1+sfv36KTExUYsXL9bAgQMViURUr1495efne5/XyJEj1aNHD1177bXRrEKFChowYIBWrVolSRo1apS++eYbbdu2TUlJSUpPT9djjz2mHTt2aPv27apatapGjhypihUrmo+7cOFCDRw4UB988IGys7PNdbdo0UIdO3bU/PnztXnzZqWkpKh3797q06ePpEN/v4wdO1affvqpJk+erPj4eJUpU0YDBgwo1MLqv+JKmIyMDFe/fn23bNky17p162iemprqVq1a5WrVquV27NgRHZeXl+duueUWN3jwYOecc+PHj3dpaWnOOecWLFjg2rZtG53j6aefdnXq1HFt2rRxjz76qPvggw9cTk5OzBoOP4bP9u3bXcOGDd2aNWucc869/PLLrlatWs4559555x135513Ouecu+mmm9ykSZOcc86tXbvWXXrppe6dd96Jrtu3Pp+hQ4e6vn37/vILh2Lv1VdfdZdccolr0aKFe/jhh92UKVPcvn373Ndff+3uvfdel5eX55xzbsyYMa5nz57OOefS0tLc+PHjnXP/97lduHChu/nmm92+ffucc859/vnn0e+ltLQ017lzZ3fw4EGXnZ3tOnTo4KZOneqys7PdVVdd5T799FPnnHPLli1zycnJ7uDBg+7KK690q1evds45N3LkSDds2LDj+bLgKDRv3tx9++23zrlDn4PXX3/dOXfofaxbt647cODAET97cnJy3PXXX++WL1/unHNu165drk2bNm7JkiXus88+c61atXJZWVkuPz/f9enTxzVv3tw5d+jzk5qaGn3cwYMHu/fee88551x2drZLTk52H330kXPOua5du7p//OMfzjnnRo0a5QYPHuzy8/Odc849++yz7vHHH3cHDx50v//97928efOcc87NmDHD1apVy2VkZMQ8x4YNG7qVK1cW+Do8//zzrlWrVtGf66+99pobM2aMc865/Px816NHD/fKK68U+Lg//7lsrfvwa374750tW7a4evXquY0bN0bfgx07drjc3FxXp04dt3XrVuecc++++66bPHlygc/heCqRVyAkqW7duoqLi9Py5ctVsWJF7d27V7Vq1YoZV6pUKT3zzDPq0KGDmjRpUuCc6enp6tmzp7788kstWrRIQ4cO1euvv65JkyYd1SViSfrqq69Uq1ataAXZuXNnDR8+/IgxWVlZ+vbbb/XGG29IkmrUqKHGjRsf1fw/d/DgQb399tuaNm1a8J9F8dO9e3fdeOONWrRokRYtWqRx48Zp3Lhxmjp1avSf2jIyMrRw4UKVLVvWnGfOnDnasGFDdK+NJO3atUuZmZmSpKuvvjp69aBWrVrKysrS6tWrVapUKTVr1kzSoe+/GTNmSJJuvPFGTZkyRWlpaXr33Xf1+uuvF80LgEJz+J9S69Spo+zs7COubEnS+vXrtXHjRvXt2zeaHThwQCtWrND333+v1q1b68wzz5Qk3XLLLVqwYEF03M+vfD3yyCOaO3euxo0bp/Xr12vbtm0xjyUd+kzu3r1b8+bNkyTl5OSoYsWKWr16tUqXLq0rr7xSkpScnKzHHnvM+5ycc4pEItH/HzRokBYuXKj8/Hzt378/ut+ifv36Kl360F+NqampWrx4sSZMmKD169drzZo1uvTSS4/6ca11/+frXLlyZVWsWFFZWVk6//zzo1+Pi4tT69at1aVLFzVr1kxNmjRR06ZNvc/vRCixBYR06BLu+++/rwoVKiglJcUcV6VKFf3tb39TWlqaOnTo4B0ze/ZsZWZm6oYbblCrVq3UqlUrPfDAA2ratKlWrFihevXqHfW63M827Bz+oP7c4WLk5+OOtkD5uc8++0y1a9c+4gOJkumrr77SkiVL1KNHDzVv3lzNmzfXgw8+qOTkZM2aNUsvvfSSunfvrpYtW6p69ep6//33zbny8/OVkpKiRx55JPr/27Zt01lnnSXp0D/9HRaJROScU1xc3BE/nCVp9erVql69urp06aJOnTrp8ssvV82aNfk8FgNlypSRpOh76v5jk2FeXp7KlSt3xL6ZH3/8UeXKldOIESMK/Nl1xhlnRP/7wQcfVF5entq0aaNmzZpp8+bN3g2N+fn56tu3b/Qvz7179+rgwYP64YcfYsb7fqZKhzY5fvnll9FfJA8XP5s2bVK7du2863vmmWf07bff6oYbbtAVV1yh3Nzc6OMdzeNa6z7s8Oss/d/30n8aNmyYVq9erXnz5mns2LGaPn26nnvuOe9zPN5KXBfGz6WkpOijjz7S3//+9yO6KXxat26ta665RhMnTvR+vWzZsho+fLjWrl0bzTIyMhQXF6cLLrjgqNfUqFEjrV27VitXrpQk79WBxMRENWjQIPq1jIwMzZ8/P+YHdFxcnHJycszH+vLLL6MVMkq2ChUqaPTo0Vq8eHE02759u/bs2aMPP/xQzZs3180336y6detq1qxZysvLM+dq0qSJPvzwQ23btk2S9NZbbyk1NbXAx69evboikUh089d3332n1NRU5efnq0qVKqpfv74GDRqkP/3pT4XwbHEilC5dWnl5eXLOqVq1akpISIgWEJs3b1ZycrKWL1+upk2baubMmdq9e7ckaerUqeacX3zxhXr16qXrr79ekrR06dLoZzMuLk65ubmSDn0mJ02apOzsbOXn56t///4aPny4kpKS5JzTv/71L0mHftHLysryPtZDDz2kMWPGaM6cOdG/qA8cOKCPP/5YpUr5/yr84osvlJqaqg4dOqhixYqaN2+e8vLyjvpxrXX/ksPPfefOnWratKnKly+vW2+9Vb179z6uG1l/SYm+AlG5cmXVqFFD5cqVU/ny5X9xfL9+/fTVV195v9a4cWP1799faWlp2r17t+Li4lSpUiWNGzcu+pvZ0ahQoYKGDRumhx9+WPHx8WrUqJF33JAhQ/Too4/qzTffVOXKlXXeeecd8ZufJF144YUqU6aMOnXqpClTpsQUGBs2bDhikyZKrmrVqunFF1/UiBEjtGXLFpUpU0blypXToEGDVLVqVT300ENq166dcnNzddVVV2nmzJnmZrMmTZrojjvu0G233aZIJKLExES98MIL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AAAIRgEBAACCUUAAAIBgFBAAACAYBQQAAAhGAQEAAIJRQAAAgGAUEAAAIBgFBAAACEYBAQAAglFAAACAYBQQAAAgGAUEAAAIRgEBAACCUUAAAIBgFBAAACAYBQQAAAhGAQEAAIJRQAAAgGAUEAAAIBgFBAAACEYBAQAAglFAAACAYBQQAAAgGAUEAAAIRgEBAACCUUAAAIBgFBAAACAYBQQAAAhW4gqITZs2KSkpSV27do35Wnp6upKSkrRz587ouClTphwx5pVXXlF6erokaeHChUpOTo5+bc6cOercubPat2+vtm3b6v7779eWLVskSffdd59SUlKUkpKipKQktWvXTikpKerWrVuB6925c6eSkpIkSbNnz9aTTz5Z4PitW7eqS5cukqSMjAzde++95rx/+ctf1K5dO11//fUaMmSI8vPzC5wbxds333yjbt26qV27dkpOTlaPHj20Zs2aAv9Menq6XnnlFUlSSkqKdu3adTyWipNMixYttGzZsgLH7N69W3/+85+P04qkF154QbNmzQr+c7/73e+0adMm79dWrVql++67T9ddd53atGmjtm3basKECXLO/bfLjT7usmXLdN999/1Xc912223auXPnf72molb6RC+gKJQpU0br1q3Tv//9b1WtWlWStG/fPn399ddHjCtVqpSGDBmihg0bqnr16gXOuXXrVqWlpWnatGnROUePHq3evXtr8uTJev7556Njk5KSNHHiRFWoUCFo3S1btlTLli0LHFO5cmVNnjxZkvTDDz9o3bp13nGDBg1SjRo19MILL+jgwYO67bbbNG3aNHXq1CloTSgesrOz1bNnT7366quqU6eOJGn69Om64447NHv2bMXFxf3iHNOnTy/qZaIYy8rK+sUiozAtXLhQF154YaHNt3LlSnXv3l0DBw6M/rzeuXOn7rnnHklS9+7dC+Vx6tWrd8TfB8di7ty5hbKWolYiC4i4uDi1adNGM2bM0F133SVJmjlzplq2bKlXX301Oi4hIUHdu3fXww8/rMmTJ+u0004z5/zpp5+Uk5Ojffv2RbPU1FTVrl07eH0zZ87UiBEjdPrpp6tu3brRfNq0afrnP/+pMWPGaMOGDerbt6+ysrJUqVIlOefUvn17XX755WrXrp0WL16sfv36aevWrbr99tujv0Ue9oc//EENGjSQdKigqlmzpn744YfgtaJ42L9/v3bv3n3E57N9+/ZKTExUXl6enn76aS1dulR79+6Vc05PPvmkGjZseMQcSUlJmj9/vipUqKApU6borbfeUn5+vsqXL6/+/furRo0aSk9PV2JiolatWqUtW7YoKSlJQ4YMUdmyZbV06VI9+eST2r9/v+Lj4/XXv/5V27dv15tvvnlE0XvTTTfpk08+KfD7DSdOvXr1dOedd2ru3Lnatm2bevTooZtvvll9+vTRgQMHlJKSomnTpmn9+vV66qmnlJmZqby8PHXr1i36C8rYsWM1depUlS1bVpdddplmz56tTz75ROnp6crMzFRGRoaaNWumTp06acCAAdq7d6+2b9+u2rVra+TIkZo6daqWL1+uoUOHKi4uTk2bNtWwYcO0aNEi5eXl6eKLL1a/fv2UmJioxYsXa+DAgYpEIqpXr555pXXkyJHq0aOHrr322mhWoUIFDRgwQKtWrZIkjRo1St988422bdumpKQkpaen67HHHtOOHTu0fft2Va1aVSNHjlTFihXNx124cKEGDhyoDz74QNnZ2ea6W7RooY4dO2r+/PnavHmzUlJS1Lt3b/Xp00fSob9fxo4dq08//VSTJ09WfHy8ypQpowEDBhRqYfVfcSVMRkaGq1+/vlu2bJlr3bp1NE9NTXWrVq1ytWrVcjt27IiOy8vLc7fccosbPHiwc8658ePHu7S0NOeccwsWLHBt27aNzvH000+7OnXquDZt2rhHH33UffDBBy4nJydmDYcfw2f79u2uYcOGbs2aNc45515++WVXq1Yt55xz77zzjrvzzjudc87ddNNNbtKkSc4559auXesuvfRS984770TX7Vuf5bvvvnMNGzZ0K1as+MWxKL5effVVd8kll7gWLVq4hx9+2E2ZMsXt27fPff311+7ee+91eXl5zjnnxowZ43r27Omccy4tLc2NHz/eOfd/n9uFCxe6m2++2e3bt88559znn38e/V5KS0tznTt3dgcPHnTZ2dmuQ4cOburUqS47O9tdddVV7tNPP3XOObds2TKXnJzsDh486K688kq3evVq55xzI0eOdMOGDTueLwuOQvPmzd23337rnDv0OXj99dedc4fex7p167oDBw4c8bMnJyfHXX/99W758uXOOed27drl2rRp45YsWeI+++wz16pVK5eVleXy8/Ndnz59XPPmzZ1zhz4/qamp0ccd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hg3q27evsrKyVKlSJTnn1L59e11++eVq166dFi9erH79+mnr1q26/fbbo79FHrZixQqtWrVKL7zwgm677bbgNaJ42b9/v3bv3n3E57N9+/ZKTExUXl6enn76aS1dulR79+6Vc05PPvmkGjZseMQcSUlJmj9/vipUqKApU6borbfeUn5+vsqXL6/+/furRo0aSk9PV2JiolatWqUtW7YoKSlJQ4YMUdmyZbV06VI9+eST2r9/v+Lj4/XXv/5V27dv15tvvnlE0XvTTTfpk08+KfD7DSdOvXr1dOedd2ru3Lnatm2bevTooZtvvll9+vTRgQMHlJKSomnTpmn9+vV66qmnlJmZqby8PHXr1k2dOnWSJI0dO1ZTp05V2bJlddlll2n27Nn65JNPlJ6erszMTGVkZKhZs2bq1KmTBgwYoL1792r79u2qXbu2Ro4cqalTp2r58uUaOnSo4uLi1LRpUw0bNkyLFi1SXl6eLr74YvXr10+JiYlavHixBg4cqEgkonr16ik/P9/7vEaOHKkePXro2muvjWYVKlTQgAEDtGrVKknSqFGj9M0332jbtm1KSkpSenq6HnvsMe3YsUPbt29X1apVNXLkSFWsWNF83IULF2rgwIH64IMPlJ2dba67RYsW6tixo+bPn6/NmzcrJSVFvXv3Vp8+fSQd+vtl7Nix+vTTTzV58mTFx8erTJkyGjBgQKEWVv8VV8JkZGS4+vXru2XLlrnWrVtH89TUVLdq1SpXq1Ytt2PHjui4vLw8d8stt7jBgwc755wbP368S0tLc845t2DBAte2bdvoHE8//bSrU6eOa9OmjXv00UfdBx984HJycmLWcPgxfLZv3+4aNmzo1qxZ45xz7uWXX3a1atVyzjn3zjvvuDvvvNM559xNN93kJk2a5Jxzbu3ate7SSy9177zzTnTdvvUV9Hqg5Hv11VfdJZdc4lq0aOEefvhhN2XKFLdv3z739ddfu3vvvdfl5eU555wbM2aM69mzp3POubS0NDd+/Hjn3P99bhcuXOhuvvlmt2/fPuecc59//nn0eyktLc117tzZHTx40GVnZ7sOHTq4qVOnuuzsbHfVVVe5Tz/91Dnn3LJly1xycrI7ePCgu/LKK93q1audc86NHDnSDRs27Hi+LDgKzZs3d99++61z7tDn4PXXX3fOHXof69at6w4cOHDEz5KcnBx3/fXXu+XLlzvnnNu1a5dr06aNW7Jkifvss89cq1atXFZWlsvPz3d9+vRxzZs3d84d+vykpqZGH3fw4MHuvffec845l52d7ZKTk91HH33knHOua9eu7h//+IdzzrlRo0a5wYMHu/z8fOecc88++6x7/PHH3cGDB93vf/97N2/ePOecczNmzHC1atVyGRkZMc+xYcOGbuXKlQW+Ds8//7xr1apV9Of6a6+95saMGeOccy4/P9/16NHDvfLKKwU+7s9/LlvrPvyaH/57Z8uWLa5evXpu48aN0fdgx44dLjc319WpU8dt3brVOefcu+++6yZPnlzgczieSuQVCEmqW7eu4uLitHz5clWsWFF79+5VrVq1YsaVKlVKzzzzjDp06PCLewXS09PVs2dPffnll1q0aJGGDh2q119/XZMmTTqqS8SS9NVXX6lWrVrRCrJz584aPnz4EWOysrL07bff6o033pAk1ahRQ40bNz6q+XHq6t69u2688UYtWrRIixYt0rhx4zRu3DhNnTo1+k9tGRkZWrhwocqWLWvOM2fOHG3YsCG610aSdu3apczMTEnS1VdfHb16UKtWLWVlZWn16tUqVaqUmjVrJunQ99+MGTMkSTfeeKOmTJmitLQ0vfvuu3r99deL5gVAoTn8T6l16tRRdnZ2zD+Drl+/Xhs3blTfvn2j2YEDB7RixQp9//33at26tc4880xJ0i233KIFCxZEx/38ytcjjzyiuXPnaty4cVq/fr22bdvm/SfXOXPmaPfu3Zo3b54kKScnRxUrVtTq1atVunRpXXnllZKk5ORkPfbYY97n5JxTJBKJ/v+gQYO0cOFC5efna//+/dH9FvXr11fp0of+akxNTdXixYs1YcIErV+/XmvWrNGll1561I9rrfs/X+fKlSurYsWKysrK0vnnnx/9elxcnFq3bq0uXbqoWbNmatKkiZo2bep9fidCiS0gpEOXcN9//31VqFBBKSkp5rgqVarob3/7m9LS0tShQwfvmNmzZyszM1M33HCDWrVqpVatWumBBx5Q06ZNtWLFCtWrV++o1+V+tmHn8Af15w4XIz8fd7QFCk5NX331lZYsWaIePXqoefPmat68uR588EElJydr1qxZeumll9S9e3e1bNlS1atX1/vvv2/OlZ+fr5SUFD3yyCPR/9+2bZvOOussSYf+6e+wSCQi55zi4uKO+OEsSatXr1b16tXVpUsXderUSZdffrlq1qx5xA9InJzKlCkjSdH31P3HJsO8vDyVK1fuiH0zP/74o8qVK6cRI0YU+LPrjDPOiP73gw8+qLy8PLVp00bNmjXT5s2bvRsa8/Pz1bdv3+hfnnv37tXBgwf1ww8/xIz3/UyVDm1y/PLLL6O/SB4ufjZt2qR27dp51/fMM8/o22+/1Q033KArrrhCubm50cc7mse11n3Y4ddZ+r/vpf80bNgwrV69WvPmzdPYsWM1ffp0Pffcc97neLyVuC6Mn0tJSdFHH32kv//970d0U/i0bt1a11xzjSZOnOj9etmyZTV8+HCtXbs2mmVkZCguLk4XXHDBUa+pUaNGWrt2rVauXCnp0L6H/5SYmKgGDRpEv5aRkaH58+fH/ICOi4tTTk7OUT82Sq4KFSpo9OjRWrx4cTTbvn279uzZow8//FDNmzfXzTffrLp162rWrFnKy8sz52rSpIk+/PBDbdu2TZL01ltvKTU1tcDHr169uiKRSHTz13fffafU1FTl5+erSpUqql+/vgYNGqQ//elPhfBscSKULl1aeXl5cs6pWrVqSkhIiBYQmzdvVnJyspYvX66mTZtq5syZ2r17tyRp6tSp5pxffPGFevXqpeuvv16StHTp0uhnMy4uTrm5uZIOfSYnTZqk7Oxs5efnq3///ho+fLiSkpLknNO//vUvSYd+0cvKyvI+1kMPPaQxY8Zozpw50b+oDxw4oI8//lilSvn/Kvziiy+UmpqqDh06qGLFipo3b57y8vKO+nGtdf+Sw899586datq0qcqXL69bb71VvXv3Pq4bWX9Jib4CUblyZdWoUUPlypVT+fLlf3F8v3799NVXX3m/1rhxY/Xv319paWnavXu34uLiVKlSJY0bNy76m9nRqFChgoYNG6aHH35Y8fHxatSokXfckCFD9Oijj+rNN99U5cqVdd555x3xm58kXXjhhSpTpow6deqkKVOmxBQYOHVUq1ZNL774okaMGKEtW7aoTJkyKleunAYNGqSqVavqoYceUrt27ZSbm6urrrpKM2fONDebNWnSRHfccYduu+02RSIRJSYm6oUXXijw83Xaaadp1KhRGjRokIYOHar4+HiNGjUq+k8df/zjHzVw4MCT6vIrwlSqVEmXXHKJ2rZtq0mTJumll17SU089pfHjxys3N1f3339/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\n" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot explanations!\n", "nr_images = 3\n", "fig, axes = plt.subplots(nrows=nr_images, ncols=3, figsize=(nr_images*2.5, int(nr_images*3)))\n", "for i in range(nr_images):\n", " axes[i, 0].imshow((np.reshape(x_batch[i], (28, 28)) * 255).astype(np.uint8), vmin=0.0, vmax=1.0, cmap=\"gray\")\n", " axes[i, 0].title.set_text(f\"MNIST digit {y_batch[i].item()}\")\n", " axes[i, 0].axis(\"off\")\n", " axes[i, 1].imshow(a_batch_saliency[i], cmap=\"seismic\")\n", " axes[i, 1].title.set_text(f\"Saliency\")\n", " axes[i, 1].axis(\"off\")\n", " a = axes[i, 2].imshow(a_batch_intgrad[i], cmap=\"seismic\")\n", " axes[i, 2].title.set_text(f\"Integrated Gradients\")\n", " axes[i, 2].axis(\"off\")\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "tuBkEBv3mihR" }, "source": [ "## 2) Quantative evaluation using Quantus\n", "\n", "We can evaluate our explanations on a variety of quantuative criteria but as a motivating example we test the Max-Sensitivity (Yeh at el., 2019) of the explanations. This metric tests how the explanations maximally change while subject to slight perturbations." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "id": "aLjrKsT6mS9X" }, "outputs": [], "source": [ "# Define metric for evaluation.\n", "metric_init = quantus.MaxSensitivity(nr_samples=10,\n", " lower_bound=0.1,\n", " norm_numerator=quantus.norm_func.fro_norm,\n", " norm_denominator=quantus.norm_func.fro_norm,\n", " perturb_func=quantus.perturb_func.uniform_noise,\n", " similarity_func=quantus.similarity_func.difference,\n", " disable_warnings=True,\n", " normalise=True,\n", " abs=True)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "id": "NlV_43TAmJll" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/dilyarabareeva/Documents/UMI_Lab/Quantus/quantus/helpers/warn.py:263: UserWarning: The settings for perturbing input e.g., 'perturb_func' didn't cause change in input. Reconsider the parameter settings.\n", " warnings.warn(\n", "/Users/dilyarabareeva/Documents/UMI_Lab/Quantus/quantus/functions/explanation_func.py:392: UserWarning: Softmax argument has been passed to the explanation function. Different XAI methods may or may not require the output to go through softmax activation. Make sure that your softmax argument choice aligns with the method intended usage.\n", "\n", " warnings.warn(\n", "/opt/homebrew/Caskroom/miniforge/base/envs/quantus/lib/python3.8/site-packages/captum/_utils/gradient.py:56: UserWarning: Input Tensor 0 did not already require gradients, required_grads has been set automatically.\n", " warnings.warn(\n" ] } ], "source": [ "# Return Max-Sensitivity scores for Saliency.\n", "scores_saliency = metric_init(model=model, \n", " x_batch=x_batch,\n", " y_batch=y_batch,\n", " a_batch=a_batch_intgrad,\n", " device=device,\n", " explain_func=quantus.explain,\n", " explain_func_kwargs={\"method\": \"Saliency\", \"softmax\": False})" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "id": "iq7qqDfSmIdj" }, "outputs": [], "source": [ "# Return Max-Sensitivity scores for Integrated Gradients.\n", "scores_intgrad = metric_init(model=model, \n", " x_batch=x_batch,\n", " y_batch=y_batch,\n", " a_batch=a_batch_intgrad,\n", " device=device,\n", " explain_func=quantus.explain,\n", " explain_func_kwargs={\"method\": \"IntegratedGradients\"})" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 202, "status": "ok", "timestamp": 1665156140018, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "3kBrG51Lpuq9", "outputId": "97c19adf-53bb-45c7-afb5-014239e72797" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "max-Sensitivity scores by Yeh et al., 2019\n", "\n", " • Saliency = 0.39 (0.11).\n", " • Integrated Gradients = 0.25 (0.08).\n" ] } ], "source": [ "print(f\"max-Sensitivity scores by Yeh et al., 2019\\n\" \\\n", " f\"\\n • Saliency = {np.mean(scores_saliency):.2f} ({np.std(scores_saliency):.2f}).\" \\\n", " f\"\\n • Integrated Gradients = {np.mean(scores_intgrad):.2f} ({np.std(scores_intgrad):.2f}).\"\n", " )" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 81 }, "executionInfo": { "elapsed": 204, "status": "ok", "timestamp": 1665156209547, "user": { "displayName": "Anna Hedström", "userId": "05540180366077551505" }, "user_tz": -120 }, "id": "uGYHGu1Esya7", "outputId": "ad92c308-a3ae-4a33-88ec-e97e8ea2e709" }, "outputs": [ { "data": { "text/plain": " Saliency IntegratedGradients\nmax-Sensitivity {'0': 0.3584188719838858} {'0': 0.2516450374849362}", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
SaliencyIntegratedGradients
max-Sensitivity{'0': 0.3584188719838858}{'0': 0.2516450374849362}
\n
" }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Use the quantus.evaluate functionality of Quantus to do a more comprehensive quantification.\n", "metrics = {\"max-Sensitivity\": metric_init}\n", "\n", "xai_methods = {\"Saliency\": a_batch_saliency,\n", " \"IntegratedGradients\": a_batch_intgrad}\n", "\n", "results = quantus.evaluate(metrics=metrics,\n", " xai_methods=xai_methods,\n", " model=model.cpu(),\n", " x_batch=x_batch,\n", " y_batch=y_batch,\n", " agg_func=np.mean,\n", " explain_func_kwargs={\"method\": \"IntegratedGradients\", \"device\": device},\n", " call_kwargs={\"0\": {}})\n", "\n", "df = pd.DataFrame(results)\n", "df" ] } ], "metadata": { "accelerator": "GPU", "colab": { "collapsed_sections": [], "machine_shape": "hm", "provenance": [], "toc_visible": true }, "gpuClass": "premium", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.12" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "0bddd893a61a43379a2468b976e11f46": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "0eff6746f7b741b2a774a1b363c3a79d": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "147093205d8d44c5ac4c620666f14494": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_40c671a8807c47e29b5441916992599f", "placeholder": "​", "style": "IPY_MODEL_f34de86120004b8381d160be350a379c", "value": "100%" } }, "15ef3b2f2f5647d98f8992462427dcc5": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "1ae7b9a0dd9e40b9b8b850d3b78c66a9": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "1fccfa6575284f298dc7463850d931f8": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "25091e652b7e4e7cb48fd4f453a9d240": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2aa9e8b2c8204edd80757d46ff51e8b6": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_ec754f5742ef426f92a6c8c074d629f4", "placeholder": "​", "style": "IPY_MODEL_0eff6746f7b741b2a774a1b363c3a79d", "value": " 1648877/1648877 [00:00<00:00, 21419253.46it/s]" } }, "2bb77a7c4c6d4a178946bd49691f6d98": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_49aa9bbcce91465c8f299c8121660a50", "IPY_MODEL_b338e19ab9cc4492881708e1b05be1c3", "IPY_MODEL_a6038c3a9e72403e83d0eb4cf7015146" ], "layout": "IPY_MODEL_88c45a260afe4a83a06399109e272740" } }, "2f4eb4e9a357487b9dead1e821ddd591": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "346e3a743b944ee0aaed6cc93806f7b2": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_5322bafd984d4cb292685cdb18d0d7ab", "max": 28881, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_2f4eb4e9a357487b9dead1e821ddd591", "value": 28881 } }, "3bb0b2b1bcc04ddbacd04b38c0fc889c": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "3c0de11db45a477384385e0774386fd4": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "40c671a8807c47e29b5441916992599f": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "4131166f9c1d474cbbfb7553de12b9a5": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "41ce3124b7834e6e98f595db48128777": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "4773e1086f2e474cb08255d32c832463": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "49aa9bbcce91465c8f299c8121660a50": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_b8455132e9a04542881e18ba996badb7", "placeholder": "​", "style": "IPY_MODEL_733eb2712ae94b0a920e1b2a735c2d24", "value": "100%" } }, "5322bafd984d4cb292685cdb18d0d7ab": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "5a07ed378e3142f28538f317431dd309": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_1ae7b9a0dd9e40b9b8b850d3b78c66a9", "placeholder": "​", "style": "IPY_MODEL_fa5d6bd45df14a7988896b362da8e6bb", "value": " 28881/28881 [00:00<00:00, 1217676.68it/s]" } }, "66d5db69f68d4d36b8126dea6d32e7e6": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "6970ae8b3cc54c2b8d9029609276d48a": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "733eb2712ae94b0a920e1b2a735c2d24": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "7cc311962cb946268a7c53d8ededcd79": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "87900229b261458a82558f08715c35d6": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_cd4ae70adc714f4bb12b457c1de8493b", "max": 1648877, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_3bb0b2b1bcc04ddbacd04b38c0fc889c", "value": 1648877 } }, "88c45a260afe4a83a06399109e272740": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8e1f92e1cd8e4efb9a058100faead72f": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_d994fef356354bf58d4d05fd6f9a87d1", "IPY_MODEL_346e3a743b944ee0aaed6cc93806f7b2", "IPY_MODEL_5a07ed378e3142f28538f317431dd309" ], "layout": "IPY_MODEL_1fccfa6575284f298dc7463850d931f8" } }, "a255b429665e4e5f8e82f13aebdd9a2c": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a6038c3a9e72403e83d0eb4cf7015146": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_4131166f9c1d474cbbfb7553de12b9a5", "placeholder": "​", "style": "IPY_MODEL_6970ae8b3cc54c2b8d9029609276d48a", "value": " 4542/4542 [00:00<00:00, 180358.33it/s]" } }, "a847cf16d837428c96fb83c5fb343db8": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_f42923edb1be415db102f3403dc08883", "max": 9912422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_3c0de11db45a477384385e0774386fd4", "value": 9912422 } }, "b13c7dd7a557447192b8eb1c4f7f357f": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_25091e652b7e4e7cb48fd4f453a9d240", "placeholder": "​", "style": "IPY_MODEL_ce337f24bd9b41e6bff4f88a92d4264b", "value": "100%" } }, "b338e19ab9cc4492881708e1b05be1c3": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_7cc311962cb946268a7c53d8ededcd79", "max": 4542, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_0bddd893a61a43379a2468b976e11f46", "value": 4542 } }, "b8455132e9a04542881e18ba996badb7": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "cd4ae70adc714f4bb12b457c1de8493b": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "ce337f24bd9b41e6bff4f88a92d4264b": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "d994fef356354bf58d4d05fd6f9a87d1": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_15ef3b2f2f5647d98f8992462427dcc5", "placeholder": "​", "style": "IPY_MODEL_66d5db69f68d4d36b8126dea6d32e7e6", "value": "100%" } }, "e83b82b532ae41cb8c5ea2174c16cc08": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_147093205d8d44c5ac4c620666f14494", "IPY_MODEL_a847cf16d837428c96fb83c5fb343db8", "IPY_MODEL_f29b0791c47047cda06f717f13b72408" ], "layout": "IPY_MODEL_4773e1086f2e474cb08255d32c832463" } }, "ec07c6581e9146ac9c44ade89191185a": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_b13c7dd7a557447192b8eb1c4f7f357f", "IPY_MODEL_87900229b261458a82558f08715c35d6", "IPY_MODEL_2aa9e8b2c8204edd80757d46ff51e8b6" ], "layout": "IPY_MODEL_a255b429665e4e5f8e82f13aebdd9a2c" } }, "ec754f5742ef426f92a6c8c074d629f4": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "f132c540c8e141ce9aeaccd97fe3b73a": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "f29b0791c47047cda06f717f13b72408": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_41ce3124b7834e6e98f595db48128777", "placeholder": "​", "style": "IPY_MODEL_f132c540c8e141ce9aeaccd97fe3b73a", "value": " 9912422/9912422 [00:00<00:00, 25366118.44it/s]" } }, "f34de86120004b8381d160be350a379c": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "f42923edb1be415db102f3403dc08883": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "fa5d6bd45df14a7988896b362da8e6bb": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } } } } }, "nbformat": 4, "nbformat_minor": 1 }