{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "da7e553f", "metadata": {}, "outputs": [], "source": [ "#| default_exp datasets" ] }, { "cell_type": "code", "execution_count": null, "id": "3a5b2d33", "metadata": {}, "outputs": [], "source": [ "#|export\n", "from __future__ import annotations\n", "import math,numpy as np,matplotlib.pyplot as plt\n", "from operator import itemgetter\n", "from itertools import zip_longest\n", "import fastcore.all as fc\n", "\n", "from torch.utils.data import default_collate\n", "\n", "from miniai.training import *" ] }, { "cell_type": "code", "execution_count": null, "id": "579a712f", "metadata": {}, "outputs": [], "source": [ "import logging,pickle,gzip,os,time,shutil,torch,matplotlib as mpl\n", "from pathlib import Path\n", "\n", "from torch import tensor,nn,optim\n", "from torch.utils.data import DataLoader\n", "import torch.nn.functional as F\n", "from datasets import load_dataset,load_dataset_builder\n", "\n", "import torchvision.transforms.functional as TF\n", "from fastcore.test import test_close" ] }, { "cell_type": "code", "execution_count": null, "id": "45dc4dc7", "metadata": {}, "outputs": [], "source": [ "torch.set_printoptions(precision=2, linewidth=140, sci_mode=False)\n", "torch.manual_seed(1)\n", "mpl.rcParams['image.cmap'] = 'gray'" ] }, { "cell_type": "code", "execution_count": null, "id": "84a947f2", "metadata": {}, "outputs": [], "source": [ "logging.disable(logging.WARNING)" ] }, { "cell_type": "markdown", "id": "d47ef9d3", "metadata": {}, "source": [ "## Hugging Face Datasets" ] }, { "cell_type": "code", "execution_count": null, "id": "95ce04f5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fashion-MNIST is a dataset of Zalando's article images—consisting of a training set of\n", "60,000 examples and a test set of 10,000 examples. Each example is a 28x28 grayscale image,\n", "associated with a label from 10 classes. We intend Fashion-MNIST to serve as a direct drop-in\n", "replacement for the original MNIST dataset for benchmarking machine learning algorithms.\n", "It shares the same image size and structure of training and testing splits.\n", "\n" ] } ], "source": [ "name = \"fashion_mnist\"\n", "ds_builder = load_dataset_builder(name)\n", "print(ds_builder.info.description)" ] }, { "cell_type": "code", "execution_count": null, "id": "7b8e6589", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'image': Image(decode=True, id=None),\n", " 'label': ClassLabel(num_classes=10, names=['T - shirt / top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'], id=None)}" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ds_builder.info.features" ] }, { "cell_type": "code", "execution_count": null, "id": "1671912b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'train': SplitInfo(name='train', num_bytes=31296607, num_examples=60000, dataset_name='fashion_mnist'),\n", " 'test': SplitInfo(name='test', num_bytes=5233810, num_examples=10000, dataset_name='fashion_mnist')}" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ds_builder.info.splits" ] }, { "cell_type": "code", "execution_count": null, "id": "eacdc83c", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8f650bdfaf8447e1b73fa0ae909d389f", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/2 [00:00,\n", " 'label': 9}" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train,test = dsd['train'],dsd['test']\n", "train[0]" ] }, { "cell_type": "code", "execution_count": null, "id": "bebfe2a9", "metadata": {}, "outputs": [], "source": [ "x,y = ds_builder.info.features" ] }, { "cell_type": "code", "execution_count": null, "id": "2ef65b83", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('image', 'label')" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x,y" ] }, { "cell_type": "code", "execution_count": null, "id": "4c7b6fcc", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACBUlEQVR4nLXSz0tUURQH8O+597373rx545g6NmNJY6TlJgozEsKFZGCrkDBoVdGmdf9BiwJ3bVr1PwhBUbQfJQcKjWZRTsjo0KDpDPV+eN+997WK0Z2bvtsPfM+Bc4D/HwJycwBZAEAE6zAyfe5RFMQfFYiRAj+CXM/c2HK82VetVMM34RGUmCxz9v7yYnW9dnWyskyHR6azi72Jwep3ScVk9c7LLhKQrpRBSiI2n76puZFT3doUwH4pcmw/zpjrU2zw3dFt4XEWdvbKhpinzTBYt5bDH4qlLYO8cbKBWHOudDHluFtiLrLD0kmM2//6q9VFS+JLLDxv9GzMPV9v3XuzYgHEGSUGCngbRCLd4W6CxPCLHTDwVMkDA0y/qEa/lFFBoF2EEME8CAD6hsZK8+djlmSatuiXXsWfNh27NU6Yelro1bytPElRbaGaO1FGPfc7zPg9HvHlIaVD8AjID9y/+bgZ/6iP9ks7J/QZevh8w/cd2PlGs8CKt92R7MQEk0yA7GtWq9ETN3zRs7fpR7FaWi/3yXaipW1IjFnbaSM70N7dsRzbzbHd8aCx7+wmKskUO5esz0sPmvXYF67gBzoNfxptxb5stxM10iLg1pOTO23NhcUptW1hE6gFYYprC8QMMPNsMM+4pamVbps/HGkSsg+1Cv4d+0Jh//Sm3DjGix4rfwFoJNh2/0cDFgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x,y = 'image','label'\n", "img = train[0][x]\n", "img" ] }, { "cell_type": "code", "execution_count": null, "id": "3db1778b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[9, 0, 0, 3, 0]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xb = train[:5][x]\n", "yb = train[:5][y]\n", "yb" ] }, { "cell_type": "code", "execution_count": null, "id": "e54b5bcc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ClassLabel(num_classes=10, names=['T - shirt / top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'], id=None)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "featy = train.features[y]\n", "featy" ] }, { "cell_type": "code", "execution_count": null, "id": "fcef590a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Ankle boot',\n", " 'T - shirt / top',\n", " 'T - shirt / top',\n", " 'Dress',\n", " 'T - shirt / top']" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "featy.int2str(yb)" ] }, { "cell_type": "code", "execution_count": null, "id": "953cac0f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[9, 0, 0, 3, 0]" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train['label'][:5]" ] }, { "cell_type": "code", "execution_count": null, "id": "6b8790b8", "metadata": {}, "outputs": [], "source": [ "def collate_fn(b):\n", " return {x:torch.stack([TF.to_tensor(o[x]) for o in b]),\n", " y:tensor([o[y] for o in b])}" ] }, { "cell_type": "code", "execution_count": null, "id": "36b7be22", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(torch.Size([16, 1, 28, 28]),\n", " tensor([9, 0, 0, 3, 0, 2, 7, 2, 5, 5, 0, 9, 5, 5, 7, 9]))" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dl = DataLoader(train, collate_fn=collate_fn, batch_size=16)\n", "b = next(iter(dl))\n", "b[x].shape,b[y]" ] }, { "cell_type": "code", "execution_count": null, "id": "45a6c6b4", "metadata": {}, "outputs": [], "source": [ "def transforms(b):\n", " b[x] = [TF.to_tensor(o) for o in b[x]]\n", " return b" ] }, { "cell_type": "code", "execution_count": null, "id": "7ce1985b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(torch.Size([16, 1, 28, 28]),\n", " tensor([9, 0, 0, 3, 0, 2, 7, 2, 5, 5, 0, 9, 5, 5, 7, 9]))" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tds = train.with_transform(transforms)\n", "dl = DataLoader(tds, batch_size=16)\n", "b = next(iter(dl))\n", "b[x].shape,b[y]" ] }, { "cell_type": "code", "execution_count": null, "id": "1ad7ecde", "metadata": {}, "outputs": [], "source": [ "def _transformi(b): b[x] = [torch.flatten(TF.to_tensor(o)) for o in b[x]]" ] }, { "cell_type": "code", "execution_count": null, "id": "54cfb4a8", "metadata": {}, "outputs": [], "source": [ "#|export\n", "def inplace(f):\n", " def _f(b):\n", " f(b)\n", " return b\n", " return _f" ] }, { "cell_type": "code", "execution_count": null, "id": "8ffe8f17", "metadata": {}, "outputs": [], "source": [ "transformi = inplace(_transformi)" ] }, { "cell_type": "code", "execution_count": null, "id": "f8b1248f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(torch.Size([784]), 9)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r = train.with_transform(transformi)[0]\n", "r[x].shape,r[y]" ] }, { "cell_type": "code", "execution_count": null, "id": "d6e8c480", "metadata": {}, "outputs": [], "source": [ "@inplace\n", "def transformi(b): b[x] = [torch.flatten(TF.to_tensor(o)) for o in b[x]]" ] }, { "cell_type": "code", "execution_count": null, "id": "07367168", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(torch.Size([784]), 9)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tdsf = train.with_transform(transformi)\n", "r = tdsf[0]\n", "r[x].shape,r[y]" ] }, { "cell_type": "code", "execution_count": null, "id": "42cd1354", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1, 3)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d = dict(a=1,b=2,c=3)\n", "ig = itemgetter('a','c')\n", "ig(d)" ] }, { "cell_type": "code", "execution_count": null, "id": "3c2e0bd6", "metadata": {}, "outputs": [], "source": [ "class D:\n", " def __getitem__(self, k): return 1 if k=='a' else 2 if k=='b' else 3" ] }, { "cell_type": "code", "execution_count": null, "id": "105f8d6f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1, 3)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d = D()\n", "ig(d)" ] }, { "cell_type": "code", "execution_count": null, "id": "9dd178af", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['image', 'label']" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(tdsf.features)" ] }, { "cell_type": "code", "execution_count": null, "id": "838cbf23", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'a': [tensor([1, 3])], 'b': [tensor([2, 4])]}" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "batch = dict(a=[1],b=[2]), dict(a=[3],b=[4])\n", "default_collate(batch)" ] }, { "cell_type": "code", "execution_count": null, "id": "150eb14f", "metadata": {}, "outputs": [], "source": [ "#|export\n", "def collate_dict(ds):\n", " get = itemgetter(*ds.features)\n", " def _f(b): return get(default_collate(b))\n", " return _f" ] }, { "cell_type": "code", "execution_count": null, "id": "383173e9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(torch.Size([4]), [9, 0, 0, 3, 0])" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dlf = DataLoader(tdsf, batch_size=4, collate_fn=collate_dict(tdsf))\n", "xb,yb = next(iter(dlf))\n", "xb.shape,yb" ] }, { "cell_type": "markdown", "id": "8f0277c6", "metadata": {}, "source": [ "## Plotting images" ] }, { "cell_type": "code", "execution_count": null, "id": "e9710424", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD4CAYAAAAq5pAIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAR1UlEQVR4nO3dbYyV5ZkH8P9fXlRe5EVEhpcIVoxsNi6sIxpBU60Q9INQtVg+NBh1aUxN2qQma9wPNfGDRLdt9gNpMlVTunZtmhQixrcS0sRuwMpIWECmrYBYBsYBBIHhbRi49sM8mCnOc13jec45z5H7/0vIzJxr7nPuc878OWfmeu7npplBRC5+l5Q9ARGpD4VdJBEKu0giFHaRRCjsIokYXM8bI6k//YvUmJmxv8sLvbKTXEDyryR3kHyqyHWJSG2x0j47yUEA/gZgHoB2ABsBLDGz7c4YvbKL1FgtXtlnA9hhZrvMrBvAbwEsLHB9IlJDRcI+CcCePl+3Z5f9A5LLSLaSbC1wWyJSUJE/0PX3VuFLb9PNrAVAC6C38SJlKvLK3g5gSp+vJwPYV2w6IlIrRcK+EcB0ktNIDgXwXQBrqjMtEam2it/Gm1kPyScAvANgEICXzezDqs1MRKqq4tZbRTem39lFaq4mB9WIyNeHwi6SCIVdJBEKu0giFHaRRCjsIolQ2EUSobCLJEJhF0mEwi6SCIVdJBEKu0giFHaRRNT1VNJSf2S/C6C+UHTV48iRI9363Llzc2tvvfVWoduO7tugQYNyaz09PYVuu6ho7p5KnzO9soskQmEXSYTCLpIIhV0kEQq7SCIUdpFEKOwiiVCf/SJ3ySX+/+dnz55169ddd51bf+yxx9z6yZMnc2vHjx93x546dcqtv//++269SC896oNHj2s0vsjcvOMHvOdTr+wiiVDYRRKhsIskQmEXSYTCLpIIhV0kEQq7SCLUZ7/IeT1ZIO6z33XXXW797rvvduvt7e25tUsvvdQdO2zYMLc+b948t/7iiy/m1jo7O92x0Zrx6HGLjBgxIrd27tw5d+yJEycqus1CYSe5G8AxAGcB9JhZc5HrE5HaqcYr+51mdrAK1yMiNaTf2UUSUTTsBuAPJD8guay/byC5jGQrydaCtyUiBRR9Gz/HzPaRHA9gLcm/mNm7fb/BzFoAtAAAyWJnNxSRihV6ZTezfdnH/QBWA5hdjUmJSPVVHHaSw0mOPP85gPkAtlVrYiJSXUXexl8NYHW2bncwgP8xs7erMiupmu7u7kLjb775Zrc+depUt+71+aM14e+8845bnzVrllt//vnnc2utrf6fkLZu3erW29ra3Prs2f6bXO9xXb9+vTt2w4YNubWurq7cWsVhN7NdAP6l0vEiUl9qvYkkQmEXSYTCLpIIhV0kEQq7SCJYdMver3RjOoKuJrzTFkfPb7RM1GtfAcDo0aPd+pkzZ3Jr0VLOyMaNG936jh07cmtFW5JNTU1u3bvfgD/3Bx980B27YsWK3FprayuOHj3a7w+EXtlFEqGwiyRCYRdJhMIukgiFXSQRCrtIIhR2kUSoz94Aou19i4ie3/fee8+tR0tYI959i7YtLtoL97Z8jnr8mzZtcuteDx+I79uCBQtya9dee607dtKkSW7dzNRnF0mZwi6SCIVdJBEKu0giFHaRRCjsIolQ2EUSoS2bG0A9j3W40OHDh916tG775MmTbt3blnnwYP/Hz9vWGPD76ABw+eWX59aiPvvtt9/u1m+77Ta3Hp0me/z48bm1t9+uzRnZ9coukgiFXSQRCrtIIhR2kUQo7CKJUNhFEqGwiyRCffbEDRs2zK1H/eKofuLEidzakSNH3LGfffaZW4/W2nvHL0TnEIjuV/S4nT171q17ff4pU6a4YysVvrKTfJnkfpLb+lw2luRakh9lH8fUZHYiUjUDeRv/KwAXnlbjKQDrzGw6gHXZ1yLSwMKwm9m7AA5dcPFCACuzz1cCWFTdaYlItVX6O/vVZtYBAGbWQTL3QF+SywAsq/B2RKRKav4HOjNrAdAC6ISTImWqtPXWSbIJALKP+6s3JRGphUrDvgbA0uzzpQBeq850RKRWwrfxJF8F8E0A40i2A/gJgOUAfkfyUQB/B/CdWk7yYle05+v1dKM14RMnTnTrp0+fLlT31rNH54X3evRAvDe816eP+uRDhw5168eOHXPro0aNcutbtmzJrUXPWXNzc25t+/btubUw7Ga2JKf0rWisiDQOHS4rkgiFXSQRCrtIIhR2kUQo7CKJ0BLXBhCdSnrQoEFu3Wu9PfTQQ+7YCRMmuPUDBw64de90zYC/lHP48OHu2GipZ9S689p+Z86cccdGp7mO7veVV17p1lesWJFbmzlzpjvWm5vXxtUru0giFHaRRCjsIolQ2EUSobCLJEJhF0mEwi6SCNZzu2CdqaZ/UU+3p6en4uu+5ZZb3Pobb7zh1qMtmYscAzBy5Eh3bLQlc3Sq6SFDhlRUA+JjAKKtriPefXvhhRfcsa+88opbN7N+m+16ZRdJhMIukgiFXSQRCrtIIhR2kUQo7CKJUNhFEvG1Ws/urdWN+r3R6Zij0zl765+9NdsDUaSPHnnzzTfd+vHjx9161GePTrnsHccRrZWPntPLLrvMrUdr1ouMjZ7zaO433nhjbi3ayrpSemUXSYTCLpIIhV0kEQq7SCIUdpFEKOwiiVDYRRLRUH32Imuja9mrrrU77rjDrT/wwANufc6cObm1aNvjaE141EeP1uJ7z1k0t+jnwTsvPOD34aPzOERzi0SPW1dXV27t/vvvd8e+/vrrFc0pfGUn+TLJ/SS39bnsGZJ7SW7O/t1b0a2LSN0M5G38rwAs6Ofyn5vZzOyff5iWiJQuDLuZvQvgUB3mIiI1VOQPdE+Q3JK9zR+T900kl5FsJdla4LZEpKBKw/4LAN8AMBNAB4Cf5n2jmbWYWbOZNVd4WyJSBRWF3cw6zeysmZ0D8EsAs6s7LRGptorCTrKpz5ffBrAt73tFpDGE540n+SqAbwIYB6ATwE+yr2cCMAC7AXzfzDrCGyvxvPFjx4516xMnTnTr06dPr3hs1De9/vrr3frp06fdurdWP1qXHe0zvm/fPrcenX/d6zdHe5hH+68PGzbMra9fvz63NmLECHdsdOxDtJ49WpPuPW6dnZ3u2BkzZrj1vPPGhwfVmNmSfi5+KRonIo1Fh8uKJEJhF0mEwi6SCIVdJBEKu0giGmrL5ltvvdUd/+yzz+bWrrrqKnfs6NGj3bq3FBPwl1t+/vnn7tho+W3UQopaUN5psKNTQbe1tbn1xYsXu/XWVv8oaG9b5jFjco+yBgBMnTrVrUd27dqVW4u2iz527Jhbj5bARi1Nr/V3xRVXuGOjnxdt2SySOIVdJBEKu0giFHaRRCjsIolQ2EUSobCLJKLufXavX71hwwZ3fFNTU24t6pNH9SKnDo5OeRz1uosaNWpUbm3cuHHu2Icfftitz58/360//vjjbt1bInvq1Cl37Mcff+zWvT464C9LLrq8NlraG/XxvfHR8tlrrrnGravPLpI4hV0kEQq7SCIUdpFEKOwiiVDYRRKhsIskoq599nHjxtl9992XW1++fLk7fufOnbm16NTAUT3a/tcT9Vy9PjgA7Nmzx61Hp3P21vJ7p5kGgAkTJrj1RYsWuXVvW2TAX5MePSc33XRTobp336M+evS4RVsyR7xzEEQ/T955Hz799FN0d3erzy6SMoVdJBEKu0giFHaRRCjsIolQ2EUSobCLJCLcxbWaenp6sH///tx61G/21ghH2xpH1x31fL2+anSe70OHDrn1Tz75xK1Hc/PWy0drxqNz2q9evdqtb9261a17ffZoG+2oFx6dr9/brjq639Ga8qgXHo33+uxRD9/b4tt7TMJXdpJTSP6RZBvJD0n+MLt8LMm1JD/KPvpn/BeRUg3kbXwPgB+b2QwAtwL4Acl/AvAUgHVmNh3AuuxrEWlQYdjNrMPMNmWfHwPQBmASgIUAVmbfthLAohrNUUSq4Cv9gY7kVACzAPwZwNVm1gH0/ocAYHzOmGUkW0m2Rr+DiUjtDDjsJEcA+D2AH5nZ0YGOM7MWM2s2s+aiiwdEpHIDCjvJIegN+m/MbFV2cSfJpqzeBCD/z+wiUrqw9cbeHsFLANrM7Gd9SmsALAWwPPv4WnRd3d3d2Lt3b249Wm7b3t6eWxs+fLg7NjqlctTGOXjwYG7twIED7tjBg/2HOVpeG7V5vGWm0SmNo6Wc3v0GgBkzZrj148eP59aidujhw4fdevS4eXP32nJA3JqLxkdbNntLi48cOeKOnTlzZm5t27ZtubWB9NnnAPgegK0kN2eXPY3ekP+O5KMA/g7gOwO4LhEpSRh2M/tfAHlHAHyrutMRkVrR4bIiiVDYRRKhsIskQmEXSYTCLpKIui5xPXnyJDZv3pxbX7VqVW4NAB555JHcWnS65Wh732gpqLfMNOqDRz3X6MjCaEtob3lvtFV1dGxDtJV1R0dHxdcfzS06PqHIc1Z0+WyR5bWA38efNm2aO7azs7Oi29Uru0giFHaRRCjsIolQ2EUSobCLJEJhF0mEwi6SiLpu2Uyy0I3dc889ubUnn3zSHTt+fL9nzfpCtG7b66tG/eKoTx712aN+s3f93imLgbjPHh1DENW9+xaNjeYe8cZ7veqBiJ6z6FTS3nr2LVu2uGMXL17s1s1MWzaLpExhF0mEwi6SCIVdJBEKu0giFHaRRCjsIomoe5/dO0951Jss4s4773Trzz33nFv3+vSjRo1yx0bnZo/68FGfPerze7wttIG4D+/tAwD4z2lXV5c7NnpcIt7co/Xm0Tr+6Dldu3atW29ra8utrV+/3h0bUZ9dJHEKu0giFHaRRCjsIolQ2EUSobCLJEJhF0lE2GcnOQXArwFMAHAOQIuZ/RfJZwD8G4Dzm5M/bWZvBtdVv6Z+Hd1www1uveje8JMnT3bru3fvzq1F/eSdO3e6dfn6yeuzD2STiB4APzazTSRHAviA5PkjBn5uZv9ZrUmKSO0MZH/2DgAd2efHSLYBmFTriYlIdX2l39lJTgUwC8Cfs4ueILmF5Mskx+SMWUaylWRrsamKSBEDDjvJEQB+D+BHZnYUwC8AfAPATPS+8v+0v3Fm1mJmzWbWXHy6IlKpAYWd5BD0Bv03ZrYKAMys08zOmtk5AL8EMLt20xSRosKws/cUnS8BaDOzn/W5vKnPt30bwLbqT09EqmUgrbe5AP4EYCt6W28A8DSAJeh9C28AdgP4fvbHPO+6LsrWm0gjyWu9fa3OGy8iMa1nF0mcwi6SCIVdJBEKu0giFHaRRCjsIolQ2EUSobCLJEJhF0mEwi6SCIVdJBEKu0giFHaRRCjsIokYyNllq+kggE/6fD0uu6wRNercGnVegOZWqWrO7Zq8Ql3Xs3/pxsnWRj03XaPOrVHnBWhularX3PQ2XiQRCrtIIsoOe0vJt+9p1Lk16rwAza1SdZlbqb+zi0j9lP3KLiJ1orCLJKKUsJNcQPKvJHeQfKqMOeQhuZvkVpKby96fLttDbz/JbX0uG0tyLcmPso/97rFX0tyeIbk3e+w2k7y3pLlNIflHkm0kPyT5w+zyUh87Z151edzq/js7yUEA/gZgHoB2ABsBLDGz7XWdSA6SuwE0m1npB2CQvANAF4Bfm9k/Z5c9D+CQmS3P/qMcY2b/3iBzewZAV9nbeGe7FTX13WYcwCIAD6PEx86Z12LU4XEr45V9NoAdZrbLzLoB/BbAwhLm0fDM7F0Ahy64eCGAldnnK9H7w1J3OXNrCGbWYWabss+PATi/zXipj50zr7ooI+yTAOzp83U7Gmu/dwPwB5IfkFxW9mT6cfX5bbayj+NLns+Fwm286+mCbcYb5rGrZPvzosoIe39b0zRS/2+Omf0rgHsA/CB7uyoDM6BtvOuln23GG0Kl258XVUbY2wFM6fP1ZAD7SphHv8xsX/ZxP4DVaLytqDvP76Cbfdxf8ny+0EjbePe3zTga4LErc/vzMsK+EcB0ktNIDgXwXQBrSpjHl5Acnv3hBCSHA5iPxtuKeg2ApdnnSwG8VuJc/kGjbOOdt804Sn7sSt/+3Mzq/g/Avej9i/xOAP9Rxhxy5nUtgP/L/n1Y9twAvIret3Vn0PuO6FEAVwJYB+Cj7OPYBprbf6N3a+8t6A1WU0lzm4veXw23ANic/bu37MfOmVddHjcdLiuSCB1BJ5IIhV0kEQq7SCIUdpFEKOwiiVDYRRKhsIsk4v8B1lwxmxAZrsAAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "b = next(iter(dl))\n", "xb = b['image']\n", "img = xb[0]\n", "plt.imshow(img[0]);" ] }, { "cell_type": "code", "execution_count": null, "id": "ef84d1b0", "metadata": {}, "outputs": [], "source": [ "#|export\n", "@fc.delegates(plt.Axes.imshow)\n", "def show_image(im, ax=None, figsize=None, title=None, noframe=True, **kwargs):\n", " \"Show a PIL or PyTorch image on `ax`.\"\n", " if fc.hasattrs(im, ('cpu','permute','detach')):\n", " im = im.detach().cpu()\n", " if len(im.shape)==3 and im.shape[0]<5: im=im.permute(1,2,0)\n", " elif not isinstance(im,np.ndarray): im=np.array(im)\n", " if im.shape[-1]==1: im=im[...,0]\n", " if ax is None: _,ax = plt.subplots(figsize=figsize)\n", " ax.imshow(im, **kwargs)\n", " if title is not None: ax.set_title(title)\n", " ax.set_xticks([]) \n", " ax.set_yticks([]) \n", " if noframe: ax.axis('off')\n", " return ax" ] }, { "cell_type": "code", "execution_count": null, "id": "77221d36", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on function show_image in module __main__:\n", "\n", "show_image(im, ax=None, figsize=None, title=None, noframe=True, *, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, interpolation_stage=None, filternorm=True, filterrad=4.0, resample=None, url=None, data=None)\n", " Show a PIL or PyTorch image on `ax`.\n", "\n" ] } ], "source": [ "help(show_image)" ] }, { "cell_type": "code", "execution_count": null, "id": "2209898e", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_image(img, figsize=(2,2));" ] }, { "cell_type": "code", "execution_count": null, "id": "27586e5e", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAACmCAYAAAB5qlzZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAPiUlEQVR4nO3dzW/U1RfH8VtBLBTaAj5QkBQVSjWIVdQUH1OCysZEwIDR6EJNDAt2JP4BLDTBldGVJsaHnYmYkICoxIUJaiGW2EYIWKO2llRBi7QFFcXFb+Mv53PG73VmjtPp+7U8PTPz7TycTObcc2/DxYsXEwAgxiX/9QUAwHRC0QWAQBRdAAhE0QWAQBRdAAhE0QWAQDNL/bGhoYH1ZKiqixcvNvwXjxv53m5o0P9itZZrdnZ2mthLL70kc99++20T6+vrM7HffvtN3v733383sVWrVsncjRs3mtjg4KDM3bVrl4mNjY3J3Frlvbf5pgsAgSi6ABCIogsAgRpK/a7Eb7qotqn6m261fqft6uqS8UceecTENm/eLHP/+OMPE2tqapK5s2fPNrGFCxeWuMJ/7/jx4yb2559/ytyVK1ea2OjoqMzdv3+/ib3wwgsyd2BgoNQlVhS/6QJADaDoAkAgii4ABKLoAkAgii4ABGL1Av5TU3X1Qo7m5mYZf+ONN0xs9erVMveSS+z3o7Nnz8rc8+fPm5iaHEtJr3S49NJLTaylpUXefmJiwsS8FQnlruxobGyUcbUCY9asWTL3448/NrHHH3+8rOvysHoBAGoARRcAAlF0ASAQRRcAAtFIK0CNfOY0BebNm2did911l8zdt29fWdc1Y8YMmXvhwoXC95vDG4dV1HM2HRppH374oYy3t7eb2OnTp2Wuak7NnKl3ZlWvdc7rpJp23taO3vut6P1WQs7ns62tzcQeeOABmXvs2LGyrotGGgDUAIouAASi6AJAIIouAASi6AJAoJIHU+J/VNdVjU8uX75c3v7pp582sXPnzslcNVapxjpTSqm3t9fEclYpeB1t9f96uTmPl9PpnqrWrFljYmqVQkopnTp1ysS8FQnqufPGYpcsWWJic+bMkbnqtVYjw951qc+B915R48Xe+0eNOA8PD8vcnPegul71+UwppR07dhS+3xx80wWAQBRdAAhE0QWAQBRdAAhEI60A1cRQP8ivW7dO3n79+vUm5jUFLrvsMhPzmiD33Xefib366qsyV52k6o1Kqv/NM3fuXBPz9lOdnJwsfL9TVU9Pj4mp19SLe8+deg/++uuvMvfZZ581sZGREZmr3oeLFy82sZMnT8rb54wMq/9XvX9SSumWW24xse3bt8vcnIaken4ffvhhmUsjDQDqAEUXAAJRdAEgEEUXAAJRdAEgEJuYV9Arr7wi4xs3bjSxoaEhmavi+/fvl7k333yzialRy5RSOnz4sIn19/fL3KNHj5rY7bffLnNvu+02Ezt48KDM/eSTT0xsbGysrjYx//TTT03syiuvlLlq1NXr/Ksu/5kzZ2Rud3e3id1///0yV40Mv/baayb2zDPPyNsPDAyYmDqdNyW9AkOtqkkppSNHjpjYiRMnZK56Hr0RaTUy3NnZKXNXrVplYsePH5e5CpuYA0ANoOgCQCCKLgAEougCQCDGgP/G2wdUNRvVCO6tt94qb69+6G9qapK5HR0dhWIppXTo0CET++qrr2SuasSsXbtW5m7atMnE1B6r3jV4+5N6Y6v15KabbjIxr2mqRmi9kWGlubm5cO57770n42r/5htuuMHEvJHY3bt3m9iDDz4oc9Vo7ueffy5z1b7E3r656rPkjbKrMeDvvvtO5qrPR04jzcM3XQAIRNEFgEAUXQAIRNEFgEAUXQAIVPdjwN6KhBzqOVLjnsuWLSt8nzmn63qjoYp3crDq2nqdY7UCwuscb9iwwcSuvfZamatGTr1RyWor972tRkRTSmnv3r0mNj4+Xvh+vfeFGq09ffq0zFWdf7UiISW9oqStrc3E1LhvSvp6vZUuKtdbQfP++++b2IEDB2Suel9516Di3uj8Z599ZmLeyhyFMWAAqAEUXQAIRNEFgEAUXQAIVPdjwKUaheX4+eefTUw1IFJK6dy5cybmjXuqUUnvxFTVNPP2MlWNtLvvvlvm3nHHHSamRlZT0nvFeiOn9USduJuSfv69RpoaVfVeP/Vae81NNY6+cOFCmbtgwQITU42lq666St5eNaa8Zu6sWbNMrLW1VeZu3brVxObPny9z1eerpaWlcK66rpT8sf5y8U0XAAJRdAEgEEUXAAJRdAEgEEUXAALV/eqFapkzZ46JeR1+FZ+cnJS56oRXb9xTjR17qzXUCKZ3vep/y9kUeunSpTK3nngnHi9atMjEli9fLnPVJuTe5vbqJFzvNVEj6up18uLqftVJvinp1TbeKLO6X+89qDb+9zYQV+9X73rV442MjMjcd999V8bLxTddAAhE0QWAQBRdAAhE0QWAQNN2P131g7rXmFBjuH19fYUfK2cMWP2oPzo6KnPVuK7XdFPNBm/8UTUxvLFKddKtN7b81FNPmdihQ4em5H66Obzx1RUrVpjYtm3bZO69995rYt4pw+q1Ghsbk7lq5NdrQpUrp5mrRom992B/f7+JPfbYY5lXV3nspwsANYCiCwCBKLoAEIiiCwCBKLoAEKjux4C91RmqQ+utXlAbKqtxzx9//FHeXm1M7Y1lqjFQb6xWnRLsrYpQm02rEc6U9PV6m2C//PLLJtbV1SVzvcerd2rD+5RS6u3tNTF1Om9KKa1bt87EvPe2WpXijRerz4H33lTUigRvFY+6X+/9qt7bjY2NMtcbya5VfNMFgEAUXQAIRNEFgEAUXQAIVPedDa95o36o9wwMDJiYaniokcqU8pp26nRd73RVNfLrXYNqQnjNFdX4GR4elrmPPvqoie3atUvmqn1e641qInmviXoPes2xX375xcS8cV313so5FVv9D9U6VduTM4rsjTgXvV+vcVit/5lvugAQiKILAIEougAQiKILAIEq1khTP77nHA7nTbGoSaqciZkLFy4UzvXs3bvXxCYmJkxM7Zubkp4Q8n6kV1Nt3vOommPq+fJ4uer59a5h9erVJqYO15wu1Oua85oMDg7KuGqkVaJJrK633Eaa91lWvGv1mo+Kem48OftoVwvfdAEgEEUXAAJRdAEgEEUXAAJRdAEgUPbqhZzRw0qsHCjXPffcI+ObN282sTvvvFPmTk5OmpgawfVO11VdZq9jqh7Le87VXqTenqOq+6wey+P9b+Pj4ya2adMmmbtnz57Cj1dPvBNv1XvAWwGTs3ey+tx5Kx2KrlTwViTknPCr7tfbP1idXu1dQy3UmRx80wWAQBRdAAhE0QWAQBRdAAiU3UirxMjcggULTGzx4sUyd8WKFYVzVQOno6ND5qof8L0GgGo4qYMaR0ZG5O3VfrheY0rtp+uNSqpmg3dI39y5c03MazKqMWBvtFeNuHZ3d8vc6SpnhNYbcc/ZI1fFvfd20WvI2d/Wa3ipa/D+B3UNOQ06T/S+wArfdAEgEEUXAAJRdAEgEEUXAAJRdAEgUPbqBa8zvXPnThO74oorZG5ra6uJeasiVNfUO/1TjQOePXtW5qoVAV7XVY1mqlUCW7Zskbc/fPiwic2bN0/mqlUVy5Ytk7nKjTfeKOPq8YaGhmSuWq0xe/ZsmatWRbS3t5e6RPwLS5YsMTF1anNK+jPjde1zDhSoBm9FgloV411XzsqKWsA3XQAIRNEFgEAUXQAIRNEFgEAlG2nqB+oXX3xR5ra1tZmY1xxT8Urs7ZqzP6nS0tIi46ox9Pzzzxd+rG3btplYzsjwgQMHZO7XX39tYmpsOiU9tpxzEmtOw0OdaDydVWL0NGfPWPX58D6LqjlVNJZS3t67arTXO/VXNZS95zHn5GDGgAFgmqHoAkAgii4ABKLoAkAgii4ABCq5euGJJ54wMW/Ec3Bw0MTUiKgXVxube7xupVp94I26qtUDalPwlFIaHR01sddff93EHnroIXl7dQquN9qrnps1a9bI3J6eHhPzVhnknCbrrQ5RVFfce32WLl1a+H7x/1Q33xt/VSsdvFy1okB1+L3bq/eVt0JAnUjs5easZlLbCtQyvukCQCCKLgAEougCQCCKLgAEKtlI++GHH0zMa0yp/VrVj//efXhNN9XUaW5ulrk//fSTiX377bcyVz2eN8arRnNVs2L37t3y9v39/SbmNdJUQ9Eb11X7Cqux3JT09Xonz6pGmJerRj69Rpx3MjP+mff8F5Uzxqt4DdqcvXdzRoZVrjcK7e31XPR+o/FNFwACUXQBIBBFFwACUXQBIBBFFwAClVy98P3335uY1/0bHh42saamJpl7+eWXm5h3wu+pU6dMzNskW40ZeqOuqkPf2Ngoc9XKDNXNVdeaUkrXX3+9iU1MTMhctbLDO/VV/W/eNahVDV43WOV6HeJFixaZ2JkzZ2RuV1eXjOOfeasHiiq3a1+t1Qve/easXvDG92sV33QBIBBFFwACUXQBIBBFFwAClWykHTlyxMTeeecdmfvkk0+amHfirTrFVo3apqTHdb39WlWzxxtJVfuDemPLas9Y9UO/twfoyZMnC93eeyzVIExJP2feOLUaJfaal+WOF19zzTUyV+1LPB1Ua/TU2+M2R85obrnXkPM8qAabd6JxJZ6HSHzTBYBAFF0ACETRBYBAFF0ACETRBYBAJVcvKM8995yMq5UOO3bskLlqA29vfFV10r0RWtXF9FYvqBUBXhdUdXNVJ9ZbVaHi3nWp3JxusperVg54Kx3URureJtpqDPiLL76QuW+99ZaJvfnmmzK3npS7gXhKevVJJcZf1euqPgfeCG7Rz0YlVGL1ApuYA8A0Q9EFgEAUXQAIRNEFgEAlG2lqFM9rqOzbt69QLKWUenp6TMxr0LW3t5tYS0uLzFXX6/3Irhpp3g/1ijop2fuRXu1L7I0cj4+Pm1glGgVqjNcbW1bP4wcffCBzjx49amIHDx4sdYmoEG8vWvU+9pp56j6KxlLS9aDcPXZLPZ7CGDAAwEXRBYBAFF0ACETRBYBAFF0ACFRy9YK3UqFcH330kYl1d3cXvn1nZ6eM55wyfPXVV5vYN998I3NV539wcNC/QOBvKjF6qg4E6OjokLlqZNf7LKu4GkXPuX0lNuhXvPtlDBgA4KLoAkAgii4ABKLoAkCg7P10a8GxY8fKvo+BgYEKXAkQo7W11cSamppkrmpOqSZzSsVHfr29onOoRprXBBsaGjIxb//g6667rvA15GxtUC180wWAQBRdAAhE0QWAQBRdAAhE0QWAQFNy9QIwlVTiNOC+vj4T+/LLL2WuGn3PWX2gOvxqc/2U9P/g/b8548nq9OP58+fL3N7eXhlXolcqKHzTBYBAFF0ACETRBYBAFF0ACNRQC/tLAsB0wTddAAhE0QWAQBRdAAhE0QWAQBRdAAhE0QWAQH8BO6ilivQYHzEAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig,axs = plt.subplots(1,2)\n", "show_image(img, axs[0])\n", "show_image(xb[1], axs[1]);" ] }, { "cell_type": "code", "execution_count": null, "id": "366112a5", "metadata": {}, "outputs": [], "source": [ "#|export\n", "@fc.delegates(plt.subplots, keep=True)\n", "def subplots(\n", " nrows:int=1, # Number of rows in returned axes grid\n", " ncols:int=1, # Number of columns in returned axes grid\n", " figsize:tuple=None, # Width, height in inches of the returned figure\n", " imsize:int=3, # Size (in inches) of images that will be displayed in the returned figure\n", " suptitle:str=None, # Title to be set to returned figure\n", " **kwargs\n", "): # fig and axs\n", " \"A figure and set of subplots to display images of `imsize` inches\"\n", " if figsize is None: figsize=(ncols*imsize, nrows*imsize)\n", " fig,ax = plt.subplots(nrows, ncols, figsize=figsize, **kwargs)\n", " if suptitle is not None: fig.suptitle(suptitle)\n", " if nrows*ncols==1: ax = np.array([ax])\n", " return fig,ax" ] }, { "cell_type": "code", "execution_count": null, "id": "8018591c", "metadata": {}, "outputs": [], "source": [ "from nbdev.showdoc import show_doc" ] }, { "cell_type": "code", "execution_count": null, "id": "f53aae66", "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "---\n", "\n", "[source](https://github.com/fastai/course22p2/blob/master/miniai/datasets.py#L52){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", "\n", "### subplots\n", "\n", "> subplots (nrows:int=1, ncols:int=1, figsize:tuple=None, imsize:int=3,\n", "> suptitle:str=None, sharex=False, sharey=False, squeeze=True,\n", "> subplot_kw=None, gridspec_kw=None, **kwargs)\n", "\n", "A figure and set of subplots to display images of `imsize` inches\n", "\n", "| | **Type** | **Default** | **Details** |\n", "| -- | -------- | ----------- | ----------- |\n", "| nrows | int | 1 | Number of rows in returned axes grid |\n", "| ncols | int | 1 | Number of columns in returned axes grid |\n", "| figsize | tuple | None | Width, height in inches of the returned figure |\n", "| imsize | int | 3 | Size (in inches) of images that will be displayed in the returned figure |\n", "| suptitle | str | None | Title to be set to returned figure |\n", "| sharex | bool | False | |\n", "| sharey | bool | False | |\n", "| squeeze | bool | True | |\n", "| subplot_kw | NoneType | None | |\n", "| gridspec_kw | NoneType | None | |\n", "| kwargs | | | |" ], "text/plain": [ "---\n", "\n", "[source](https://github.com/fastai/course22p2/blob/master/miniai/datasets.py#L52){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", "\n", "### subplots\n", "\n", "> subplots (nrows:int=1, ncols:int=1, figsize:tuple=None, imsize:int=3,\n", "> suptitle:str=None, sharex=False, sharey=False, squeeze=True,\n", "> subplot_kw=None, gridspec_kw=None, **kwargs)\n", "\n", "A figure and set of subplots to display images of `imsize` inches\n", "\n", "| | **Type** | **Default** | **Details** |\n", "| -- | -------- | ----------- | ----------- |\n", "| nrows | int | 1 | Number of rows in returned axes grid |\n", "| ncols | int | 1 | Number of columns in returned axes grid |\n", "| figsize | tuple | None | Width, height in inches of the returned figure |\n", "| imsize | int | 3 | Size (in inches) of images that will be displayed in the returned figure |\n", "| suptitle | str | None | Title to be set to returned figure |\n", "| sharex | bool | False | |\n", "| sharey | bool | False | |\n", "| squeeze | bool | True | |\n", "| subplot_kw | NoneType | None | |\n", "| gridspec_kw | NoneType | None | |\n", "| kwargs | | | |" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "show_doc(subplots)" ] }, { "cell_type": "code", "execution_count": null, "id": "20546a79", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig,axs = subplots(3,3, imsize=1)\n", "imgs = xb[:8]\n", "for ax,img in zip(axs.flat,imgs): show_image(img, ax)" ] }, { "cell_type": "code", "execution_count": null, "id": "aeaf024b", "metadata": {}, "outputs": [], "source": [ "#|export\n", "@fc.delegates(subplots)\n", "def get_grid(\n", " n:int, # Number of axes\n", " nrows:int=None, # Number of rows, defaulting to `int(math.sqrt(n))`\n", " ncols:int=None, # Number of columns, defaulting to `ceil(n/rows)`\n", " title:str=None, # If passed, title set to the figure\n", " weight:str='bold', # Title font weight\n", " size:int=14, # Title font size\n", " **kwargs,\n", "): # fig and axs\n", " \"Return a grid of `n` axes, `rows` by `cols`\"\n", " if nrows: ncols = ncols or int(np.floor(n/nrows))\n", " elif ncols: nrows = nrows or int(np.ceil(n/ncols))\n", " else:\n", " nrows = int(math.sqrt(n))\n", " ncols = int(np.floor(n/nrows))\n", " fig,axs = subplots(nrows, ncols, **kwargs)\n", " for i in range(n, nrows*ncols): axs.flat[i].set_axis_off()\n", " if title is not None: fig.suptitle(title, weight=weight, size=size)\n", " return fig,axs" ] }, { "cell_type": "code", "execution_count": null, "id": "c422a7de", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHsAAACxCAYAAADktMKtAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAyNElEQVR4nO19WWxc53X/b/a5sy8ccrgv2kXJduzYsSCnUIsiSFqnbQI03VD0oSjQh7ZAkQJF0aJAH1s0T31pij6mD3YLFC2Qpondxi7iWokSy7Y2yxKlISlyqFk4+3Zn+z/w/zv65mpIcbkjTUMegCA5vDO83z3fd9bfOcfS7XZxRIeDrM/6Bo7o6dERsw8RHTH7ENERsw8RHTH7ENERsw8R2Xf6o8Vi+T/tl3W7Xcte33PQNVssFszOzuLkyZP44z/+YyQSCXz44Ye4d+8ecrkcWq0WOp0O2u02xsfHEYvFcOnSJbjdbqytreHKlSv47//+b1QqFbRarT3//53WvCOzj2hnslgs8Pl88Hq9iEQiCAQCCAQCiMVimJiYQCAQwPj4OHRdx9jYGGq1GlqtFrrdLjqdDsLhMILBIEZHR2G329HtdvHCCy/A4/GgVCqhXq9jc3MTpVIJyWQS9Xoduq7v/353CqocneydyeFw4NSpU5ibm8PFixfxwgsv4NixY+h0OrBardA0DQ6HA3a7HX6/H06n87HP6HQ6WF1dRaPRkA0Qi8VQKBRQKBRw+fJlXL9+Hf/2b/+GZDKJbDa77zUfnew9ks1mg8PhwM/+7M9ibm4Op06dQigUwuTkJEKhENrtNprNJrrdLhqNBgDAarWiUCjAbrfD5XKh0+nICe92uyiVSmi32+h2u8jlcqjX62i1Wmi1WpiamoLP50M8HsfKygoePHiA7373u9jc3NzzvQ8Nsy0WCywWCzqdzrO+lR3J6XTC5/PhwoULePnll7GwsACHwwGLxQJd16HrOprNJtrtdo/IttvtsNls8Hq96HQ6aDQawmxVuuq6jmKxCKfTCZvNhtHRUcTjcZw7dw6JRALLy8t4//33kcvlsNdQ9zNnts1mg8vlwtTUFCKRCK5du4ZKpdJzjdW65TQMw0a4ePEifu3Xfk1OdLlcFoZZLFsSlEzmBrZarbBYLHKKAfQwiu9TqdlsotlsQtd1+Xs0GkUwGMTx48eh6zqSyeSeGP7Umc1FA1unxOPxYGRkBBMTEwiHw1hZWZFruNhhIKvVCpfLhbGxMZw+fRqBQAB2ux31eh2dTgfdbhc2mw1WqxVOp1OYDPQys91uP/aauhkoCVSpwOfl8XjgdrsRj8eRyWSwsbExvMzmTueDGR8fx8LCAn7u534O7XYbjUYDtVoNxWIRuq7j4cOHWF1d7XuijQ+SD1H9m5nkcrlw8uRJzM3NYWxsDOVyGbVaDTabDTabDcCWweZwOBCNRuFyueByuYSRdLns9q1HzjVZLBZ5rd1uQ9d1NBoNZLNZ1Ot10eUARFp8/vOfRzgcxvXr1/ck7Z76ybZarcLsyclJzM3N4dixY6hWq6hWq8jlciLG4/E4xsbGsLq6imKxiFqtJp9j3NEOh0NeU0+DWeRyuTA9PY1oNAq73Q6r1QqbzSabTZVGH374IRqNRo8odjqdsFqtfXU1P49SQdM0jI6OQtM0WbO6uefn51Eul/e8qZ/JyQa2FriwsIATJ07g5MmTyOfzKJVKaLVa0HUdbrcbtVoN5XIZb731Fu7fvy/uCYCe3U4RyweoXmcWuVwuHD9+HGNjY2JsdToddDodEdn83++88464SaVSCfl8HpFIBA6HA5lMRlyzdruNdrstG8Hj8WB0dBTT09N4/fXXEQqFUKvVep4bAJw8eRKNRmO4mc0T1+12YbfbMT8/j/n5eYyOjsqObrVayOfzWFpagsfjwdjYGL70pS+hXC5jaWkJhUIB6XQa+XwelUoF09PTCIVCmJ2dRS6Xw8bGBlZXV8UQMot8Ph9effVVTE5OCrOsVqv87HQ65TS///772NjYwOzsLPx+PyKRCG7duoVKpYKXXnoJ7XYb6XRaJIPdbken00G1WsUnn3yCq1ev4sUXX8TMzIyoCAZdms0mwuGw2DmZTAbFYnFXa3jqYrzb7cLhcEDTNMRiMYTDYWiaBl3X0W63EQqF5LQ4HA54vV54vV4JHW5ubsLhcMDpdKJcLmNychLRaBSzs7MIBAJwOBzit5pJDocDMzMzCAaDPfpWtbh5upPJJDKZDJ5//nkEAgH4/X7cuXMHrVYL09PTIto1TRO93mq1kMlkkM/nce/ePVQqFZFaFosFNpsN7XYbnU5HPJhwOIxqtTq8zAa2xNDCwgLOnj2LWCyGarUKYMvanJiYQDwex4kTJ5DNZpFMJpFKpVCpVOB0OjE6OopoNCqWqcViQa1WQyKRwPT0ND73uc/B4/FgeXnZ1Ht2u904fvw4Op0OSqWSMJg+NvDIu7BarZiensY3vvENOJ1OtFotnDt3DtlsFr/1W7+FUqmEK1eu4PTp05idnYXNZkO1WsXS0hLeeOMNLC0tiYpwuVwAHhl0nU4HmUwGlUoFi4uL6Ha72NjY2NUangmzFxYWcO7cOYTDYXg8HhFlNptNxJXb7ZZoFBnaarXQbDZRrVbFzWm1WnC5XJicnMT09LSI2Xw+b9r9er1e+Hw+cYX44CnGaZHTXQKAWq2Gjz/+GFarFbquY2NjA+VyGT/84Q9RqVTw6aefolarYW1tTU5tqVSSU6rrOur1Otxut9wHVWCr1YLVapWo2m5poMw2BgvoOvzMz/wMLl26hHg8LjpJdaH4NTIygpGREei6Lg+5UChgaWlJRF673UYgEMAXv/hFhMNhhMNhZDIZXL9+3bQ1MDvFE636ytykTqdTxHO328XKygq+/vWvo9vtinqy2Wz4x3/8R1FJFMtMqCwuLmJ1dRUAxLAbHR2V/0lmN5tN2O12nD59ek8SbKDM3s794a6l79lqtcRYoe7jbqeOp3Hn9/tx/PhxTExMoF6vA9gSsTMzMyiXy0gkEqIWzCCbzYbPfe5zeO655+ByuYTRqttEP5rMi8fjaLVaCIVCEvakeOe1ACT+bbfb4Xa74ff7MT09Da/Xi7GxMbjdbnk2LpdL/ofdboemaZienkY4HN71Wp6JGG82m2g0GiKOGo2GnBAynRmidrstIrvT6cDn88Hv9/eEKO12OyKRCGq1GlKplCQgzCCr1YrTp0/j1KlTYjWrUUCbzSaileI9Ho/DYrHA7/dD0zRomiaBk0AgIJKLMXS73S7GaDAYxMTEBCKRCJxOJ9rttqyR/5PWfyQSgdfr3fVangmzHQ4HXC5Xz2mmPq7VaqKXvV5vD2OBRxaww+EQX5e6lMEIGjVmUKfTwZ07d2C1Wnty1i6XCw6HQ+IBqVRKGPcXf/EXskHVqKEaP6flDjxSb9T7dOHa7bb8H0q6druNfD6PfD6Pn/zkJ7h58+au1/LUgyrclWSIyshutyvhwnK5DJvNBr/fL+KcD4QPT7VQa7UaOp0O3G43PB4PPB6PKffc7Xaxvr4Om82GQCCAUCiEaDQKv98vcWoaaVxHPB4XEayuTX0GakRMdeUo9RgubTQaKBQKyOfzIvaLxSLy+Txu3ryJhw8f7notAzfQuJMZF6Z/GA6HH9PZ3L084aFQCD6fD6VSCc1mU6SB3W4Xve/1etFut3Hv3j3JNU9NTeH06dOmrKHdbuP73/8+LBYL/umf/kk2E0O5X/nKVzA9PY0zZ86gXq+j2WziwYMHAIByuQzgUTi0X3aLzwmASLhWqwVN02C1WnHv3j386Ec/wt/93d/12EBGz2A3NHADTQ3phcNhTE9PY2RkBB6PR3SrGmO22+2SM3Y6nY+FIym2qcdcLhcqlYpE3Bj0MDMZogZoOp0Oms0mAKBareKDDz6Arus4e/Zsz3tUKbQdo9XX1Ot4/51OBxsbG0in02KMHoQGLsbVBcViMbzwwguIx+Pw+/1ildL4oOVNnUwL1Gq1inEEPNpEjCdXKhXcunULoVAIExMT0HVdXDqziSevVqshk8mINf7Lv/zLcm+qkWnU2eoz4Xd189K1olpYXV3dk6jeiQbGbBV5wkWWSiWsrKxIwkPVXbxG0zQAEAOFQRUaPDzNNGJyuRza7TZee+01JBIJXLlyBTdu3BB/1WziPfO0EylKm4ESSLXYjZmxnUjV6YyX81QfFM0zMNx4P2bTOGOggaS6XJqmiYFF/5qfx+t4agnvAYCZmRm43W5sbGwgm80il8sNamk90opinYEfkpGp2+nrfqSqIMKc1M/Zy2eptKeTraIvVGuSwQR1gf1236VLl/Dnf/7ncDqdqNVqaDQaj/mQDBfyFDCQoVreNOzU9Ob4+Dhu3769b7z1bknN3LXbbSSTSTx8+BDlclnWwv+vnnBVnKukingCFakaut1u35O9X9oTs1VfUXUp+okmr9cLTdMwMjICt9uNYDCIxcVFhEIhVKtVOQnqYhmcUPWecZHGAIZq2Hi9XnF7ngbRVaTKUcWves9GQ0xdk7oJ1M/oh8BR/+9+aFfMph5SfdsnUTwex8zMDC5duoTJyUmcP38efr8f9XodlUoFuq73DYwQycGQKaNLqm/dbDblPhiZqtfriMViePXVV/GjH/3I9KwXyXhCGRdg2JOqS7XGSf10uJHZRut9L8/8SbQrZhtPL0Wny+WCpmkIBoNwu93w+XwIhUKYm5vD1NQUxsbGMDY2JiFOu92OZrMpTK5WqxJIUK1rPjC73Q673Y50Oo1arQan0ylxYxWYp4ZS5+bmTAuo7PbZAL1QKFVsq3EGAI+deCPDVem5G4NuL7QrZlMXccexwoGx3PHxcfj9foyMjGBychKvvPIKYrEYQqGQZIHIEDKbFi13NA0vr9crwRWe6kqlgnw+D4/HIz44mV2tVsUi9ng8GB8fNzVcaqR+D98Y7FCfm5Ge9Fo/F20nw28v9ERmBwIBKW95/vnnpYzF7/cL810ul5xQm80Gt9stxoUKBaYrlU6n0W638dJLL0HXdayursLlckma0G63Y2xsTHY3gX7MHKVSKdGT3CRut1uiW09LZ5OcTqekYimljIbZk06peo2KO6c6M4OeyGy/34/Tp0/j3LlzWFxcFGZrmtZjVHS7XdRqNQnW03gxYqodDgey2SwqlQpOnToFq9Uqp5kWfrvdFjw203pkKv8PXydaRbXOnzZxXa1WS5im3kc/Q00l1TXtZ/AexAJXaUdmW61WnDhxAn/4h38owX9jEl09udyBLH3hTlVPntfrxb//+7/j1q1baDabOHnyJH7+538exWIR5XIZrVZLwIX5fB6bm5uIx+Pw+XwIBoMAIHqaBpDFYpHIVqVS6fFLnwZRjag5bqopY0DFGDVTdbWa2eLmpcrjew5COzL77NmzmJ+fx8jICCwWi2SiaGlyUVyM+vBZXlqv13vcqnq9jvPnzyMcDmN5eRn5fP4xsAE/y+FwYHx8HMFgUIB5AMTAU61d9eFpmgafz3egB7MT9XvoKnqF9oR6b+ragEcGHaWA6u2oxpzT6YTD4TDlvndk9ssvv4zFxUVEIhGBrLIMlQl5uj403BwOBzweD/L5vJxWPoxOpwNd13Hx4kVUKhX8yZ/8CQqFAv73f/9X6pjIqFOnTiEej2NqakqYzBOrGowkphktli2Iz14QHAclo55VxTL/rr6mBmb6Wd7qRnC73X1LffdDOzI7n88jl8shk8mg3W5D0zR0Oh3xlQnppb7VNA2NRgOlUgm5XE6iYUxJquLOarXiD/7gD1AqlZDJZBCNRhEIBCTb5Xa7exAqasarXyZMNWai0SgmJiZMeUC7oe184e2Mst1kwXjCWVJkBu3I7Fqthmq1KjVNfPAMflC/UKTy4TebTVQqFdRqNWiaJgYUr9d1HS6XC+fPn0e1WsX6+jqCwSB8Ph98Pp8gMhmw4PsYOVOzXzwB1HeMpD3Nk63Sk4wpPkP1WqOrpZ56wrVIA3O9UqkUxsfH0e12USwW0Wg0xEUKhUJoNpuCpmi3248ZE9Q3zFGrYEKLxYJisQibzYa5uTmJimWzWTHSyMRSqQRd13vADnwYhO2Ew2H537FYDCdPntz3Q9krGQMopH6MMUbIjH/j+1Tc+FM52Zubm8hms1hfX4fH4xF3i/lcMpuiWTXeeONqXZTROKFUoDQgDo31XmrghcQHwQoSSgwWERDwYHat15Nou1i48Zp+P6tWutFCP2jyQ6UdmZ1IJOB0OnH58mVcuHABs7OzyGQyqNfrgtluNptiRNBg42nmKSZD+B2A6H6eVC6aTCL4ToXO0tXjFzcaTz0NvGq1amqRwG6pH8O385uN8QBVlKvMVnP+B6UnBlVSqRTeeustpNNpfPLJJzhz5gz8fj+i0SgajYbgv3nSCDDol3tW66EA9GR5VCSm0R3h6WcXAmLR/H6/uICBQADNZhMbGxu4fv06rl27ZsoD2g1R2qlqzPh3o8Xdzy0zvkeVhurn7JeeyOx8Po8f//jHKJfLSCaTGB0dhdvtRiAQEAYxh8xACk+06gsbMzkABGpE40693ijyVNFMUD0Bena7HR6PR7oR3L17F7dv3973Q9krqZ7Cdn/vF+d+0mf2O9kDM9BU5iQSCSSTSdy4cQOhUAjnzp3DCy+8gIsXLyIcDksIlUxVjTH1Ji0WixhcwFaKsFAoiNGlJk6MC6chSH3e7XZx48YN5HI5pFIpJJNJJBIJ0zBbeyWu28hQVXJxXUaLHOgNm6qf+VR0tkr1eh31eh2FQkESEi6XCyMjI/D5fHC5XAiFQj2BFgASECATgS3Dj+gL4qJVhvZDh9KgYzsOPtTbt28jl8shmUwinU5jfX39wA9lr0SDkVaz0aBUja1+GSz1u/Hk7gRB3ivtyOztREa1WsWHH36Ijz/+GN/61rcAbIUwZ2dnJb9dq9Wg6zpisRi63a2yUrpOGxsbPR2R9iqa1EiV8etZkK7ryGQycgCoctT7oqoyRtWMRul2UsEM2je6lAuiJd1sNvHw4UM4nU5sbm6KwUaruFQqyXsI+v9pITKZcQVuRjXMuZ1aAx7F1W02G+r1ugA1WIViFhjDNChxp7NVJH4YiVk9MpyvBYPBHi+DnoqR1DQw24MQM88wMvBkC/5J9Myb3v00UKVSwb1797CxsQGHw4FqtYputysgCtXIIoJUtdDVwBFDxB6PB91uF9euXcOnn34KYMApziPaHTWbTRSLRVSrVVitVpTLZcHQkchYbgSV2VSFqmok9GptbW1ffUr70Y5diY/op4uOJgkcIjpi9iGiI2YfIjpi9iGiI2YfIjpi9iGiI2YfIjpi9iGigQ1xY+XmL/zCLwAA/vM//xPFYnHH1tAWiwUnTpxAJBLBzMwMlpaW8NFHHz2GQ9stdZ/SEDf2CT9x4gRmZmbw+c9/Hl6vF8ViEbdu3cKVK1ek0/Dc3BxmZmZw4cIFnDp1ClNTU6jVashms/jud7+Lq1ev4vLly3u9BaGd1mx6uJQB/1AoJI3SnU4nXn31VZTLZcl+AXisjplIU4IgisUiJiYmpGR3mCgUCsHj8WB6ehqapiEQCGBiYgKxWEzgSfy7xWLBwsICdF1HIBCQXuGapkmO3mKxYGJiAq1WC16vF4VCAeVyGXfv3jWtk4TpQ9yYAXrppZdw9uxZfO1rX8PIyIh0LWQtFhGlhBgRpMiW1D/4wQ/w4MED3L9/H++99x6SyeSeFzfIk/3iiy9iYWEBv/mbvyn90pnVIlbO4/EgGo1ifHxcGtUmk0kBUhaLRVQqFZkg5HA4RCJeu3YNd+/exd/+7d/uup/4k9Zs+skmaoNVI++88w5isRg++9nPwuPxSGdAtVOhijxlj5KbN2+iUqnsW4QPith0YHFxEceOHcPm5mZP7boKfy4UCtI7hrj5UqkkgAUWUqhjLtLpNICtAo1AIIAvfelLSCQS+OEPf3jgezed2TyxZPjVq1cxNjaGc+fOQdM0mT9J+HGz2US5XBbY08OHD7G8vIzl5eXHAADDQOwTMzc3h7m5OWxubgriVUWQcvNyKIwRetTtdnsKLIhQbTQaqFQqiEQi0DQNr776KjweD3784x/vCGrcDQ0sxUmIb6vVQjqdxr/+679icXERL7/8skzDYU1zpVKRiQHf+973kM/nEQqFBKr8tAH/O9GpU6fwxS9+EX6/X7BzRKHwhKulTpVKBZVKpadqBngErVYBCXyP1WpFPp+HzWbDxMQEFhYWcOHCBSwtLe1LnZEGxmwVe9VqtbC+vi6tOPx+P1wuF9xuN3RdR6lUwvr6OlKplDRo9fl8PWU+w0RGeDSlmQpG4Ckk7o4wLeARY9UGBMCjfDZ/NpsGxmyKcY/HI9Nu0uk03nvvPUSjUXi9XoRCIdTrdaRSKRHlPp8PHo+n50GYha40g5aXl/Gd73wHv/iLv4hYLIZ8Pg9d15HL5QSWpG5SFYxAMEOr1UK1Wu2Lw+P1bPqXzWZx7949vP/++wfeAANFqqiltOrcLVaRULQRGux2u6W91LBSuVzG2toaksmkzM2u1+vS+clisUhnRpYlcY0sXjTWorG4grgzqsBOp4OrV69ieXnZlGlGAxXjai22ipBkKXA+nxcms7hf7dHyrCHC/ahUKqFUKiGRSMDj8eDEiROoVqsyp0vtr0J7o91uS3cJumWsaOFr7C3Dje5wOFCr1fA///M/psGSBnqyVYy02vWPSEzisFRDxVj2YyZI3ky6cuUKNjY28Prrr8Pr9SKTyaDRaEjRIU8z1ZkR+12v13ukWLe71RiIjXjv37+PVColpdJm0EC7EqsGDIAe5u4EfFcZb+wSOCz08OFDwcBzMgLbdVHv8kutXiVunK+zZYjFYpGKVbvdjkwmg9XVVVNHTQ6M2az9Yr00xZfavUHFVJNUBnOXP4t2V9uRuoZcLoevf/3rOH36NH7pl35JrlG7RdBeYfkTma12Rur3DG7cuIGbN2+aOlJ64P3Gt+tKoF7Dn7d7/7AR7QhG/CKRiIxTdDgc0iFKjf5xg9PwopQzNrRj73J2mzKTBspsiicyTK1m5DV8nb+rVqfx+mEg1WBkSJSlwuwVxyYBaqts9WSzqZ/P55NkCA1ZtpwexJD4gTGbTKLrYSy2Bx6vcFCtb4q4/wukulwMm6pNBFRRzeehTgZSq1ZbrZZMWjCbBqoM1cUZuypsFzAxRqGG6VTvRGSuGsun7cHNbuxgaKz0BCCdpgax0Qc+NkJlMOuT1aJzIzP5GrsXB4NB07oFmUmqhGo0GtJrRl0rgyrcCFRr3BSsR6fYtlqtqNfryGQyIsbNLNk1ndmqNW20MHf7fgAiDdTJfsNKbOXF+Di/1DQuv8hwtWGfcSyGOm/EzHWbzmz2IlcjRKpBtp3BpRalM7EAQFKhw3i6SY1GAxsbG6jVapL9crlc8Pv9cDgc0HUdtVoNtVpNGvYCjxrc0h9XG/0OImpoOrNpkFBX8zXjNf0Wo24Kiny12d2wktrx0dhiA3i8EN94PduJAYONGg4EvMCdutsdup0PrjbXG+REn4NSp9ORe+zXH4UinVOOmPXiBlD7k6odIM2mgTAbOLhhQUzasJLxBDMYUigUZKIAQQsApGEQD4HT6RR0TiAQgMVikVmeg6KBW+P7fe+wBVN2Q4yJqy4Vs2BA70FgK2/+ToNNDUaZTQODEqtWaL9WVwB29KP79QsbplSnGhiy2+3w+Xzwer3w+XwCMGRn5G53q9Fvq9USJK3b7e6Jn/O5UXVxqI2Z/vZAmL3TABO1vcSTdq/ajoKozWEhdR3U2UTUMgLGNK4RbsRctzr/BIDofeLmzSbTmU2xxVChaqQYf++3IGMole0uCWwYJuI9tlotFAoFbGxswO12I51OyykmwjQUCgkShfqcIt/j8Uj7ba/Xi0AgMBB7ZSAWkNGFMoYE96qPhjX7RfJ6vTh27Bjsdjuy2SzS6bREwAir9nq9ArJkIoTMDoVCYqD5/X4EAgGZm8aGO2aosYEx+0nM2e3f1cDMsOltYOu+NE3D1NQUqtUqSqWSoEtoldfrdcnt+/3+x/xsJlGAR8YbpyrUajXT1jxQA2072u6Ek5nGlKhx+MuzJt6n1WqVeSTz8/PIZrMol8uCt/N6vSiVStjc3JRIYDweR6ezNWmQkUHVr7bZbKjVajh//jzGx8fx7W9/2zSGD1SM75XUBakpUersYSOr1YpIJAK/3y9WOUdk2Gw2hMNhdDodFItFAVX6fD6JMPp8PhHrwKOG+iwApNSgnj/w/R74E7YhWqHqKTaeeiOCdLvdy7GLw6K3eZ9OpxOf+cxnMDU1hUQiIQV4rN9yu91otVqSxaJEIFa+0WjAZrP1FPfpuo5yuQy32y1SIxqNmnLfA3O9tguB7lYcGTfKMOLJrVYrRkZG4HK5ZIAN8EiVqVmvfh2J1RovTkYAtjYLkySBQOCxIXf7pYExWxXDKoN3y3D1pBvHHQ0L2Ww2jI2NAQAKhUIPQoUinfdthFipriUDK8FgUBCrFN3BYFAG4R2UBmagGTvn7+VEk+ijDiOFQiFEIhGUSiVJZqhwI2btLJatSlRuBLUOTEW20EK32WwIhULS/9Tv95vWgnogOtsIEd6L+FX1tyrKh+1ka5oGj8cjKVg1F62maI1qTT3ZRhuGvjmxAN1uV+rHzPBGTGc2I2jGGR97rS0mwznwhaOTh4WCwSBisZjcE0U2QYfEy/NvZCwtcKZsqfIIS65Wq/D5fOKSeb1eCbQctFZ9ILAkVVfvdaCaylCKPU3TZMzjsJA6C4X3SaNMrdM2rl8NJfMAsBNFqVSS9TLHzcF0hGcdhAbCbPUhGFGUu3m/mmBgOHFsbGyoRDkZS8Y1Gg3BzJGhKhyaz4B/V+FIgUAAXq8XqVQKuq4jHA7D6/XKvHG/3y+n/UD3bMbCVXI4HBL0Bx4PnW7H8H4hVhUUwIqLYSGWN7HCg71SGDxxOp1Sp6XOBeFJVVErkUhEjLJyuSydoRwOh8wIMSM/YLo1Tj3jcDgeE+nGAIuReepr6nsItx0mZhM4yJNN31gdClOpVITZXAvFs4ouZQSO1SBcq81mg6ZpUrd+UCPN9JNNkCDQW7JLsacuEugFFxqrJLhY5n+HidnsHEFxXSgUpMaaXROY2eLPpVJJRmAZ8wedTkckGKcjdTodwaJHo1FBpe6XTGc2y1eazWbP2MV+FZvA4yFTAJIF4hczR8PEbCJCtwMWchMAvQEVdWYpryXejtLQWBAIQKTIge75QO/uQ6VSCbdu3YLX68Xo6Ci8Xq+MVCSpAQbgcT3OQaqkzc1NrK2tDRV4gRYymUeMODeqGmDhfC5N00Qna5oGv9+PUCgk+ezJyUkEAoGexgWEdHk8ngMngwbW9G5tbQ3dbhexWEyyQMYhZiqzjXqcrS9zuZwMhRumk+3z+SRuTatc1alMzdrtdjSbTeRyORSLRYyOjsopLxQKaLfbCAaDIq5ZYECIUqVSQTabxerq6oHDpgNrepdIJLC+vo4XX3xRdi/Dg0YwIfBId1MKpNNprK6u4s6dOz1tpYaFAoGAjJW2Wq2yLnXjsreK1WpFKpVCq9XC2bNnZdOnUimsr68jGAzK5zKAROMul8vJ5OCDttswvXep8l4J7lP3ulwuyek6nc4eg4OWKFtksVyGi97Pqe4OsHfpwsKCnGwiUjRNg8vlwujoKLrdLtbX1wVJmkwmUa/X5W+1Wk10cygUArA1vprinRuczyKbze7qOey05oEwe7vMlsvlEiuWTKfBxqat2WxWmtAclAbJbIpi1Qijrp2cnASw1XeF602lUqalKneifTP7iH66aHiAXUc0cDpi9iGiI2YfIjpi9iGiI2YfIjpi9iGiI2YfIjpi9iGiI2YfIhrYxL79kMViwcjICLrdLjKZzIE/b5Dh0n7EysuXXnoJ8/Pz+PKXvyydFB48eCB5frvdDq/Xi/n5eYyNjeHGjRv49NNP8c1vfnPbvip7KK54enO9IpEIzpw5Iyk/NoRj9sq4EGaMFhYWMDk5iVAohE6ng3Q6jfX1ddy/f//AI44GQSzgm5iYkHSnx+OBpmmYm5vD2NiYJEH8fr80zCHG3Ol0IhKJwO12IxgMYmJiAq+99pp0OywUCqjX63jw4IH0MT8omZ4IuXjxIv7qr/4KHo8HLpcLhUIBS0tL+Ou//mtks1nkcrme691uN8LhMP7oj/4IX/3qV6U7wcOHD/Ev//Iv+OY3vym1zHulQZ5sv9+PSCSC3/iN38Dc3Byee+45wZY1Gg3Bm0UiEYyOjgo4EXhU8pPP51EqlZDNZqWDEud63bhxA8vLy3jzzTeRz+dRqVQOvOaBlf9omiZ4LJ/Phz/90z8VfFUikUC1WsXZs2flNJw7dw4ej0e6ERAnrbZ2HAbixL4vf/nLOHnyJCYnJ+H1egUoCECGtnW7XeTzeaysrAhokPBo1nKpFSRcq9VqxfT0NEKhEBwOB9bX13Ht2jWsra0dSL0NrD7bbrcL2D0Wi+HMmTNoNptoNBp49913kcvl8Prrr8Pn88FmswkygwsmxGfYmt1xYt+lS5fw4osvYnNzU9ZFGBIZyvkg7H7EvjBsuEOsWigUEkQLES4jIyOIxWKYmJhAIpGAruuoVCrDxexms4lCoSBYqnK5DKvVKoPbvF4vvvOd7+Dq1as4duwYpqenMTEx0XMyut2tVlL8fZjoueeew1e+8hVEIhFsbm7K1D4V+qy2zyawnwgc2iwsFWJ3YrVlp1rLbrVaMT4+jq9+9auo1WpYW1vbN/jSdNeLY404q0qtfAC2DBsCCHO5nLR1pGgDIEC7YTLKKK1CoRBmZ2elAS2rPnivap9SGnGs/VI7M7CZDnU5ceEq/JqbhtJxZGQE4XB438BD0092vV7H+vo6xsfHe2qaVP0EbBkpqVQKY2Nj8Pl8KJfLaLfbUklCHTcsZLPZEI1GEYlEEIlEZI6HOi1ALQDoV8akFiryVHPgm/rF7gxqew2Px4Pjx4+jVCrh7bffRj6f3/MaTH+auq4jm81K7RPwCIRIUeXz+RCJRAA8agKnYq/5OcMEMrRarVJ75fP5euC+qsilzu1X8mQs8KPOVmvhyHDCkTnry2azYWRkBLOzs3Ig9koDOdlq723ueuqrVquFaDSKeDwu9U7qqacY4zjDYSHVw/D7/dJInkxzuVzCNBqXRh2sEiHVxuvUahl1Q7HLA4sD90MDO9nValUYSP3VbDaRz+fxO7/zO/jVX/1V6UdCkKGqr6rVqmmT6swgl8uF2dlZRKNRKfNhlQZ1NEt2CoUCGo0GstmsNMfhhmYLS17LIgK32414PI54PI7p6WmxBTiE1u12o1gsysCZ/ZDpzObMaOPoAxpr9XodJ0+ehNPplK5CbClBccfTPkwGGrAleslEI5NLpZKgYjc3N1GpVLCxsYFisYh8Pi/M5nc+H8760jRNNgkNN+p16niXyzVczOZwlHK53OMjq8bH+vo6gN6BMBTbrO0apsJ7YAvq/Pbbb+MnP/kJ/vmf/xkXLlzA1NQU5ubmsLKygm9/+9tIpVLI5/OyTjahpZulFknQ77bZbFKlmk6npXPFX/7lX+LixYvS2VjXdYRCISn73Q8NpPynVqtJBaY6n1I1VLijgUd6S90QwxQ1A7bE+NzcHLxeLzRNQ7FYxPr6OrrdLpLJpJT2zM3NAegtbwIeGZ601qnr6XZS6tG22djYwJUrV6RJHq1/qoX90ECCKsViEU6nE7FYTHxu9bQaa77UDkN8SOpEnGGgaDSK3/7t35aQ5/Xr13Hv3j3cvXsXzWYTHo8Hv/7rv44vfOELALY2dKVSkaqWSqXy2GgJYGsTsFf5/Pw8isUiMpkM/uEf/gFvvPGGBJvYLusgHorpzG61WigWi1LRoVqTqqtCUqsVWccNQOqYh4Xq9Tpu376NaDSK0dFRzM/PY25uDrOzsygUCrh58yZWVlbw5ptvSisNr9cr7+9nw9DdYmfEmzdvSrPbqakpjI6OSsqzXC5jfHwcgUAAb7zxBjY2NvYcYRyIgcbTrC6sX322sROD6noxqDAsRNHqcrkQj8cxPj4Ov9+PV155BalUCvV6Hffu3cONGzfg8/ng8XgwMTEh0TK1xZdxeh9rv5aXl9FoNNBoNPDKK69gbGxM4u7FYhHPP/88JiYm8P3vfx/ZbPbZM5tE0b2dRW0swle7CtH1GqaTHYvF8Hu/93vSVYERv7W1NVitVrz22muS2OHGZsDE2ECoXwE/N3uj0UC1WhX3laW+d+/eRTqdhtPpxIMHD3ad8lRpYMwmA9UFbmdh93sYZiXszSKLxSINcxkho3hVrWs1TUtf2rgO1XhjDzSCOGi587poNIp2uy3SQg2z7jUOMdDgc79FAr0RJaOxwgcx6LFHe6VKpYL33nsP8/PzOH78uEQAL1++jEwmg5WVFRmRnEqlJF1Jka02JCDx1KvD1elPR6NRjIyM4Gtf+xqq1SpmZ2dx7NgxRKNR3L59Gx988AGWlpb2FIsYKLO3mwGiMrpfjxWLxdIzCmkYyGazIRgMwul0yigIXdclNBwOh2V+NtO7av9W43xS1UCjha5O3y0UCmg2m5JnKJfLSCaTyOfzEpnbKw10WLqRkepC1YyQcTQU3ZGDtm80k+x2u/SI4UCXZrMpKJQzZ85gfHwc0WhU1mBs6WnU1XwG6tjGarWKYrGId999F8lkEmtra2i1Wshms8jn82i1Wnjw4AFyudyeI4wDPdlGF4vfjZ2KVfeMzI/FYj1NdJ41qcwmtoz+r4pUabfbgkEzbmDgceMMgHQtptrjunVdl7w38wjU45ubm8NjjZP6nWb1dfV3PhwV2TIsRPgvZ24xy8VUrjFnzU1LA00NIqnBIlXEs2cam9wSiUrDj21J+PNu4cWyBnMfySMy6ifja/xd3eVMidpsNsTj8Z7GMsNAZJ4aAma+mRkwo642xhjYzM946o0hVIpz5raDwaDMEIlEIgiHw9KRatf3b/YDYTtLtSuS0RDrF0Hjz8zhmtH3y2wyBoR4sok+6XfSdkroqCJdvZZIU6aJjV6NOpV3L2Q6s91ut0SXCE4w6ih1t8uNGNpl+f1+aJpm9u0diIyeBA0qXdf7tsYyMtP4O0W8GirmqSfsmogdNWbBqNxeaSDMjsfjsFgsksflaSWp4VGjqOe1Pp9PskhmjU0wg9R7brfbKJVKqNfrjzXU57UAHlNVxrUbA0r8bGPImRtsv/O1TWc2s11Wq7Vn3qRKRrdEbub/nwzgUaXIzMzMgRu0mklGb4Ine6euwf1Eez8pYTz16mvG2MRQMDscDuOzn/2sNHfrlwTpFz1jtKnb3Zpttb6+jlgshl/5lV/B+Pi42be5L+onltmLVNXZxpi/KobVPIB6itW0rsXyqFEvmwGqzCVyZa80kJMdj8fhdrt3tQuNBgoZ3mg0pEhu2HS3SpRa/cY4Gcm4EYyvqylQimpCt4z2jdHm2Q2Zbu4Gg0EsLi7C6/VKoYCqc4D+g954Dds6cwwxxx8OMzGJoXoTwPbTEdQcgMpowrL4HOx2O5LJJCwWC/x+f08xwn7EuOnM5tgI+qT9SA2PGokPiIELfu30eU+DuAFVi1m9Z9VN3Ok+jR6Jei1Fu3o42JCe2TEVXrxXGsiMkEgkIhEm46kGtjfQgEcRJafTCY/Hg2AwOBTVIQyD0uc12iDMapGM4rqfC6qW+9D6VkU5sDUJsFKp9IjtZ85sBkKY9WHFopGx/SxQVdQTbfnRRx9hZWUFuq6LC/asGM6QpaqfWaGp+sf99ChFcj/mqOqMtgo3BJ9ZJpNBsVjsCbcSsbpXMp3ZnHxjsVh6Ij/b6Zp+0bVOpyMF6J1OB4FAAOFw+MADUfZL6oblpmTyQ2VOv7XxPervxs82+tvqMymXy1L8SAm5n1MNmMhsu92OY8eOYWJioicAADweG1fRFmpdFN9jt9sxPT2NSCQiZS8zMzPPdK6XqlttNhuKxaL0ADf63kb3ql8ZEF0yI9qU19NWWVtbk6IE/h3ojxV4EpkmF202m8x65nxK1bfkTVLcqfqKp5lfFosFXq9XUnqcpfGsTjZJVTnEivWTWP0kgfp+vq6eYjWBAjwa91gqlcT12u+JJpnGbKfTieeffx6zs7NSSK9aj8zeMIZMfUVjjAB5Xh8KheB2u9HpdBCLxTA1NTU0E/ssFgtKpZJUf6iBI+pw1atQGcv3k1QpoFr1zGOvr6/3GGjqZ+6VTGO21WqV1BuBeQCks0C9XpepPm+//Tbu3r2LTz75BGfOnMHv/u7vwm63Pza/i/hrYrWH4WQDW8wql8s9pT5sgaXWufUDLRijiCrRFVNLhkqlUg8E6SDhUtOYTdFL7BijXvQP2+22JOE/+ugjvPvuu/jBD36AL3zhC/j93//9HmuXhh1HGfr9fgSDwWfObBIjW+VyWZhI16xWq/VNTapoUn5GP1uGz4gMr1QqEi5V9fUz1dm6ruPKlSvodrs4f/58j0FjsVjEV2YolCeYD4oGizHr02g0sL6+juXl5WdeNKAyiIzlSVONTnojXq+3Jz7e72TzM5kb50Fh9FA9KNTjdAX3SqYxu9VqIZFIYHJyUvQxRbNR9KhYakam+DO/VDRmKpXCgwcPnhmO3OgHq3qWay8UCpIBU2d0qZuZn6V+Lqnb7UpXJZY+bdcW7Jnr7Hq9jrfeeku6E1AkFQoFYXi/aBK7K9E/5+mlNa5pGi5fvozvfe97z6x7Eh8uC/PUKBqwFfh455134Ha74XA4BAWq9pQhqR0X1M3PTREMBpHJZHDz5k2RZurmOki41NSQVLvdxsrKCr71rW/hM5/5DI4fPy5T4FXoDplICUAAnRp1c7lcWF5exq1bt3D37l0xhp4FUXSqkT5VXG9ubuLy5ctSg02XrF8wxcgkNT7e6XRkMPz9+/eRy+V6kiUk2jJ7Zbjp8cc7d+7gb/7mb/Bnf/ZnWFxc7GkrQbHGRjQUdcSIE7AHbDWXu3XrFv7+7/8e169fR6FQMPtWd03Ul6qepWsEAOl0Gv/1X/810HtQPQG22tormc7sarWK5eVlfOMb38Cbb76J6elp+P1+jIyMSL+Qjz/+GHfu3JEepf/xH/8hov+DDz5AKpXC3bt3sba2huXl5WfKaK6pUChgbW0NhUIBbrcbt2/fRiKReCp2RCaTwbvvvitWeiKR2DOyFBhQfXapVMIHH3yADz/8EM899xxisRhmZ2clxptOp0UsVyoVJBIJ6dz78ccfI5FI4P333x+aYnx6BYzV1+t15PN5FAqFxwyvvTJgN1StVrG2toaRkRF4PB4Ui0Vx+/ZCRxP7DhENR5TiiJ4KHTH7ENERsw8RHTH7ENERsw8RHTH7ENH/A0eOfSMcKYrPAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig,axs = get_grid(8, nrows=3, imsize=1)\n", "for ax,img in zip(axs.flat,imgs): show_image(img, ax)" ] }, { "cell_type": "code", "execution_count": null, "id": "02f44439", "metadata": {}, "outputs": [], "source": [ "#|export\n", "@fc.delegates(subplots)\n", "def show_images(ims:list, # Images to show\n", " nrows:int|None=None, # Number of rows in grid\n", " ncols:int|None=None, # Number of columns in grid (auto-calculated if None)\n", " titles:list|None=None, # Optional list of titles for each image\n", " **kwargs):\n", " \"Show all images `ims` as subplots with `rows` using `titles`\"\n", " axs = get_grid(len(ims), nrows, ncols, **kwargs)[1].flat\n", " for im,t,ax in zip_longest(ims, titles or [], axs): show_image(im, ax=ax, title=t)" ] }, { "cell_type": "code", "execution_count": null, "id": "91e0e2ac", "metadata": {}, "outputs": [], "source": [ "yb = b['label']\n", "lbls = yb[:8]" ] }, { "cell_type": "code", "execution_count": null, "id": "a7aacc2a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Boot Top Top Dress Top Pullover Sneaker Pullover'" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "names = \"Top Trouser Pullover Dress Coat Sandal Shirt Sneaker Bag Boot\".split()\n", "titles = itemgetter(*lbls)(names)\n", "' '.join(titles)" ] }, { "cell_type": "code", "execution_count": null, "id": "33b9ac1b", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_images(imgs, imsize=1.7, titles=titles)" ] }, { "cell_type": "code", "execution_count": null, "id": "56422103", "metadata": {}, "outputs": [], "source": [ "#|export\n", "class DataLoaders:\n", " def __init__(self, *dls): self.train,self.valid = dls[:2]\n", "\n", " @classmethod\n", " def from_dd(cls, dd, batch_size, as_tuple=True, **kwargs):\n", " f = collate_dict(dd['train'])\n", " return cls(*get_dls(*dd.values(), bs=batch_size, collate_fn=f, **kwargs))" ] }, { "cell_type": "markdown", "id": "ff61b773", "metadata": {}, "source": [ "## Export -" ] }, { "cell_type": "code", "execution_count": null, "id": "686a88de", "metadata": {}, "outputs": [], "source": [ "import nbdev; nbdev.nbdev_export()" ] }, { "cell_type": "code", "execution_count": null, "id": "59c28edf", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 5 }