{ "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": 2, "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": 3, "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": [ { "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 ./sample_data/MNIST/raw/train-images-idx3-ubyte.gz\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2a36d5ae8b6040debdfcffe68ad1d0e9", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/9912422 [00:00" ] }, "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": 5, "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": 6, "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": 7, "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/10 - test accuracy: 95.64% and CE loss 0.18\n", "Epoch 2/10 - test accuracy: 97.42% and CE loss 0.17\n", "Epoch 3/10 - test accuracy: 98.17% and CE loss 0.10\n", "Epoch 4/10 - test accuracy: 98.24% and CE loss 0.04\n", "Epoch 5/10 - test accuracy: 98.51% and CE loss 0.01\n", "Epoch 6/10 - test accuracy: 98.56% and CE loss 0.03\n", "Epoch 7/10 - test accuracy: 98.67% and CE loss 0.02\n", "Epoch 8/10 - test accuracy: 98.58% and CE loss 0.03\n", "Epoch 9/10 - test accuracy: 98.77% and CE loss 0.00\n", "Epoch 10/10 - test accuracy: 98.68% and CE loss 0.04\n", "Model test accuracy: 98.68%\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=10,\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": 8, "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": [ "/Users/annahedstroem/anaconda3/envs/quantus/lib/python3.9/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": 9, "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": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhAAAAJfCAYAAAAuDu8wAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABbCUlEQVR4nO3dfYDPVf7//8fMmLAosVbJ7obMJKYsapVaM2nTyBg20ioNLbVdXzdDVF8kJHwSksr6llikC7XbitgtVyG5WD9X35KxYUSGXM2YOd8//Ly/2fd5Tk7NGDPut7/qMcd5n/eFmee8nOfrxDjnnAAAAALElvYCAABA2UMBAQAAglFAAACAYBQQAAAgGAUEAAAIRgEBAACClbsCYuvWrUpMTNTNN98c9bU+ffooMTFRu3fvjoybPn36cWNeeeUVZWVlSZKWLFmi9u3bR742f/58de3aVR06dND111+v+++/X9u3b5ck3XfffUpPT1d6eroSExOVlpam9PR0de/evcj17t69W4mJiZKkuXPnatCgQUWO37Fjh2666SZJUnZ2tu69917vuJtuuimynvT0dF188cU/ODfKts8//1zdu3dXWlqa2rdvr169emnjxo1F/pmsrCy98sorkqT09HTt3bv3ZCwVp5irr75aq1evLnLMvn37dOutt56kFUkvvPCC5syZE/znfvOb32jr1q3er61fv1733Xefrr32WrVr107t2rXTxIkTVRx3Mzj2uKtXr9Z99933k+a67bbbtHv37p+8ppJWobQXUBIqVqyozZs36z//+Y/OO+88SdKBAwe0fPny48bFxsZq6NChatGiherVq1fknDt27FBmZqZmzpwZmXPcuHF64IEHNHXqVD3//PORsYmJiZo0aZJq1KgRtO42bdqoTZs2RY6pXbu2pk6dKkn6+uuv9eWXX3rHHRsjHS1MnnvuOd1///1B60HZkZeXpzvuuEOvvvqqGjduLEl655131Lt3b82dO1dxcXE/OMc777xT0stEGZabm/uDRUZxWrJkiS644IJim2/dunXq2bOnBg4cGPl+vXv3bt11112SpJ49exbL4yQlJR338+DHWLBgQbGspaSVywIiLi5OqampmjVrlv785z9LkmbPnq02bdro1VdfjYyrVKmSevbsqYcfflhTp07VGWecYc757bffKj8/XwcOHIhkGRkZatSo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BKOAAAAAwSggAABAsHJXQGzdulWJiYm6+eabo77Wp08fJSYmavfu3ZFx06dPP27MK6+8oqysLEnSkiVL1L59+8jX5s+fr65du6pDhw66/vrrdf/992v79u2SpPvuu0/p6elKT09XYmKi0tLSlJ6eru7duxe53t27dysxMVGSNHfuXA0aNKjI8Tt27NBNN90kScrOzta9995rznvPPfcoLS1N7dq109ChQ1VYWFjk3CjbPv/8c3Xv3l1paWlq3769evXqpY0bNxb5Z7KysvTKK69IktLT07V3796TsVScYq6++mqtXr26yDH79u3TrbfeepJWJL3wwguaM2dO8J/7zW9+o61bt3q/tn79et1333269tpr1a5dO7Vr104TJ06Uc+6nLjfyuKtXr9Z99933k+a67bbbtHv37p+8ppJWobQXUBIqVqyozZs36z//+Y/OO+88SdKBAwe0fPny48bFxsZq6NChatGiherVq1fknDt27FBmZqZmzpwZmXPcuHF64IEHNHXqVD3//PORsYmJiZo0aZJq1KgRtO42bdqoTZs2RY6pXbu2pk6dKkn6+uuv9eWXX3rHDR48WA0aNNALL7ygw4cP67bbbtPMmTPVuXPnoDWhbMjLy9Mdd9yhV199VY0bN5YkvfPOO+rdu7fmzp2ruLi4H5zjnXfeKellogzLzc39wSKjOC1ZskQXXHBBsc23bt069ezZUwMHDox8v969e7fuuusuSVLPnj2L5XGSkpKO+3nwYyxYsKBY1lLSymUBERcXp9TUVM2aNUt//vOfJUmzZ89WmzZt9Oqrr0bGVapUST179tTDDz+sqVOn6owzzjDn/Pbbb5Wfn68DBw5EsoyMDDVq1Ch4fbNnz9bIkSNVuXJlNWnSJJLPnDlT//jHPzR+/Hh99dVX6tu3r3Jzc1WrVi0559ShQwdddtllSktL07Jly9SvXz/t2LFDf/rTnyK/RR7z+9//Xs2aNZN0tKBq2LChvv766+C1omw4ePCg9u3bd9zns0OHDqpataoKCgr0zDPPaOXKldq/f7+ccxo0aJCaN29+3ByJiYlatGiRatSooenTp2vKlCkqLCxU9erV1b9/fzVo0EBZWVmqWrWq1q9fr+3bt6t+/foaMWKEqlSpopUrV2rQoEE6ePCg4uPj9dhjj2nnzp164403jit6b7zxRn300UdF/n1D6UlKStLtt9+uBQsWKCcnR7feeqt69OihPn366NChQ0pPT9fMmTO1efNmPf3009qzZ48KCgrUvXv3yC8oL730kmbMmKEqVaqoRYsWmjt3rj766CNlZWVpz549ys7OVnJysjp37qwBAwbowIEDysnJ0YUXXqhRo0ZpxowZWrNmjYYNG6a4uDi1bt1aw4cP19KlS1VQUKCLLrpI/fr1U9WqVbVs2TINHDhQMTExSkpKMq+0jho1Sr169dI111wTyWrUqKEBAwZo/fr1kqTRo0fr888/V05OjhITE5WVlaUnnnhCu3bt0s6dO3Xeeedp1KhRqlmzpvm4S5Ys0cCBA/Xee+8pLy/PXPfVV1+tTp06adGiRdq2bZtSU1P12GOPqU+fPpKO/nx56aWXNG/ePE2dOlXx8fGqWLGiBgwYUKyF1U/iypns7GzXtGlTt3r1apeamhrJMzIy3Pr1611CQoLbtWtXZFxBQYHr1q2bGzJkiHPOuZdfftllZmY655xbvHixu/766yNzPPPMM65x48YuNTXVPf744+69995z+fn5UWs49hg+O3fudM2bN3cbN250zjn34osvuoSEBOecc2+++aa7/fbbnXPO3XjjjW7y5MnOOec2bdrkLrnkEvfmm29G1u1bn+Xf//63a968uVu7du0PjkXZ9eqrr7qLL77YXX311e6RRx5x06dPdwcOHHCfffaZu/fee11BQYFzzrnx48e7O+64wznnXGZmpnv55Zedc//vc7tkyRLXrVs3d+DAAeeccx9//HHk71JmZqbr2rWrO3z4sMvLy3MdO3Z0M2bMcHl5ea5Vq1Zu3rx5zjnnVq9e7dq3b+8OHz7sLr/88sjnfdSoUW748OEn82XBCUhJSXGrVq1yzh39HLz22mvOuaPvY5MmTdyhQ4eO+96Tn5/v2rVr59asWeOcc27v3r0uNTXVrVixwv3rX/9ybdu2dbm5ua6wsND16dPHpaSkOOeOfn4yMjIijztkyBD39ttvO+ecy8vLc+3bt3cffPCBc865W265xf397393zjk3evRoN2TIEFdYWOicc+65555zTz75pDt8+LC74oor3MKFC51zzs2aNcslJCS47OzsqOfYvHlzt27duiJfh+eff961bds28n39L3/5ixs/frxzzrnCwkLXq1cv98orrxT5uN//vmyt+9hrfuznzvbt211SUpLbsmVL5D3YtWuXO3LkiGvcuLHbsWOHc865t956y02dOrXI53AylcsrEJLUpEkTxcbGas2aNapZs6b279+vhISEqHGxsbF69tln1alTJ1155ZVFzpmVlaU77rhDn376qZYuXaphw4bptdde0+TJk0/oErEkLV++XAkJCZEKsmvXrhoxYsRxY3Jzc7Vq1Sq9/vrrkqQGDRqoZcuWJzT/f/v444/16KOPql+/fj/qagnKjp49e6pLly5aunSpli5dqgkTJmjChAmaMWNG5J/asrOztWTJElWpUsWcZ/78+frqq68ie22ko5/JPXv2SJKuuuqqyNWDhIQE5ebmasOGDYqNjVVycrKko3//Zs2aJUnq0qWLpk2bpszMTL311luRzzVOXcf+KbVx48bKy8s77sqWJG3evFlbtmxR3759I9mhQ4e0du1affHFF7ruuut05plnSpJuvvlmLV68ODLu+1e+Hn30US1YsEATJkzQ5s2blZOTE/VY0tHP5L59+7Rw4UJJUn5+vmrWrKkNGzaoQoUKuvzyyyVJ7du31xNPPOF9Ts45xcTERP5/8ODBWrJkiQoLC3Xw4MHIfoumTZuqQoWjPxozMjK0bNkyTZw4UZs3b9bGjRt1ySWXnPDjWuv+79e5du3aqlmzpnJzc/XLX/4y8vW4uDhdd911uummm5ScnKxWrVopLS3N+/xKQ7ktIKSjl3Dfffdd1ahRQ+np6ea4OnXq6KmnnlJmZqY6duzoHTN37lzt2bNHN9xwg9q2bau2bdvqwQcfVHJystauXaukpKQTWlNMTMxxG3aOfVC/71gx8v1xJ1qgfN/EiRP10ksvacSIEbriiiuC/zzKjuXLl2vFihXq1auXUlJSlJKSooceekhpaWmaM2eOxo4dq549e6pNmzaqX7++3n33XXOuwsJCpaen69FHH438f05Ojs466yxJR//p75hjn+e4uLjjvjlL0oYNG1S/fn117dpVXbp00WWXXaaGDRuqbt26JfAKoDhVrFhRkiLvqfuvTYYFBQU688wzj9s3880336hatWoaOXJkkd+7fvazn0X++6GHHlJBQYFSU1OVnJysbdu2eTc0FhYWqm/fvmrdurUkaf/+/Tp8+LB3vO97qnR0k+Onn34a+UXyWPGzdevW434of399zz77rFatWqUbbrhBv/3tb3XkyJFIIXIij2ut+5hjr7MU/bPh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AADBKCAAAEAwCggAABCMAgIAAASjgAAAAMEoIAAAQDAKCAAAEIwCAgAABKOAAAAAwSggAABAMAoIAAAQjAICAAAEo4AAAADBKCAAAEAwCggAABCMAgIAAASjgAAAAMEoIAAAQDAKCAAAEIwCAgAABKOAAAAAwcpdAbF161YlJibq5ptvjvpanz59lJiYqN27d0fGTZ8+/bgxr7zyirKysiRJS5YsUfv27SNfmz9/vrp27aoOHTro+uuv1/3336/t27dLku677z6lp6crPT1diYmJSktLU3p6urp3717kenfv3q3ExERJ0ty5czVo0KAix+/YsUM33XSTJCk7O1v33ntvkePXrVunK6+8ssgxKB8+//xzde/eXWlpaWrfvr169eqljRs3FvlnsrKy9Morr0iS0tPTtXfv3pOxVJxirr76aq1evbrIMfv27dOtt956klYkvfDCC5ozZ07wn/vNb36jrVu3er+2fv163Xfffbr22mvVrl07tWvXThMnTpRz7qcuN/K4q1ev1n333feT5rrtttu0e/fun7ymklahtBdQEipWrKjNmzfrP//5j8477zxJ0oEDB7R8+fLjxsXGxmro0KFq0aKF6tWrV+ScO3bsUGZmpmbOnBmZc9y4cXrggQc0depUPf/885GxiYmJmjRpkmrUqBG07jZt2qhNmzZFjqldu7amTp0qSfr666/15ZdfescdOXJEr7/+ul566SUdPHgwaB0oe/Ly8nTHHXfo1VdfVePGjSVJ77zzjnr37q25c+cqLi7uB+d45513SnqZKMNyc3N/sMgoTkuWLNEFF1xQbPOtW7dOPXv21MCBAyPfr3fv3q277rpLktSzZ89ieZykpKTjfh78GAsWLCiWtZS0cllAxMXFKTU1VbNmzdKf//xnSdLs2bPVpk0bvfrqq5FxlSpVUs+ePfXwww9r6tSpOuOMM8w5v/32W+Xn5+vAgQORLCMjQ40aNQpe3+zZszVy5EhVrlxZTZo0ieQzZ87UP/7xD40fP15fffWV+vbtq9zcXNWqVUvOOXXo0EGXXXaZ0tLStGzZMvXr1087duzQn/70p8hvkcesXbtW69ev1/PPP6/evXsHrxFly8GDB7Vv377jPp8dOnRQ1apVVVBQoGeeeUYrV67U/v375ZzToEGD1Lx58+PmSExM1KJFi1SjRg1Nnz5dU6ZMUWFhoapXr67+/furQYMGysrKUtWqVbV+/Xpt375d9evX14gRI1SlShWtXLlSgwYN0sGDBxUfH6/HHntMO3fu1BtvvHFc0XvjjTfqo48+KvLvG0pPUlKSbr/9di1YsEA5OTm69dZb1aNHD/Xp00eHDh1Senq6Zs6cqc2bN+vpp5/Wnj17VFBQoO7du6tz586SpJdeekkzZsxQlSpV1KJFC82dO1cfffSRsrKytGfPHmVnZys5OVmdO3fWgAEDdODAAeXk5OjCCy/UqFGjNGPGDK1Zs0bDhg1TXFycWrdureHDh2vp0qUqKCjQRRddpH79+qlq1apatmyZBg4cqJiYGCUlJamwsND7vEaNGqVevXrpmmuuiWQ1atTQgAEDtH79eknS6NGj9fnnnysnJ0eJiYnKysrSE088oV27dmnnzp0677zzNGrUKNWsWdN83CVLlmjgwIF67733lJeXZ6776quvVqdOnbRo0SJt27ZNqampeuyxx9SnTx9JR3++vPTSS5o3b56mTp2q+Ph4VaxYUQMGDCjWwuonceVMdna2a9q0qVu9erVLTU2N5BkZGW79+vUuISHB7dq1KzKuoKDAdevWzQ0ZMsQ559zLL7/sMjMznXPOLV682F1//fWROZ555hnXuHFjl5qa6h5//HH33nvvufz8/Kg1HHsMn507d7rmzZu7jRs3Ouece/HFF11CQoJzzrk333zT3X777c4552688UY3efJk55xzmzZtcpdccol78803I+v2ra+o1wPl36uvvuouvvhid/XVV7tHHnnETZ8+3R04cMB99tln7t5773UFBQXOOefGjx/v7rjjDuecc5mZme7ll192zv2/z+2SJUtct27d3IEDB5xzzn388ceRv0uZmZmua9eu7vDhwy4vL8917NjRzZgxw+Xl5blWrVq5efPmOeecW716tWvfvr07fPiwu/zyyyOf91GjRrnhw4efzJcFJyAlJcWtWrXKOXf0c/Daa685546+j02aNHGHDh067ntJfn6+a9eunVuzZo1zzrm9e/e61NRUt2LFCvevf/3LtW3b1uXm5rrCwkLXp08fl5KS4pw7+vnJyMiIPO6QIUPc22+/7ZxzLi8vz7Vv39598MEHzjnnbrnlFvf3v//dOefc6NGj3ZAhQ1xhYaFzzrnnnnvOPfnkk+7w4cPuiiuucAsXLnTOOTdr1iyXkJDgsrOzo55j8+bN3bp164p8HZ5//nnXtm3byPf1v/zlL278+PHOOecKCwtdr1693CuvvFLk437/+7K17mOv+bGfO9u3b3dJSUluy5Ytkfdg165d7siRI65x48Zux44dzjnn3nrrLTd16tQin8PJVC6vQEhSkyZNFBsbqzVr1qhmzZrav3+/EhISosbFxsbq2WefVadOnX5wr0BWVpbuuOMOffrpp1q6dKmGDRum1157TZMnTz6hS8SStHz5ciUkJEQqyK5du2rEiBHHjcnNzdWqVav0+uuvS5IaNGigli1bntD8OH317NlTXbp00dKlS7V06VJNmDBBEyZM0IwZMyL/1Jadna0lS5aoSpUq5jzz58/XV199FdlrIx39TO7Zs0eSdNVVV0WuHiQkJCg3N1cbNmxQbGyskpOTJR39+zdr1ixJUpcuXTRt2jRlZmbqrbfeinyuceo69k+pjRs3Vl5e3nFXtiRp8+bN2rJli/r27RvJDh06pLVr1+qLL77QddddpzPPPFOSdPPNN2vx4sWRcd+/8vXoo49qwYIFmjBhgjZv3qycnJyox5KOfib37dunhQsXSpLy8/NVs2ZNbdiwQRUqVNDll18uSWrfvr2eeOIJ73NyzikmJiby/4MHD9aSJUtUWFiogwcPRvZbNG3aVBUqHP3RmJGRoWXLlmnixInavHmzNm7cqEsuueSEH9da93+/zrVr11bNmjWVm5urX/7yl5Gvx8XF6brrrtNNN92k5ORktWrVSmlpad7nVxrKbQEhHb2E++6776pGjRpKT083x9WpU0dPPfWUMjMz1bFjR++YuXPnas+ePbrhhhvUtm1btW3bVg8++KCSk5O1du1aJSUlndCaYmJijtuwc+yD+n3HipHvjzvRAgWnp+XLl2vFihXq1auXUlJSlJKSooceekhpaWmaM2eOxo4dq549e6pNmzaqX7++3n33XXOuwsJCpaen69FHH438f05Ojs466yxJR//p75hjn+e4uLjjvjlL0oYNG1S/fn117dpVXbp00WWXXaaGDRuqbt26JfAKoDhVrFhRkiLvqfuvTYYFBQU688wzj9s3880336hatWoaOXJkkd+7fvazn0X++6GHHlJBQYFSU1OVnJysbdu2eTc0FhYWqm/fvmrdurUkaf/+/Tp8+LB3vO97qnR0k+Onn34a+UXyWPGzdevW434of399zz77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\n", "text/plain": [ "
" ] }, "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": 10, "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": 11, "metadata": { "id": "NlV_43TAmJll" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/annahedstroem/Projects/quantus/quantus/helpers/warn.py:261: 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/annahedstroem/Projects/quantus/quantus/helpers/normalise_func.py:107: RuntimeWarning: invalid value encountered in multiply\n", " - (a < 0.0) * np.divide(a, a_min, where=a_min != 0),\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\"})" ] }, { "cell_type": "code", "execution_count": 12, "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": 13, "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.53 (0.16).\n", " • Integrated Gradients = 0.31 (0.09).\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": 14, "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/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SaliencyIntegratedGradients
max-Sensitivity0.4347350.308418
\n", "
" ], "text/plain": [ " Saliency IntegratedGradients\n", "max-Sensitivity 0.434735 0.308418" ] }, "execution_count": 14, "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=quantus.explain,\n", " explain_func_kwargs={\"method\": \"IntegratedGradients\", \"device\": device})\n", "\n", "df = pd.DataFrame(results)\n", "df" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "3MOog0W5U4Id" }, "outputs": [], "source": [] } ], "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.13" }, "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 }