diff --git a/docs/ml/dl/nn/playground-mnist.ipynb b/docs/ml/dl/nn/playground-mnist.ipynb new file mode 100644 index 0000000..b639c93 --- /dev/null +++ b/docs/ml/dl/nn/playground-mnist.ipynb @@ -0,0 +1,350 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Playground / MNIST\n", + "\n", + "Here we'll play with the famous [MNIST dataset](https://en.wikipedia.org/wiki/MNIST_database)." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "import numpy as np\n", + "from matplotlib import pyplot as plt\n", + "from tensorflow.keras import layers, models\n", + "from tensorflow.keras.datasets import mnist\n", + "from tensorflow.keras.utils import to_categorical" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n" + ] + } + ], + "source": [ + "# check if GPU is available\n", + "print(tf.config.experimental.list_physical_devices('GPU'))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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oejUfTN06NBSfeKJJ9b8npWHmqWGwWfOnBmyadOmhWzkyJGl+le/+lVYkzqgNPUlCB988EGpHjt2bFgzzzzzhGzUqFEho33r06dPyO6+++6arvX222+HrPJeo32ZMWNGyCZMmBCyhRdeOGR///vfS/XsHI783nvvleopU6aENYsttljIPvroo5A98MADNe+jPfNEAwAAyE6jAQAAZKfRAAAAstNoAAAA2RkG/5pGjBgRsl133TVk2267bcgqTxU/+OCDw5rlllsuZJtvvvnX2SIZpAZSUyeVfvjhhyH77W9/2yp7ym3uuecO2WmnnVbVa5988slSfcIJJ+TYUod02GGHhWzMmDEhW3/99bO957vvvluq77vvvrDmtddeC9mf//znbHtIOeigg0p1apAzNdhLx3P88ceHLPXFE9Wo5vRw2pdJkyaFLHVy/IMPPhiynj17luq33norrBk2bFjIbrzxxpBNnDixVN9+++1hTWoYPLWus/JEAwAAyE6jAQAAZKfRAAAAstNoAAAA2RkGzyA1tPTrX/86ZNddd12pnmuu+Mu/4YYbhmzjjTcO2dNPP131/mg906dPD9n48ePrsJOWVQ5/n3zyyWHNscceG7LU6c0XXnhhqf70009nc3edy3nnnVfvLdTFpptu2uKaWk+HpnENGDAgZFtssUVN10oN8Y4ePbqma9G+vPDCCyFLfaFETpV/J9too43CmtSXGPhSi3/xRAMAAMhOowEAAGSn0QAAALIzo/E1rbrqqiH7/ve/H7K11147ZKmZjEojR44M2R/+8Icqd0dbu//+++u9haTUz0RXzl/stttuYU3q55933nnnbPuCltx777313gKZPfbYYyFbcMEFq3pt5SGS++67b44tQVUqD+9NzWM0NzeHzIF9/+KJBgAAkJ1GAwAAyE6jAQAAZKfRAAAAsjMM/m+WX375kP34xz8u1TvttFNYs+iii9b0fl999VXIUoe9pYaPaF1NTU1VZTvssEPIjjzyyNbY0n909NFHh+xnP/tZyHr06FGqb7311rBmn332ybcxgKIoFlpooZBV++faL3/5y1LtcFDa0qOPPlrvLbR7nmgAAADZaTQAAIDsNBoAAEB2Gg0AACC7TjEMnhrW3mOPPUJWOfhdFEXRp0+fbPsYPnx4qT7rrLPCmkY9abqzSZ30mcpS99Zll11Wqn/1q1+F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7wl0bP379y/V9957b1jTq1evkF1++eUhe+aZZ2raw5AhQ0K27777tvi6s846q6b3a2SeaAAAANlpNAAAgOw0GgAAQHadYkZj3nnnDdlKK60UslNPPTVkgwYNavH6lYeqFUV1B6ulDmbZb7/9QvbVV1+1eC2gc6r8eeSiKIr777+/VC+99NJttZ2vpfIwtqIoimuuuaYOO6E9W2ihheq9BdrAXHPFv7LutddeIbv++utLdbV/R0sdqnzCCSeU6spD94qiKHr27Bmy1GF8TU1Npfrmm28Oa66++uqQtXeeaAAAANlpNAAAgOw0GgAAQHYaDQAAILt2Pwz+jW98I2Srr756qb777rvDmsUWWyxkqQOgKge2U4fnbbXVViFLDaBXSg027bTTTiG79NJLQzZjxowWrw90TpVDh5X17Kj1yy9Sttlmm5B973vfC9nvfve7mq5P57DddtvVewu0gd133z1k1113XcgqDxBNfT69+eabIVtrrbVazLbffvuwZokllghZ6u+YEyZMKNX7779/WNMReaIBAABkp9EAAACy02gAAADZaTQAAIDs2tUweJcuXUKWGsS+5557WrzW6aefHrInn3wyZM8991ypTp0AmXpd6rTeSgsvvHDIzjnnnJC9++67IbvvvvtK9fTp01t8P9qfysHbaoduN9xww5BdccUVWfZEYxkxYkTINt5441KdOj330UcfDdkXX3yRbV8HHHBAyA4//PBs16dzeOqpp0p16gsE6Hh22223kN1www0h+/LLL0M2adKkUr3nnnuGNZ988knILrzwwpBttNFGpTo1MJ76so3KgfSiKIpevXqV6n/84x9hTeVnd1EUxVtvvRWy9sQTDQAAIDuNBgAAkJ1GAwAAyE6jAQAAZNfUnJpYSS3MeLJsNVInfv/85z8P2bHHHtvitVKnyu69994hqxwgKoo4sP3www+HNWussUbIUid3n3/++aU6NTCeOnUy5fe//32pPu+888Ka1LBTyiuvvFLVukpV3jpZtPX91yi++uqrUj07v+arrrpqqR45cmTN12oEbXn/FUXnvQdr1aNHj5B9/PHHLb5u2223DVmjngzuM7D17bzzzqX6zjvvDGs+//zzkK200kohGzNmTL6NNYCOfP+lvmSnd+/eITvzzDNDlhoar0bqnrn66qtL9XrrrRfWVDsMXuk3v/lNyPbZZ58W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6+vbt2+pfvXVV8OaP/7xjyEbNGhQyGbNmpVvYw3A/Uc9VXv/eaIBAABkp9EAAACy02gAAADZaTQAAIDsHNiXwTHHHBOyLl26hGzFFVcs1YMHD67q+pVDvEVRFCuvvHKVu6OtPfLII6W6T58+Yc35558fsl/84hchmzhxYovvt8IKK4Tsf/7nf0LWr1+/Un3KKaeENT//+c9bfD86hv79+4fsiCOOCFnv3r1bvFblvVUURbH00ku3+Lpzzz03ZKkvKUgNoo4bN65Upz5zaV+6du0assov0/jrX/8a1uy6664h62iD39RHz549S/Vuu+0W1px44okhS31BRqWTTz45ZOecc87X2F374IkGAACQnUYDAADITqMBAABkp9EAAACyczL4v9loo41CVjkwmVqz4447hiznr1dqqO3NN98s1fU45dmppEWx+eabh6xyGPyOO+4Ia/bYY49W21NRpIe6KwfPxowZE9Yss8wyrban3JwMPntSg98XX3xxTdeaPn16yO68886QbbLJJqW6moHJokj/2u+zzz6l+pZbbqnqWjn5DMwr9YUYP/7xj0v1csstF9aMHTu21fbUyNx/eQ0cODBklZ+J66yzTliT8//Dr3/965Dtt99+2a6fk5PBAQCAutFoAAAA2Wk0AACA7DQaAABAdu3+ZPDFFlssZLfddlupXnbZZau6Vo8ePUI233zzlerUQNRLL70UsjXWWKOq96zGHHPEfrByX9THXHPF30KVg/q33357W23n/7vrrrtCVjkMnjqFt3v37iGbMmVKvo1RF6eddlrIjj322Kpee9NNN5XqCRMmhDUXXHBByFLrBgwYUKofffTRsKZXr15VXSt1j9N+zD333CHba6+9Qvb000+X6s46+E1eqc+Za6+9NmQrrrhiqU59Ft13330hGzZsWMgqv8Bil112CWtSA+ldunQJ2YwZM0LWqDzRAAAAstNoAAAA2Wk0AACA7NrVjMZmm20WstTP1C211FKttofUwXgfffRRyFI//1d5ONUNN9wQ1iy55JJV7WPkyJFVraN1PfXUUyFbffXVS/W0adPaajv/X+oAtUqLLLJIyPbcc8+QDR06NMueqJ/UTNc888wTstQhjieddFKpHj9+fFXv2bdv35CdeOKJpXrhhRcOaz777LOQpWZMvvjii6r2QWM67rjjQjb//POHrPL+gxxSMxSV8xhFURSPPfZYqR40aFDN7/nGG2+U6tTfaVN/B0zt69VXX615H23NEw0AACA7jQYAAJCdRgMAAMhOowEAAGTXrobBU8NjtQ5+p4Zljz/++JD9+c9/LtWjR4+u6voff/xxyI488shSXe3g9zvvvBOyvffeu6rX0roadSD17bffDtnf/va3Ur3yyiuHNcstt1yr7Yn6SR1ut9VWW4Us9WUX5557bqk+7LDDwprUYacXXXRRyLbeeutSPXHixLDmrLPOCtlVV10VMtq3LbbYImTPPfdcyF5++eW22A6dzOeff17VutTQeGtKHZCb+sKh9sQTDQAAIDuNBgAAkJ1GAwAAyE6jAQAAZNeww+CpQbGBAwfWdK133303ZKlh6tQgWk7VDn9XSg0jtffhIFrXl19+GbKZM2fWYSc0gldeeSVklV90URTpYfBNNtmkVG+++eZhzcUXXxyypZdeusV9nX766SG7/PLLW3wd7csGG2wQstSf56usskq299x4441DNmHChFJd+QUZdB5NTU1VZZ988kmp7tq1a1jzrW99K2T77rtvyNZcc81S/f7774c1e+yxR8jGjRsXsvbEEw0AACA7jQYAAJCdRgMAAMhOowEAAGTXsMPgxxxzTMjmnXfeql77/PPPl+rUwGHOwe8FF1wwZKlTdzfccMMWr1W596Ioiocffri2jdFpzT333CFLDbFVmjp1amtshzqbPn16yFIn0KYsvvjipfruu+8Oa1JDlM3NzSG7/vrrS/V9991X1R5o3/baa6+QvfbaayH7+9//3uK1UkO2F154YchSfy5X/j4YMmRIWHPllVe2uAfav5VXXjlkqc+sn/zkJ6U69XfTyiHv/2T33Xcv1XfddVdVr2vvPNEAAACy02gAAADZaTQAAIDsGnZG45prrglZr169QjZ58uSQ7bnnnqU6dShKToccckjIzjjjjBZflzosaNdddw1Za++fjqdPnz4hW3755Vt83SOPPFLT+6V+b6622mohW2+99UJ25513lurRo0fXtAe+njFjxrTq9VOzZRdccEGp/sc//tGqe6Ax7L///iGr/HO6KNKzRF26dCnVp556alhz8MEHh+zRRx8N2aBBg0r1DTfcENa89dZbIav1c5HG9fHHH4esW7duIVtrrbVKdbXzaNOmTQvZyJEjv84WOwxPNAAAgOw0GgAAQHYaDQAAIDuNBgAAkF3DDoOnDoVKZW1t2223Ddkpp5xS1WtnzpxZqocOHRrWGPzmv0kdxLfkkkuGbP3116/p+ql78qWXXgrZGmusUap79uwZ1iy11FIhSx0I2Ldv31KdOpCL2TPnnHOG7Dvf+U7IUoOO1XjooYdClvqspHOoPAxtrrniXzUq/zz8Tyo/a1KD2dUefPbb3/62VG+wwQZhzQknnBAyw+AdT+rAvoEDB4as8s/XynvoP7nnnntCZhgcAAAgE40GAACQnUYDAADITqMBAABk19ScOtIwtbDGIcGO5quvvgpZlb+ExWGHHVaqU6eftyfV/nfn0Kj33zzzzBOyb37zm6W6cpixKNJDZ5tsskmL79e1a9eQpYbaapW6v8eOHdvi62688caQpQaEP/roo5C98847Ve2tUlvef0XRuPdgNSpPXy+Kothpp52yXT/1/3q77bbLdv1G5TMwbdNNNy3Vjz/+eFiz0korhWzUqFEhqzytufKk8KJIn/JcjdQe/vrXv4Ys9WUKjcD91/r69+9fql999dWwJvX/IXVvvf766/k21gCqvf880QAAALLTaAAAANlpNAAAgOw0GgAAQHYNezJ4ozj77LNL9RxzxN5s1qxZVV3rmWeeybInWl9qyPu0004LWer04xVWWCHbPqZMmVKqUydrp07YTZ3EW+m6664LWepk8JdffrnFa1E/iy++eMj222+/Ur3zzjuHNalBvtT/68rhx8prF0X8AgRoybhx46pal/rMy6WaL7qgc1tllVVK9ez8HbCz8kQDAADITqMBAABkp9EAAACyM6Pxb1IHAa2++uqlOvWzeKmfdT7yyCND9sYbb8zG7mhL9913X8g233zzkE2fPj1klYeX/f3vfw9rhg0bVtW1Kg+zS/1MceqQq379+oXs7bffLtU/+clPwppPP/00ZDS2ysPRiqIofv7zn7f4upNPPjlkV1xxRch22GGHUp2a0Rg5cmSL70fnUXm4W6Me9rbRRhuFrDVnQmh/Pv/881Kd+jvg008/HbIZM2a01pbaHU80AACA7DQaAABAdhoNAAAgO40GAACQXacdBp933nlDttdee4UsNQBc6bbbbgvZrbfeGjKHurQfW2yxRchSQ9077bRTyF555ZVs+6g8eO+8884La5ZYYomQffjhhyHbddddS7XB7/Zn4403Dtlll13W4uu22267kP3+978P2aKLLhqyU045pcXrV35pAZ1b5RekpL4wpR6+8Y1vlOpDDjkkrPn1r3/dVtuhwaQO2z3ggANK9YQJE8Kaq666KmQ+E//FEw0AACA7jQYAAJCdRgMAAMhOowEAAGTXKYbBu3XrFrJrr702ZN///vdbvNbRRx8dstRpuga/27fU8OKkSZNCNmLEiGzv2bVr15DdeeedpXrrrbcOa1Iniu++++4he/nll2djdzSC1JdT9OjRI2TPPPNMqX7wwQfDmsrB2KIoim222abF66dOeU4NSNJ5VZ4UP378+LAm9eUrqaHaWqXu78rr9+nTJ6z5wQ9+kG0PNK7U5+ajjz4assovWzn++OPDmrvuuivfxjogTzQAAIDsNBoAAEB2Gg0AACA7jQYAAJBdpxgGT52cXM3gd1EUxVtvvVWqqzmFl/bv9ddfD9mAAQNCds0114RsoYUWKtWvvvpqWPP222+H7Nhjjw3Z8ssvX6pfeOGFsObQQw8NWc7TyWkcqS+ZSH1xQWWWGozdYYcdQnbppZeG7JNPPinV1113XViTc4iX9q9y+Pvss88Oay688MKqrnXrrbeW6mWXXTasWW211UJ24oknhuyLL74o1VtssUVY89FHH1W1L9q3888/P2Spvyvedtttpbra+5Z/8UQDAADITqMBAABkp9EAAACy65AzGiussEKpPuaYY6p6Xern8r/3ve9l2RPtS+U9VBRFccYZZ4RsyJAhIZtjjnL/vtVWW1X1nvfff3/IKu/dRx55pKpr0TF985vfrGpd5QF6jz/+eFjzne98p6pr7bfffqX6gQceqOp18E9XXnllVetSP/+eOhC30tSpU0OWmqc888wzS/WMGTOq2hft22abbRay1IGRn3/+ecgcxjf7PNEAAACy02gAAADZaTQAAIDsNBoAAEB2Tc2p055SC5uaWnsv2VQe8LPbbrtV9brDDz88ZA6i+s+qvHWyaE/3H22jLe+/omiMe/Coo44KWTUHSKX2PnHixJClhnbPPffcUp0amOysfAZST+6/tD59+pTql156Kazp2rVryFID4vfee2+2fXU01d5/nmgAAADZaTQAAIDsNBoAAEB2Gg0AACC7dn8y+Morrxyy7t27t/i6a665JmRPPvlklj0BtIabbropZF26dAnZz372s1I9fPjwsCZ1Ev3FF188G7sDaFvzzDNPyI455phS3aNHj7Dm7rvvDpnB79bhiQYAAJCdRgMAAMhOowEAAGSn0QAAALJr9yeDn3feeSGrHAQaM2ZMWDNo0KCQjR49Ot/GOgGnklJPnfFkcBqLz0Dqyf1XFIceemjIrrjiilL9/PPPhzWbbbZZyKZPn55vY52Ak8EBAIC60WgAAADZaTQAAIDs2v2MxqabbhqyRx99tFTvvPPOYc2wYcNabU+dhZ8PpZ7MaFBvPgOpp852/62zzjohSx2896tf/apUX3vttWHN2LFj822skzKjAQAA1I1GAwAAyE6jAQAAZKfRAAAAsmv3w+DUT2cbRKOxGAan3nwGUk/uP+rJMDgAAFA3Gg0AACA7jQYAAJCdRgMAAMiu6mFwAACAanmiAQAAZKfRAAAAstNoAAAA2Wk0AACA7DQaAABAdhoNAAAgO40GAACQnUYDAADITqMBAABkp9EAAACy02gAAADZaTQAAIDsNBoAAEB2Gg0AACA7jQYAAJCdRgMAAMhOowEAAGSn0QAAALLTaAAAANlpNAAAgOw0GgAAQHYaDQAAIDuNBgAAkJ1GAwAAyE6jAQAAZDdXtQubmppacx+0Q83NzW32Xu4/KrXl/VcU7kEin4HUk/uPeqr2/vNEAwAAyE6jAQAAZKfRAAAAstNoAAAA2Wk0AACA7DQaAABAdhoNAAAgO40GAACQnUYDAADITqMBAABkp9EAAACy02gAAADZaTQAAIDs5qr3BgAAoD267bbbQjZw4MCQ7b777qX6hRdeaLU9NRJPNAAAgOw0GgAAQHYaDQAAIDuNBgAAkJ1h8DbUr1+/Uj106NCwZvDgwSEbP358q+2JzmPjjTcu1U888URYM8cc8d8eKl9XFEXxzDPP5NoWALRbvXv3DlmfPn1Cdsstt5TqlVZaKaz58ssvs+2rUXiiAQAAZKfRAAAAstNoAAAA2Wk0AACA7Fp9GLxbt24hm3/++UM2efLkUj1t2rRW21O9DBo0qFRvuOGGYc0Pf/jDkJ1zzjkhmzlzZr6N0eHsu+++ITv88MNL9axZs6q61kUXXRSym2++uVRfeeWVYY17FGhkJ5xwQsjOOuuskJ1//vkh++lPf9oqe6KxLbXUUiFba621qnpt3759S/Vcc8W/ghsGBwAAqIJGAwAAyE6jAQAAZNfU3NzcXNXCpqaa3uCMM84IWernIo899thSffHFF9f0fo1sgw02KNVPP/10Va9bYYUVQvbmm2/m2NJsqfLWyaLW+68zSM1j7L333iFLzQRVSh3YV80sR+XPnhZFUYwZM6bF182Otrz/isI9+N+kDqw6+uijQ3bYYYeV6tTPKN9+++0h23PPPWdjd63HZ2D7UjkzOnr06LBmkUUWCVnq5+Z/9KMflerrr79+Nnf39bn/2l7//v1D9te//rWq1953332leueddw5rqp2dbATV3n+eaAAAANlpNAAAgOw0GgAAQHYaDQAAILtWP7CvWqeeemqpfvvtt8OaYcOGtdV2WsWiiy5a7y3QwBZYYIGQDRgwoFTfcMMNYU2vXr1C1rVr1xbfb9SoUSFLDYP369evxWvReey3334hu+SSS0L2xhtvhOzggw8u1anDryr/LCiKovj5z38estT9C/+U+qKBQw89tFSnBr9TPvjgg5D96U9/qm1jtCuV91Hqy4yq9Zvf/KZUt6fB79nhiQYAAJCdRgMAAMhOowEAAGSn0QAAALJrmGHw+eefv1Snhl632GKLkA0fPrzV9jQ7Kv97iqIofvKTn9R0rV122SVk55xzTk3XojHssMMOITvwwANDVnnP13pyd8ovfvGLkKWuf+2119Z0fdqfLl26hOyYY44p1aecckpYc9FFF4UsdX9NmjSpVK+xxhphTWoYfOrUqSGD/2bgwIEhq/XPzUMOOSRkI0eOrOlatC8XX3xxqd5zzz3rtJP2yxMNAAAgO40GAACQnUYDAADITqMBAABk1+rD4O+8805Nr+vevXvITj/99JDttddeIfvkk09qes+c+vbtG7J11lmnDjuh3lL36E033VTTtVLD2rVqampq8/eksaVO/T7zzDNL9VFHHRXWXH755TW9X+oLPj788MOQjRs3rqbr0zn06dMnZJdddllN13riiSdC9vTTT9d0LdqX1BeyHHDAAXXYScfibxAAAEB2Gg0AACA7jQYAAJBdq89o3HjjjSFbfPHFQ5Y6pKnSlltuGbKdd945ZNddd111m2tFqZ8zfvvtt0v1sssuW9W17rzzzix7om1UzmRccsklYU3qkL0vvvgiZB988EGp7tatW1jTs2fPqvZVef0pU6aENT169AhZrQcC0thS980ZZ5wRsrvuuqtUX3XVVTW/Z+/evUv1D3/4w5qvBf/0wAMPhGyllVZq8XWpz8DUQZOff/55bRujYaXm0a644oqQVR5i+vLLL4c1qYNH+RdPNAAAgOw0GgAAQHYaDQAAIDuNBgAAkF2rD4N/9dVXIUsdpDN48OBSnTrwLuVHP/pRyO69995S/fHHH1d1rZy++c1vhqza4W/ajx122CFklYfxVTtM/cILL4Rss802K9X77rtvWHPttddWdf0TTzyxVFf+PvlP16f9m2uu+FH/3HPPhazyyweKoigOPfTQUj1z5sya93HLLbeU6tRn4oUXXljz9emcVl555ZA1Nze3+Lpf/vKXIXv88cez7InZM//884dstdVWC1m/fv1Ctu6665bqXXfdNaxZcMEFq9rHEUccUaoffvjhsObNN9+s6lqdlScaAABAdhoNAAAgO40GAACQnUYDAADIrtWHwVMmT54cssrBxGqHwVdZZZWQLbXUUqV6dobBK0+FPPjgg6t63S677FLze9KYUoPSqVO/K6VO/E4NflcOnVXr1VdfDVnlQHpRVHeic+Up0EVRFAceeGDI1llnnSp3RyP4/ve/H7LUEOUmm2wSsokTJ9b0nnvssUfIBg4cWKo//fTTsOaCCy6o6f3oHC666KKQNTU1hSw1DP7EE0+U6jPOOCPfxshqySWXDNmvfvWrkKU+xyql/s6Z+hKV888/P2TvvPNOi/viv/NEAwAAyE6jAQAAZKfRAAAAstNoAAAA2dVlGDzlT3/6U6n+wQ9+UPO11ltvvVL9yiuvhDXrr79+VVnl6ZQnn3xyzfuqxmuvvRayTz75pFXfk+r87Gc/C9l8883X4uvOPvvskJ1zzjk17eHZZ58N2e9+97uQpU54rkZqOHf69Ok1XYvGkfo8HT16dMief/75mq6/6KKLhiz1RQlzzFH+t63LL788rKn13qVjuvLKK0v1DjvsENakBr//93//N2SDBw8u1akv6qAxjBo1KmSrrrpqyJZbbrkWrzVlypSQvfvuu7VtbDZU8/eFjsgTDQAAIDuNBgAAkJ1GAwAAyK5hZjSuu+66Ur3RRhuFNXvuuWdV17riiiv+a/11VP5M8axZs2q+VjVWWmmlkKV+JvX6669v1X10dgMGDAhZt27dQlZ5fxRFUcw555ytsaWiKIrizTffbLVr/yepw7BS/900ri233DJkp5xySsi+/PLLFq/VvXv3kN19990h69WrV8iGDh1aqs8777wW34/OI3UQaOWff6l5oJRrrrkmZBMmTKhpXzSG1LzgiBEj2nQPU6dODdn7778fstR9uv3225fqG2+8Mdu+Gpm/LQAAANlpNAAAgOw0GgAAQHYaDQAAILuGGQavdOGFF4Zsjz32aPN9VA5/pw4Gam0DBw4MmWHwvPr371+qU8OtCy64YMha+8sB2lrlAZVFURRdunQJWUf77+5oNt100xbX3HfffVVdq3KQ/Oqrrw5rll566ZClvrjgxBNPLNWpg7TovPbff/+QLbbYYi2+LnXQ7bBhw7LsCf7dxx9/HLK///3vIUsNgz/11FOtsqdG54kGAACQnUYDAADITqMBAABkp9EAAACya9hh8EZROdCYGgZ/6KGHQjZ58uSQpU7ipTFcdtllpTo13NoZfP/73w9Z6rReGtsHH3xQqr/44ouw5o477ghZt27dQrbwwguX6tTpvKnT46+88sqQpT4X6ZyOOuqokB1wwAEhq+YLWDbffPOQvffeezXtC1rL+PHj672FuvBEAwAAyE6jAQAAZKfRAAAAstNoAAAA2XWKYfCJEyeG7N133w1Z6jTy2267rab3HDBgQMgMg3c8xx13XL23ULMVVlghZOeff35Vr33nnXdKdWrYmPoZMWJEqT7kkEPCmtTg7auvvhqyys/AK664IqwZPnx4yFIniNM5LbXUUiFL3X9zzBH/7fOrr74q1ddee21YY/CbRpP6EoMPP/ywDjupP080AACA7DQaAABAdhoNAAAgu4ad0Xj77bdDdvPNN4ds2WWXDdlrr71WqlMHR1X+DHMj22KLLUK24IILlupPPvmkrbbDv/n444/rvYWqVc5kDBs2LKxZaKGFQpb6udLKg/0qD4ijsaQ+O1NZ6uC9Sy65pFQvssgiYc1OO+0UMnM7nVffvn1L9f333x/WLL/88lVd6+KLLy7Vxx9/fO0bo1OqvB+Loih69uxZ1WunTZtWqlMzvxdddFHIUvOOlYefVtZFURTzzjtvyM4888yQ3XnnnaU69XusUXiiAQAAZKfRAAAAstNoAAAA2Wk0AACA7Bp2GHzKlCkh23///euwk/pbYoklQtalS5c67KTjqhyCTR0clXLDDTeELDVk25rmn3/+qvaw/fbbt3it1JcwbLPNNiEbPXp0lbujPdloo41C9uMf/7hUn3XWWWFN6sA+Oq/KQe9qB79TGnnIlbaV+ntP6guBDjrooFJ98MEHhzWpoeuUGTNmlOpPP/00rKl2sLxygHvChAlhTeq/sUePHiF7//33S3Uj/z7xRAMAAMhOowEAAGSn0QAAALLTaAAAANk17DB4ezdp0qSQjR8/vlQvtthiNV//7LPPLtWpYaeZM2fWfP3OpvLkzd/+9rdhTWogK+Wpp54q1c3NzWFN6lTu1ID1cccdV6pTJzenhsfWWWedkFWecFp5DxVFUdxzzz1V7YuO6Te/+U3I3nvvvVKdOvEW/l21w7GVnn766ZCNHDlyNndDe7TIIouE7NJLLw3Zbrvtlu09K/+OVhTxz++//e1vYc2rr76abQ/Vuummm9r8PWvliQYAAJCdRgMAAMhOowEAAGSn0QAAALJrak5NqqYWJoZQ+XrWXXfdUp0avE0NQFUjNaj82Wef1XStalV562TR1vdf6oTku+++O2SpX/fKU8VnzZqVbV+pE8tT13/mmWdCVnlaeFufYJ5bW95/RdHxPgPXWmutkD3//PMhO+KII0r10KFDW21P7U1H/gycHe+8806pXmqppap6XWqw96677sqxpQ6pI99/Rx99dMguuuiimq714IMPhuzCCy8M2XPPPReyL7/8sqb37Ayqvf880QAAALLTaAAAANlpNAAAgOzMaNRR6mekUz9L2KtXrxavtemmm4Ys9XP6OXXknw9NWWKJJUJ20EEHhezkk08u1TlnND788MOQ/fGPfwxZ6gDHyZMnZ9tHIzCjUb2uXbuGLDWPseCCC4asf//+pbq1Z7/ak872GZiy8sorh6zy4L3UAX6nn356yM4444yQtfXv8/akI99/ffr0Cdn9998fssoDRYsiHrh7ww03ZNsX/2JGAwAAqBuNBgAAkJ1GAwAAyE6jAQAAZDdXvTfQmQ0fPjxkqUNqjj322JA99NBDLV6LvMaNGxeyU089NWRvv/12qR4yZEhYs8IKK4Rs1KhRIfvFL35Rqt96662wJnXIEPy7/fbbL2SrrbZaVZnhb/6bgQMHhqxbt24tvm769OkhM/jNP1Ue+lgURbHqqqu2/UaYbZ5oAAAA2Wk0AACA7DQaAABAdhoNAAAgOyeDU7OOfCopjc/J4NUbOXJkyFLDuGuvvXbIZs6c2Sp76gh8BqaNGTOmVM8777xhzeabbx6yV155pbW21CG5/6gnJ4MDAAB1o9EAAACy02gAAADZaTQAAIDsnAwO0MH17NkzZKeffnrIDH6TQ+/eveu9BaBBeKIBAABkp9EAAACy02gAAADZObCPmjksiHpyYB/15jOQenL/UU8O7AMAAOpGowEAAGSn0QAAALLTaAAAANlpNAAAgOw0GgAAQHYaDQAAIDuNBgAAkJ1GAwAAyK7qk8EBAACq5YkGAACQnUYDAADITqMBAABkp9EAAACy02gAAADZaTQAAIDsNBoAAEB2Gg0AACA7jQYAAJDd/wM4wlWdFJ9skwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# load dataset\n", + "(train_images, train_labels), (test_images, test_labels) = mnist.load_data()\n", + "\n", + "# plot some images\n", + "plt.figure(figsize=(10, 10))\n", + "for i in range(25):\n", + " plt.subplot(5, 5, i + 1)\n", + " plt.imshow(train_images[i], cmap='gray')\n", + " plt.axis('off')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(60000, 28, 28) (60000,) (10000, 28, 28) (10000,)\n" + ] + } + ], + "source": [ + "# check structure of dataset\n", + "print(train_images.shape, train_labels.shape, test_images.shape, test_labels.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(60000, 784) uint8\n" + ] + } + ], + "source": [ + "# flatten images, dim[1] <- dim[1] * dim[2]\n", + "train_images = train_images.reshape((60000, 28 * 28))\n", + "test_images = test_images.reshape((10000, 28 * 28))\n", + "\n", + "print(train_images.shape, train_images.dtype)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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++xzn/tcXn311U997u/cuTPvvvturrzyyn3e8++nZ8+eOfnkk/P888937HvuuecyadKk4n+vzf/82R1NH0cEAABAMb46BQAAFCc0AACA4oQGAABQnNAAAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQnNAAAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQnNAAAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQnNAAAACKExoAAEB52U2VSsWY//b553/+5yxfvjxjxoxJU1PTbj1+0qRJe7WrW7duufrqq/Pggw9m+PDh//DxgwYNynXXXZcrr7xyr/ZNnDgxc+bMyRVXXJF+/fr9w8fffvvtmT17do466qg93nXwwQdnzZo1eeihh9KzZ8/des4777yTWbNm7fGuLl265JlnnklbW1suv/zyf/j4rl275tRTT82HH36Y6dOn7/G+r33ta1m2bFkefPDBDB06dLfO+4IFCzJ37twce+yxe7Srf//++etf/5parZZ/+qd/SqdOnf7hc+66667UarVcccUVu3UPfzLNzc154IEH0t7enkWLFqVv37679e975JFHsnLlyowbN+4fPr5Tp04ZPnx4vv/97+evf/1rqtVq5s6du1vPrVQqmTx5chYvXpw777wzw4YN6/j5oYcemjFjxuT888/P9ddfnxkzZmTp0qXZunVr1q1bl+effz4ffPBBdu7cma985Svp0qXLbu275ZZbsmPHjmzYsCGvvfZaFi5cmIULF6Zer6e9vT3VajWbNm3KSy+9lFtuuSVnn312Bg8enM6dO2ft2rVpa2vbo+vds2fPXH311Xn88cd3mVmzZmXy5MkZNWrUp54zaNCg3Hbbbdm6dWtuv/32Pb6f93R++MMfZu3atZk1a1aGDBnS8H2/+93v0t7evtv3yL7MiBEj8txzz2X+/PkZOXJkw/ddfvnlWbVqVW688cYcfPDBDd/34IMPpr29Peeff37Ddw0dOjTPPPNM1q5dmx/84AcN3/ed73wnK1asyDPPPLNXf7P2dL7+9a+nVqvlrrvu2qPPWbNvszuaPo4IAACAYnx1CgAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDyspsqlYox/20zbdq0bN26NUkyceLEdOrUqSF7WlpactFFF2Xbtm2p1WrZuHFjxo0b17DjOvbYYzNnzpxUq9XUarXMnDkzQ4cObciuz3/+81m8eHF27tyZJUuWZMyYMenevXtDdk2YMCEffPBBqtVqtm/fnsmTJzfsHI4dOzbPPfdc6vV6Vq5cmWnTpjVsV9++ffPaa6+lVqtlw4YNOeeccxp2DocNG5YFCxakXq9n586dueqqqxp2XAMHDsytt96aWq2WNWvWZPr06enRo0dDdo0bNy4vvfRSduzYkYULF2b8+PFpaWlpyK5DDz009Xq9Y+69996GncNBgwbl4YcfTrVaTbVazSuvvJIhQ4Y0ZNfQoUNz3333ZfPmzalWq5k7d27GjBnTsGP75L1crVbz4osvpnfv3g3bNWzYsNTr9VSr1bz33nuZOHFiw3adddZZWbx4cdrb21Ov1zNt2rT07NmzIbtGjRqVpUuXplarpa2tLbfcckvDdrW0tORrX/taarVadu7cmblz5zbsHFYq/9/7bObMmanX61m3bl2mTJnS0H0HHnhgZs+enR07dmTZsmUNO49mz2d3NH0cEQAAAMX46hQAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAA5WU3VSoVY8weTL9+/XLWWWfl4YcfzsqVK1Ov1/OXv/wlF1xwQb7//e/nwgsvzKBBg4rsOvHEEzN//vzs2LEj9Xo98+bNy8KFC9Pa2pparZZ6vZ7HHnssffr02ac9LS0tGTduXLZs2ZJarZZnn302xx9/fDp37pz99tsvf/zjH1Ov19PW1pbvfve7+7RrwIABueGGG1Kr1bJmzZpMnz493bt3T6VSybBhw3LHHXekVqtly5Ytuemmm9KzZ8+93nXuuedm6dKlqdfr+f3vf59Ro0alU6dOHb9/7LHHsn379tRqtVx44YXp0aPHXu+6+uqrU6/X09ramscee6zjmCqVSrp165avfe1rHbt+9KMf7fWe5ubmjB07NuvWrcv69evzs5/9rON33bt3z6mnnpolS5akVqtlxYoVueyyy9K1a9e93te7d+88+OCDqdVqueiii3LwwQdn8uTJ+cMf/pAPP/wwO3fuTL1eT61Wy7Rp09K3b999uj/69u2bFStWdNzftVqtY1asWJGVK1emVqtl1apVRd5jXbt2zamnnpoNGzaktbU1r776an7wgx/k8MMPz/jx47Nw4cK8//77ueiii4rs+8/miCOOyIsvvpj29vbMmDGj2GfIfzZf+tKXOs7rgQce2NBdlUolo0aNSr1ez/z587Pffvs1fNezzz6ber2e8847L126dGnovgsvvDDVajX1ej0DBgxo6K7OnTtn4sSJSZLFixdn//33b/i1u+aaa7Jx48Zcc8016d+/f8P3nXPOOWlra8vzzz+fUaNGNXRXU1NThg0blj//+c/ZvHlzfvGLX+zy2d2I6dq1ayZPnpw33ngjV1111T5/ZjZidkfTxxEBAABQjK9OAQAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFBedlOlUjGmodOzZ88MGDAg5557bv71X/81ffv2bcieESNG5M4778wbb7yRWq2WWq2W7du35/rrry+2o1evXjnllFPy9NNPp7W1NfV6PVu2bMnSpUvz4YcfZuvWrbnppptywAEH7PM5u+KKK/Luu+9m586dHcezbNmyjBs3LiNGjMjKlStTq9VyyimnpHPnzvu07/zzz+/Y8cksXrw4gwcPTqVSyZFHHplarZatW7dm3Lhx+7Rr1KhRefnllzteb/78+bnyyivTv3//VCqVDB48OLfddltqtVoeeeSRDBs2bJ/29evXLxdccEFOPvnkDB06NC0tLbv8/rTTTssHH3yQWq2W008/PV26dGnYe6GpqSkzZ85MrVZLW1tbPv/5zxd9/cGDB2fatGm54oorcsUVV2TGjBlZunRpVq9enauuuipNTU37vKNLly4ZOXJkbr311qxduzb1ej1J0t7ennq9njVr1uRLX/rSPp/HlpaWjB07NitWrOi4V1auXJmHHnooW7Zs6bhPV61alUsvvXSf3gP77bdfpk6dmlqtlg8//DCXXHJJjjrqqLS0tGTChAl55513dnlvvPzyyxk/fvyn7qV/NM3NzTn11FOzYMGC1Gq1LFy4MBMnTkznzp3Tp0+fzJgxIxs3bsyOHTty7733ZtasWVm7dm1qtVpeeumlnHXWWRk7dmzGjBmTrl27/sNd11xzTdra2rJly5Z897vf7XiPjR07NvPmzUutVsuSJUtywgknpFKppE+fPjnppJMya9asXc7xO++881/u6tq1ay677LLUarWsWLEip556ag455JCcccYZmTNnTrZv354PP/wwF198cQYMGPCp5x9yyCG59NJLM3v27Fx77bU5+OCD/8t9l1xySbZs2ZIdO3bkvffey6JFi7J+/fqOf+8jjzySo446qsj9XqlU8uyzz2bHjh273ANz5szJ5ZdfnsMPP3yP74N/NPvvv3/OP//83HzzzZk2bVoOPPDAff6MN2ZPZnc0fRwRAAAAxfjqFAAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADlZTdVKhXzv2DGjRuX5557LuvXr8/06dOz3377NWzXwIED87e//S3VajX1ej3nnHNOunbt2rB9vXv3zuOPP556vZ7W1tZ88YtfbOi5HDNmTJ566qnU6/XMmTMnRxxxRMN29erVK7/+9a+zZcuW1Ov1fOMb30iPHj0aeu2WLVuWer2earWaK664IkOHDm3YvhEjRmTWrFmp1+up1Wp55ZVXGn79XnzxxY591113Xfr169fQfUlSr9dTr9dz8cUXN3TX8ccf33Fsr7/+eiZOnNjQfc8880zHvptuuikHHXRQQ/d9sqtWq+Xb3/52Q3eNHTu249qtXr06V111VUP3PfLII7sc33nnndfQ9/qMGTM6dtVqtdx6660N29WvX7/89Kc/7di1cuXKfOc732no+bz55ps7PjeTZMqUKenevXtDr1+1Wk2tVku9Xs+IESMatqtHjx755je/2bFr0aJFGTRoUEOv380335z169enXq/n29/+dnr27NnQ62f+787uaPo4IgAAAIrx1SkAAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAystuqlQqxhSdQw89NEcccUTOP//8rFu3Lu3t7anX67vM7Nmz07dv333ac+SRR+amm27Ke++9l5UrV3a8dq1W+9Rs27Ytv/jFL9KrV6+92nXMMcfklVde2eU1/6t9tVotd955ZwYNGrRX+0477bS88847qdVq+eijj/KrX/0q1157baZPn57p06dnzpw52bZt2y77Jk6cmE6dOu3VvpaWlgwZMiRDhgzJgAEDPvX7Aw44ICtXrkytVktbW1vuv//+dOnSpWH3z4wZM9La2pparZYFCxbklFNOaciuk046KY888ki2bt3acR5HjhyZpqamonvOPvvsvPnmm2lra+vYU61WM2/evHTr1m2vX7dLly455phjctNNN+XPf/5z/vznP+eNN97Y5b5sa2vL888/n5NPPjn777//Xu8aMmRIZs2atcu5+qz3wQsvvJBhw4bt8zkbNWpU3n333U99diTZ5b8/uff3dV9LS0uOOuqofPe7383RRx+dUaNGdcyJJ56Y3//+96nVapk3b16OPvrohtyPn0yPHj3ywgsvpFar5fvf//4+f1b+oznjjDN2+RzZ29fp2bNnvvjFL6Zr166f+fv+/fvnxz/+ccdn18KFC3Psscfu1b14xRVXZOnSpZk+ffqnPtd79uyZE044Ic8991zHe2779u2ZNm1a9ttvvz3e99xzz2XHjh0dn+s//elPc91113XMX//6113ux2effTannXbaXp3D7t27Z9GiRf/p35VP3nM7d+7M3//+9/zoRz/ap8/iAw88MFOmTMlf//rXT+1Zs2ZNFi1alIcffjinn376Xp27z5ouXbrk3HPPzfLly1OtVvPEE0/k4osvzuDBg4t/9pq9m93R9HFEAAAAFOOrUwAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAACUl91UqVSMKT4tLS35p3/6p8yePTsHHXRQw/cdfPDBaW9vz3vvvZcBAwY0dFeXLl1y4YUXpr29PY8++mgGDx7c0H377bdfFi1alCQ59dRT06VLl4buO/DAA9Pe3p5arZZx48Y1dFfnzp1z9tlnp729PQsWLMiJJ57Y0H29evXKs88+m2q1mgceeCCHHHJIQ/dVKpU88cQTaW9vz89//vOG7xo1alTmzZuX5cuX55vf/GbD902fPj0fffRR/vjHP2bEiBH/bedy06ZNDd81YMCA3HbbbalWq5k9e3bD940bNy5//etf09bWlsmTJ6dr164N3XfKKaekXq9n+/btOfzwwxt+fIcffniWLVuWNWvW5NJLL234vnPPPTevv/56Jk2alObm5obvu/nmm7Nx48a0tLQ0fNcBBxyQ3/zmN1mxYkW+8IUvNHzf9ddfn82bN+eyyy5Lnz59Gr7v/vvvz2uvvZbhw4c3fJf57NkdTR9HBAAAQDG+OgUAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAedlNlUrFmI65+OKL89xzz+Xkk09u+K6f/vSn2bJlS37961+nc+fODdvTvXv33HbbbWltbc3KlSvzla98paHHdc4552TZsmVZunRpzjzzzH1+vaOPPjqzZs3KqFGj0tzcvMvvvva1r2X58uVZunRpjjvuuHTq1Gmf97399tup1Wo57rjjdvl5165d89Zbb6W1tbXYOTzuuOPyzjvv5M9//nNGjRrV8fN+/frlhz/8YVpbWzNnzpyMGTNmn3dNmTIly5cvz7vvvpvx48enpaWl4/645ZZbsnnz5syfPz+DBg3a511DhgzJ6tWr09ramgkTJnT8vKmpKXfddVdqtVrefffdfd7TvXv3TJo0KStXrsyKFSsyderUjt8ddthhmTlzZnbu3JmXX345J5xwwl7vaW5uzvHHH59XXnklSdLe3p7FixfnlltuyfDhw3PAAQfk/vvvz6ZNm/L4449nyJAh+3RckydPzs6dO1Or1VKv1/P3v/89tVottVotL7/8clauXJlarZZVq1bt054ePXrk29/+dqrVarZt25b58+fnn//5n3PyySfnr3/9a8f+er2eWq2Wbdu25aGHHsrBBx+8V/suvvjivPbaa5kxY0YOP/zwjp8PGjQoM2bMyEcffbTLvj/+8Y8ZMWLEXh/f1KlTM2zYsDQ1Ne3y8/Hjx2fDhg2p1Wo544wzcsQRR+SII45Inz599vme/I/3zfDhw/Pb3/42ra2teeyxx4q+/n+ck046Ka+88ko2btyYb37zm+nevXvDdg0ZMiRvvfVWqtVqpk+f/qnP5pJzwAEHZNmyZdmyZUtuuummhp7DSqWSCRMm5IUXXsivf/3rHHbYYQ3fZ/7nze5o+jgiAAAAivHVKQAAoDihAQAAFCc0AACA4oQGAABQnNAAAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQnNAAAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQnNAAAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQnNAAAADKy26qVCrm//Hp27dvTjrppNx333156aWXctttt+Xyyy/P8ccfn06dOhXd9S//8i9555130t7e/ql77fTTT0/nzp2L7jvggAOydu3az7y3P/zww5xwwglF9w0bNix33HFHduzYka1bt2b9+vUd+xYsWJCvfOUrxa/fgw8+mNbW1ixdujQ7duzo2Dd+/Pji1++Ta/jaa6/tci537NiRz33ucw25P7t27ZrTTjst77//fse+5cuX58ILLyy+68QTT8yPfvSjfPjhh7sc33XX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8cQTGTVq1D7v+mS+9KUv5amnnkq1Wu3Yd99992XatGmZMGFCsT3G/N+c3dH0cUQAAAAU46tTAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAAJSX3VSpVIwpPj//+c+zevXq/NM//VM6derU0F29e/fOBx98kGq1milTpjT82I4//vi8+eabWbBgQSZOnNjwfV/4whfy3nvv5YknnsjBBx/c8H1Dhw5Ne3t7tm3b1vB93bp1y5QpU5Ikr776ak444YSG7jvooIMyf/78tLe354Ybbkj//v0bum/IkCFpb29Pe3t7vv3tbzd0V5cuXXLGGWekvb09b731Vr7yla80dN8BBxyQuXPnJkluvfXWht8r//5cfuc732nors6dO+crX/lK2tvb8/rrr2f06NEN3de/f//MmTMn7e3tOffcc9O1a9eG7hs8eHBqtVra29szePDghu5qaWnJCSeckPb29ixatCiDBg1q6L79998/Dz30UNrb2zNz5swMHz684ffKwoUL097enu9973tpampq6L6BAwfmjTfeyNatWzNjxoyG7qpUKpk8eXLeeuutLF68OF/60pcavm/o0KH585//nIsvvjjNzc0N32c+e3ZH08cRAQAAUIyvTgEAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQnNAAAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQnNAAAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQnNAAAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQXnZTpVIxxuzljBo1KpdddlluvPHGvPrqq6nX61m7dm0uvvjiYjuOPvrofOMb38h9992XjRs3plar7TLVajVvv/12+vbtu1evf8ghh+SFF17IihUrsmLFimzZsiW1Wi31ej2vvvrqZ+5btGjRHu/p06dPLrzwwnz44Yefes0//vGPGTZsWAYOHJgxY8bkRz/6UdatW5darZZly5blm9/85h7v+9GPfpQ1a9Z07Ghtbc3NN9+cE044IT179ux43NVXX53169enVqvlvffey5FHHpnm5uY92nXiiSdm8+bNHbuWLVuW44477lOPa2pqyuzZs1Or1bJz587ccMMNe3xcQ4YMyYsvvpharZbNmzfnwQcfzNixY3d5TEtLSw4//PDccMMN2bp1a1avXp0ZM2Zk5MiRe7zvmGOOyX333Ze5c+fma1/7Wrp27fqpx5xzzjlZvnx5arVa/v73v+fzn/98WlpaGvKe++pXv5rW1tbUarW0tbVl6tSpDdlTqVQybty41Ov11Gq1LFq0KBMnTmzYrrPPPjtLly5Ne3t76vV6zj333HTv3r0huzp37pw5c+Z0HNvFF1+8x/f87kxTU1MOPvjg/OhHP0q9Xs+6desyffr09OrVq/iurl27ZurUqXnnnXdSq9Vy33335fDDD2/Y9frc5z6XrVu3dtzzjbrfO3XqlKOPPjoPPPBA2tra8vzzz2fgwIENO67TTjstixYtSq1Wy8MPP5xRo0Y19Bw++OCDaW1tzT333JNRo0alqampIbu6dOmSW265JdVqNa+99lpGjBjRsOOqVCoZPHhwfvWrX+Xhhx/eq8/d/9uzO5o+jggAAIBifHUKAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgPKymyqVijFF56tf/WruvPPOLFiwINu2bcvOnTvz8ssv59BDD01TU1OxPQceeGAef/zx1Ov1rFu3LrNnz86cOXOydevW1Ov1vPrqq8V2ff7zn89bb72V+fPn57zzzkvPnj1TqVTSt2/fXHHFFWltbc3cuXPzxS9+cZ93HXPMMXn99dfzzDPPZPjw4Z/6/SWXXJKNGzdm5cqVGTBgwD7vmzhxYt5+++187Wtf+0//Pe3t7XnvvffSu3fvfdrV1NSUbt26pWvXrp/5+969e+cHP/hB2tvb85e//CXjx49v6L3a0tKSJ554Im1tbfn1r3+dfv36NXRfU1NTXnvttdRqtdx4440N3dXc3JyTTjopK1euzBtvvJFJkyY1dN/QoUPz+uuvp729Peecc066d++eSqWS/fffP+PHj89ll12WMWPGpFOnTvu0p2vXrhk+fHimTJmS9vb2tLe357XXXsvMmTPz2muvZcWKFWlvb8/GjRtz55137vZ16dWrVz73uc/lnHPOya9+9au8+uqrWbBgQZYtW9ax55PZunVrli9fnueeey7f+MY3MmrUqPTv3/8f7uncuXNOO+20PPXUU9m4ceMur7lt27asXr264/Orvb09TzzxRCZOnJgePXrs1bl67LHHUqvV0tbWlieffDIzZszIF7/4xYwfPz6DBw9OpVLJkiVL0t7ennfeeSe9evXa6+ty4IEHplarZf78+TnyyCM/9fvBgwdn5syZ2bJlS55//vkcfvjh+3Qf/PjHP84HH3yQKVOm7PJ3paWlJd///vezcuXK7Ny5M1deeeVuXZt/NC+//HJqtVpmzZqVxx57LNOnT8+UKVPyxhtvpFar5eWXX84xxxxT7P3UrVu33HTTTWlra8uOHTuyY8eObNq0KTNnzsw///M/F9tjzGfN7mj6OCIAAACK8dUpAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAMrLbqpUKsb8t06PHj3y/PPPZ+XKlRk5cmSampqKvv7AgQMzevToHHXUURk2bFimTp2aarWal156KT179tyn1+7Tp08mTZqUBx54IE8//XRefvnlrFu3LvV6PS+//HLuuOOOvPXWW1m2bFkuuOCCdOvWbZ/2nXnmmVmxYkXq9Xrq9Xra2try+9//Pu+8806q1Wrq9Xra29szderUdOnSZZ92/fjHP862bdtSr9czc+bM/PSnP80BBxyQpqamjB07NmvXrk29Xs+yZcvStWvXfdo1YsSIPPzww9m+fXtmzZqV/fffP5VKJb169coZZ5yRV199NTt37swzzzyT4447bp/viZEjR+b3v/99tm7dmjlz5uSII47IgAEDcvvt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vV433HBDtm3blkcffbRhnx2VSiWdO3fOtGnTsnPnzjz11FPp0qVLw3YddNBBueaaa/LHP/4xkyZNKvo3+r9rdkfTxxEBAABQjK9OAQAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFBedlOlUjH/S6dfv36ZNm1apk6dmp49e+7287p3754DDzwwvXv3TnNz824/74ILLsjmzZtz3XXX7dG+6dOnp1arZdq0abv9nObm5nz5y19OrVbLhg0bMmzYsN163sCBAzNz5szs3Lkzr7zySj7/+c/v1vOGDx+ee++9N7VaLb/85S/Tr1+/3XreWWedlcWLF6dWq2XLli254IIL0rt37//yOT169Mijjz6a7du3p1ar5brrrkuPHj12a9+UKVNSrVZTq9VSq9Xy5JNPZv/99/8vnzN27NiOx7e2tubSSy/d7eswYMCA/PKXv+x4/t///vecfPLJ/+W9NWXKlKxevTq1Wi33339/DjjggD26N3/xi19k8+bNqdVqeffdd3PSSSelc+fOn/n4kSNHZunSpR3/vgkTJqSlpWW391Uqldx11127nNMxY8bs8vsuXbrkO9/5Tr7zne9k7ty5u5zL4cOH79GuPn365Kqrrup4jeXLl+e0005L7969c9JJJ+UHP/hB7r///o7ffzIbNmzIzTffvEfvu0/mggsuyLvvvpt6vf6pSZL29vbP/N3VV1+dvn377vG+0aNHp62t7VPHUKvVUq/XP/PntVotd9555x7v6ty5c04++eTPfL1t27bl7bffzksvvZQbbrgh9913X8fvli1blosuumiP9w0aNCj/5//8n47X2bx5cxYvXpwf//jHGTx4cMfjhg8fnldeeaXjcY899lgOPfTQPd7Xu3fv3HHHHXn++edzxx13ZPTo0Z/5uDFjxuxy7O+//37222+/Pd63O9OjR498/etf32Xfn/70p4btO+igg/K73/2u4/OyVqtl9uzZ+dznPteQfZVKJccee2w++OCDXY5xb957e3JOJ0+enPXr16dWq2XBggU56qijGravUqlk/Pjxefjhh3PnnXfmyCOP3KP/FzD/82d3NH0cEQAAAMX46hQAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAA5WU3VSoV8790hg4dmpkzZyZJ7rzzzgwePLhhu84444zMnTs3bW1tqdfree2113LppZeme/fuRfc0NzfnG9/4Rl544YVUq9XUarXU6/VUq9WsXr26yDF27tw5w4YNy5VXXpnVq1entbU11Wo1a9euzaJFi7J69epUq9XceOON6dOnzz7tmjBhQn7zm99k48aNqdfrqdVqqVarqVarueSSS3L++edn/fr1qVarGT16dJqbm/d61znnnJN6vZ56vZ729vYk6fjvHTt25LzzzsuFF16Yer2eTZs2ZciQIXu156CDDso111yTzZs3Z8eOHVm3bl3ef//9bNq0KdVqNW1tbXnyySdz5pln5je/+U2q1Wpuv/327Lfffnu8a9y4cVmwYEHHeXv11VdzxBFH5Ctf+UrefffdVKvVXHvttdlvv/0yadKkjmt37LHH7vG5PO+887Jp06bU6/Vs3bo1f/rTn3LEEUekUqnk/PPPz/z58/Ptb387nTp1SqVSyX777Zd58+Zl69ate3wuR4wYkZUrV6ZWq2XFihX5+te/3vG77t27Z9iwYZ86XyeeeGLeeuutzJo1K/369dvtXUOGDMlvf/vbtLa25vTTT9/t582cOTNbt27NhAkT0tLSslvPOeKII7JkyZKOe/yTc/WPpnfv3nnppZfS2tqaoUOH7tZz+vfvnxdffLFj15tvvrlbzxs8eHBuu+22VKvVPProo+nfv/9uPe/CCy/M+++/n2q1mt/97ncZNWrUP3zO0KFD89xzz6WtrS0rVqzIcccdt9vnZPbs2Wlra0u1Ws03vvGNf3g/jxw5Mm+//Xbq9XpWrVqVo446arevdZ8+fTJ37tyOz4v33nvvMx/X3Nyco446Ki+88ELq9Xq2bduWhx56aI8/l4cNG5Y77rgjW7duTbVazd///vc8//zzueWWW3LmmWfmF7/4RZ5//vnMnTs3a9euzfbt23PPPfdk/Pjxe/035/Of/3zH9fuPn8X//mfPPvtszjvvvL3a8e+nqakphx12WH72s591/A37ZNra2vLOO+/klltuSa9evfZ517+f0aNH55577smaNWvywQcf5NZbb83EiRMzYMCAonvM/+zZHU0fRwQAAEAxvjoFAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHFCAwAAKE5oAAAAxQkNAACgOKEBAAAUJzQAAIDihAYAAFCc0AAAAIoTGgAAQHnZTZVKxZj/p2b48OH55S9/mWq1mh07duTuu+9uyJ4RI0bkrrvuyooVK3Lvvffmu9/9bp5++uncfvvtOeCAA4rtaWlpyTe/+c2sWLEit99+e4YNG5bm5uaMGjUqq1evzpgxY9Lc3Fxs30UXXZRarZaLL76442edOnXKVVddlWXLlhU9rlNPPTWLFy/OpZde2nEMPXv2zNSpU/P+++/nuuuuK7Krubk5999/f958882MHz8+nTp16vjdrFmzsm3bttx9993Zf//9i+w766yzUq/XM2HChF1+fvbZZ6darWbDhg056KCDiuw6/PDD89xzz2XWrFkdx9WlS5ecccYZ2bRpU956662cccYZxa7bo48+mlmzZmX48OGpVCrp0aNH7rzzzmzevDkPP/xwRo4cWex+POGEE1Kv13PUUUelUqnky1/+ct577720t7fn73//e/r27VvsuLp06ZJTTjklmzdvzttvv53Vq1entbU127Zty9KlSzNp0qRiuz6Z4447LjNnzsxjjz2WqVOn5sknn8zLL7+ccePGFX1Pf9bceuut2bFjR8aOHdvQPd27d895552XVatWZerUqQ3dValUctNNN+WDDz7IWWedlZaWlobuOvroo7N169Z8+9vfbvj1Gjx4cF577bXMnTs33bt3b+iuY489Nk8//XRuuOGG9O/fv+HXbN68eXnttdfSp0+fhu/q06dPli9fnilTpjR81/8/z+5o+jgiAAAAivHVKQAAoDihAQAAFCc0AACA4oQGAABQnNAAAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQnNAAAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQnNAAAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQnNAAAADKy26qVCrG/LfN9773vWzbti233nprunbt2tBdBx98cFavXp16vZ7169dn8uTJDdnT1NSUsWPH5oknnki9Xs+mTZty3XXX5YADDmjIvrFjx+aDDz5IvV5PvV7P2WefnS5dujRk1/Dhw7Nw4cLU6/VUq9XMnj073bp1a8iuL3/5y1mxYkXq9Xra2try8MMPZ+TIkQ27PxYsWJD29vbU6/Xcfvvt6devX8N2/fznP0+S1Ov1/PGPf2zYvX/44Yfn4Ycfzrp167Jp06b88pe/TJ8+fRq266mnnkpra2va29tz44035qCDDmrYObzjjjvS3t6e9vb2vPnmmxk4cGBD9hxwwAH52c9+llqtlnq9nnnz5qV///4N2dWvX7/MmDEjmzZt6nh/HXHEEQ3ZNXz48Lzxxhsdnxs33nhjw65Vt27dMmXKlI5d7777bsaMGdOwfWPHjs3TTz+der2et956K5MmTWrYZ2KlUsmiRYs67o/Jkyenubm5IXs6deqU4447LuvXr8+mTZvyve99r2HHVKlUMmbMmDz66KOpVqt58sknM3bs2Ibuq1QqWbhwYT766KOMHz++YefR7PnsjqaPIwIAAKAYX50CAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQnNAAAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQnNAAAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoDihAQAAFCc0AACA4oQGAABQnNAAAACKExoAAEBxQgMAAChOaAAAAMUJDQAAoLzspkqlYv4vT7du3fLQQw9l0aJFOfrooxu+78wzz8z777+fDRs2ZNq0aWlubm7YrkMOOSTvv/9+x/02ZMiQhu1qamrKMccckySp1Wr57W9/m6ampobtOv744/Pyyy8nSZ566qmMHj26Ycf2r//6r1m/fn3Hebz44ovTvXv3huz61re+ldbW1o5dtVotp512WvE9AwcOzM0335xqtZqNGzdm2bJlSZIXXnghY8eO3afX7tatW0aNGpUzzzwzN9xwQxYvXpxqtZok+fnPf56jjz46b775ZpJk2rRp6d279z7tGzlyZJYsWdJxzjZt2pS77rorI0aMSEtLS4YNG5YkaW9vz+mnn17k/uvdu3dGjRqVkSNHZsCAAbsc+3nnnZckWbBgQY4//viG3ZeVSiV9+vTJ7Nmzs3Pnzrzwwgs57LDDGrqvUqnkpZdeSpJ897vfbfiu0aNH580338zrr7+e8ePHN3zfzTffnI0bN+aSSy5J3759i772iBEjcuyxx+bYY4/NqFGjMnDgwJx++ulZtmxZTj/99Bx44IE59NBDM2vWrJxyyil7taN79+4ZO3Zs7r777o7Pkfb29rS2tmbz5s0d75GdO3dm3bp12bp1a5YvX54pU6bs0Z6ePXtmypQpWbx48S7/T7Np06Z8+OGHeeWVV3L33XfnZz/72afmC1/4Qnr06LFH+6ZOnZrt27d37HnqqafyxS9+MV26dCl+DzQ1NeXII4/Ma6+9lscffzxnnXVWw+87Y/797I6mjyMCAACgGF+dAgAAihMaAABAcUIDAAAoTmgAAADFCQ0AAKA4oQEAABQnNAAAgOKEBgAAUJzQAAAAivv/Afw5tes4P213AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# try visualizing the data\n", + "plt.figure(figsize=(10, 10))\n", + "for i in range(25):\n", + " plt.subplot(25, 1, i + 1)\n", + " plt.imshow(train_images[i].reshape(1, 28*28), cmap='gray')\n", + " plt.axis('off')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> After flattening the images, we'll have a dataset with 784 features*." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# normalize images\n", + "train_images = train_images.astype('float32') / 255\n", + "test_images = test_images.astype('float32') / 255" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# one-hot encode labels\n", + "train_labels = to_categorical(train_labels)\n", + "test_labels = to_categorical(test_labels)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n" + ] + }, + { + "data": { + "text/plain": [ + "((60000, 10), (10000, 10))" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# an idea of what the data looks like\n", + "# print(train_images[0])\n", + "print(train_labels[0])\n", + "\n", + "train_labels.shape, test_labels.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model = models.Sequential(\n", + " [\n", + " layers.Dense(512, activation='relu', input_shape=(28 * 28,)),\n", + " layers.Dense(10, activation='softmax')\n", + " ]\n", + ")\n", + "\n", + "model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/5\n", + "\u001b[1m469/469\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.8707 - loss: 0.4508\n", + "Epoch 2/5\n", + "\u001b[1m469/469\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step - accuracy: 0.9650 - loss: 0.1170\n", + "Epoch 3/5\n", + "\u001b[1m469/469\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.9785 - loss: 0.0725\n", + "Epoch 4/5\n", + "\u001b[1m469/469\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.9847 - loss: 0.0533\n", + "Epoch 5/5\n", + "\u001b[1m469/469\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.9889 - loss: 0.0371\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.fit(train_images, train_labels, epochs=5, batch_size=128)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 672us/step - accuracy: 0.9767 - loss: 0.0762\n", + "0.06263845413923264 0.98089998960495\n" + ] + } + ], + "source": [ + "test_loss, test_acc = model.evaluate(test_images, test_labels)\n", + "print(test_loss, test_acc)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/5\n", + "\u001b[1m469/469\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step - accuracy: 0.9919 - loss: 0.0283\n", + "Epoch 2/5\n", + "\u001b[1m469/469\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 3ms/step - accuracy: 0.9944 - loss: 0.0210\n", + "Epoch 3/5\n", + "\u001b[1m469/469\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step - accuracy: 0.9957 - loss: 0.0155\n", + "Epoch 4/5\n", + "\u001b[1m469/469\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step - accuracy: 0.9971 - loss: 0.0118\n", + "Epoch 5/5\n", + "\u001b[1m469/469\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step - accuracy: 0.9983 - loss: 0.0079\n", + "dict_keys(['accuracy', 'loss'])\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABFeklEQVR4nO3deXxM9/7H8fckZJKIxJ6Exq4aNGgsjbWttLFURReKS6qLLtpy1S2q1v4q1SraUlRbqsvVDV0oYrt+UrdVpJbi1u4iltLEmpD5/v7wy9TIHkkmOV7Px+M8zPnO95zz+c4Z5u2cM2dsxhgjAAAAi/BwdwEAAAAFiXADAAAshXADAAAshXADAAAshXADAAAshXADAAAshXADAAAshXADAAAshXADAAAshXADFAOPPPKIatasma9lx44dK5vNVrAF5dL11G0FN/r4geKKcANkw2az5Wpas2aNu0sFAPy/Uu4uACjOPv74Y5f5efPmKS4uLkN7aGjodW1n9uzZcjgc+Vr25Zdf1vDhw69r+wBgJYQbIBt/+9vfXOb//e9/Ky4uLkP7tc6fPy9fX99cb6d06dL5qk+SSpUqpVKl+KuMguFwOJSamipvb293lwLkG6elgOt0xx13qFGjRtq4caPatWsnX19fvfTSS5Kkb775Rl26dFHVqlVlt9tVp04dvfLKK0pLS3NZx7XXbuzfv182m02TJk3Se++9pzp16shut6t58+basGGDy7KZXXNjs9n07LPPatGiRWrUqJHsdrsaNmyopUuXZqh/zZo1atasmby9vVWnTh3NmjXruq7jOXfunF544QWFhITIbrerfv36mjRpkowxLv3i4uLUpk0blStXTn5+fqpfv77zdUv3zjvvqGHDhvL19VX58uXVrFkzffbZZ9luPzU1VaNHj1Z4eLgCAgJUpkwZtW3bVqtXr3bpl5fXWJLztfT29lajRo20cOHCXL8muX0fSNJPP/2kzp07q3z58ipTpozCwsL01ltvufTZuXOnevToocqVK8vHx0f169fXyJEjnc9ndS1Qdu+VTz/9VA0bNpTdbne+TyZNmqRWrVqpYsWK8vHxUXh4uL766qtMx/jJJ5+oRYsWzn3Vrl07LV++XJIUExOjSpUq6dKlSxmWu+eee1S/fv3sX0Agj/jvHlAA/vjjD3Xq1EkPP/yw/va3vykwMFCSNHfuXPn5+WnIkCHy8/PTqlWrNHr0aCUnJ+uNN97Icb2fffaZzpw5oyeffFI2m02vv/667r//fu3duzfHoz3r1q3TggUL9Mwzz6hs2bJ6++239cADD+jgwYOqWLGiJGnz5s3q2LGjgoODNW7cOKWlpWn8+PGqXLlyvl4HY4zuu+8+rV69Wo899piaNGmiZcuW6R//+IcOHz6sKVOmSJK2b9+ue++9V2FhYRo/frzsdrt2796t+Ph457pmz56t559/Xg8++KAGDRqkixcvasuWLfrpp5/Uu3fvLGtITk7W+++/r169eumJJ57QmTNn9MEHHygqKko///yzmjRpkufXePny5XrggQfUoEEDxcbG6o8//lD//v1100035ep1ye37IC4uTvfee6+Cg4M1aNAgBQUFaceOHfr+++81aNAgSdKWLVvUtm1blS5dWgMGDFDNmjW1Z88efffdd3r11VdzVc+1Vq1apS+++ELPPvusKlWq5AxGb731lu677z716dNHqampmj9/vh566CF9//336tKli3P5cePGaezYsWrVqpXGjx8vLy8v/fTTT1q1apXuuece9e3bV/PmzdOyZct07733OpdLTEzUqlWrNGbMmHzVDWTJAMi1gQMHmmv/2rRv395IMjNnzszQ//z58xnannzySePr62suXrzobIuJiTE1atRwzu/bt89IMhUrVjSnTp1ytn/zzTdGkvnuu++cbWPGjMlQkyTj5eVldu/e7Wz79ddfjSTzzjvvONu6du1qfH19zeHDh51tv//+uylVqlSGdWbm2roXLVpkJJn/+Z//cen34IMPGpvN5qxnypQpRpI5ceJEluvu1q2badiwYY41XOvy5csmJSXFpe306dMmMDDQPProo862vLzGTZo0McHBwebPP/90ti1fvtxIchl/VnLzPrh8+bKpVauWqVGjhjl9+rRLX4fD4Xzcrl07U7ZsWXPgwIEs+1y7X9Jl9V7x8PAw27dvz7Hu1NRU06hRI3PXXXc5237//Xfj4eFhunfvbtLS0jKtKS0tzdx0002mZ8+eLs9PnjzZ2Gw2s3fv3gzbBq4Hp6WAAmC329W/f/8M7T4+Ps7HZ86c0cmTJ9W2bVudP39eO3fuzHG9PXv2VPny5Z3zbdu2lSTt3bs3x2UjIyNVp04d53xYWJj8/f2dy6alpWnFihWKjo5W1apVnf3q1q2rTp065bj+zCxZskSenp56/vnnXdpfeOEFGWP0ww8/SJLKlSsn6crpmqwupC5Xrpz++9//ZnqKKDuenp7y8vKSdOX6kVOnTuny5ctq1qyZNm3alKF/Tq/x0aNHlZCQoJiYGAUEBDj73X333WrQoEGuasrN+2Dz5s3at2+fBg8e7Hx90qWfSjpx4oTWrl2rRx99VNWrV8+0T360b98+07FcXffp06eVlJSktm3buryOixYtksPh0OjRo+Xh4fqRkl6Th4eH+vTpo2+//VZnzpxxPv/pp5+qVatWqlWrVr5rBzJDuAEKQLVq1ZwfqFfbvn27unfvroCAAPn7+6ty5crOi5GTkpJyXO+1H2DpH8KnT5/O87Lpy6cve/z4cV24cEF169bN0C+zttw4cOCAqlatqrJly7q0p3+b7MCBA5KuBIrWrVvr8ccfV2BgoB5++GF98cUXLkFn2LBh8vPzU4sWLVSvXj0NHDjQ5bRVdj766COFhYXJ29tbFStWVOXKlbV48eJMX/OcXuP0muvVq5dh2dxeK5Kb98GePXskSY0aNcpyPemBK7s++ZFVuPj+++91++23y9vbWxUqVFDlypU1Y8YMl9dxz5498vDwyDHo9evXTxcuXHBeq7Rr1y5t3LhRffv2LbiBAP+PcAMUgKv/h5vuzz//VPv27fXrr79q/Pjx+u677xQXF6eJEydKUq6++u3p6Zlpu7nm4tyCXraw+fj4aO3atVqxYoX69u2rLVu2qGfPnrr77rudF9mGhoZq165dmj9/vtq0aaOvv/5abdq0yfH6jE8++USPPPKI6tSpow8++EBLly5VXFyc7rrrrkxf88J+nQrifZBXWR3FyewCZinz9+///u//6r777pO3t7feffddLVmyRHFxcerdu3e+XpsGDRooPDxcn3zyiaQr+8nLy0s9evTI87qAnHBBMVBI1qxZoz/++EMLFixQu3btnO379u1zY1V/qVKliry9vbV79+4Mz2XWlhs1atTQihUrdObMGZejN+mnXmrUqOFs8/DwUIcOHdShQwdNnjxZEyZM0MiRI7V69WpFRkZKksqUKaOePXuqZ8+eSk1N1f33369XX31VI0aMyPKryl999ZVq166tBQsWuHzI5/ei1fSaf//99wzP7dq1K8flc/s+SD+FuG3bNuf4r1W7dm1nn+yUL19ef/75Z4b29KNQufH1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/WdmbSW1LwBcD5vtr+na+fTJbndriSUq3AQFBenYsWMubceOHZO/v3+mR20kyW63y14UL/LGjVL37tf/QQyUBB4eV/4By+rP7J4r7L75maT8L1tQ6ygONRSXdeRmefoUfp/Mni8hSlS4iYiI0JIlS1za4uLiFBER4aaKrnLpknTokHu2bbNd+Yf96qmw26y4zfS/vJ6efz2X3uauD+ri1reE/QMH4Mbk1nBz9uxZ7d692zm/b98+JSQkqEKFCqpevbpGjBihw4cPa968eZKkp556StOmTdOLL76oRx99VKtWrdIXX3yhxYsXu2sIf2nUSPrll6L/0OeDBgAAF24NN7/88ovuvPNO53z6tTExMTGaO3eujh49qoMHDzqfr1WrlhYvXqy///3veuutt3TTTTfp/fffLx5fA/fzk8LD3V0FAAA3PJsxN9YVhsnJyQoICFBSUpL8/f3dXQ4AAMiFvHx+exRRTQAAAEWCcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACyFcAMAACzF7eFm+vTpqlmzpry9vdWyZUv9/PPP2fafOnWq6tevLx8fH4WEhOjvf/+7Ll68WETVAgCA4s6t4ebzzz/XkCFDNGbMGG3atEmNGzdWVFSUjh8/nmn/zz77TMOHD9eYMWO0Y8cOffDBB/r888/10ksvFXHlAACguHJruJk8ebKeeOIJ9e/fXw0aNNDMmTPl6+urDz/8MNP+P/74o1q3bq3evXurZs2auueee9SrV68cj/YAAIAbh9vCTWpqqjZu3KjIyMi/ivHwUGRkpNavX5/pMq1atdLGjRudYWbv3r1asmSJOnfunOV2UlJSlJyc7DIBAADrKuWuDZ88eVJpaWkKDAx0aQ8MDNTOnTszXaZ37946efKk2rRpI2OMLl++rKeeeirb01KxsbEaN25cgdYOAACKL7dfUJwXa9as0YQJE/Tuu+9q06ZNWrBggRYvXqxXXnkly2VGjBihpKQk53To0KEirBgAABQ1tx25qVSpkjw9PXXs2DGX9mPHjikoKCjTZUaNGqW+ffvq8ccflyTdeuutOnfunAYMGKCRI0fKwyNjVrPb7bLb7QU/AAAAUCy57ciNl5eXwsPDtXLlSmebw+HQypUrFRERkeky58+fzxBgPD09JUnGmMIrFgAAlBhuO3IjSUOGDFFMTIyaNWumFi1aaOrUqTp37pz69+8vSerXr5+qVaum2NhYSVLXrl01efJkNW3aVC1bttTu3bs1atQode3a1RlyAADAjc2t4aZnz546ceKERo8ercTERDVp0kRLly51XmR88OBBlyM1L7/8smw2m15++WUdPnxYlStXVteuXfXqq6+6awgAAKCYsZkb7HxOcnKyAgIClJSUJH9/f3eXAwAAciEvn98l6ttSAAAAOSHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAASyHcAAAAS3F7uJk+fbpq1qwpb29vtWzZUj///HO2/f/8808NHDhQwcHBstvtuvnmm7VkyZIiqhYAABR3pdy58c8//1xDhgzRzJkz1bJlS02dOlVRUVHatWuXqlSpkqF/amqq7r77blWpUkVfffWVqlWrpgMHDqhcuXJFXzwAACiWbMYY466Nt2zZUs2bN9e0adMkSQ6HQyEhIXruuec0fPjwDP1nzpypN954Qzt37lTp0qXztc3k5GQFBAQoKSlJ/v7+11U/AAAoGnn5/HbbaanU1FRt3LhRkZGRfxXj4aHIyEitX78+02W+/fZbRUREaODAgQoMDFSjRo00YcIEpaWlZbmdlJQUJScnu0wAAMC63BZuTp48qbS0NAUGBrq0BwYGKjExMdNl9u7dq6+++kppaWlasmSJRo0apTfffFP/8z//k+V2YmNjFRAQ4JxCQkIKdBwAAKB4cfsFxXnhcDhUpUoVvffeewoPD1fPnj01cuRIzZw5M8tlRowYoaSkJOd06NChIqwYAAAUNbddUFypUiV5enrq2LFjLu3Hjh1TUFBQpssEBwerdOnS8vT0dLaFhoYqMTFRqamp8vLyyrCM3W6X3W4v2OIBAECx5bYjN15eXgoPD9fKlSudbQ6HQytXrlRERESmy7Ru3Vq7d++Ww+Fwtv3nP/9RcHBwpsEGAADceNx6WmrIkCGaPXu2PvroI+3YsUNPP/20zp07p/79+0uS+vXrpxEjRjj7P/300zp16pQGDRqk//znP1q8eLEmTJiggQMHumsIAACgmHHrfW569uypEydOaPTo0UpMTFSTJk20dOlS50XGBw8elIfHX/krJCREy5Yt09///neFhYWpWrVqGjRokIYNG+auIQAAgGLGrfe5cQfucwMAQMlTIu5zAwAAUBgINwAAwFLces0NAKDopKWl6dKlS+4uA8iSl5eXy7W2+UW4AQCLM8YoMTFRf/75p7tLAbLl4eGhWrVqXfftXQg3AGBx6cGmSpUq8vX1lc1mc3dJQAYOh0NHjhzR0aNHVb169et6nxJuAMDC0tLSnMGmYsWK7i4HyFblypV15MgRXb58WaVLl873erigGAAsLP0aG19fXzdXAuQs/XRUWlrada2HcAMANwBORaEkKKj3KeEGAABYCuEGAHDDqFmzpqZOnZrr/mvWrJHNZiv0b5rNnTtX5cqVK9Rt3EgINwCAYsdms2U7jR07Nl/r3bBhgwYMGJDr/q1atdLRo0cVEBCQr+3BPfi2FACg2Dl69Kjz8eeff67Ro0dr165dzjY/Pz/nY2OM0tLSVKpUzh9plStXzlMdXl5eCgoKytMycD+O3AAAip2goCDnFBAQIJvN5pzfuXOnypYtqx9++EHh4eGy2+1at26d9uzZo27duikwMFB+fn5q3ry5VqxY4bLea09L2Ww2vf/+++revbt8fX1Vr149ffvtt87nrz0tlX76aNmyZQoNDZWfn586duzoEsYuX76s559/XuXKlVPFihU1bNgwxcTEKDo6Ok+vwYwZM1SnTh15eXmpfv36+vjjj53PGWM0duxYVa9eXXa7XVWrVtXzzz/vfP7dd99VvXr15O3trcDAQD344IN52nZJR7gBgBuMMdK5c0U/GVOw4xg+fLhee+017dixQ2FhYTp79qw6d+6slStXavPmzerYsaO6du2qgwcPZruecePGqUePHtqyZYs6d+6sPn366NSpU1n2P3/+vCZNmqSPP/5Ya9eu1cGDBzV06FDn8xMnTtSnn36qOXPmKD4+XsnJyVq0aFGexrZw4UINGjRIL7zwgrZt26Ynn3xS/fv31+rVqyVJX3/9taZMmaJZs2bp999/16JFi3TrrbdKkn755Rc9//zzGj9+vHbt2qWlS5eqXbt2edp+iWfy4eDBg+bQoUPO+Z9++skMGjTIzJo1Kz+rK1JJSUlGkklKSnJ3KQBQ6C5cuGB+++03c+HCBWfb2bPGXIkaRTudPZu/McyZM8cEBAQ451evXm0kmUWLFuW4bMOGDc0777zjnK9Ro4aZMmWKc16Sefnll696bc4aSeaHH35w2dbp06edtUgyu3fvdi4zffp0ExgY6JwPDAw0b7zxhnP+8uXLpnr16qZbt265HmOrVq3ME0884dLnoYceMp07dzbGGPPmm2+am2++2aSmpmZY19dff238/f1NcnJyltsrrjJ7v6bLy+d3vo7c9O7d25keExMTdffdd+vnn3/WyJEjNX78+IJJXQAAZKNZs2Yu82fPntXQoUMVGhqqcuXKyc/PTzt27MjxyE1YWJjzcZkyZeTv76/jx49n2d/X11d16tRxzgcHBzv7JyUl6dixY2rRooXzeU9PT4WHh+dpbDt27FDr1q1d2lq3bq0dO3ZIkh566CFduHBBtWvX1hNPPKGFCxfq8uXLkqS7775bNWrUUO3atdW3b199+umnOn/+fJ62X9LlK9xs27bNueO++OILNWrUSD/++KM+/fRTzZ07tyDrAwAUMF9f6ezZop8K+ibJZcqUcZkfOnSoFi5cqAkTJuh///d/lZCQ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b71VQUFB2r9/f6Fu81oBAQEKDAzUhg0bnG1paWnatGlTtsvFx8erW7du+tvf/qbGjRurdu3a+s9//uN8vl69evLx8dHKlSszXT4sLEwJCQlZXitUuXJll4uepStHe3KyceNGORwOvfnmm7r99tt1880368iRIxm2nVVd6R5//HHNnTtXc+bMUWRkpEJCQnLc9vUg3AAALKFevXpasGCBEhIS9Ouvv6p3795uuWv+c889p9jYWH3zzTfatWuXBg0apNOnT2d7GqZevXqKi4vTjz/+qB07dujJJ5/UsWPHnM97e3tr2LBhevHFFzVv3jzt2bNH//73v/XBBx9Iknr16qWgoCBFR0crPj5ee/fu1ddff63169dLku666y798ssvmjdvnn7//XeNGTNG27Zty3EsdevW1aVLl/TOO+9o7969+vjjj50XGqcbMWKENmzYoGeeeUZbtmzRzp07NWPGDJ08edLZp3fv3vrvf/+r2bNnF+6FxP8vT6el7r///myf5w6OAAB3mTx5sh599FG1atVKlSpV0rBhw5ScnFzkdQwbNkyJiYnq16+fPD09NWDAAEVFRcnT0zPLZV5++WXt3btXUVFR8vX11YABAxQdHa2kpCRnn1GjRqlUqVIaPXq0jhw5ouDgYD311FOSrtyPZ/ny5XrhhRfUuXNnXb58WQ0aNND06dMlSVFRURo1apRefPFFXbx4UY8++qj69eunrVu3ZjuWxo0ba/LkyZo4caJGjBihdu3aKTY2Vv369XP2ufnmm7V8+XK99NJLatGihXx8fNSyZUv16tXL2ScgIEAPPPCAFi9enO1X4guKzeThRGH//v1z1W/OnDn5LqiwJScnKyAgQElJSfL393d3OQBQqC5evKh9+/apVq1a8vb2dnc5NySHw6HQ0FD16NFDr7zyirvLcZsOHTqoYcOGevvtt7Psk937NS+f33k6clOcQwsAAMXBgQMHtHz5crVv314pKSmaNm2a9u3bp969e7u7NLc4ffq01qxZozVr1ujdd98tkm3ybSkAAAqQh4eH5s6dq6FDh8oYo0aNGmnFihUKDQ11d2lu0bRpU50+fVoTJ05U/fr1i2SbhBsAAApQSEiI4uPj3V1GsVHU31iT+LYUAACwGMINANwArvcmc0BRKKj3KeEGACws/W6658+fd3MlQM7S78ic3dfmc4NrbgDAwjw9PVWuXDnnbx/5+voW6m/6APnlcDh04sQJ+fr6qlSp64snhBsAsLigoCBJyvbHIIHiwMPDQ9WrV7/uAE64AQCLs9lsCg4OVpUqVTL9sUSguPDy8pKHx/VfMUO4AYAbhKen53VfywCUBFxQDAAALIVwAwAALIVwAwAALIVwAwAALIVwAwAALKVYhJvp06erZs2a8vb2VsuWLfXzzz/narn58+fLZrMpOjq6cAsEAAAlhtvDzeeff64hQ4ZozJgx2rRpkxo3bqyoqKgcbza1f/9+DR06VG3bti2iSgEAQEng9nAzefJkPfHEE+rfv78aNGigmTNnytfXVx9++GGWy6SlpalPnz4aN26cateuXYTVAgCA4s6t4SY1NVUbN25UZGSks83Dw0ORkZFav359lsuNHz9eVapU0WOPPZbjNlJSUpScnOwyAQAA63JruDl58qTS0tIUGBjo0h4YGKjExMRMl1m3bp0++OADzZ49O1fbiI2NVUBAgHMKCQm57roBAEDx5fbTUnlx5swZ9e3bV7Nnz1alSpVytcyIESOUlJTknA4dOlTIVQIAAHdy629LVapUSZ6enjp27JhL+7Fjx5y/Ynu1PXv2aP/+/eratauzzeFwSJJKlSqlXbt2qU6dOi7L2O122e32QqgeAAAUR249cuPl5aXw8HCtXLnS2eZwOLRy5UpFRERk6H/LLbdo69atSkhIcE733Xef7rzzTiUkJHDKCQAAuP9XwYcMGaKYmBg1a9ZMLVq00NSpU3Xu3Dn1799fktSvXz9Vq1ZNsbGx8vb2VqNGjVyWL1eunCRlaAcAADcmt4ebnj176sSJExo9erQSExPVpEkTLV261HmR8cGDB+XhUaIuDQIAAG5kM8YYdxdRlJKTkxUQEKCkpCT5+/u7uxwAAJALefn85pAIAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACw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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# a more visual way to see the training process\n", + "history = model.fit(train_images, train_labels, epochs=5, batch_size=128)\n", + "history_dict = history.history\n", + "print(history_dict.keys())\n", + "\n", + "loss_values = history_dict['loss']\n", + "acc_values = history_dict['accuracy']\n", + "epochs = range(1, len(loss_values) + 1)\n", + "\n", + "plt.plot(epochs, loss_values, 'b', label='Training loss')\n", + "plt.plot(epochs, acc_values, 'r', label='Training accuracy')\n", + "plt.title('Training loss and accuracy')\n", + "plt.xlabel('Epochs')\n", + "plt.ylabel('Loss')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/mkdocs.yml b/mkdocs.yml index f10dd2e..d16dca8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -40,6 +40,7 @@ nav: - Neural Network: - ml/dl/nn/index.md - Backward Propagation: ml/dl/nn/bp.md + - Playground/MNIST: ml/dl/nn/playground-mnist.ipynb - Miscellaneous: - Derivative: ml/dl/nn/derivative.md - Graph: ml/dl/nn/graph.ipynb