{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2b2e7392",
   "metadata": {},
   "source": [
    "# Day 6 — Machines That See 👁️\n",
    "\n",
    "> **Mission briefing:** The Lab's camera team needs a **photo detective**: point it at a picture and it names what's there — one of ten everyday objects. But a plain network treats a photo as a flat list of numbers and falls apart. Today you give it real eyes: **convolutions**.\n",
    "\n",
    "**Previously in the Lab:** on Day 5 you trained your first real networks with PyTorch and unlocked **Digit Reader**. Those digits were tiny and gray — today we go to full color.\n",
    "\n",
    "**Today you will:**\n",
    "- See exactly **why** a flat network struggles with photos\n",
    "- Build a **convolution** by hand and watch it find edges\n",
    "- Train a **CNN** on **CIFAR-10** — ten object classes, in color\n",
    "- Read a **confusion matrix** and look through the network's own eyes\n",
    "- Road-test it on real photos — and meet its honest limits\n",
    "\n",
    "**Today you unlock:** 🔓 **Photo Detective** — upload a photo and the CNN *you trained* investigates.\n",
    "\n",
    "<details data-resource-precision=\"6\"><summary>A precise reading</summary><p>Flattening preserves pixel values in a fixed order; it removes the explicit spatial structure from the layer interface. A CNN builds in local connectivity and shared weights. Day 5 trained both an MLP and a CNN. CIFAR-10 contains 50,000 training and 10,000 test images. Report the measured test score and failure cases rather than assuming a universal human baseline.</p></details>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3b1da11d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:55:54.562600Z",
     "iopub.status.busy": "2026-08-17T12:55:54.562449Z",
     "iopub.status.idle": "2026-08-17T12:55:54.673287Z",
     "shell.execute_reply": "2026-08-17T12:55:54.672261Z"
    }
   },
   "outputs": [],
   "source": [
    "# ╔═══════════════════════════════════════════════════════════════════╗\n",
    "# ║ SETUP — run me first! (identical in every Lab notebook)           ║\n",
    "# ╚═══════════════════════════════════════════════════════════════════╝\n",
    "import os, sys, pathlib\n",
    "\n",
    "IN_COLAB = \"google.colab\" in sys.modules\n",
    "SMOKE = os.environ.get(\"SMOKE_TEST\", \"0\") == \"1\"   # tiny fast run for automated tests\n",
    "\n",
    "REPO_URL = \"https://github.com/A-Halimi/ai-studio-internship.git\"  # instructor: set once\n",
    "\n",
    "if IN_COLAB:\n",
    "    if not pathlib.Path(\"/content/ai-studio-internship\").exists():\n",
    "        !git clone -q {REPO_URL} /content/ai-studio-internship\n",
    "    %cd /content/ai-studio-internship/notebooks/day06                    # ← ADAPT day folder\n",
    "    %pip -q install gradio==6.19.0                                       # ← ADAPT per-day installs (see spec; delete line if none)\n",
    "\n",
    "HERE = pathlib.Path.cwd()\n",
    "REPO = HERE.parents[1]                       # .../notebooks/dayNN -> repo root\n",
    "DATA_DIR = pathlib.Path(os.environ.get(\"COURSE_DATA_DIR\", REPO / \"data\"))\n",
    "SAMPLES_DIR = REPO / \"data_samples\"          # small datasets shipped with the repo\n",
    "MODELS_DIR = REPO / \"ai_studio\" / \"models\"   # where your Studio modules unlock\n",
    "for p in (REPO / \"data\", MODELS_DIR):\n",
    "    p.mkdir(parents=True, exist_ok=True)\n",
    "\n",
    "import random\n",
    "import numpy as np\n",
    "SEED = 42\n",
    "random.seed(SEED); np.random.seed(SEED)\n",
    "print(f\"✅ Setup done | Colab: {IN_COLAB} | Smoke test: {SMOKE}\")\n",
    "print(f\"   data: {DATA_DIR}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "baa7b39b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:55:54.675155Z",
     "iopub.status.busy": "2026-08-17T12:55:54.674920Z",
     "iopub.status.idle": "2026-08-17T12:55:55.944966Z",
     "shell.execute_reply": "2026-08-17T12:55:55.943898Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "torch.manual_seed(SEED)\n",
    "DEVICE = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "if DEVICE.type == \"cuda\":\n",
    "    print(f\"⚡ Running on GPU: {torch.cuda.get_device_name(0)}\")\n",
    "else:\n",
    "    print(\"🐢 No GPU found — running on CPU. Everything still works, just slower.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a7efbd44",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:55:55.946773Z",
     "iopub.status.busy": "2026-08-17T12:55:55.946544Z",
     "iopub.status.idle": "2026-08-17T12:55:55.950501Z",
     "shell.execute_reply": "2026-08-17T12:55:55.949571Z"
    }
   },
   "outputs": [],
   "source": [
    "# ── CONFIG — the Lab's control panel. Tweak me later! ──────────────\n",
    "EPOCHS        = 1 if SMOKE else 8\n",
    "TRAIN_SUBSET  = 1_000 if SMOKE else 20_000    # how many training images to use\n",
    "BATCH_SIZE    = 128\n",
    "LEARNING_RATE = 1e-3\n",
    "print(f\"EPOCHS={EPOCHS}  TRAIN_SUBSET={TRAIN_SUBSET:,}  BATCH_SIZE={BATCH_SIZE}  LR={LEARNING_RATE}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d4f97285",
   "metadata": {},
   "source": [
    "## 1. Why a flat network can't really see\n",
    "\n",
    "On Day 5 the very first layer was `nn.Flatten()`: it unrolled each 28×28 image into a list of 784 numbers. That worked for neat, centered digits. For real photos it's a disaster, for three reasons:\n",
    "\n",
    "- **It destroys neighborhoods.** Flattening puts pixel (0,0) next to (0,1) but far from (1,0) — even though those two are neighbors on the image. The network has to *re-learn* which pixels are adjacent. That's wasteful and hard.\n",
    "- **It's not shift-invariant.** Move a cat 3 pixels to the right and *every* input number changes. To a flat network, the shifted cat is a brand-new, unrecognizable image.\n",
    "- **It explodes in size.** A color 32×32 photo is 32·32·3 = 3,072 numbers. One dense layer to just 512 hidden units needs 3072·512 ≈ **1.5 million weights** — for a *single* layer, on a *tiny* image.\n",
    "\n",
    "Convolutions fix all three at once."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "80d610b2",
   "metadata": {},
   "source": [
    "## 2. A convolution is a sliding stencil\n",
    "\n",
    "Picture a tiny **magnifying glass**, 3×3 pixels wide. You slide it across the image, and at every position it asks **one fixed question** — say, *\"is there a vertical edge right here?\"* — and writes down how strongly the answer is \"yes.\"\n",
    "\n",
    "That little 3×3 grid of numbers is a **kernel** (or *filter*). Sliding it over the whole image produces a new image — a **feature map** — that lights up wherever the pattern appears.\n",
    "\n",
    "The magic is that **the same kernel is used at every position**. So it finds its pattern anywhere in the image (shift-invariance ✓), only ever looks at neighbors (respects the 2-D layout ✓), and costs just 9 numbers instead of millions ✓.\n",
    "\n",
    "Let's build one by hand and point it at a real photo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b20818ec",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:55:55.952012Z",
     "iopub.status.busy": "2026-08-17T12:55:55.951875Z",
     "iopub.status.idle": "2026-08-17T12:55:59.266772Z",
     "shell.execute_reply": "2026-08-17T12:55:59.265823Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import torch\n",
    "import torch.nn.functional as F\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.datasets import load_sample_image\n",
    "\n",
    "photo = load_sample_image(\"china.jpg\")             # a real photo, no download needed\n",
    "gray = photo.mean(axis=2)                           # collapse color -> grayscale\n",
    "img = torch.tensor(gray, dtype=torch.float32).reshape(1, 1, *gray.shape)\n",
    "\n",
    "# A horizontal-edge detector: rows of -1 / 0 / +1\n",
    "h_kernel = torch.tensor([[-1., -1., -1.],\n",
    "                         [ 0.,  0.,  0.],\n",
    "                         [ 1.,  1.,  1.]]).reshape(1, 1, 3, 3)\n",
    "h_edges = F.conv2d(img, h_kernel)\n",
    "\n",
    "fig, axes = plt.subplots(1, 2, figsize=(10, 4))\n",
    "axes[0].imshow(gray, cmap=\"gray\"); axes[0].set_title(\"original\"); axes[0].axis(\"off\")\n",
    "axes[1].imshow(h_edges[0, 0], cmap=\"gray\"); axes[1].set_title(\"horizontal edges\"); axes[1].axis(\"off\")\n",
    "plt.tight_layout(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dc645e53",
   "metadata": {},
   "source": [
    "### 🧪 Exercise 1 — the vertical-edge kernel\n",
    "\n",
    "The horizontal detector had *rows* of −1 / 0 / +1. To find **vertical** edges, you need *columns* of −1 / 0 / +1 instead — the same idea, turned 90°.\n",
    "\n",
    "- Build `v_kernel` and apply it with `F.conv2d`.\n",
    "- Expected: the output lights up on **vertical** boundaries (the sides of pillars and doorframes) instead of horizontal ones."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "77b49792",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:55:59.269221Z",
     "iopub.status.busy": "2026-08-17T12:55:59.268995Z",
     "iopub.status.idle": "2026-08-17T12:55:59.316291Z",
     "shell.execute_reply": "2026-08-17T12:55:59.315229Z"
    }
   },
   "outputs": [],
   "source": [
    "# ==================== YOUR CODE HERE ====================\n",
    "### HINT: transpose the pattern — make columns of -1, 0, +1 instead of rows\n",
    "...\n",
    "v_edges = F.conv2d(img, v_kernel)\n",
    "\n",
    "fig, axes = plt.subplots(1, 3, figsize=(10, 4))\n",
    "axes[0].imshow(gray, cmap=\"gray\");        axes[0].set_title(\"original\");         axes[0].axis(\"off\")\n",
    "axes[1].imshow(h_edges[0, 0], cmap=\"gray\"); axes[1].set_title(\"horizontal edges\"); axes[1].axis(\"off\")\n",
    "axes[2].imshow(v_edges[0, 0], cmap=\"gray\"); axes[2].set_title(\"vertical edges\");   axes[2].axis(\"off\")\n",
    "plt.tight_layout(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6e43273b",
   "metadata": {},
   "source": [
    "### 🧪 Exercise 2 — a blur kernel\n",
    "\n",
    "Not every kernel finds edges. A kernel of equal positive weights that sum to 1 **averages** each neighborhood — a blur.\n",
    "\n",
    "- Build a 3×3 kernel where every entry is `1/9`, then apply it.\n",
    "- Expected: a softer, smeared version of the photo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cfcaf6e8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:55:59.318144Z",
     "iopub.status.busy": "2026-08-17T12:55:59.318002Z",
     "iopub.status.idle": "2026-08-17T12:55:59.360142Z",
     "shell.execute_reply": "2026-08-17T12:55:59.358931Z"
    }
   },
   "outputs": [],
   "source": [
    "# ==================== YOUR CODE HERE ====================\n",
    "### HINT: torch.ones(1, 1, 3, 3) / 9 makes nine equal weights that sum to 1\n",
    "...\n",
    "blurred = F.conv2d(img, blur_kernel)\n",
    "\n",
    "fig, axes = plt.subplots(1, 2, figsize=(10, 4))\n",
    "axes[0].imshow(gray, cmap=\"gray\");         axes[0].set_title(\"original\");        axes[0].axis(\"off\")\n",
    "axes[1].imshow(blurred[0, 0], cmap=\"gray\"); axes[1].set_title(\"blurred (3×3 average)\"); axes[1].axis(\"off\")\n",
    "plt.tight_layout(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0334d471",
   "metadata": {},
   "source": [
    "## 3. Stacking convolutions = seeing bigger things\n",
    "\n",
    "One kernel finds one pattern. A convolution **layer** learns *many* kernels at once (our detective learns 32 in its first layer). Stack layers and something beautiful happens:\n",
    "\n",
    "- **Layer 1** learns edges and color blobs — like the ones you just built by hand.\n",
    "- **Layer 2** combines those edges into **corners, curves, and textures**.\n",
    "- **Layer 3** combines those into **object parts** — an ear, a wheel, an eye.\n",
    "\n",
    "And you never hand-design these kernels. The network *learns* them by gradient descent: `loss.backward()` discovers which 3×3 patterns matter.\n",
    "\n",
    "> **HPC echo:** a convolution is secretly a big matrix multiply. Libraries unroll each image patch into a column (a trick called `im2col`) and hit the whole thing with one giant `@`. It's the same operation you've been staring at since Day 4 — which is exactly why GPUs love convolutions, and why HPC engineers obsess over making `@` fast."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "32e18740",
   "metadata": {},
   "source": [
    "## 4. Meet CIFAR-10 — the world in 32×32 color\n",
    "\n",
    "**CIFAR-10** is 60,000 tiny color photos, each 32×32 pixels, across 10 classes: airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truck. It's the classic proving ground for \"can your network actually see?\"\n",
    "\n",
    "This time we **do** normalize the pixels to roughly −1…+1. Centering the numbers keeps training stable — and it's the exact recipe your Studio module expects, so remember it for the unlock: `Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))`, i.e. `(x − 0.5) / 0.5`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3615a1c4",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:55:59.361876Z",
     "iopub.status.busy": "2026-08-17T12:55:59.361731Z",
     "iopub.status.idle": "2026-08-17T12:56:02.251619Z",
     "shell.execute_reply": "2026-08-17T12:56:02.250371Z"
    }
   },
   "outputs": [],
   "source": [
    "from torchvision import datasets, transforms\n",
    "from torch.utils.data import DataLoader, Subset\n",
    "\n",
    "tfm = transforms.Compose([\n",
    "    transforms.ToTensor(),                                     # -> [0, 1]\n",
    "    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),    # -> ~[-1, 1]  (module contract!)\n",
    "])\n",
    "\n",
    "# The official CIFAR-10 server (cs.toronto.edu) is often slow — use a fast md5-verified mirror.\n",
    "# (In the Docker container the dataset is already baked in, so nothing downloads at all.)\n",
    "datasets.CIFAR10.url = \"https://data.brainchip.com/dataset-mirror/cifar10/cifar-10-python.tar.gz\"\n",
    "\n",
    "train_full = datasets.CIFAR10(DATA_DIR, train=True, download=True, transform=tfm)\n",
    "test_set   = datasets.CIFAR10(DATA_DIR, train=False, download=True, transform=tfm)\n",
    "classes = train_full.classes\n",
    "train_set = Subset(train_full, range(TRAIN_SUBSET))\n",
    "\n",
    "# num_workers=0: CIFAR-10 is small and already local, so one process is plenty,\n",
    "# and it avoids the harmless-but-noisy DataLoader worker-shutdown warnings in Jupyter.\n",
    "train_loader = DataLoader(train_set, batch_size=BATCH_SIZE, shuffle=True, num_workers=0)\n",
    "test_loader  = DataLoader(test_set, batch_size=256, shuffle=False, num_workers=0)\n",
    "print(\"classes:\", classes)\n",
    "print(f\"train images: {len(train_set):,}   test images: {len(test_set):,}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1efb1f2b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:56:02.253472Z",
     "iopub.status.busy": "2026-08-17T12:56:02.253196Z",
     "iopub.status.idle": "2026-08-17T12:56:02.571935Z",
     "shell.execute_reply": "2026-08-17T12:56:02.570754Z"
    }
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "fig, axes = plt.subplots(4, 8, figsize=(10, 6))\n",
    "for ax, idx in zip(axes.ravel(), range(32)):\n",
    "    img_t, label = train_full[idx]\n",
    "    ax.imshow((img_t * 0.5 + 0.5).permute(1, 2, 0))     # un-normalize: img*0.5+0.5 -> [0,1]\n",
    "    ax.set_title(classes[label], fontsize=8)\n",
    "    ax.axis(\"off\")\n",
    "fig.suptitle(\"CIFAR-10 — 32×32 color photos\")\n",
    "plt.tight_layout(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "40313e93",
   "metadata": {},
   "source": [
    "## 5. Build the detective\n",
    "\n",
    "Here's the blueprint: two **convolution blocks** to see, then two dense layers to decide.\n",
    "\n",
    "```\n",
    "Conv2d(3 → 32, 3×3, pad 1) → ReLU → MaxPool(2)      # 32×32 → 16×16\n",
    "Conv2d(32 → 64, 3×3, pad 1) → ReLU → MaxPool(2)     # 16×16 → 8×8\n",
    "Flatten → Linear(64·8·8 → 256) → ReLU → Dropout(0.3) → Linear(256 → 10)\n",
    "```\n",
    "\n",
    "`padding=1` keeps each conv the same width; `MaxPool2d(2)` halves it and keeps only the strongest response in each 2×2 patch. `Dropout` randomly silences 30% of neurons during training so the network can't over-rely on any single one — cheap insurance against memorizing.\n",
    "\n",
    "### 🧪 Exercise 3 — assemble the CNN\n",
    "\n",
    "Translate the blueprint into an `nn.Sequential`. Match the numbers exactly — the unlock at the end traces this shape."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "15038a9e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:56:02.573688Z",
     "iopub.status.busy": "2026-08-17T12:56:02.573446Z",
     "iopub.status.idle": "2026-08-17T12:56:02.984674Z",
     "shell.execute_reply": "2026-08-17T12:56:02.983496Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch.nn as nn\n",
    "\n",
    "# ==================== YOUR CODE HERE ====================\n",
    "...\n",
    "\n",
    "print(detective)\n",
    "\n",
    "# shape check: a fake batch of 4 images should come out (4, 10)\n",
    "_probe = detective(torch.zeros(4, 3, 32, 32, device=DEVICE))\n",
    "assert _probe.shape == (4, 10), \"The network should output 10 scores per image\"\n",
    "print(\"✅ shape check passed:\", tuple(_probe.shape))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "280abecd",
   "metadata": {},
   "source": [
    "### 🧪 Exercise 4 — count the cost\n",
    "\n",
    "Add up the detective's parameters and compare to that 1.5-million-weight *single* MLP layer from Section 1."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a0b03728",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:56:02.986309Z",
     "iopub.status.busy": "2026-08-17T12:56:02.986152Z",
     "iopub.status.idle": "2026-08-17T12:56:02.990556Z",
     "shell.execute_reply": "2026-08-17T12:56:02.989543Z"
    }
   },
   "outputs": [],
   "source": [
    "# ==================== YOUR CODE HERE ====================\n",
    "### HINT: sum(p.numel() for p in detective.parameters())\n",
    "...\n",
    "\n",
    "mlp_one_layer = 32 * 32 * 3 * 512 + 512\n",
    "print(f\"The whole detective:              {n_params:,} parameters\")\n",
    "print(f\"One dense 3072→512 layer alone:   {mlp_one_layer:,} parameters\")\n",
    "print(f\"Entire CNN smaller than that one layer? {n_params < mlp_one_layer}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e6038d4e",
   "metadata": {},
   "source": [
    "## 6. Train the detective\n",
    "\n",
    "Same five-step loop as Day 5 — you know this pattern cold now. We print the **test accuracy after every epoch** so you can watch it climb. On the Lab's GPU the full run takes a few minutes; grab water and watch the number go up."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a39356b5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:56:02.992121Z",
     "iopub.status.busy": "2026-08-17T12:56:02.991976Z",
     "iopub.status.idle": "2026-08-17T12:56:43.781391Z",
     "shell.execute_reply": "2026-08-17T12:56:43.779805Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch.nn as nn\n",
    "from tqdm.auto import tqdm\n",
    "\n",
    "def evaluate(model, loader):\n",
    "    model.eval()\n",
    "    correct = total = 0\n",
    "    with torch.no_grad():\n",
    "        for images, labels in loader:\n",
    "            preds = model(images.to(DEVICE)).argmax(1).cpu()\n",
    "            correct += (preds == labels).sum().item()\n",
    "            total += labels.size(0)\n",
    "    return correct / total\n",
    "\n",
    "loss_fn = nn.CrossEntropyLoss()\n",
    "optimizer = torch.optim.Adam(detective.parameters(), lr=LEARNING_RATE)\n",
    "\n",
    "for epoch in range(1, EPOCHS + 1):\n",
    "    detective.train()\n",
    "    running = 0.0\n",
    "    for images, labels in tqdm(train_loader, desc=f\"epoch {epoch}/{EPOCHS}\"):\n",
    "        images, labels = images.to(DEVICE), labels.to(DEVICE)\n",
    "        optimizer.zero_grad()\n",
    "        loss = loss_fn(detective(images), labels)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        running += loss.item() * images.size(0)\n",
    "    train_loss = running / len(train_loader.dataset)\n",
    "    test_acc = evaluate(detective, test_loader)\n",
    "    print(f\"epoch {epoch}: train loss {train_loss:.3f} | test accuracy {test_acc:.3f}\")\n",
    "\n",
    "if not SMOKE:\n",
    "    assert test_acc > 0.60, \"Expected > 60% after the full run — give it all 8 epochs on GPU\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f7cc3d56",
   "metadata": {},
   "source": [
    "### How good is 70%, really?\n",
    "\n",
    "If that number feels low, hold on. Random guessing across 10 classes is **10%** — your detective is already **7× better than chance**, learned from just 20,000 tiny images. Humans score about **94%** on CIFAR-10, and they've had years of practice.\n",
    "\n",
    "The gap is real, though, and tomorrow you'll close most of it with one trick. For now, look at *where* it goes wrong — that's where the story is."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc120d59",
   "metadata": {},
   "source": [
    "## 7. Where does it get confused?\n",
    "\n",
    "A **confusion matrix** counts, for every true class, what the network actually *guessed*. The diagonal is correct answers; bright spots off the diagonal are mix-ups.\n",
    "\n",
    "### 🧪 Exercise 5 — build the confusion matrix\n",
    "\n",
    "Loop over the test set and tally `cm[true, predicted] += 1` for each image."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "71a85085",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:56:43.783401Z",
     "iopub.status.busy": "2026-08-17T12:56:43.783238Z",
     "iopub.status.idle": "2026-08-17T12:56:45.377958Z",
     "shell.execute_reply": "2026-08-17T12:56:45.376748Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "detective.eval()\n",
    "cm = np.zeros((10, 10), dtype=int)\n",
    "with torch.no_grad():\n",
    "    for images, labels in test_loader:\n",
    "        preds = detective(images.to(DEVICE)).argmax(1).cpu().numpy()\n",
    "        # ==================== YOUR CODE HERE ====================\n",
    "        ### HINT: for each (true, pred) pair, do cm[true, pred] += 1\n",
    "        ...\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "sns.heatmap(cm, annot=True, fmt=\"d\", cmap=\"Blues\",\n",
    "            xticklabels=classes, yticklabels=classes)\n",
    "plt.xlabel(\"predicted class\"); plt.ylabel(\"true class\")\n",
    "plt.title(\"Confusion matrix — where the detective gets confused\")\n",
    "plt.tight_layout(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "829c3ae5",
   "metadata": {},
   "source": [
    "Look at the brightest off-diagonal cells. Almost always it's **cat ↔ dog** and **deer ↔ horse** — four-legged, furry, similar silhouettes once you shrink them to 32×32. Your network isn't making *random* mistakes; it's making the same ones a squinting human would. That's a sign it learned something real about shape and texture."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2d4b816d",
   "metadata": {},
   "source": [
    "## 8. See through the detective's eyes\n",
    "\n",
    "Two ways to peek inside. First, the **32 filters** its first layer learned — tiny 3×3 color patterns, the machine-designed cousins of your hand-built edge kernels. Second, the **feature maps**: what those filters light up on for a real image."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ad9829bb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:56:45.379904Z",
     "iopub.status.busy": "2026-08-17T12:56:45.379755Z",
     "iopub.status.idle": "2026-08-17T12:56:45.766987Z",
     "shell.execute_reply": "2026-08-17T12:56:45.765900Z"
    }
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# The 32 first-layer filters, shown as little color squares\n",
    "w = detective[0].weight.detach().cpu()          # shape (32, 3, 3, 3)\n",
    "w = (w - w.min()) / (w.max() - w.min())         # scale to [0,1] for display\n",
    "\n",
    "fig, axes = plt.subplots(4, 8, figsize=(9, 5))\n",
    "for ax, i in zip(axes.ravel(), range(32)):\n",
    "    ax.imshow(w[i].permute(1, 2, 0))            # (3,3,3) C,H,W -> H,W,C\n",
    "    ax.axis(\"off\")\n",
    "fig.suptitle(\"Layer 1 — the 32 tiny 3×3 filters the detective learned\")\n",
    "plt.tight_layout(); plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0c8ae583",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:56:45.768585Z",
     "iopub.status.busy": "2026-08-17T12:56:45.768441Z",
     "iopub.status.idle": "2026-08-17T12:56:45.940036Z",
     "shell.execute_reply": "2026-08-17T12:56:45.938935Z"
    }
   },
   "outputs": [],
   "source": [
    "# Feature maps: run one test image through just the first conv layer\n",
    "detective.eval()\n",
    "img_t, label = test_set[0]\n",
    "with torch.no_grad():\n",
    "    fmaps = detective[0](img_t.unsqueeze(0).to(DEVICE))[0].cpu()   # (32, 32, 32)\n",
    "\n",
    "fig, axes = plt.subplots(4, 8, figsize=(9, 5))\n",
    "for ax, i in zip(axes.ravel(), range(32)):\n",
    "    ax.imshow(fmaps[i], cmap=\"viridis\")\n",
    "    ax.axis(\"off\")\n",
    "fig.suptitle(f\"Feature maps of conv-1 for a '{classes[label]}' image\")\n",
    "plt.tight_layout(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3de4a32c",
   "metadata": {},
   "source": [
    "### 🧪 Exercise 6 — look at a different class\n",
    "\n",
    "Pick a class name (try `\"ship\"`, `\"frog\"`, or `\"airplane\"`), find the first test image of that class, and show conv-1's feature maps for it. Notice how a *different* set of the 32 maps lights up than for the previous image — same filters, different features triggered."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3e7966bb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:56:45.942129Z",
     "iopub.status.busy": "2026-08-17T12:56:45.941983Z",
     "iopub.status.idle": "2026-08-17T12:56:46.110014Z",
     "shell.execute_reply": "2026-08-17T12:56:46.108898Z"
    }
   },
   "outputs": [],
   "source": [
    "target_class = \"ship\"\n",
    "\n",
    "# ==================== YOUR CODE HERE ====================\n",
    "### HINT: scan test_set for the first image whose label name matches target_class\n",
    "...\n",
    "\n",
    "fig, axes = plt.subplots(4, 8, figsize=(9, 5))\n",
    "for ax, i in zip(axes.ravel(), range(32)):\n",
    "    ax.imshow(fmaps[i], cmap=\"viridis\")\n",
    "    ax.axis(\"off\")\n",
    "fig.suptitle(f\"Feature maps of conv-1 for a '{classes[label]}' image\")\n",
    "plt.tight_layout(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4341ccd5",
   "metadata": {},
   "source": [
    "## 9. Why train on a GPU?\n",
    "\n",
    "Convolutions are even hungrier than the plain matrix multiplies you timed on Day 5 — so a GPU pulls even further ahead. Let's time a few real training steps of the detective on each device.\n",
    "\n",
    "### 🧪 Exercise 7 — time a training step, GPU vs CPU\n",
    "\n",
    "Fill in the timed loop. The warm-up pass and `torch.cuda.synchronize()` are given — remember, a GPU runs *asynchronously*, so you must wait for it to finish before stopping the clock."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f76689d1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:56:46.112055Z",
     "iopub.status.busy": "2026-08-17T12:56:46.111917Z",
     "iopub.status.idle": "2026-08-17T12:56:48.074251Z",
     "shell.execute_reply": "2026-08-17T12:56:48.073088Z"
    }
   },
   "outputs": [],
   "source": [
    "import time\n",
    "import copy\n",
    "import torch.nn as nn\n",
    "\n",
    "loss_fn = nn.CrossEntropyLoss()\n",
    "images, labels = next(iter(train_loader))\n",
    "N_STEPS = 3 if SMOKE else 20\n",
    "\n",
    "def time_training_steps(model, imgs, lbls, n_steps):\n",
    "    opt = torch.optim.Adam(model.parameters(), lr=LEARNING_RATE)\n",
    "    model.train()\n",
    "    # warm-up (first pass builds kernels / caches)\n",
    "    loss_fn(model(imgs), lbls).backward()\n",
    "    if imgs.is_cuda:\n",
    "        torch.cuda.synchronize()\n",
    "    # ==================== YOUR CODE HERE ====================\n",
    "    ### HINT: time n_steps of (zero_grad, forward+loss, backward, step); synchronize if on GPU\n",
    "    ...\n",
    "\n",
    "cpu_model = copy.deepcopy(detective).cpu()\n",
    "cpu_t = time_training_steps(cpu_model, images.cpu(), labels.cpu(), N_STEPS)\n",
    "print(f\"CPU: {cpu_t * 1e3:8.1f} ms per training step\")\n",
    "\n",
    "if DEVICE.type == \"cuda\":\n",
    "    gpu_model = copy.deepcopy(detective).to(DEVICE)\n",
    "    gpu_t = time_training_steps(gpu_model, images.to(DEVICE), labels.to(DEVICE), N_STEPS)\n",
    "    print(f\"GPU: {gpu_t * 1e3:8.1f} ms per training step\")\n",
    "    print(f\"→ the GPU is {cpu_t / gpu_t:.1f}× faster at training this CNN\")\n",
    "else:\n",
    "    print(\"🐢 CPU only — on the Lab's GPU this step would be many times faster.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0943138f",
   "metadata": {},
   "source": [
    "## 10. Road test on real photos\n",
    "\n",
    "Your detective only ever saw 32×32 CIFAR images. What happens on a full-size photo from the wild? The helper below center-crops any image, shrinks it to the detective's tiny 32×32 world, normalizes it exactly like training, and shows you both what *you* see and what *it* sees."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9f91a276",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:56:48.075964Z",
     "iopub.status.busy": "2026-08-17T12:56:48.075815Z",
     "iopub.status.idle": "2026-08-17T12:56:48.294902Z",
     "shell.execute_reply": "2026-08-17T12:56:48.293782Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from PIL import Image\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.datasets import load_sample_image\n",
    "\n",
    "def road_test(pil_img, title):\n",
    "    im = pil_img.convert(\"RGB\")\n",
    "    side = min(im.size)                                  # square center-crop\n",
    "    left, top = (im.width - side) // 2, (im.height - side) // 2\n",
    "    im32 = im.crop((left, top, left + side, top + side)).resize((32, 32), Image.LANCZOS)\n",
    "\n",
    "    x = torch.from_numpy(np.asarray(im32, np.float32) / 255.0).permute(2, 0, 1).unsqueeze(0)\n",
    "    x = (x - 0.5) / 0.5                                  # the exact training normalization\n",
    "    detective.eval()\n",
    "    dev = next(detective.parameters()).device   # follow the model onto whatever device it is on\n",
    "    with torch.no_grad():\n",
    "        probs = torch.softmax(detective(x.to(dev))[0], dim=0)\n",
    "    top = int(probs.argmax())\n",
    "\n",
    "    fig, axes = plt.subplots(1, 2, figsize=(6, 3))\n",
    "    axes[0].imshow(im);   axes[0].set_title(title); axes[0].axis(\"off\")\n",
    "    axes[1].imshow(im32); axes[1].axis(\"off\")\n",
    "    axes[1].set_title(f\"detective sees 32×32\\n→ {classes[top]} ({float(probs[top]):.0%})\")\n",
    "    plt.tight_layout(); plt.show()\n",
    "\n",
    "road_test(Image.fromarray(load_sample_image(\"flower.jpg\")), \"flower.jpg\")\n",
    "road_test(Image.fromarray(load_sample_image(\"china.jpg\")), \"china.jpg\")\n",
    "road_test(Image.open(SAMPLES_DIR / \"rps_starter\" / \"rock\" / \"rock_01.jpg\"), \"your rock ✊\")\n",
    "road_test(Image.open(SAMPLES_DIR / \"rps_starter\" / \"scissors\" / \"scissors_01.jpg\"), \"your scissors ✌️\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "27bb80d5",
   "metadata": {},
   "source": [
    "### The honest limits\n",
    "\n",
    "On the flower and the landscape, the detective does its best to squeeze them into its 10 boxes. But your **hand** photos? It has no \"hand\" class — it was never taught one — so it is *forced* to shout \"cat!\" or \"bird!\" with total confidence.\n",
    "\n",
    "That's not a bug; it's the deal you made when you trained on only 10 classes and 20,000 tiny images. **Tomorrow you'll fix exactly this**, by borrowing a network that has already seen over a million photos of a thousand kinds of things."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d413827f",
   "metadata": {},
   "source": [
    "## 11. The Photo Detective mini-app\n",
    "\n",
    "Same preprocessing, wrapped in a little upload-and-investigate interface — a preview of the Studio tab you're about to unlock."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fd1a8979",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:56:48.296832Z",
     "iopub.status.busy": "2026-08-17T12:56:48.296654Z",
     "iopub.status.idle": "2026-08-17T12:56:50.198003Z",
     "shell.execute_reply": "2026-08-17T12:56:50.196573Z"
    }
   },
   "outputs": [],
   "source": [
    "import gradio as gr\n",
    "\n",
    "detective.eval()\n",
    "\n",
    "def investigate(img):\n",
    "    if img is None:\n",
    "        return {}, None\n",
    "    im = Image.fromarray(img).convert(\"RGB\")\n",
    "    side = min(im.size)\n",
    "    left, top = (im.width - side) // 2, (im.height - side) // 2\n",
    "    im32 = im.crop((left, top, left + side, top + side)).resize((32, 32), Image.LANCZOS)\n",
    "    x = torch.from_numpy(np.asarray(im32, np.float32) / 255.0).permute(2, 0, 1).unsqueeze(0)\n",
    "    x = (x - 0.5) / 0.5\n",
    "    dev = next(detective.parameters()).device   # follow the model onto whatever device it is on\n",
    "    with torch.no_grad():\n",
    "        probs = torch.softmax(detective(x.to(dev))[0], dim=0)\n",
    "    preview = np.kron(np.asarray(im32), np.ones((8, 8, 1), np.uint8))\n",
    "    return {c: float(p) for c, p in zip(classes, probs)}, preview\n",
    "\n",
    "with gr.Blocks() as demo:\n",
    "    gr.Markdown(\"## 🕵️ Photo Detective — upload a photo of one of the 10 classes\")\n",
    "    with gr.Row():\n",
    "        inp = gr.Image(type=\"numpy\", label=\"Evidence (your photo)\")\n",
    "        with gr.Column():\n",
    "            out = gr.Label(num_top_classes=5, label=\"Verdict\")\n",
    "            seen = gr.Image(label=\"What the detective sees (32×32)\", height=200)\n",
    "    inp.change(investigate, inp, [out, seen])\n",
    "\n",
    "if not SMOKE:\n",
    "    demo.launch(share=IN_COLAB)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "919d11ff",
   "metadata": {},
   "source": [
    "## 🔓 Unlock your Studio module\n",
    "\n",
    "Ship it. We export the trained CNN as **TorchScript**, plus a small JSON file listing the 10 class names so the Studio knows what each output means. The input contract: a `(1, 3, 32, 32)` tensor, normalized with `(x − 0.5) / 0.5` — exactly what your `road_test` helper produced."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1aa53ebb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-17T12:56:50.199982Z",
     "iopub.status.busy": "2026-08-17T12:56:50.199805Z",
     "iopub.status.idle": "2026-08-17T12:56:50.522333Z",
     "shell.execute_reply": "2026-08-17T12:56:50.521140Z"
    }
   },
   "outputs": [],
   "source": [
    "import json\n",
    "\n",
    "REQUIRED_FILES = [\"photo_detective.pt\", \"photo_detective_classes.json\"]\n",
    "\n",
    "detective.eval()\n",
    "example = torch.zeros(1, 3, 32, 32)                  # input contract: (1,3,32,32), normalized\n",
    "scripted = torch.jit.trace(detective.cpu(), example)  # trace on CPU; the Studio runs on CPU\n",
    "scripted.save(str(MODELS_DIR / \"photo_detective.pt\"))\n",
    "detective.to(DEVICE)                                  # put the live model back on its device\n",
    "\n",
    "(MODELS_DIR / \"photo_detective_classes.json\").write_text(\n",
    "    json.dumps(list(classes)), encoding=\"utf-8\")\n",
    "\n",
    "missing = [f for f in REQUIRED_FILES if not (MODELS_DIR / f).exists()]\n",
    "assert not missing, f\"Something didn't save: {missing}\"\n",
    "print(\"🔓 UNLOCKED: Photo Detective! Run the Studio to see it live:\")\n",
    "print(\"   python ai_studio/app.py   (from the repo root)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0a0e78d3",
   "metadata": {},
   "source": [
    "## 🏁 Checkpoint\n",
    "\n",
    "Today you gave a network eyes:\n",
    "\n",
    "- ✅ Saw why flattening a photo throws away everything that matters\n",
    "- ✅ Built edge and blur **convolutions** by hand with `F.conv2d`\n",
    "- ✅ Trained a **CNN** on CIFAR-10 to roughly **7× better than guessing**\n",
    "- ✅ Read a **confusion matrix** and visualized the filters it learned\n",
    "- 🔓 Unlocked **Photo Detective** in your AI Studio\n",
    "\n",
    "Your detective learned from just 20,000 tiny images. That's why it tops out around 70% — and why a photo of your hand comes back as \"cat.\"\n",
    "\n",
    "**Tomorrow — Day 7, \"Standing on Giants\":** 36 photos could never train a great network from scratch. So you won't. You'll **borrow 1.2 million photos' worth of experience** from a network trained on ImageNet and fine-tune it on rock-paper-scissors in minutes. It's the shortcut the pros actually use. 🪨📄✂️"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2bd7f163",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "<div align=\"center\" style=\"background:#14161E;border-radius:12px;padding:18px 12px 14px;margin-top:6px\">\n",
    "  <a href=\"https://ahalimi.com\" target=\"_blank\">\n",
    "    <img src=\"data:image/webp;base64,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\" alt=\"Dr. Abdelghafour HALIMI\" width=\"260\"/>\n",
    "  </a>\n",
    "</div>\n",
    "\n",
    "<div align=\"center\" style=\"text-align:center;margin-top:8px\"><sub>The Lab · AI Studio — Intro to AI · © 2026 <b>Dr. Abdelghafour HALIMI</b> · <a href=\"https://ahalimi.com\">ahalimi.com</a> · All rights reserved.</sub></div>"
   ]
  }
 ],
 "metadata": {
  "authors": [
   {
    "name": "Dr. Abdelghafour HALIMI"
   }
  ],
  "copyright": "© 2026 Dr. Abdelghafour HALIMI · ahalimi.com · All rights reserved",
  "kernelspec": {
   "display_name": "Python 3",
   "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.12.3"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "023f8b35c5c040c987a9e53c86521ed6": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "0445f1095e194c8f941403cde49f1d35": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "05dc80d035304c09bbc5920e7405619f": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "0ab115ead4824baa96ad1e077fe6fdb6": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "0b4dad765e8a4d89a3df9bc1932c1a63": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_023f8b35c5c040c987a9e53c86521ed6",
       "placeholder": "​",
       "style": "IPY_MODEL_2417308cd0744de5ac830f0f8e2cb49c",
       "tabbable": null,
       "tooltip": null,
       "value": " 157/157 [00:03&lt;00:00, 42.08it/s]"
      }
     },
     "0e3365441a2b4f5da7d27ba7c7d74c0d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_6e0850cdb2ba4a2c9d9deac8b411286d",
       "placeholder": "​",
       "style": "IPY_MODEL_287c04e29f3048df9a4b5bfe8728f4f3",
       "tabbable": null,
       "tooltip": null,
       "value": "epoch 5/8: 100%"
      }
     },
     "0e81156c06094d75a1ae2850d01d5515": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "0ee34cb6be3c452c91bdf403564fdd6a": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "0f21d990c6f84700a55980c71b15670e": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "11ff4df95a50411a992d94a39d8edf78": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "12bc3d99874c4310848b28a2dc0e1a1c": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "187ab011f4834a0185a919e6fb72c0ce": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "19878079fd5345839d876ea93d939618": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "1db3d83ac54f4f8383b1c08ce55a1848": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "1ed1ee077cff4378849051eb32956e8b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_63516cf828ea4b3fbb442ee3bfbb75a2",
        "IPY_MODEL_f7911f3960ad48ce85ce15db2dc57020",
        "IPY_MODEL_59d7aa8e85854a73a7e979d3ae3175a7"
       ],
       "layout": "IPY_MODEL_0ee34cb6be3c452c91bdf403564fdd6a",
       "tabbable": null,
       "tooltip": null
      }
     },
     "23371de63f7e4a54b0edafb8bcb4957c": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "2417308cd0744de5ac830f0f8e2cb49c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "284531189488420a8d4fc23409287606": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "287c04e29f3048df9a4b5bfe8728f4f3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "2b1a55db867440d1a368a5609688dfad": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "2db48289f992487597968e5f7291b2e1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_feca8e79f5bd474c91a3f0cae817ad1b",
       "max": 157,
       "min": 0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_44d915e25bcb4df0a8897a7d944040eb",
       "tabbable": null,
       "tooltip": null,
       "value": 157
      }
     },
     "31d78e770d7349c29890e552459fc39d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_a86c9e9bcbbe45f1aa8572bff4a6f135",
        "IPY_MODEL_f30fad5eff5c41f490b771cf47b3a88b",
        "IPY_MODEL_5db4e5ec773a464e975e5dce94149699"
       ],
       "layout": "IPY_MODEL_38818fc5064c4296a72bde71242b6572",
       "tabbable": null,
       "tooltip": null
      }
     },
     "329a17fd17744d8db1c5fbae4320d938": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_0f21d990c6f84700a55980c71b15670e",
       "placeholder": "​",
       "style": "IPY_MODEL_40a95d7299d84ca98187f3f7d4720a21",
       "tabbable": null,
       "tooltip": null,
       "value": "epoch 7/8: 100%"
      }
     },
     "381ac43a9dee412b8721e79162d6262a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "38818fc5064c4296a72bde71242b6572": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "39a775bc82624e2b9eb26c060073602e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "3e1e9d6f07f242948493e98a3908334c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "40a95d7299d84ca98187f3f7d4720a21": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "42162c666fb5411d9de3ae492f0bd915": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_0e3365441a2b4f5da7d27ba7c7d74c0d",
        "IPY_MODEL_d17fe87bfd32493abf9ce3a90a746de4",
        "IPY_MODEL_8fc434efb7b8441497266f83ac180bb8"
       ],
       "layout": "IPY_MODEL_6db3a05e157a44e1be35b84a83c02eaf",
       "tabbable": null,
       "tooltip": null
      }
     },
     "435e20b70d2e46ad83f4237bb0a09167": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "44d915e25bcb4df0a8897a7d944040eb": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "47e262efd3b745c3b9e58848b9ebddda": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_a3e8b3988c87455cb4654369280a0bd4",
       "max": 157,
       "min": 0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_fba8ee2432e74bf0bf79f84bc58e02d4",
       "tabbable": null,
       "tooltip": null,
       "value": 157
      }
     },
     "4c1c4ddf02c2482684c8d24b2474d1b4": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "4c2b1f915fd24256860219b5b51960e3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_95ab58dff1a7436ca685be932133b46c",
        "IPY_MODEL_5fdfb6518a1345f987cc2ab286864fdc",
        "IPY_MODEL_c3f805f1fac743fcaac86caf4d495ad1"
       ],
       "layout": "IPY_MODEL_187ab011f4834a0185a919e6fb72c0ce",
       "tabbable": null,
       "tooltip": null
      }
     },
     "4c5a8cf76bbe46918ad781a21471dad8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "51da0dd9b4d04ede9a3bd914a913cc93": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_23371de63f7e4a54b0edafb8bcb4957c",
       "placeholder": "​",
       "style": "IPY_MODEL_3e1e9d6f07f242948493e98a3908334c",
       "tabbable": null,
       "tooltip": null,
       "value": " 157/157 [00:03&lt;00:00, 44.03it/s]"
      }
     },
     "5256a4a1507e48aa9b7f3135edd5341a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "546f4624d3f14ba1a691be2be80f9fa5": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_a03ddc1a781948998703610bf990488c",
        "IPY_MODEL_8e5ce8efce07487d8c7cf4129b8d6b62",
        "IPY_MODEL_51da0dd9b4d04ede9a3bd914a913cc93"
       ],
       "layout": "IPY_MODEL_05dc80d035304c09bbc5920e7405619f",
       "tabbable": null,
       "tooltip": null
      }
     },
     "5688e127bc5048349e4c0e508c3498e4": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "59d7aa8e85854a73a7e979d3ae3175a7": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_ac67e5d8a1ae4f959d91d65337eb691d",
       "placeholder": "​",
       "style": "IPY_MODEL_fe97b9c9e0b54a75a4247fa21706f6c1",
       "tabbable": null,
       "tooltip": null,
       "value": " 157/157 [00:05&lt;00:00, 42.89it/s]"
      }
     },
     "5db4e5ec773a464e975e5dce94149699": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_f3cf80b6c7fd483bab668c9732acacde",
       "placeholder": "​",
       "style": "IPY_MODEL_5256a4a1507e48aa9b7f3135edd5341a",
       "tabbable": null,
       "tooltip": null,
       "value": " 157/157 [00:03&lt;00:00, 43.69it/s]"
      }
     },
     "5fdfb6518a1345f987cc2ab286864fdc": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_1db3d83ac54f4f8383b1c08ce55a1848",
       "max": 157,
       "min": 0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_682dea562c1b4e7b83373e69daab5de9",
       "tabbable": null,
       "tooltip": null,
       "value": 157
      }
     },
     "63516cf828ea4b3fbb442ee3bfbb75a2": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_c256c7a108c544ba8a12f5c349185a62",
       "placeholder": "​",
       "style": "IPY_MODEL_cd906d32e1154a09a85dc64e6fd028fd",
       "tabbable": null,
       "tooltip": null,
       "value": "epoch 6/8: 100%"
      }
     },
     "682dea562c1b4e7b83373e69daab5de9": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "682ef37b005f4eac859fa6cb5039d5f5": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "6db3a05e157a44e1be35b84a83c02eaf": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "6e0850cdb2ba4a2c9d9deac8b411286d": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "74e9a8df1dcf497cbc3881479fa78025": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "7d7f003d16044462998ad0162ef3b139": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "80e5df71ca73465dab76942c3a57ec21": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "846883cf7ee54aa48c4159dd97dd0fd4": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "84e9070825aa4d178e1aefd34c693919": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "8ac38f77e67647e780619de8c62cb24e": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "8e5ce8efce07487d8c7cf4129b8d6b62": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_435e20b70d2e46ad83f4237bb0a09167",
       "max": 157,
       "min": 0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_eb5e75830cb24be3b53916c52f0a2d25",
       "tabbable": null,
       "tooltip": null,
       "value": 157
      }
     },
     "8fc434efb7b8441497266f83ac180bb8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_5688e127bc5048349e4c0e508c3498e4",
       "placeholder": "​",
       "style": "IPY_MODEL_d82f3effad7f4962909a596a85563a58",
       "tabbable": null,
       "tooltip": null,
       "value": " 157/157 [00:03&lt;00:00, 43.67it/s]"
      }
     },
     "9160df6b4c6c4d049571cfe7cab6c0be": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "95ab58dff1a7436ca685be932133b46c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_a09d1e7524744328a3e565b5ed653e3d",
       "placeholder": "​",
       "style": "IPY_MODEL_0e81156c06094d75a1ae2850d01d5515",
       "tabbable": null,
       "tooltip": null,
       "value": "epoch 2/8: 100%"
      }
     },
     "9e4d02eba18e45a9bfa34cc9d415812b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_fb741573331a44bc866e77821aa1c6d2",
       "placeholder": "​",
       "style": "IPY_MODEL_d485f20e28a949e19a4eb66a5260996b",
       "tabbable": null,
       "tooltip": null,
       "value": "epoch 8/8: 100%"
      }
     },
     "a03ddc1a781948998703610bf990488c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_7d7f003d16044462998ad0162ef3b139",
       "placeholder": "​",
       "style": "IPY_MODEL_19878079fd5345839d876ea93d939618",
       "tabbable": null,
       "tooltip": null,
       "value": "epoch 4/8: 100%"
      }
     },
     "a09d1e7524744328a3e565b5ed653e3d": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "a3e8b3988c87455cb4654369280a0bd4": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "a7a895908568472eb3fc7d7d4a013eab": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_cbe37e34221c47b699971baa60b8b290",
        "IPY_MODEL_47e262efd3b745c3b9e58848b9ebddda",
        "IPY_MODEL_c454180939bd49d5bd5a59111c02c131"
       ],
       "layout": "IPY_MODEL_12bc3d99874c4310848b28a2dc0e1a1c",
       "tabbable": null,
       "tooltip": null
      }
     },
     "a86c9e9bcbbe45f1aa8572bff4a6f135": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_4c5a8cf76bbe46918ad781a21471dad8",
       "placeholder": "​",
       "style": "IPY_MODEL_4c1c4ddf02c2482684c8d24b2474d1b4",
       "tabbable": null,
       "tooltip": null,
       "value": "epoch 3/8: 100%"
      }
     },
     "ac67e5d8a1ae4f959d91d65337eb691d": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "bd2d6620aee747909351b622a29e4805": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_9e4d02eba18e45a9bfa34cc9d415812b",
        "IPY_MODEL_de878d5ebc924aab86f9c13ff7b8cbff",
        "IPY_MODEL_0b4dad765e8a4d89a3df9bc1932c1a63"
       ],
       "layout": "IPY_MODEL_11ff4df95a50411a992d94a39d8edf78",
       "tabbable": null,
       "tooltip": null
      }
     },
     "bfddec0a77b54da097012e11692af7f7": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "c0492f40233b41bcad62a6d0d751723b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "c256c7a108c544ba8a12f5c349185a62": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "c2ff9b1d81c3400d9ac0424d0d19b2f2": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "c3f805f1fac743fcaac86caf4d495ad1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_8ac38f77e67647e780619de8c62cb24e",
       "placeholder": "​",
       "style": "IPY_MODEL_9160df6b4c6c4d049571cfe7cab6c0be",
       "tabbable": null,
       "tooltip": null,
       "value": " 157/157 [00:03&lt;00:00, 49.80it/s]"
      }
     },
     "c454180939bd49d5bd5a59111c02c131": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_284531189488420a8d4fc23409287606",
       "placeholder": "​",
       "style": "IPY_MODEL_381ac43a9dee412b8721e79162d6262a",
       "tabbable": null,
       "tooltip": null,
       "value": " 157/157 [00:03&lt;00:00, 52.66it/s]"
      }
     },
     "c8ee25f90adf4beb95e36ee267f9b31a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_80e5df71ca73465dab76942c3a57ec21",
       "placeholder": "​",
       "style": "IPY_MODEL_c0492f40233b41bcad62a6d0d751723b",
       "tabbable": null,
       "tooltip": null,
       "value": " 157/157 [00:03&lt;00:00, 41.70it/s]"
      }
     },
     "cbe37e34221c47b699971baa60b8b290": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_d67410fcff6445c388363cd52771caf4",
       "placeholder": "​",
       "style": "IPY_MODEL_39a775bc82624e2b9eb26c060073602e",
       "tabbable": null,
       "tooltip": null,
       "value": "epoch 1/8: 100%"
      }
     },
     "cd906d32e1154a09a85dc64e6fd028fd": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "d17fe87bfd32493abf9ce3a90a746de4": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_682ef37b005f4eac859fa6cb5039d5f5",
       "max": 157,
       "min": 0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_84e9070825aa4d178e1aefd34c693919",
       "tabbable": null,
       "tooltip": null,
       "value": 157
      }
     },
     "d485f20e28a949e19a4eb66a5260996b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "d67410fcff6445c388363cd52771caf4": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "d82f3effad7f4962909a596a85563a58": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "de878d5ebc924aab86f9c13ff7b8cbff": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_846883cf7ee54aa48c4159dd97dd0fd4",
       "max": 157,
       "min": 0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_74e9a8df1dcf497cbc3881479fa78025",
       "tabbable": null,
       "tooltip": null,
       "value": 157
      }
     },
     "eb5e75830cb24be3b53916c52f0a2d25": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "f30fad5eff5c41f490b771cf47b3a88b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_0445f1095e194c8f941403cde49f1d35",
       "max": 157,
       "min": 0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_0ab115ead4824baa96ad1e077fe6fdb6",
       "tabbable": null,
       "tooltip": null,
       "value": 157
      }
     },
     "f3cf80b6c7fd483bab668c9732acacde": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "f7911f3960ad48ce85ce15db2dc57020": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "",
       "description_allow_html": false,
       "layout": "IPY_MODEL_c2ff9b1d81c3400d9ac0424d0d19b2f2",
       "max": 157,
       "min": 0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_2b1a55db867440d1a368a5609688dfad",
       "tabbable": null,
       "tooltip": null,
       "value": 157
      }
     },
     "f8979d4dd39448b9adb35d5c52e51254": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "2.0.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_329a17fd17744d8db1c5fbae4320d938",
        "IPY_MODEL_2db48289f992487597968e5f7291b2e1",
        "IPY_MODEL_c8ee25f90adf4beb95e36ee267f9b31a"
       ],
       "layout": "IPY_MODEL_bfddec0a77b54da097012e11692af7f7",
       "tabbable": null,
       "tooltip": null
      }
     },
     "fb741573331a44bc866e77821aa1c6d2": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "fba8ee2432e74bf0bf79f84bc58e02d4": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": ""
      }
     },
     "fe97b9c9e0b54a75a4247fa21706f6c1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "2.0.0",
       "_model_name": "HTMLStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "StyleView",
       "background": null,
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "feca8e79f5bd474c91a3f0cae817ad1b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": 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,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
