Created
July 1, 2020 00:41
-
-
Save RealmX1/cc7ed72e36731f59cffa1b2628da59fc to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| {"cells":[{"metadata":{},"cell_type":"markdown","source":"# Imports for Python libraries"},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"%matplotlib inline\n%config InlineBackend.figure_format = 'retina'\n\nimport numpy as np\nimport torch\nimport torchvision\nimport matplotlib.pyplot as plt\nfrom time import time\nfrom torchvision import datasets, transforms\nfrom torch import nn\nfrom torch import optim","execution_count":1,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Set up the mini-batch size"},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Edit code here to change the batch size.\")\nmini_batch_size = 64","execution_count":2,"outputs":[{"output_type":"stream","text":"Edit code here to change the batch size.\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"# Download the dataset, pre-process, and divide into mini-batches"},{"metadata":{"trusted":true},"cell_type":"code","source":"### Define a transform to normalize the data\ntransform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)),])\n\n### Download and load the training data\ntrainset = datasets.MNIST('/kaggle/input/cs-361-mnist-data/MNIST_data', download=False, train=True, transform=transform)\nvalset = datasets.MNIST('/kaggle/input/cs-361-mnist-data/MNIST_data', download=False, train=False, transform=transform)\n\ntrainloader = torch.utils.data.DataLoader(trainset, batch_size=mini_batch_size, shuffle=True)\nvalloader = torch.utils.data.DataLoader(valset, batch_size=mini_batch_size, shuffle=True)\ndataiter = iter(trainloader)\nimages, labels = dataiter.next()\nprint(type(images))\nprint(images.shape)\nprint(labels.shape)","execution_count":3,"outputs":[{"output_type":"stream","text":"<class 'torch.Tensor'>\ntorch.Size([64, 1, 28, 28])\ntorch.Size([64])\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"# Explore the processed data"},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.imshow(images[0].numpy().squeeze(), cmap='gray_r'); # Change the index of images[] to get different numbers","execution_count":4,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{"image/png":{"width":251,"height":248},"needs_background":"light"}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"figure = plt.figure()\nnum_of_images = 60\nfor index in range(1, num_of_images + 1):\n plt.subplot(6, 10, index)\n plt.axis('off')\n plt.imshow(images[index].numpy().squeeze(), cmap='gray_r')","execution_count":5,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 60 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAroAAAHKCAYAAADsN+hFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzddYBU1fvH8Td2i1hgYBdgCyp2AgZ2YKBg91exsVG/FlgYiI1igB3Y7ddCsbvBQGwUW39/+PvsmXt3ZndmZ+bO3Luf1z+7TJ493Jm585znPE+bf/75BzMzMzOzrJmq1gMwMzMzM6sGn+iamZmZWSb5RNfMzMzMMsknumZmZmaWST7RNTMzM7NM8omumZmZmWWST3TNzMzMLJN8omtmZmZmmeQTXTMzMzPLJJ/ompmZmVkm+UTXzMzMzDLJJ7pmZmZmlkk+0TUzMzOzTJqmjPv+U7FR1K82JdzW89GY5yTK8xHl+YjyfER5PqI8H1GejyjPRwGO6JqZmZlZJvlE18zMzMwyySe6ZmZmZpZJPtE1MzMzs0zyia6ZmZmZZVI5VReshr766quG3+edd97IdT///DMAM800U6JjMjMzM6snjuiamZmZWSY5opsBbdpES8vdcccdAPTp06cWwzEzM8uUq6++uuH3M888E4B33nkn723XWGMNAA455BAAtt122+oOzprkiK6ZmZmZZZIjuin1119/Fbzu008/TXAk1ffNN98AMGXKFACuuOIKAH788UcA7r33XgDefffdhvvstddeALRv3x6AAw44AIB55pkngREn46mnngLgggsuAODJJ58E4Msvv2x0W83DTjvtBMAZZ5wBwLTTTlv1cZpZepx00kkAPP744w2XPfbYYwCsu+66AJx44omRf2fRr7/+CoT30/79+zdcN/XUU0d+xj399NMAjBs3Dgj7ZnbbbbfqDNaa5IiumZmZmWWSI7opddpppxW8bs4550xwJJX3+eefA3DttdcCcMkllwAwYcKEyO3++eff1t7KUc7NVb788ssjt3n44YeBEAVNM+Vg77zzzgDMNttsACy//PIAbLPNNkB0PiZPngzA8OHDgRDJPeWUUwCYbrrpqj3sijv55JOBEIGK56rHrbPOOg2/d+3aFYCOHTsCsOuuuwIw++yzV3qYNffaa68B0KNHDwC++OILIBwvAM8++ywAM8wwQ8Kjs1rR60avo2IositZjugec8wxAAwdOrTZ2y688MJAeB95+eWXAbjrrrsA+OSTT6owwuoYNWoUANtvvz0Aq622GgDLLLMMAOuvvz4ACy64YKP7jh8/Hggrp6uvvjoAs846axVH3DxHdM3MzMwsk9oo4tUCLb5jijQdIopKZD4uvfRSAA4++OCGy/78808AFlpoIQDefvttAKaffvpKP30p8wElzon+Nu1o1bfgQpG65ZZbDoDDDjsMgCWWWKLgY88yyywAdOnSpZQhFSOxY+SPP/4AQjRSUVnlKM8999zNPsaxxx4LhBzdW265BYCtttqqnKHlSmw+OnToAMDEiRP/feJmIrq573Xx2y666KIAjB07FqhoZLdm7yHKMdTr4rPPPotcv9RSSzX8roiu/u4XX3wRCNHfpZdeGoDFF1+83GFVfD60wlHs3gQdB1oVmzRpUsHbFDqmdL3eT+6++24gvAeXILHjQ9HY9dZbr+T7KnIbj+gqV1fR4Qqo+WfueeedB8DRRx8NhP0wuftiNt54YwCGDRsGhJUQ1bRXhQbtFenbty8AF110UeT2RUh8PlZeeWUAXnrppbIfa/755wdCfrOOl0K5zUUo9RwEcETXzMzMzDIq8YhusXlBOvOX3Fyg+LfK+G0qmDdU82+Xoujm2muvDYRcGAj5Qffffz/QdGSzTFWN6Hbv3h2A55577t87//+xqW+FO+64IwB77LFH5PIa5/8kdoxcd911QIgO6P97o402KvoxFOVTVGexxRaLPHYFJDYfWtVQDl05EV05/PDDgbCqUAE1ew/Ze++9gZCvLuqYqCgkhPfMhx56CAgRfu0WV0T3zTffLHdYZc/Hxx9/DIQKIq+//joQxtrsgzYTrS3mNvHrtbp0++23AyVFdqt+fBQbyS0mOhufj0cffRTIxmfu119/DYRorXLbJfd11LNnT6BxV1KJR3Tl/fffB+rr+IjTa71QjeByqBqFPutbwBFdMzMzMzNJvOpCbm2+psQjvsXsDNVtqpA3VDPKGVSXM0VytdMeQkWBRRZZJOHRVZa+Ba+66qoAfP/990DY3Xn22WfXZFz1QpUTlIu77LLLlvwYqq6gSISOnZ9++gkIucxpcPzxxwMhqlSBaCPnnHMOAJ06dQLSXfdyzJgxeS8fMGAAkD8KVyg6quOjHmgnu1Z+RDu927ZtC4TI7++//171Mb366quRsR144IFVf85iFYrklhKNbW4VNQu22247IFRMkLXWWgto2XtBU/Xu00IrpsrZ1QpyU0aOHAmEczG9Fp944gmgrIhuiziia2ZmZmaZlFhEV98IC30ztPz+85//APDBBx9ELleuJcD1118PhO5fc8wxR0Kjq6wll1wSCNHqH374AYDNN9+8ZmOqJ6NHjwagX79+QOh2VopHHnkEgDvvvBMIdXTTFMkVRbaVV7rhhhsC0LlzZyBEJVWVohT5duKnhTrkKedQFlhgAQB22GGHgvdV3qsqmdQj7VM4//zz816ufNkRI0YA4X2kHNpdX4lVg1orNpKb+1kdjwrH99CkmVYrfvvtNyBUBNDr5ZBDDmnxY+uxtK+iUE5vPdP7RSkVV3Rs1UtE2xFdMzMzM8ukxCO6ojP+3G5FLVVKZ5e0UeRt0003BfLn0J1wwglA2IWv3Lw0RunyqWIViVRRNFZ1dEvxzTffALD11lsDsMoqqwBw5JFHVmh0taMoSXyXdDFOPfVUILyGZPDgwUCowpAmikYrQiXaNa7843xUqzlOtTXrgTq65XZ2y0ddqsqh3EJFdAvZc889gfrKzY1TFLbYSG6+3N4qVDaqOUVbX3jhhcjlmocW1EZuRI+Rxs6DK620Usn36d27NxCtDgWlVQiqJEd0zczMzCyTEovoxr8BVqMiQhYju+3atQPgmWeeAeDDDz8Ewm55CLlqqlGn6NSQIUMSG2c1KRKl3Lt77rkHaLrWpXaIqsrHZpttBoTosCIwte7BXYpevXoB8NRTTwHNV0pQFBcaR79uvfVWIFRhaK2+/fZboPExpLnOEtXPbYp2nsdNmTKl0sOpa4rkqp5wodxcrUiee+65iYyrJUqtld9UvV3l92bBEUccAYTax8qnVVWBcqKvWVgpK0e8C6PO/5ZZZpkajMYRXTMzMzPLqJpFdCspi5HcQhZddNHITwi7jVWb7pprrgFCxYaOHTsmOcSy6e9Rt64HHngACB1bpJQOR5deemnkctUSve2224CQO1RM1KtWNOZNNtkEgNVXXx0Iu2H1t2rXvaKV+ShPc/jw4UDTO/GzrFCk7q233kp4JNWn/NH1118fCPWqcxXKc87ifDTlqquuAkJ93DitDB111FFAfb9vNEe5qE19jmYpkiu5K14Ac801FxCq25RTIUEVTxQlTpPTTz8dgC+//BIo7rNB+wG0AhKvdLLffvsBtXudOKJrZmZmZpmUeGe0SkZ247lEeuwsdEQrhXKJlG85ceJEAF588UUgfRFddbxSPeAbb7wRCJHbH3/8EYAVV1wRgKmmavx9TTm4ytXVT32Lf/fdd4HwDVR5zgcddFAl/5SK2mCDDYCQszxw4EAgRGTUSU7zlBvpXmGFFYBQE1I1l/fZZ5/I9UsttVTVxl9PFMl/9tln816f5l3lWvlQhErRJUUnC0Up85l++umBxisiWaRIHsCgQYOAwqtF77zzTiJjSoIiufHKSLlR3DS/HuIUqXz//feBsBKmz5nmqnk09Zjbb7995DHrpY5sKVSZpxR6PcS7MerzZM011yx/YGVwRNfMzMzMMsknumZmZmaWSYmnLlRSU0strclzzz0HhJQFLTfOOeecNRtTOdQK+IILLgDCJhotI06ePBkorpD17rvvHvm3Uhe6dOkChDm76aabgPpOXRAVwlfahcqMff755wD06NEDiJZOUzMRtc397rvvgNDq9eijjwbCkn7WqaSQjqW4tL52IGw01CZObQQRlf6ZMGFCs4916KGHAmEDZBa99957QFh2hsYludq2bQuE4yYLlPpX6HM0S+kKufr37w+Ekp35Ur1KpZKP8cecf/75Adhtt91a/Nj1KrfkYKF00WOPPRaA+eabL4khFeSIrpmZmZllUiojuvFvD2pt2Jrklo7ad999I9cpaqcyXWmnCG8lKFKXhUYJahShnyNGjABC1FolkiAcE9KzZ08gRHRbAzVbgTBXcTPPPDOQzta/cdpgqCiTKKKriC/AHnvsEbnNaaedBoTNi1mmNtD5Inq6TKtLWXhPVQQ3HskttkVwKfRZXQ+tg/X3agVU9DppSatfPaY29cZplaASbYTrhdqE9+vXr+Gy+Epghw4dgPpZFXBE18zMzMwyKZURXbV1FZVHaQ1lxZQX06dPn4bLVFZK1FjAGtP86VupcvH+/vvvmo2pUtQCWnlhTX2bbt++PVBeUfS06d27d8PvhfLx1D47yxRtmTRpUsHbLLbYYkC6GyE0R6WQlL+ej3KTtQKSZoUaQyiS29TnZzz6G/93c02b4teX2pa4EnTeoPKUooYIpURdH3rooch944+pVtpaGcmSu+66C4Cbb7654G3uueceoH5Kmzqia2ZmZmaZlMqIbvzbZL3kgVSTvjHutNNOADz44IONbtO1a1egcL6QhWYLqragyN7mm29eszFViioIqJGGcnfzUYFzzUMWqQrF1VdfDUTb/RaK6GZxd3ScKoyo0kZrpRbp+SLb66yzDhDakM8+++zJDazCFKlVRLPQ52c8opu7chq/T7n0+qtFZDdObZxLoTa58UiuqHqPmjllgRrPXHbZZQVvo5XmljTdqCZHdM3MzMwsk1IT0W0qfyjNVRe0E1y1C+O7n3/77TcAdtxxRwDuu+++Ro/Rt29fILTpzNK3yEp57bXXgMY5mGpNuPfeeyc+pkp75JFHgJZFKNRuOUuGDh0KwJlnntnsbRXRb9euXVXHVA/U+jQfvR422mijpIaTOOVPqn5uPmqRnYVIbnP5s6qn2xLxz15Fh5vL4U1yFVZ1xl955RUgtOXNrUpTjNxVoPiKkNrWNzfXaabV0Hw57aozfdFFFwEw1VT1FUOtr9GYmZmZmVVI3Ud0C+0UhfqozVcu1etUx51bbrkFgKWXXhqAK664AmjcwWnxxRdv+P3KK68E6u9bVD3QvClCE59HdRdLcyescePGRf5dzA7x+MqAolxZMGrUKACuvfbaZm+rndaDBw8GYJpp6v4tscVUceTiiy8ueJtbb70VyGaEf9CgQUB4j1VUbuGFFwaidYVVdSLNWhpd1OdpbrS21M/Y+O1rWRFJuaWqFjD11FMDjaOy2rfw66+/AvD2228DcNZZZzW6vSrbXH/99QB069atKmOvB6rqNGzYsIK3UXS8Xt83fGZkZmZmZplU9+GLfLs99W1Rea1ppujKk08+CYRIW75cXIDdd98dgGOOOabhMkdyG1PkVsdKPOqpXN1DDz000XFVw6effhr5dzFRyQ8++AAIKwcbbLBB5QeWMNVG1mtKVRckd4f3tNNOC4RIfxYieM255JJLgPyVNvQ6SXNOaiG///47EI75uPnmmw9oHcdArngntDSvjJZD0WatAI0fP77Z+6jjWRY65TVHq54ff/xx5PJll1224fdNN900ySGVzGdIZmZmZpZJdR/RjXdBg3RXWYhThypFodQz+sYbbwRgzz33BEKHEeX0tqbKCjoGNEeak3id2Hfffbfh9/POOw8IO22VX7XNNtsALatMUK/i86BczHwmTJgAwIgRIwDo3r07ANNNN12VRpecjz76CAjR+0K1cgGOOOIIoHV1EdQ+AMmNyBx55JFAiHRnyZAhQ4BwzMcdd9xxSQ4nMVrx1Kpoa43c6rNSn6FaAdMx/9VXXwEhdzdOq1533313w2WtoaOkPm+feOKJyOVaQdZ7KNT/+4YjumZmZmaWSXUb0VXejL6NlrMDNA20610/R44cWcvh1BX1FR89enTkp3Ium4rczTTTTECok6udyDPOOGN1BlsDyq/t0qULEDrjqa4ywMwzzwyEjj1//vknEFYIskC1HDt06AA0rrCRuyNYubmtmV4bAD169KjhSKpLESm9X8S7cdVDd65qaK0R3Ditmqre/KmnngrAN9980+T9VG2hd+/eQKjQ0loogv33339HLt9yyy0B2HXXXRMfU0s5omtmZmZmmVS3Ed18ubnWOimHTpFKdWhRxE45Q7k5utpJrd2gm222WTKDrSFFKffff38AevXq1eg2ysUdOHAgAOuvv35Co6u+eeaZBwiRl9zjAaJ5yIr62r+aWhVJu86dOwONOzrpb37rrbeA4upPW3ppVThLe3ySpBUzVX5KE0d0zczMzCyT2pSRn1TVxKZ4hCE3zyjB+rmlhDmymegVVWrYx3MS5fmIqsp8DB8+HAj95ydNmgREd03ni3ZXSc3nQ9Zaay0Axo4dC4ROUQAbbrhhNZ86V+LzofqfK6+8MgDffffdvwP5/88YVS0599xzG+7Tv3//Sjx1Merm+KgTno+oms3HwQcfDMBNN90EwAUXXADADjvsUMmnKVWLlp4c0TUzMzOzTEpNRDc3ipvgLlJ/u4xyRLcxHyNRno8oz0dUzeZD1ReGDh0KwC233BK5XhVvINQxT4CPjyjPR5TnI8oRXTMzMzMzqfuIrnZIqq5uwvxtKsoR3cZ8jER5PqI8H1GejyjPR5TnI8rzEeWIrpmZmZmZlBPRNTMzMzOrW47ompmZmVkm+UTXzMzMzDLJJ7pmZmZmlkk+0TUzMzOzTPKJrpmZmZllkk90zczMzCyTfKJrZmZmZpnkE10zMzMzyySf6JqZmZlZJvlE18zMzMwyySe6ZmZmZpZJPtE1MzMzs0zyia6ZmZmZZZJPdM3MzMwsk3yia2ZmZmaZ5BNdMzMzM8skn+iamZmZWSZNU8Z9/6nYKOpXmxJu6/lozHMS5fmI8nxEeT6iPB9Rno8oz0eU56OAck50zczMWo3vv/8egOOOOw6A66+/HoDBgwcD0L9//9oMzMwKcuqCmZmZmWVSm3/+aXG022HyKM9HY56TKM9HVCLzsdFGGwHw0EMPNVz23HPPAdCtW7dqP33dzUeNpXo+BgwYAMCQIUMil//+++8ATDvttKU+ZKrnowo8H1Gej6gWpS44omtmZmZmmeQcXUutSZMmAXDdddcB8M477zRcN2zYMACWWWYZAHbaaScg5NZZ9l199dUAPPnkkwAsvfTSDdcttdRStRiSpdTo0aOBxpHcM888E4BppvFHqVm9ckTXzMzMzDIpU19DX3nlFQBWXXVVAE488UQAjjnmmJqNKQlff/01AHPPPXfk33POOWfNxlRNt956KxDy5T755BMA2rQJ6Tv6XVFeRV46d+4MwFZbbZXMYC1xX331FQCnnHIKEPInDz744IbbzD777MkPzFJruummA2Cqqf6NDc0444wA/Prrr0D0vcfS5eWXXwZgnXXWAeDHH38EYP311wega9euAGy99dYN91lxxRWBFuVkWw04omtmZmZmmZSJqgu//fYbAGuuuSYAL774IgB///13uQ+dih2PiuDOM888ADz99NMArL766pV+qrqouqDoiX6uvPLKQDRKO9dccwEwfPhwAMaOHRu5TwWOjYbhlHDbunnNVFHN52PcuHFAOC769u0LwMCBAxtus8QSS1TjqfOp+XzUmVTNx+233w7ArrvuCsCff/4JhH0B22yzTblPUfP5eOqppwAYOXIkAO+//z4QjWBuuOGGACy++OLVGEKuxOfjhhtuAGDnnXcu+j69e/cG4PTTTwegU6dOlRhKPjU/PuqMqy6YmZmZmUkmcnRHjBgBhEjuBhtsUMvh1Nynn34KVCWiWxfuu+8+IERnN95442bvo2PDuXTZpyicnH322UDIYTdrjlbJTjjhBAB++uknIETyKhDJrbm7774bgM033xxo/N6YW3daOe3LLbccEPa9KI9VOcxpopWf888/v+T73nnnnUDYF7TPPvsAYfVovvnmq8QQ69Jtt90W+ZnrwQcfBOCoo44CYI899gBg1llnTWh0+Tmia2ZmZmaZlIkc3bXWWgsIuanPPPMMEKovlCEV+TH6Fqm8sQkTJgBV+VZZFzm6pbjsssuA8I07Czm62hV80kknAaEKhapP5DPDDDMAoZ6wbLbZZgB0794dgHnnnbfc4dXsNaN6ub169QKgY8eOALzwwgsAzDzzzJV8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no8oz0eU5yPK8xHl+YjyfBTgiK6ZmZmZZZJPdM3MzMwsk3yia2ZmZmaZ5BNdMzMzM8skn+iamZmZWSaVU3XBzKzuvfTSSwBcd911DZede+65kdssueSSABx++OGRy7fZZhsA2rVrV80hWg1MnjwZgAEDBgBw+eWXN1yn4+HZZ58FoG3btgmPziw9rr32WgAGDRoEwIwzzgjAq6++WrMx5XJE18zMzMwyqe4iuoMHDwbgr7/+ilye+237vffea/Ixjj76aACWW245APr06VPJIZpZiowdOxaARx99tOEyReh++OEHILyn7LPPPpH7zj///ABssskmVR+nJUufKfrZpk0o0TnXXHMBMP300yc/MLMUyF0hO/nkkwH48MMPATjggANqMqZCHNE1MzMzs0xq888/LW6mUZEuHL///jsAu+22GwA33XRTJR4WgKWWWgqABx54AIAFF1yw1IdIvCuJclruvfdeAM4880wAvv/++4L3WW+99QDo27cvALvvvnslhpKPO6M1VvPONePHjwfCt+mRI0cC8MorrzTc5rnnnmvyMXQM3X777QDMNttsLR1OzeejGPfddx8Al112GRD+7rh5550XgFtuuQWA7t27l/pUqZiPYp133nlAyHseMWIEAP369QPgsMMOA6BLly6FHqJu5mO11VYD4Pnnnwdg7rnnbrhu1KhRAKy99trVHALU0XzUCc9HVN3Nx8cffwyEz4zcy1ZaaSUgfN5MM03FkwbcGc3MzMzMTGoe0T3xxBOBsFsvLvdbtmi37EYbbQTAu+++C8A777yT9zHOOussoPGO6iJU/dvUb7/9BsD+++8PhIj2zz//XPJjKZ+sR48eANxwww0AzDTTTC0ZWj6JRnT33XdfAJZeemkA1lxzzX8H8f+5dDp29e/cv3OZZZYp56lLUbVj5KuvvgJC1PHvv/+OXK8cqW+++QaAb7/9tpSHz0sROeXKt0DdRSCaor0Ae+yxBxB2D8dNO+20QHi9liBV8yGPP/44EN5bBw4cCIRjrdDnxkILLQTARx99VOihaz4fp5xyCgCnnXYaAH/88QcABx10UMNtzj///Go8dT41n4+4p556CoDHHnus4TKtEi6wwAJFPcYLL7wAwEMPPdTosXLdf//98Yvqbj5qrO7mY8yYMUD+fQvKzR06dGi1nt4RXTMzMzMzqXlEV7udFUnRN8AVV1wRgP3226/RfaZMmQLAqquuCsCnn34KwCeffAKEKguff/45AJ06dQLg9ddfL3V4Vf829b///Q+ANdZYI+/1vXv3BkIFiXXXXReAN998s+E2t912GxDdVQ7Qv39/AK644oqWDC2fRCO6U0317/ewQhHcpiK6igIfc8wxAGy99dblDKUpFT9GFM1XDmELjlsANttss4bf55hjjsh1itTFc3eVd/XII4+06DmpwwhEMZ544gkgvL4KiUfVi1C386H3Wgh7A1SB4IsvvgBCVYrmdOvWDYAlllgCCLm7eSQ+H3/++ScA99xzDwBbbbVV5Hrt5Xjrrbcq8XSlqvnxoYj2CSecAIQ87F9//bXhNtdccw0Q9oFob41y3fU5rs8zRf1++eWXJp87z/lHYvNx0kknAWH1Yp111gFCBYE4rT5DeJ9o7v2iAmp+fIjOrzbffHMAXnvttYbrdJ6m+uRVrFbiiK6ZmZmZmdQ8olsNiy22GBDyxP773/8CcNRRR5X6UDWL6P74448AzDLLLP8OpE3hoSgSodqgd999NxCic4svvnhLhpZPohHdrl275r1c+bfK2ZXcblfK19bxrYiuds9XUMWPEVVR6NixY5O3m3XWWQFYZZVVgLCSscsuuwAwwwwzhEH+//Ezbtw4AHr16gXAxIkTI4953HHHAYVz5otQNxGIUhx88MFA87llaY7o6rj67LPPANhiiy0arps0aVJJjzXnnHMCYT/ABRdcABTVQS7x+VDkLn5MzzfffAA8/PDDQOiGlrCaHx+K1jZVrWeeeeYBQjT86quvBlqUsw6E40Q53zkSm4+mPlNLVcZ5VHNqfnyIIt16PeXSCmBuJYYqcUTXzMzMzEzqrjNaOZQ3FI+6dO7cuRbDKYvqzxX61qlIMEDPnj2BkNOpXDTtFE8r7dwtliKZAG+//XbkMtVJvfXWW4Gq5uyWrX379kDIsX3xxReBkKetlQmtXBSK/Oa+DlSBY8CAAUDjSK6iwscee2z5f0CKKBJ5ySWX5L1ekcurrroqsTGV6/jjjwfC/6nysa+88kqgcHWafPT+s+iiiwKhYoH+rX0S9Uh/t8Ycfy/V6kWNIrk1p8j+oYce2uxtVQFm2LBhTd5Oq0haMdp5552B8HmmSjotWF2tmHwRyUo9ZjUeu15UYTU0MY7ompmZmVkmZSqiq4iFdgcuvPDCQNhVW4+Ub7rWWmsB8OSTTwKhduohhxyS937q3AOhrrAioKpCoYhfa5FbdUEdWtTZSBFeVaio54iuIvF33XVXi+6vrlXqqgdw8803573t9ttvD4SqJ1XcLVtzuTvAla+pCL/q6cYpZze3gkW90l4EVVlRndhSaHVA1UqmnnpqAPbcc89KDDFRWtmK0+pOvjqgrYkqrnz33XeRy7VyNPvsszdc9vTTTwOwwgorADB69GgApptuush9dbxoVSpO+ypyHzspirYWqqog8UoKqsaQK/4YTeWvZlVuj4O55pqrhiNpniO6ZmZmZpZJNY/oKq+2UI6c5H572GmnnfLeRlEIUZce1XasR6pvqjwy7VpUh6pXXnkFgCFDhgChskK+TjOqZdfaIrlN0S7h4cOHAyGym0UPPvggEHbT56thOeOMMwKw4447AmFeFInJEq10qDNibreukSNH5r2PounKc01gF3HFqPbtl19+WfJ9DzzwQCBE89IYwY3T/792xGu1Yv755weyecxXwkUXXQSEij8QKnaohmpLKee9HqkOfTG1cQtFhbOYq6v3Fb2epEuXLg2/L7vssomOqVSO6JqZmZlZJiUe0VX+mL7x6Nu2upgVkpsLpB2b2smpqItqz4q6q6WB6ugqJ1e7wbXb+4MPPojcLjcyqTq52kVsgXKHqljnsOYUudXu6aa6ESk3TpE75eeprqW60WWBOswVk6u6wQYbAKGebrmRqySpDqoicc056KCDADj77LMbLtN7aZb+//VZo2oL6vyl/H3LT13O+vXr13CZcnOzqJRIbmukfUMff/xx5HLtBYGQs73tttsmNq5SZOddzczMzMwsR2IRXfVQV+7pTz/9VNL9lcsLof6fqEtLnPIQ00C5geozrqiDIkxPPPFE5GeuTp06AdGqA1mizm/6Zqloti6P967PpQoUleyCU2/Uq/7bb79t9rbK31T0Vz+32247IOTK13MuXbFUSaIpOnYUFc3NS0wLRVaKXbVQxG7s2LENl3Xv3r3yA6sR5ZNqZWPeeecFYO+9967ZmNJE1V522223hsuyFOmPKzaSm6Z8/UrSZ2jcDz/80PB7PKe/3iK72T16zczMzKxVa1NG7mJRd1Qv665duwIhz2ORRRYBQh6QunrFnX/++QC8//77DZc119lH+YdjxowBoEOHDsUMNZ+a95lW5Pucc84B8u/2VP5y7969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AnDSSScBJUV0rYbee+89IOQP7rfffkCoqrH44osX/RivvfYaEHJU02idddYBYNVVVwXgzz//BGCWWWZp9r7Kwb3mmmsAOOqooyLXv/POO0BFIrqZ9O233wIh8qlI5/nnnw/AwQcfXJuBlUDH/n//+18ABg8e3HCdVgfkpZdeAmCOOebI+1h6DWr/Q1aNGDEi7+WqeNLaKDc3Tu9NabDaaqsBza9WaKV4zjnnbHTdBhtsAMDuu+9e2cFZVTiia2ZmZmaZlMqI7i+//AKE3edffvll5Pq1114bCPlmiy22GABvv/12UkMsmaJzirqozqmi0aKI3KefftroMS644AIgRD4rsIO+pjbccMPIv5Vn2q9fP6DpiO5vv/0GwHHHHQfAzz//DMDIkSMrPs6kzTDDDCXfR1GJ3r17AyG3UJHcM888E4CNN964EkNMlHbGK2q/7LLLAjDttNOW/dg//PADAFtuuSUAzz//PBByFIupXVwvLrnkEgCOP/74Zm+r96N4pFcOOuggIKwm7LjjjpUYYt144oknALj77rsjl2+++eZA663JrsovaaaVXq3SxP36669A4z0/ufuZVMtc86F9JPvssw8QzjnSRPs0nnrqKSDsY7n99tsjt2uqbruqkuhzpphV1yQ4omtmZmZmmZSakN+bb77Z8Lu+NVx11VWR28wzzzwAnHLKKQDMNNNMCY2udH///TcAN910EwCnn346AG+88UZR98/3beqQQw4BYPjw4QAcc8wxQMhJLqF+cF3o2LFji+87efJkIETGp59+egCWWmqp8geWAVo50M8K1L9M3HfffQeEaKuqdKgjoqLU8R3zxVC0Z7PNNgPg2WefjVyvlYJ6jIB/9dVXALz11ltAWAGJr3yVQ1GvvffeGwjVTOKrMGl14oknAo0j2vr70r5aVirl5sZzdDVP2v+SBldccQUQPiPitEIUj/h+/vnnDb/fcsstQFgh1DnJZZddBoQV19lmm61Sw644vYb1vqDVCkV2JV6hp6m67dr7oRVDHS96f6iVdJ35mJmZmZkVqe6/lioX5uqrr264TLm3cTvvvDOQjh2gqoXav3//vNcvueSSQMi3bYryLK+//noAXn/9dSDMh76h9u3bt4wR1497770XCHlAxVhkkUUAWHHFFasyprRQnrO+tetbuaL/aaDo84ABA4AQyZVXX30VCCs+pUR0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maWSD3TNzMzMLJV8oGtmZmZmqeQDXTMzMzNLJR/ompmZmVkq+UDXzMzMzFLJB7pmZmZmlko+0DUzMzOzVPKBrpmZmZmlkg90zczMzCyVfKBrZmZmZqnkA10zMzMzSyUf6JqZmZlZKvlA18zMzMxSyQe6ZmZmZpZKczXivv8UbSuSq0ket/V41OYxifN4xHk84jwecR6POI9HnMcjzuNRBye6ZmZmZpZKPtA1MzMzs1Tyga6ZmZmZpVJjanTLaujQoTX/vuGGGwC4+uqrAVhzzTUrsk1mZmZmllxOdM3MzMwslRKf6H733XcAnHDCCTWXHXLIIQC0adOmIttkZmaWZldccUXNvy+55BIAvv/+ewA6deoEwD333APA0ksvXeatM8udE10zMzMzS6Um//xTcOu1svRsu/DCCwEYOHBgzWVjx44FYO655y71r3cPuzj30a2t7PvIRRddBEDfvn2BULPes2fPYjx8YyXuNfPBBx8AcNNNN9Vc9vHHHwOwxRZbAHDYYYcB0Lp162L/+sSNR4Uldjxuv/32mn9ffPHFALRr1w6A1157DYAffvgBCGcVH3vssdjtu3btCsACCyyQ669N7HhEZZ5ZffjhhwFYZ511AHjjjTeK9auqYjwyPfPMMwBce+21AAwbNix2vd6jDzroIADmmWeeXB+6KsejhNxH18zMzMxMEpvojho1CoDNN98cCMkuQK9evUr5q6PK9m2qX79+APz4448AXHrppQA0a9as4Mf85ptvgKLWTznRra3s37iPO+44AK655prY5Y8++igAO++8czF+TaEqnkBMmzYNgMsvvxyA888/H4AZM2bUeZ9DDz0UgJtvvrnYm1Ox8Xj//feBMB433ngjEOoqo+/9TZoUFJTUGDFiBAAbb7xxQzet+P6RKfMMCcCcc85Z733+/vvvrLfTmYHrr78+11+fuPHIxbHHHguEFPz+++8HoHPnzo196KoYDx2fnHvuuQA89dRTAPz5559Zb6/X2g477ADALbfcAkDLli0b+lWJGY8vvvgCgIMPPhiApZZaqua6IUOGALD66qsD8PLLLwOw2GKLFXsznOiamZmZmUliuy688MILsf9vsMEGFdqS8lCSq1qe3XffHYBtt90278d6+umnAdhrr70AeOWVVwBYd911G72dVnl77703UDvR7d+/P1DxRLdifv/9dwDOOOMMIPTZlmgCseqqqwLw0ksvATklkUBI8v7v//4vdvmSSy4JQPPmzfPc6uJTuqTkRXWlohRSzyV62exAf3OlTjoTUgyfffZZ0R4ryY4++mgAHnroISB8XunsQZroTJA6T0A4w6wEt23btgB0794dgJ122gmA559/Hgi1zfps3mOPPYCwL+ZRs1sxc8317+Gi6rX1+oFwRuiTTz4BwtkRJd56f6wUJ7pmZmZmlkqJS3T1DUmzF4888kgA2rdvX7FtKqW77roLCEnuvPPOC8Aqq6xS8GMOGDAACAmX6onSnuj+97//rfn38OHDAbj11lsBePHFF4HQqaNjx44AXHXVVQAsu+yyZdvOxlpvvfViP1WLqZ/nnXceEOq+007792mnnQaERFMJrl5bG220Uc19NFZKUjRbvi533nknAIMGDQLCWRK54447gJDoVJJStswktxgWXHBBAAYPHhy7XIlWkn399dcA7LnnngD8+uuveT+GzgSoa0cmdWmoZvpM0n4UpdeYzrDefffdQOheot670b731UpnbU499VQAHnjggZrr5p9/fgDOPPNMIHS8yay5XWuttYDwnvTcc88B8OGHHwIwbtw4ANZYY43iP4EiU0cafbaq8waE+RB6jWmug2qTo12zKsGJrpmZmZmlUuIS3XfeeQcI36aqISkohJLrCy64IHb5hhtuCMByyy1X8GN++eWXsct/++23ArYwuf766y8gfDseOnQoEPYdCN+Y65pN/sgjjwCw6aabAnDiiSeWZmNLQCnkoosuCoRvzUq01S82mi4Wsj9VC9ULvvrqqwDMMce/39+POeYYALp06VLrPjvuuCMAW265JQDzzTcfEMbw9ddfB0LHBtWjzZw5Ewh/A/0O9ROtBNUQ6nU/derU2PXq6aqkf9999wXCawTgqKOOit3n8ccfB2rXHOv1tMgiixRj08tKr4tCklzp06cPAD169Kj3+mqgNPHKK68EwpmP+uhMoxJdva9oP1Edq/axaF18tdDrSUmuPl+irwWl3VtvvXVOj6k+u0p8M/sS6/pqoLOf0eeeeRyTNE50zczMzCyVEpfoKjFQYhKtq0sTJSaffvpp7HLVjxVCdWOZj6nUqtppnXX1kb3vvvti16seCuCII44AQmK75pprAqGe8/DDDwdCTVE1Ui9G1eqqJvPbb7+N/YR0J7rvvvtu7P8dOnQAQj1hfZTkipJenS3IpNnUp59+OpB7t4ZS0nwGJVCi9xLVo/fu3Tt2vXqUA3z00Uel3MRE0Opm0W4TUdG+wkokVXud6cADD6z3sZJIZ8JUV6v3UZ0BWHjhhYHwmasVBQF++uknALp16xZ7TL2vqH51l112AcLrZ//99y/ysyg99enXc1KSG63RzTXJzaQx1mdZXe8z1SDaK3rKlCmx6xZaaKFyb069nOiamZmZWSolLtFVbZwSuLTW6E6aNCn2/7XXXhsISWMhot84o4/Zpk2bgh8zSfbZZx8g9B5cZpllgLA6j2b+QuhfqNmus2bNAkKXBdVaaszUm7aaziDo+evvrOcsmgkLIZnSbOE0U12g6m3VaSMb1bWeffbZQO2EZYkllgBCP0itoJaEvrPqo3zWWWdlvV41uWl5/TeWXvt6LWy22WZAmCHeokWLmttm9mAWraKWeeZR3YEq3S+0Pnqf1GeMEmz13dY4qGZ3zJgxNfdVLanOHmXaZpttgJCEa4U41fTqLEuSTZgwAahdL5tvPW59VlppJaC6+y3/8ccfALzxxhu1rtMcI6XgJVgZrSBOdM3MzMwslRKX6P78889AepNcyUxfW7VqBTRuhRT1ii3mYyaBep6OGDECCHVhWl9dNWfR+uZffvkFqLvrgkyePBkI/YurkepKMxPdaB/MAw44AIBdd921fBtWJlo98LHHHgNCRw2tDKakKvo31gpFSuK0jruoi8Jtt90W+38lKaHW7HgluZolbvXTmQ/1ehV16dhtt93qvK+Sf73niN5jo2dPkmbIkCFAqD0V1Wgr4VYXl6222goIvWEBVlxxxZx+l8543HPPPQA88cQTQHUkuvr762yrnn8xklx57733Yv+PjnHSqfOMzn5pvkuUurHorEEhK7uWghNdMzMzM0ulxCW6b7/9NlB7hZG0UY2ojB8/HggzqDt37gyE1UgKSRzTlt6ppkzpSi4pQWb3DtX3ilYBSkJiV6hOnToB8VnjmZSspG2fALj00kuBkDB89dVXQPjbjhw5EggzwiHUK6qfpWilo1NOOQVIVk2zkkhtu7qpKJ2OrgwIIeHXWbJqSNUqob4kV9RtINp7GJK9Epr6iqvPtDpEqGe4XjeZ9NlTCHUhWX755QEYNmwYEDqgJPHMmRJtdZlQJ5ZifiYoBdX7jbov6P0miT7//HMg9J/Waog6C5qNVk5UzXazZs1KuYk5c6JrZmZmZqnUpL4UqAEF37E+6oWqn0plKqT+As+4vMajf//+APTr16/e26277rpAWIlHieRJJ51Ucxt9i1LPWK2Epj6rqlUsgnzGA4q8j9x4440AXHjhhUB4nppVrucPIaXR2Nx6661A6P2n/Uv1a1rDvgAl20fypXqvQYMG1XmbiRMnAqG2sAQqNh6qs9XM7zfffDPn++6xxx5AWAVJdZtFULTxUJ2kEl0l+UqLtIpbppVXXhkIr59o/9wKSMzrJReq99b7r2acKx3V+7H+FgUo2XgoudWZAP3dM89qlYJWSNOZEY1jDul52fePNdZYA4BPPvkkdrn6T7/yyisFP7ZWeNXv0Oql6setxLseZRuP6dOnA/Dss88C4fNEPX/ro+4KOiO/wgorNGZT6pPvMQjgRNfMzMzMUioxia5WdVI6p1l7F198cTF/Tb5K9m1KNbqaDa9vQqo/LQb1hVTCV4T6zIomuqKx02o92dZT13Xqj1tXR4IuXbo0dnMSk1AprVV9XDb6lh5d1abIKj4e2j+OOeYYINSYZaM+uXr9lWAFuaKNh1YvUzokSmK03rx6vWbSGvWM4HacAAAecklEQVRLL710rccp4f6QqeL7Ry50JrF79+5Zrx84cCAQugw0QtHHQ11qome4IKyYWd/7Q7Eo0dVqffqcq2uluYiS7x9K4/Wa32STTYAwn0NnToYPHw6EeTL5UPKv+mh1b9HYa87Eaqut1tBDle31ojND6hmeD60Uqb93CWtzneiamZmZmYkPdM3MzMwslRLTXkxRvxr9q7m3fPPNNzX/fvjhhwG47777gDBhS82Jo22Ekqpp06ZAeA6ZHn30USBMuFJJg+4XnVCgYnmNoagspRynqspJY5CtZEE0+SyzZGHAgAFAOtts5UKnzNJMi4SMGzeuwduqVY7eM1544QUAFl988RJtXeEySxZE7ZC05K9+alLe6NGjgTDZRpP2Xn311ZrH0EQ1lT0cf/zxQP3LJ6fN77//XvNvlXJkLvWs/aIIJQslM23aNCAsJKLyrEp+DqjVWRJMmTIFqF3aodZnjz/+OBBKFu68804gLIYAYdnkuvTp0wcIE0dFk9ByKFkou+222w4IpV65TEITTYRVuYcWUNEy25XmRNfMzMzMUikxiW4mTbxQs/ftt9++5rpff/0VCE2Jldzce++9AHz22WdAWNKwGjXUhuXkk0+u+bcmGGmChGgin1pppd23335b828tvCEqkteSr0VsH5UYSiAOPPBAoHaaAGFRAaU+SVoQoVjU0kjprGjJXAhnjq6++mogLASg5ZSV6miyWjXSMqxKcpVCKl3TpBwIyaUmlSgl1mSaaqSWVloIIHM5cCWcCy20EBAa4kPtBFK3zVy6vRooqdbfOzOlLgeNcSXp7KjeBzIn4k+dOhWAlVZaCQiTNrWogybU1Ue31TLdomMRnW1JIk3Ke/DBB4HQxlOvhfoWipB3330XgK5duwKw5557AnDllVcCYcJfuaXv097MzMzMjAS1F1MNrlp7HHbYYbHL1fQcai9dqHRGNTRaAlTtdBqhKlrh6FuTWmaJaov233//Yv2qRLQXy/TXX38BIcmD0CR9gw02AEIT7BIkC4nbR9544w0gNDyPbcD/Xu9KMkuQ2FVsPPr27QuEOlM9V9XfRttuKbW5+eabgdrj8PLLLwONWghAErN/KNlVy72PP/645rrMlG+BBRYAYIsttgCgd+/eAGy99daN3Yyij4ea8GuBEJ3tGjt2LBDOAGY+R6VLc801V+x22W6rtHefffbJY/NzUvTx0PPQPBd9Ho4YMQIIy/SWkvYbzR/RvJpKLhihFl+HHHJI7HKdLda+rfpZJZy5fGa89dZbQDjLrPkyOibR5896662XzyZDAt4/tBRw9PWR6cUXXwTiC1lF6eya9otGcHsxMzMzMzNJTI2u6mG0FKuSXKWydS1vCSHBUgpRqTqQSllzzTWB2onu7EL1UKoDgrD0r2qmklAjVi6anR+dpa+ad1G3j2quwZTXXnsNCLOFleTutddeQGhSr7rTqA033LAcm5gISqqU7Gn+A8B//vMfICzco7pO1SprnLSgRvQMW6V99913QOi6kyt1JdDP+mgWvZI5dXVJoubNmwMhXdSCQapNVZ2xbldMei2OGjUKgHXWWQeAzp07F/135Uodi84555zY5Xp/fPLJJ/N+TCW2Sqq1OI0uV3cOvX4KSHITQ2e/6tNQNx+dTSpColsQJ7pmZmZmlkqJSXRFfeaU0g4dOhQIdVRRzzzzDBBqVPUNdskllyz5dlrlqbtGdDa9nHDCCUDD/Q7TSGl2CZdhTATVZqpTgJZ91gx51VWqP2aUbqt0U/Q+k+b+sUryNt9885rLVL+oriRaTlr69esHhE4uel/We24lHXTQQUC8i0SUEv66rs+8XbbbTpo0CQidTFS7rfrO+np6V4pmvivBfe6554BwpkNndRZeeOGCf8ePP/4IhOTyuOOOA0JXm+uuuw7I/hosl6effhqACRMmAKFuVl1JcqU5ABCSXH0Gad/RmQ4lnKusskqhm5143bp1q/n3sGHDst6mTZs2AOy3335l2aa6ONE1MzMzs1RKXKKrb6HqrKBvDR06dKi5jWaR3nXXXQC0b98+9v/ZTatWrSq9CWWlHrDaV9R1I1oHdvbZZ5d9u5JGyS6ExEE/X3/9dSDMVN9oo43KvHWNp76wmtmtMzmqVVeKpJXAVMMLoa47cyaxOjOUY2Z6kiiZVBcKnSXLXG1RtbuHH344EFYQi/Y5Lzf1yFZ9aKaG+seqnjJaw62eu3pvydxPDj74YCCkpXvssUdB215Kej9Uoqn6SNUZq/byqquuAkLSv8MOOwDxvuTqRax6ZvWs12PrctXkKtlNwutIfWH13qc687pWGtTZZK1Oev/99wPhfSQbrSqm3s3Z5gNUO+0P6toS7TWdWed+7rnnAtCrVy+g8nNknOiamZmZWSolLtHV7ER9i1JdjGpionbffXcg1JeVYhZpNdhyyy2zXv7ee+8BRe2jmwiqE1R9lDp1KGWwfynxhFCfJ0qsoqlNtVF/R1Giq3oxnQ1SPa5+RqmWUK8RJVHVRH2klT6KahGVZCqdnT59ep2Ppd6rTZs2jd0nk2p41Yu3kolu27ZtC7pf5mpneu5R6qesxDYz2VU3hiQmuqKOGeo+on1cr32tpCiLLbYYADNnzqy5TM87c3U51aDuuuuuQEjyKlmTm0nvfdp27dvqt6ykV/uB6rG1iqSujz73Ll26AGG1NO3/aUxyVX+tv61WP4taYYUVADjxxBOBcMYn29yqSnCia2ZmZmaplIzD7SyU1uqn5U+JZ1qMHz8eCPWV+sbds2dPoHGzh9Noq622qvn3EkssAcD3338fu41mXqfhdTZ69OjYz/p0794dCPVmO+64Y+k2rMSUbGfWHF5zzTVAqOHXSomqI4x2FqirfrUuLVu2BHLrsZkUShkvuOACICT+9XXpUWcK1buqHlxJZjXNj9Dz1XNSnb76yKorgWp4taIghPeHzC4CWnmymrqUvP3227GfmYmt+vHruWmFNM0JgdC7Pk0Jruqt9frQ2Rqd1Ykm/BA6sUA4s6GxSxonumZmZmaWSolNdC13rVu3BkKik7kKVlqoX6ZWb1K6oBniFqdaOwj9UTN7Dlfzij1KKJXKvv/++0DYT5TgqSZPM+Uh7DtJqiUsVIsWLYDQMUK0EpReL8Wg5EZdcFSrWEnqmqAEMrOn52abbQbAscceCxRWT6ueq+rs0LFjx8I2NgGUYM8uZ0119kbvD0oqdTZCPZDVvUmdAtLcAxdCoj916lQAnnrqKaB29xL1XdaZAI1nNM3O94xQuTnRNTMzM7NUahJdDSZPBd+xijRp+CY1Kj4e++yzDwBDhgwBQj/EQtbyrkM+4wFFGhPNFu7Ro8e/G/G/Wir1hdSs0Pnnn78Yvy5fVbWPlIHHI65i4zFy5EggrCAnSvdHjRpVc1lmIqPXVGYnG/VJbURtovePOI9HnMcjrujjoT70u+22GwCbbropEM7OrL766rHb671BHWoqLN9jEMCJrpmZmZmllBPd+vnbZVxZE111WdAMV80SVw2VVs9TDWaFeB+J83jEeTziPB5xHo84j0ecxyPOia6ZmZmZmbjrgiWW1tLWOtonnXQSAJdccknFtsnMzMyqhxNdMzMzM0sl1+jWz/UxcRXpupBw3kfiPB5xHo84j0ecxyPO4xHn8Yhzja6ZmZmZmTQm0TUzMzMzSywnumZmZmaWSj7QNTMzM7NU8oGumZmZmaWSD3TNzMzMLJV8oGtmZmZmqeQDXTMzMzNLJR/ompmZmVkq+UDXzMzMzFLJB7pmZmZmlko+0DUzMzOzVPKBrpmZmZmlkg90zczMzCyVfKBrZmZmZqnkA10zMzMzSyUf6JqZmZlZKvlA18zMzMxSyQe6ZmZmZpZKczXivv8UbSuSq0ket/V41OYxifN4xHk84jwecR6POI9HnMcjzuNRBye6ZmZmZpZKPtA1MzOznA0ePJjBgwfTpEkTmjRpwqRJk5g0aVKlN8ssKx/ompmZmVkqNfnnn4LLOlwPEufxqM1jEufxiPN4xHk84jwecYkZj1VXXRWAJZdcEoBnn30WgKZNmzb2oatyPErI4xHnGl0zMzMzM2lM1wUzMzObTdx///0AjB07FoB27doBRUlyzUrGia6ZmZmZpZITXTOz2dysWbMAOPHEEwG46aabAJg4cSIAiy22WGU2zBJFSa7stNNOFdqSxtt6660B+PDDDwEYN24cAAsttFDFtinJfvzxRwD2339/AJ5++uma63r16gXA9ddfX/4Ny4ETXTMzMzNLpcR0XRg9ejQAr732GgD//e9/AXjiiSdq3bZr164AHHLIIQDMOeecxdyUKM94jKuargszZswA4MgjjwRg4MCBQEn2lcTtI2PGjAFC/RzA+eefD0Dfvn1L/esrPh5Dhw4F4IorrgDCDHElOAAtW7YEYKWVVgJg+eWXz+mxx48fD4Tk89FHH23oLhUfj1xMnz4dgPnnnz92uWoy99prr2L9qqoYjzKqivF4//33Adh4440BaNasGQBvv/02ACuvvHKxflXJx+PXX38FYJNNNgHg448/BuDSSy8F4KSTTirkYUul4vuHEu9tttkGgMmTJ9e6jVLwDh06AGE/Oeecc4q9Oe66YGZmZmYmFU90v/jiCwDWW289AH755Zec73vJJZcA0KdPn2JsSjZl+zZ12WWXATBixAgAHnnkkbwfo3v37gCcfvrpAKyyyiqN2aRsKpLoKk34448/ANhss80avM+0adMAWG655QD4/PPPAWjevHkxNimq4t+4M2VLdDfddFMgnDEpoYqNx99//w1Aly5dgOxng2p+8f/e9xZeeGEgvP50lqguSnIffPBBAL788suGNitx+4f89ttvNf9WYjt8+HAA5pjj3wzkhRdeAGDzzTcv1q9N7HhUSFWMhz5LdEajU6dOALz00kvF/lUlHw/VoyuhfPHFF4Gwj6sn8Nxzz13IwxdbxfYPfd4qrf/uu+9yvu8iiywCwOuvvw6Es2pF4ETXzMzMzEwq1nWhf//+AJx33nkAzJw5E4AVVlgBgB49esRurxl/AAMGDADgrrvuAkLtnVLhJLv44ouBkKw988wzQHj+jTF48GAA7rnnHgB69+4NwJVXXtnox64kpQafffYZkFuiq1rDHXbYAYC33noLgG233bYEW2hJoL9xfUlupqlTpwLhNaMZxfPMM0/sdnqd6naZ11ejUaNG1fxbSa4svvjiQFGT3FT46aefABg5ciQQzhwNGjQIgHXXXReA9u3bA+EzqVWrVmXdzmI49dRTa/6tJHe11VYDQh18NdLZijZt2gAh0X355ZcBmDRpEhDOBuZCn1E//PADAB07dgRgqaWWavwGV4iS759//jl2ud77Ntpoo5rLVKP72GOPxe6j45wiJroFcaJrZmZmZqlU9kT33XffBWonuarp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FVrq9Zprrin1ZluZab9XCx8tLJPZZgpCSqP3nTQnuaKEO+203LyWM9b7/5gxYwC44YYbYj8HDRoEFLa0eDXRcteZC2joM1bt1/L5zBW996Yh0ZVinAXU8srVnOSK2phGJ+VJ5lmBpKn+0TczMzMzy6Jiie71118PhNRVjcozaem8Nddcs+YytcDRN9SzzjoLgDPOOAMItUVqn3LvvffGbqe07+CDDwZCe5UkUu1gXctY5kJLO7744ov13k6JR9ISXSXS+na84447AvDss88CoYb3gAMOqLnPfPPNB4S67S+++AKAVVZZpQxbXFkaj2pexjUXf//9NwDDhg0DQm2davhzobHSY+nsht6PqqldUmMsvfTSld6EolMbMdWPvvnmmwBcccUVALzzzjtAaMMYTf712ZAmmtOS+VnywQcfZL29FjmAsEiTzpIMHTo0dttq3H9Un6+0ddasWXk/huYDbbvttgA8+eSTQEiDdXk102IYOjMi0bkygwcPLus25cuJrpmZmZmlUtnjCi0/eeqppwK1k1wtx6jlOtW4PfqtUwmtaHlTpS+dOnWK/VTN1pFHHgmEmZCTJk0C4LzzzmvckyohJd99+/YFQu1yIfTts127drH/KwlPalNrJbpKZbUggGZXK03QN/RslETMDnTGQs3c00bpa48ePQC4++67C34s1fNqWVjVdapO8cILLyz4sZNGy5Vmo3FII70O9FNdeLTIwZAhQ4DwuRCVpmR39OjRed0+Wm+rz9wJEybEbqOzodW4CIfODKoLhTojqNZflPRHn6M+Q/UY6uikz9A//vijVJtdNjNnzgRCF47MmuVoLfc+++yT9TFat24NwPrrrw+EdFhn0vr161fELa6bE10zMzMzS6WyJ7p33nknEOprldYpsdQyjaqbUQKs2fJRSvYaWup25ZVXBkIvXs3ab6hmNQm22morIHQe0LZH6VtkQ8m0xlrjVi00G1rfqPPpo5uprlrwNFHyPXLkyJrL1FGjmun1q5rzJ554Ina9zgapf/R+++0HhDM96sMMIQXWGSPV9yqZSWPfZXW0yUa17LMDnflRXeHzzz8PwJQpU2puoxrUAw88EAi129VswQUXBGCRRRYB4Oeff6739ldddVWd1ynlu/3224Hq7kWsz9aePXsCoZZZ6XWbNm2A8L6SjRLvzCR3vfXWK+7GloHeX/fdd1+g7jkPOoYDeOqpp3J6bC2pXt++VQpOdM3MzMwslcqe6Cqh1LdppS3qF6t6GPVM1Tfq6LcH1WQqldEM+1w98sgjBW17JamDRDb6xpltxZI0UB1YY5LcNCZ0s5vtttsu9n/NaFb6pgRX9f2imt5srw8lum3bti3uxiaIzpZlriQZTaiiM+xnF7/88gsQVuGM0oqcSvXSsKpmx44dgVCTqnky0c/WqOicjS222AKA3XbbDYBtttkGSEfSLepSo5+q12+MhlLzJNJZdR2DZVp88cUBaNWqVa3r1lprLQAmTpwI1F6NsXfv3kCYL1UuTnTNzMzMLJXKnujuvffeQOgmoJWrOnToAIQOCuPHj4/dL/rt8tprr43dNs3U6zGzHjFK9YVWt2yrY1l1mjFjBgAjRoyIXf7YY48BYbawZkYrmVAtZpTWaE+zaG1yVLSuspprLDOpT+60adMAWGmllYDQuWedddYBwspoSnZnF5rT0tDcFstdXcm25ktUA82H0vGV6LNTfXRPOOEEIHT3yUa1ylqRVO9BOiNQbk50zczMzCyVKrbsj3q3XnbZZVmvX3HFFYFQC3TEEUfUXKfZo7MDfSPMrPWJJtyzw2pfZqL+z6orVWKrHo1akz0X1biiU7Fo9n3a6Kyh5oOMGzcup/tFUzl9Pi277LJF3jpLo27dugFw5plnAmH1uRdeeAGAc845pzIblgcltTojJuovrPraXDRr1gwIHa/0s1Kc6JqZmZlZKlUs0dWM6TSsBV1KWjs7U3TG9OycSuVKnRtmVzozkgaqGdPKTarNVXeFXKiuPU21qXXRqmcvvfQSEGaTl2tVonLT+6FqDbV/KPnXipiq3VVf3WhXjrSOjZWW9jUd1yjZrQZaBVJ1tDozkoZabie6ZmZmZpZKTRrRX3R2aEyaz1T9koyHkqerr77631/yv7/XxRdfXHObk08+uRS/Opt8WxckZh8ZNGgQEJLdAw44oFgPXfF9JNOYMWOA0HUAytpHuOzjobo49QfNpHXV+/TpU3NZGRO7xO0fFVax8VANt1Z6at++PVDx7j3eP+I8HnEej7iC2ic50TUzMzOzVHKiW7/EfJsaOHAgAJMnTwagR48eNdc1ZsWwPFVtoltCidlHEsLjEefxiPN4xHk84jwecR6POCe6ZmZmZmbiRLd+/jYV50S3Nu8jcR6POI9HnMcjzuMR5/GI83jEOdE1MzMzMxMf6JqZmZlZKvlA18zMzMxSqTE1umZmZmZmieVE18zMzMxSyQe6ZmZmZpZKPtA1MzMzs1Tyga6ZmZmZpZIPdM3MzMwslXyga2ZmZmap5ANdMzMzM0slH+iamZmZWSr5QNfMzMzMUskHumZmZmaWSj7QNTMzM7NU8oGumZmZmaWSD3TNzMzMLJX+HzWS3belfkv5AAAAAElFTkSuQmCC\n"},"metadata":{"image/png":{"width":349,"height":229},"needs_background":"light"}}]},{"metadata":{},"cell_type":"markdown","source":"# Set up the neural network"},{"metadata":{"trusted":true},"cell_type":"code","source":"### Layer details for the neural network\ninput_size = 784\nhidden_sizes = [128, 64]\noutput_size = 10\n\n### Build a feed-forward network\nmodel = nn.Sequential(nn.Linear(input_size, hidden_sizes[0]),\n nn.ReLU(),\n nn.Linear(hidden_sizes[0], hidden_sizes[1]),\n nn.ReLU(),\n nn.Linear(hidden_sizes[1], output_size),\n nn.LogSoftmax(dim=1))\nprint(model)","execution_count":6,"outputs":[{"output_type":"stream","text":"Sequential(\n (0): Linear(in_features=784, out_features=128, bias=True)\n (1): ReLU()\n (2): Linear(in_features=128, out_features=64, bias=True)\n (3): ReLU()\n (4): Linear(in_features=64, out_features=10, bias=True)\n (5): LogSoftmax()\n)\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"# Set up the optimization model"},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Edit code here to change the optimization model.\")\noptimizer = optim.SGD(model.parameters(), lr=0.001)","execution_count":7,"outputs":[{"output_type":"stream","text":"Edit code here to change the optimization model.\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"# Set up the loss function to optimize over"},{"metadata":{"trusted":true},"cell_type":"code","source":"time0 = time()\nepochs = 15\ncriterion = nn.NLLLoss() # Negative log likelihood loss function is used\nimages, labels = next(iter(trainloader))\nimages = images.view(images.shape[0], -1)\n\nlogps = model(images) # Model spits out the probability of image belonging to different classes\nloss = criterion(logps, labels)","execution_count":8,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Train the neural network"},{"metadata":{"trusted":true},"cell_type":"code","source":"for e in range(epochs):\n running_loss = 0\n for images, labels in trainloader:\n # Flatten MNIST images into a 784 long vector\n images = images.view(images.shape[0], -1)\n\n # Training pass\n optimizer.zero_grad()\n\n output = model(images)\n loss = criterion(output, labels)\n\n #This is where the model learns by backpropagating\n loss.backward()\n\n #And optimizes its weights here\n optimizer.step()\n\n running_loss += loss.item()\n else:\n print(\"Epoch {} - Training loss: {}\".format(e, running_loss/len(trainloader)))\nprint(\"\\nTraining Time (in minutes) =\",(time()-time0)/60)","execution_count":null,"outputs":[{"output_type":"stream","text":"Epoch 0 - Training loss: 2.223088512796837\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"# Evaluate the trained neural network"},{"metadata":{"trusted":true},"cell_type":"code","source":"correct_count, all_count = 0, 0\nfor images,labels in valloader:\n for i in range(len(labels)):\n img = images[i].view(1, 784)\n # Turn off gradients to speed up this part\n with torch.no_grad():\n logps = model(img)\n\n # Output of the network are log-probabilities, need to take exponential for probabilities\n ps = torch.exp(logps)\n probab = list(ps.numpy()[0])\n pred_label = probab.index(max(probab))\n true_label = labels.numpy()[i]\n if(true_label == pred_label):\n correct_count += 1\n all_count += 1\n\nprint(\"Number Of Images Tested =\", all_count)\nprint(\"\\nModel Accuracy =\", (correct_count/all_count))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Predict using the trained neural network"},{"metadata":{"trusted":true},"cell_type":"code","source":"def view_classify(img, ps):\n ''' Function for viewing an image and it's predicted classes.'''\n ps = ps.data.numpy().squeeze()\n\n fig, (ax1, ax2) = plt.subplots(figsize=(6,9), ncols=2)\n ax1.imshow(img.resize_(1, 28, 28).numpy().squeeze())\n ax1.axis('off')\n ax2.barh(np.arange(10), ps)\n ax2.set_aspect(0.1)\n ax2.set_yticks(np.arange(10))\n ax2.set_yticklabels(np.arange(10))\n ax2.set_title('Class Probability')\n ax2.set_xlim(0, 1.1)\n plt.tight_layout()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"images, labels = next(iter(valloader))\n\nimg = images[0].view(1, 784)\n# Turn off gradients to speed up this part\nwith torch.no_grad():\n logps = model(img)\n\n# Output of the network are log-probabilities, need to take exponential for probabilities\nps = torch.exp(logps)\nprobab = list(ps.numpy()[0])\nprint(\"Predicted Digit =\", probab.index(max(probab)))\nview_classify(img.view(1, 28, 28), ps)","execution_count":null,"outputs":[]}],"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.7.1"}},"nbformat":4,"nbformat_minor":4} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment