summaryrefslogtreecommitdiff
path: root/notebooks/01-look-at-emnist.ipynb
blob: 1f393dbb28e6cda12965f53ffece901fa0fc3a03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The autoreload extension is already loaded. To reload it, use:\n",
      "  %reload_ext autoreload\n"
     ]
    }
   ],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "from importlib.util import find_spec\n",
    "if find_spec(\"text_recognizer\") is None:\n",
    "    import sys\n",
    "    sys.path.append('..')\n",
    "\n",
    "from text_recognizer.datasets.emnist import EMNIST"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "EMNIST Dataset\n",
      "Num classes: 83\n",
      "Mapping: ['<b>', '<s>', '</s>', '<p>', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' ', '!', '\"', '#', '&', \"'\", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '?']\n",
      "Dims: (1, 28, 28)\n",
      "Train/val/test sizes: 260276, 65070, 54028\n",
      "Batch x stats: (torch.Size([128, 1, 28, 28]), torch.float32, tensor(0.), tensor(0.1715), tensor(0.3314), tensor(1.))\n",
      "Batch y stats: (torch.Size([128]), torch.int64, tensor(4), tensor(65))\n",
      "\n"
     ]
    }
   ],
   "source": [
    "data = EMNIST()\n",
    "data.prepare_data()\n",
    "data.setup()\n",
    "print(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([128, 1, 28, 28]) torch.float32 tensor(0.) tensor(0.2204) tensor(0.3593) tensor(1.)\n",
      "torch.Size([128]) torch.int64 tensor(4) tensor(4)\n"
     ]
    }
   ],
   "source": [
    "x, y = next(iter(data.test_dataloader()))\n",
    "print(x.shape, x.dtype, x.min(), x.mean(), x.std(), x.max())\n",
    "print(y.shape, y.dtype, y.min(), y.max())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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/vvvd9lZZ53lsqiprFqz16BBgzI95mmnneay6JK006dPd9nSpUtdRvNlda1Sw5FqjZW7iuo1aviVpE2bNmV6zOg11dbW5rLoMs2nnHKKy66++upwOz/84Q9dFq0aesABB7js9ttvd9mGDRvC7RRdK9dxI0QryP70pz912dixYzM9XrTS7JIlS8LbRq/TX/ziF5m2feaZZ7rsX//1X10WNUk3WpaPPI6RNEnSAjObV8muUnvx/sLMLpG0UtJ5dRkhkB81jFZAHaPQOpxQpJQelFRtkf2TajscoPaoYbQC6hhFx0qZAAAgNyYUAAAgt25z+fJoBb8tW7a4LGrsOv30010Wrd4nSZ///OddFjVg7rfffi6bNm2ay26++WaXRSu0ofVt3LjRZXPmzHFZ1LC4Zs0al916663hdrI2LW7dutVljz32mMuiFTD79Onjsg9/+MPhdo455hiXRSvfrlvnT9KZOXOmy8ralIna23vvvV0WrbgaNVUuXLjQZZ1ZmTXrv0nDhw932YABfnX1F154IfO264UjFAAAIDcmFAAAIDcmFAAAIDcmFAAAILdu05SZVdQs9s///M8u69u3b3j/d77znS7bfffdXbZ8+XKXXXPNNS5buXJluB10Py+++KLLvv71r7vsiSeecFlUb1HDopS9sSxqVItWpjz++ONdtv/++7ssWpFWkkaOHJlpPFHTKvCWqJFxn332yXTf6LUXNTVnXbm2M6JxR82kNGUCAICWwIQCAADkxoQCAADkxoQCAADk1m2aMqNmmWhVv2j1s8MPPzzzdl566SWX/e53v3PZN77xDZdVW30TkOJL1K9YscJlP/rRjzLdtx4NZA888IDLZsyY4bKzzjrLZVHzmRQ3W0ZZ9FwU4ZLOaLxotctoxdZqNberVatWuSxqfu6MHj16uGy33bL9H79fv365tl0vHKEAAAC5MaEAAAC5MaEAAAC5MaEAAAC5dTihMLPhZnavmS02s0Vm9oVKfo2ZrTazeZU//hrfQAFQwyg7ahhlkOUsj+2SvpxSeszM9pL0qJm9tWbvdSml79RveLUTdbT/4Q9/cFm01PXEiRMzbyc6S+Shhx5yWRGWSe1GWqKGs8q6dHY9RHX9la98xWXRmU+jR48OH3PRokUuW7x4scu2bt3qstWrV4ePWULdqobzGjp0qMsuv/xylz377LOZHu/mm2922XPPPZd5PNFZJ1/60pdc9oEPfMBlTz/9tMu2bduWeduN1OGEIqXUJqmt8vUWM1siaVi9BwbUCjWMsqOGUQad6qEws5GSjpD0p0r0OTObb2Y3mll4Qq+ZTTazuWY2N99QgfyoYZQdNYyiyjyhMLN+ku6QdFlKabOk6yUdImmc2mfO343ul1KaklIan1Ian3+4QNdRwyg7ahhFlmlCYWa91F7Et6aUpktSSmltSmlHSulNST+VdGT9hgnkQw2j7KhhFJ1FS/L+1Q3au0lukrQhpXTZTvmQyud6MrMvSvq7lNIFHTzW22+soHr2zL5CedT8WY8ljrupR7vyPyxquHiiJYarLTvcYq8parhJoqWuo2bJSD1qMM94mrykfNUazvIv5TGSJklaYGbzKtlVki40s3GSkqQVkj6Ve5hAfVDDKDtqGIWX5SyPByVF06bf1n44QO1Rwyg7ahhlwEqZAAAgNyYUAAAgt+zdht1YkxtggJbTYo2WKIFmriAbKdp4aoEjFAAAIDcmFAAAIDcmFAAAIDcmFAAAILdGN2Wul/TW9cH3q3zfCtiXxhjR7AGIGi6Lou4PNVw/rbQvUnH3p2oNd7j0dr2Y2dxWuVAN+9I9tdJz1Ur7IrXe/tRLKz1PrbQvUjn3h488AABAbkwoAABAbs2cUExp4rZrjX3pnlrpuWqlfZFab3/qpZWep1baF6mE+9O0HgoAANA6+MgDAADkxoQCAADk1vAJhZmdamZLzewZM7uy0dvPy8xuNLN1ZrZwp2ygmc00s6crfw9o5hizMrPhZnavmS02s0Vm9oVKXsr9aRRquDio4a4rcx1Tw8XU0AmFmfWQ9GNJp0k6VNKFZnZoI8dQA1MlnbpLdqWkWSmlUZJmVb4vg+2SvpxSOlTS+yV9tvL7KOv+1B01XDjUcBe0QB1PFTVcOI0+QnGkpGdSSstTSm9Iuk3SxAaPIZeU0mxJG3aJJ0q6qfL1TZLObuSYuiql1JZSeqzy9RZJSyQNU0n3p0Go4QKhhrus1HVMDRdToycUwySt2un75ytZ2Q1OKbVVvl4jaXAzB9MVZjZS0hGS/qQW2J86ooYLihrulFas49L/zstewzRl1lhqPw+3VOfimlk/SXdIuiyltHnnn5Vxf5BPGX/n1DB2VsbfeSvUcKMnFKslDd/p+wMrWdmtNbMhklT5e12Tx5OZmfVSexHfmlKaXolLuz8NQA0XDDXcJa1Yx6X9nbdKDTd6QvGIpFFmdrCZ7S7pAkkzGjyGepgh6aLK1xdJuquJY8nMzEzSDZKWpJS+t9OPSrk/DUINFwg13GWtWMel/J23VA2nlBr6R9Lpkp6StEzSvzR6+zUY/zRJbZK2qf1zx0sk7av2LtynJf1R0sAuPvYoSa9LuqVB+3Ks2g+jzZc0r/Ln9FrtT6v+oYbDx/y4pAWSXlX7573/S9LeDdgXarjrz11p67ie78NN2JeWqWGW3i4QM/uDpL6SVqaUPtrs8QBZmNmXJV2u9v9FzVJ7c9//Uvsb4rEppW1NHB6ABqEpsyDM7AJJG9X+hgyUgpn1l/Q1SZ9PKf0+pbQtpbRC0nmS3iHpI80cH9AZlUWmppvZC2b2opn9qNljKhMmFAVQeVP+uqQvNXssQCcdLamPpOk7hymllyX9VtIHmzEooLMqi33dLWmlpJFqP9J2WzPHVDZMKIrh/5Z0Q0rp+WYPBOik/SStTyltD37WJmlQg8cDdNWRkoZK+ueU0isppddTSg82e1Bl0rPZA+juzGycpJPVvpgJUDbrJe1nZj2DScWQys+BMhiu9v61aHKMDJhQNN8EtR9ee6797CH1k9TDzA5NKb23ieMCspgjaaukcyX94q2wskjPaZK+0qRxAZ21StJBVSbHyICzPJrMzPaQ1H+n6J/UPsH4TErphaYMCugEM7tc0pflz/IYKelvU0qvNG90QDaVHorHJM2UdLWkHZLel1J6qKkDKxGOUDRZSulVtZ+7L0kys5clvc5kAmWRUvqWmb0o6TuS3impt6T7JZ3MZAJlkVLaYWZnSvp3Sc+pfW2In0tiQpERRygA1JSZXaz2s5aOSSk91+zxAGgMJhQAas7MJknallLitDugm2BCAQAAcmMdCgAAkFuuCYWZnWpmS83sGTO7slaDAhqJOkbZUcMogi5/5FE5xeYpSaeo/Wpvj0i6MKW0+G3uw+cryGN9SqmmKy92to6pYeREDaPsqtZwniMUR0p6JqW0PKX0htrXPJ+Y4/GAjqysw2NSx2gkahhlV7WG80wohql9ZbG3PF/J/oqZTTazuWY2N8e2gHrpsI6pYRQcNYxCqPvCVimlKZKmSBxqQzlRwyg7ahiNkOcIxWq1X0zlLQdWMqBMqGOUHTWMQshzhOIRSaPM7GC1F+8Fkj5Sk1GhVHr06OGyyoXOnO3bC3fNHeq4IHbbLf7/TVRLO3bsqPdwyoQaRiF0eUKRUtpuZp+TdI+kHpJuTCktqtnIgAagjlF21DCKoqErZfLZXWtq4BGKR1NK4/M8QF7UcP10kyMU1DDKrmoNs1ImAADIjQkFAADIre6njaK17L///i47//zzXRZ9DCJJ06dPd9lzz3GF61YRfTyx7777umzgwIEuGz16dPiYBx10kMt+/etfu2zlSr/eTok/GgFKhyMUAAAgNyYUAAAgNyYUAAAgNyYUAAAgN5oyISluphsxYoTLLrnkEpd98pOfdFm19SaeffZZlz3//PMue/PNN8P7o9iimvnqV7/qsqOPPtplAwYMCB9zjz32cNmECRNcdsstt7js/vvvd9n69evD7QDIhyMUAAAgNyYUAAAgNyYUAAAgNyYUAAAgNyYUAAAgN87yyCC6CuJee+0V3vbVV1912bZt22o+pjyi/YmW1L766qtd9uEPf9hlffv2ddmcOXPCbb/wwgsua+QVb1E7ffr0cdnHPvYxl/23//bfXLbnnnu6bNOmTeF2ojOGzjjjDJf93d/9nct+/OMfu+y6665zWfS6BdA5HKEAAAC5MaEAAAC5MaEAAAC55eqhMLMVkrZI2iFpe0ppfC0GBTQSdYyyo4ZRBLVoyjwxpdTSa9meeOKJLvvQhz4U3vaGG25w2aJFi2o+pjze+973uuz88893WbSPUTNd1HT6zDPPhNt+8sknXVaQpsyWr+M8evTo4bK/+Zu/cdm5557rsqhmot95tAR7Ne9+97tdNnjwYJddfPHFLlu4cKHL7r77bpft2LEj83gKghpGU/GRBwAAyC3vhCJJ+oOZPWpmk6MbmNlkM5trZnNzbguol7etY2oYJUANo+nyfuRxbEpptZntL2mmmT2ZUpq98w1SSlMkTZEkMyvEsW1gF29bx9QwSoAaRtPlOkKRUlpd+XudpDslHVmLQQGNRB2j7KhhFEGXj1CY2Z6Sdkspbal8/UFJX6/ZyJokWjHyiiuucNmRR8av1w0bNrhs2bJlLnv99de7MLrO69nT/4qjBsxPfOITLhswYIDLolUL77//fpfdcsst4Xg2btwY5s3SqnWcRVQbkjRw4ECXHXfccS6bNGmSy6JmSTPLNJ73vOc9Yb5582aX3XXXXS4bP96f2DBixAiXffzjH3fZggULXLZ8+fJwPEXTijUcreYbZdW8+eabmTLUVp6PPAZLurPyZtFT0s9TSr+vyaiAxqGOUXbUMAqhyxOKlNJySYfXcCxAw1HHKDtqGEXBaaMAACA3JhQAACC3bnP58qgxLGrYuuSSS1w2YcIEl73yyiuZt7P77ru7rNZNmdUalqJGtaiZLmsD5n333eeyb33rWy6LGjUlGqMaIbqs+Lve9S6XnXLKKeH9jzrqKJcde+yxLtt3331dFtV/tJJqZ0SvtZ///OcuW7x4scu+9KUvuezkk0922TnnnOOyH/zgB+F4otcFsonep3r37u2yfv36uSxacbWal19+2WVbtmxx2datWzM/JjrGEQoAAJAbEwoAAJAbEwoAAJAbEwoAAJBbt2nKjFbAvPrqq1324Q9/2GXRioKvvfZauJ2oMaxaA2dXRY1vI0eODG8brYq53377uSxqlowaK6MGzKhRk8a12oua16KVKaMGwygbNWpUuJ1evXq5LGqsXLlypcvmzZvnskWLFrksqrdqK2pGDXqPP/64y5544gmXjRs3zmWnnXaay44//niX3XnnneF4yrKCZiNFl7ePGr3Hjh3rstNPP91l0fvZQQcdlHk80fvwH//4R5f98pe/dBmNml3HEQoAAJAbEwoAAJAbEwoAAJAbEwoAAJBbSzZljhkzxmXXX3+9y6JLkEcNadGljf/xH/8x3Pb8+fNdtmPHjvC2WUSNaocccojLvv3tb4f3P+OMMzKN589//rPLvvjFL7ps4cKF4XbQddHveNCgQS6Lmgkvu+wyl0WrYkZNc6tXrw7HEzU8zpkzx2X33nuvy1atWuWy6JL1KSWXVWvK3GOPPVyWtdF59uzZLotWyvzABz7gso9+9KPhY0aNybVe+bZsoobhYcOGuezoo492WfQeFdVCVDNRbVTLo/vPnDnTZS+++KLL8ryHdyccoQAAALkxoQAAALkxoQAAALkxoQAAALl12JRpZjdKOkPSupTSmEo2UNLtkkZKWiHpvJTSS/UbZnXRCpjR6pDvfe97XZZ1RcDbbrvNZVETo1R9Bc2uii6x/i//8i8uiy4vLcXNeE8++aTLrrzySpctXbo0yxBLoQh1XK3p8B3veIfLvvKVr7gsasqMVj196SW/C1Ez7TXXXBOOJ1plMHrMRq2GumnTpi7fN1rFde3atS6LXmdnnnlm+Jg333yzy1asWNHpsXVWkWt46NChLjviiCNc9rd/+7cu23vvvV0W1eCSJUtcVm31zOg1Fa0qG/37sXnzZpfRlJlNliMUUyWdukt2paRZKaVRkmZVvgeKbKqoY5TbVFHDKLAOJxQppdmSNuwST5R0U+XrmySdXdthAbVFHaPsqGEUXVfXoRicUmqrfL1G0uBqNzSzyZImd3E7QD1lqmNqGAVGDaMwci9slVJKZuZXDPmvn0+RNEWS3u52QDO9XR1TwygDahjN1tWzPNaa2RBJqvy9rnZDAhqGOkbZUcMojK4eoZgh6SJJ11b+vqtmI6qi2hKrl156aaasb9++LovO6IjO3rjhhhtcVuuzOaS44/iSSy5x2Yc//GGX7bnnnuFjRsvNPvLIIy6LzuiInp8W09A63nfffcM8OmvnvPPOc1lUw9ES1D/5yU9cNnXqVJc999xz4Xha6fcenSES7V909kL//v3Dx+zZs1BXLKhbDe+2m///5sCBA8PbRjV83HHHuWzIkCEuu+eee1w2bdo0lz300EMu69OnTzie0aNHuyw6I2T33XfPlHX3pdWz6vAIhZlNkzRH0rvN7Hkzu0TtxXuKmT0t6eTK90BhUccoO2oYRdfhVDuldGGVH51U47EAdUMdo+yoYRQdK2UCAIDcmFAAAIDcCtVd9JaoKWbixInhbS+++GKXRc2NUSPW3LlzXXbFFVe4bN262jdOR81EUQNm1GBarQEzsnLlSpd973vfc1me5Y2RzT777BPmRx11lMuiBsyoMexXv/qVy6Im4kYsDd0Z0ZLwUQOxJL355pv1Hk6htlsUUVNmv379wtuOHTvWZVEDZvTeHtXm8uXLXRYt/17tdxQtnz1//vxMt6tHw313wREKAACQGxMKAACQGxMKAACQGxMKAACQWyGbMocOHeqyaOVASRoxYkSmx4yab/73//7fLnv00UczPV5nRKvwHXjggS57//vf77L99tsv0zbeeOONMH/ggQdctmTJEpft2LEj03aQTfQ7r9aU2bt3b5dt377dZdGKgl/72tdcFjXiNtPIkSNdFjVZR01zkjR79myX1bpeo8dbsGBBeNvu3MBcbZXQvfbay2VRA2b0unj55ZczZdFrotqqrlEeNXVGjcBFa8aNmmOj5zHS6Pd1jlAAAIDcmFAAAIDcmFAAAIDcmFAAAIDcmt6UGTWcjBkzxmWHHXZYeP9oxb2st4ua5A4++GCXRc1AUSbFq2pGTabR5X6PPvpol0XPT6Ta6m5PPvmky4rWdNSKBg0a5LLPfvaz4W0HDx7ssqgR8Uc/+pHLnn32WZdVW3GyEaKmvXPOOcdlX/3qV1123333hY+5atUqly1btsxl0X7vvffeLuvVq5fLXnzxRZfdfvvt4Xg2bNgQ5t1BtfejrI2DURatvpm1ybNaU2at3+PyXrI+qrms+33EEUe4bPjw4S7bunWry6rV8MaNG11Wi+eMIxQAACA3JhQAACA3JhQAACC3DicUZnajma0zs4U7ZdeY2Wozm1f5c3p9hwnkQx2j7KhhFF2WTpOpkn4k6eZd8utSSt+p+YiUvYGlM6LmrP/xP/6Hyz796U9nerxo5U0pXpnykEMOcdkpp5zisuiS5ln1798/zCdNmuSy66+/3mVRk06Lmao61XHUkHbMMce47LTTTgvvH9X7Qw895LKotsqwwmn02t1jjz1c9vd///fh/aMVDi+//HKXvfrqqy4788wzXRY1zEarkEbPt9TU53yqGvxevKtqjXtRHjXJRq+VUaNGuSy6HHr0HlVtVdisjclRk2jUgBk1Tke3q9a0GjVbRivIRicFHHnkkZnGs2bNGpfNmDEjHE+9Vnvt8AhFSmm2pO7b1oyWQB2j7KhhFF2eHorPmdn8ymG4ATUbEdBY1DHKjhpGIXR1QnG9pEMkjZPUJum71W5oZpPNbK6Zze3itoB6yVTH1DAKjBpGYXRpQpFSWptS2pFSelPSTyX5D3n+67ZTUkrjU0rjuzpIoB6y1jE1jKKihlEkXVr+y8yGpJTaKt+eI2nh293+7UTNM6+88orLolXAOiNqvokuDZ71cuHVjBs3LtO2s66AmVfUOJR1ddFWV6s6jn6Xo0ePdtmAAdmPRkdNbmVY4TQa48KF/mmNGuyiZkkpXkE2akqLmvs++tGPho+5qzlz5risDCti1vK9OItqKwRv2bLFZW+88YbLombcaGXk6PEi1d7L8jRlRk3EEyZMyHS7apcVz9qUedBBB7ksataPnp9otddq/27WazXdDicUZjZN0gRJ+5nZ85KuljTBzMZJSpJWSPpUXUYH1Ah1jLKjhlF0HU4oUkoXBvENdRgLUDfUMcqOGkbRsVImAADIjQkFAADIremXL4+aQx5//HGXVbsM6yWXXOKy6LLkeVRrtInkucxt1kaZ119/3WVLly4Nb3vddde5rNoqn+iaqBFx0aJFLqu2GmlnmjWLLnounnjiCZdFlySv1pQZNUpHK9oeeuihLouaN3/1q1+57I477nBZtQbE7iLa/7a2tuCW8fvMqaee6rKjjjrKZVFz4tChQ132wQ9+0GXRKqp5Re/hUQ1GDaHVaiZaxTJarXLFihUui/7te+qppzJtI2rUlOrXlMkRCgAAkBsTCgAAkBsTCgAAkBsTCgAAkBsTCgAAkFvTz/KIRJ2pv/zlL8PbDhs2zGXHHXecy6Ku1n333ddlvXv3dllnlsnOekZI1i7bqOv35ptvdtn06dPD+0dnf2zbti3TtpFNnjMbpPgsj2ip3l69ermsDGci/OUvf3HZr3/9a5dFZ2lI0sCBA10WneURiZb9/s53vuOylStXZnq87i5aTluS/vM//zPT/Xfs2OGy/v37uyxa1jp6Tey5556ZttsZ0Wtq/fr1Louei5dffjl8zHvvvddl0VkZy5Ytc9lDDz3ksqxLndfrbI5qOEIBAAByY0IBAAByY0IBAAByY0IBAAByK2RTZtTk9qc//Sm87aRJk1wWNe9EzUDRUr+HH364yz75yU+67KSTTgrHs/vuu4f5rqJ9jBp3rr32Wpfdd999Lov2D80TLVEc/X4laezYsS6bMGGCy4YMGeKy5cuXd35wDRYtFX/33Xe77KKLLgrvHy3NHC17vG7dOpd9//vfd9mTTz7pskY3r5VVtecparydM2eOy1555RWXRQ2YBx98cKbbdaZhPhK9D0eNldF7btQYGWVS/NqPluKP7r9hwwaXFfX9niMUAAAgNyYUAAAgNyYUAAAgtw4nFGY23MzuNbPFZrbIzL5QyQea2Uwze7ryd+tcgxkthRpGK6COUXRZmjK3S/pySukxM9tL0qNmNlPSxyXNSilda2ZXSrpS0hX1G2osak6Jml0iUQNMtJrh8ccf77Jjjz02fMysTZnRymv/8R//4bL777/fZUVtyCmwhtfw1q1bXfbwww+Ht/3Yxz7msuHDh7vsve99r8uiFR6LVh/R6rNR43RnRM100fP7+9//3mXR76YkCvte/Nprr7ksahiO6jVaCTJaAbNnT//PVT2aMqOVMteuXZvpdtWaVsuwom0tdPjbSCm1pZQeq3y9RdISScMkTZR0U+VmN0k6u05jBHKhhtEKqGMUXadOGzWzkZKOkPQnSYNTSm+dG7dG0uAq95ksaXKOMQI1Qw2jFXS2jqlhNELm40Vm1k/SHZIuSylt3vlnqf04T3isJ6U0JaU0PqU0PtdIgZyoYbSCrtQxNYxGyDShMLNeai/gW1NKb13Wcq2ZDan8fIgkv6oMUBDUMFoBdYwi6/AjD2u/HvcNkpaklL63049mSLpI0rWVv++qywgbLGoG+od/+AeXdaapLGrImT17dqasuzTz1FMzajjrJc2luFHtsMMOc9n555/vsqihLWogi8ZTTdToFmXR5dSj1TyPO+44l1122WUu69u3bzieF154IdN4on2MVleMnp8yaIX34qhh+MUXX3TZSy+91IjhZMb7cDZZeiiOkTRJ0gIzm1fJrlJ78f7CzC6RtFLSeXUZIZAfNYxWQB2j0DqcUKSUHpRkVX4cX9ACKBBqGK2AOkbRsVImAADIjQkFAADIrZCXL2+mqNEsWumvmmiltMcee8xlN954o8ui1TPROlavXh3m//qv/+qyz33ucy6LVme94gq/IGK0uurixYuzDFGSdOihh7pszJgxLtt7771ddsIJJ7hs6NChmbY7ZcqUMF+wYIHLoubp6Pk599xzXfbDH/7QZdEl1tEYUTNtZ5qIURwcoQAAALkxoQAAALkxoQAAALkxoQAAALnRlLmLapefzXP/559/3mVRoyaNSK2t2mWzf/Ob32S6/7e+9S2XXXrppS674IILXLZp06ZM25CkffbZJ1MW2bhxo8umTZvmsqhx9IEHHggfM+uqiQ8++KDLLrzwQpcNGjTIZatWrcq0DQDVcYQCAADkxoQCAADkxoQCAADkxoQCAADkRlPmLl5++WWXRU2V1ZrUosbKzZs3u+yNN97o/ODQkqJLI99zzz0ui2rr+OOPd9mECRNcNnDgQJftv//+4Xii2lyxYoXLnn322Uy3u/baa122bt06l+VtSo7GM2PGDJdt2bIl13YAxDhCAQAAcmNCAQAAcmNCAQAAcmNCAQAAcutwQmFmw83sXjNbbGaLzOwLlfwaM1ttZvMqf06v/3CBzqOGUXbUMMrAOlpq2syGSBqSUnrMzPaS9KiksyWdJ+nllNJ3Mm/MLN+61k1y5plnumzcuHGZ7x8tCRwtPczS2x16NKU0vrN3apUa3m03P//v3bu3ywYPHuyy6CyP6AwRSdqwYYPLoqWpn3rqKZe9/vrrmR4v7xL3WZlZ07ZdRbeuYbSEqjXc4WmjKaU2SW2Vr7eY2RJJw2o7PqB+qGGUHTWMMuhUD4WZjZR0hKQ/VaLPmdl8M7vRzAZUuc9kM5trZnPzDRXIjxpG2VHDKKrMEwoz6yfpDkmXpZQ2S7pe0iGSxql95vzd6H4ppSkppfFdOcwH1BI1jLKjhlFkmSYUZtZL7UV8a0ppuiSllNamlHaklN6U9FNJR9ZvmEA+1DDKjhpG0WVpyjRJN0nakFK6bKd8SOVzPZnZFyX9XUrpgg4eq5TNQFEzXJRVEzVb0oDZJV1taOv2NRzp0aNH5ttG9drk5sayooZRdl1vypR0jKRJkhaY2bxKdpWkC81snKQkaYWkT+UeJlAf1DDKjhpG4XV4hKKmGyvpzJgjFIXRpf/d1VJZazjCEYqmoIZRdlVrmJUyAQBAbkwoAABAbll6KLo9PrJAK9qxY0ezhwCghXCEAgAA5MaEAgAA5MaEAgAA5MaEAgAA5Nbopsz1klZWvt6v8n0rYF8aY0SzByBquCyKuj/UcP200r5Ixd2fqjXc0IWt/mrDZnObvcBLrbAv3VMrPVettC9S6+1PvbTS89RK+yKVc3/4yAMAAOTGhAIAAOTWzAnFlCZuu9bYl+6plZ6rVtoXqfX2p15a6XlqpX2RSrg/TeuhAAAArYOPPAAAQG4Nn1CY2almttTMnjGzKxu9/bzM7EYzW2dmC3fKBprZTDN7uvL3gGaOMSszG25m95rZYjNbZGZfqOSl3J9GoYaLgxruujLXMTVcTA2dUJhZD0k/lnSapEMlXWhmhzZyDDUwVdKpu2RXSpqVUholaVbl+zLYLunLKaVDJb1f0mcrv4+y7k/dUcOFQw13QQvU8VRRw4XT6CMUR0p6JqW0PKX0hqTbJE1s8BhySSnNlrRhl3iipJsqX98k6exGjqmrUkptKaXHKl9vkbRE0jCVdH8ahBouEGq4y0pdx9RwMTV6QjFM0qqdvn++kpXd4JRSW+XrNZIGN3MwXWFmIyUdIelPaoH9qSNquKCo4U5pxTou/e+87DVMU2aNpfbTZkp16oyZ9ZN0h6TLUkqbd/5ZGfcH+ZTxd04NY2dl/J23Qg03ekKxWtLwnb4/sJKV3VozGyJJlb/XNXk8mZlZL7UX8a0ppemVuLT70wDUcMFQw13SinVc2t95q9RwoycUj0gaZWYHm9nuki6QNKPBY6iHGZIuqnx9kaS7mjiWzMzMJN0gaUlK6Xs7/aiU+9Mg1HCBUMNd1op1XMrfeUvVcEqpoX8knS7pKUnLJP1Lo7dfg/FPk9QmaZvaP3e8RNK+au/CfVrSHyUNbPY4M+7LsWo/jDZf0rzKn9PLuj8NfN6o4YL8oYZzPXelrWNquJh/WCkTAADkRlMmAADIjQkFAADIjQkFAADIjQkFAADIjQkFAADIjQkFAADIjQkFAADIjQkFAADI7f8DcBybgOEXiMMAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 648x648 with 9 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(9, 9))\n",
    "for i in range(9):\n",
    "    ax = fig.add_subplot(3, 3, i + 1)\n",
    "    rand_i = np.random.randint(len(data.data_test))\n",
    "    image, label = data.data_test[rand_i]\n",
    "    ax.imshow(image.reshape(28, 28), cmap='gray')\n",
    "    ax.set_title(data.mapping[label])"
   ]
  }
 ],
 "metadata": {
  "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.9.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}