Skip to content

Instantly share code, notes, and snippets.

@Pabla007
Last active December 29, 2019 05:57
Show Gist options
  • Save Pabla007/fe7726bc7deb35fb139e17b241d770a9 to your computer and use it in GitHub Desktop.
Save Pabla007/fe7726bc7deb35fb139e17b241d770a9 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Classifying Fashion-MNIST\n",
"\n",
"Now it's your turn to build and train a neural network. You'll be using the [Fashion-MNIST dataset](https://github.com/zalandoresearch/fashion-mnist), a drop-in replacement for the MNIST dataset. MNIST is actually quite trivial with neural networks where you can easily achieve better than 97% accuracy. Fashion-MNIST is a set of 28x28 greyscale images of clothes. It's more complex than MNIST, so it's a better representation of the actual performance of your network, and a better representation of datasets you'll use in the real world.\n",
"\n",
"<img src='assets/fashion-mnist-sprite.png' width=500px>\n",
"\n",
"In this notebook, you'll build your own neural network. For the most part, you could just copy and paste the code from Part 3, but you wouldn't be learning. It's important for you to write the code yourself and get it to work. Feel free to consult the previous notebooks though as you work through this.\n",
"\n",
"First off, let's load the dataset through torchvision."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import torch\n",
"from torchvision import datasets, transforms\n",
"import helper\n",
"\n",
"# Define a transform to normalize the data\n",
"transform = transforms.Compose([transforms.ToTensor(),\n",
" transforms.Normalize((0.5,), (0.5,))])\n",
"# Download and load the training data\n",
"trainset = datasets.FashionMNIST('~/.pytorch/F_MNIST_data/', download=True, train=True, transform=transform)\n",
"trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)\n",
"\n",
"# Download and load the test data\n",
"testset = datasets.FashionMNIST('~/.pytorch/F_MNIST_data/', download=True, train=False, transform=transform)\n",
"testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we can see one of the images."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"image, label = next(iter(trainloader))\n",
"helper.imshow(image[0,:]);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Building the network\n",
"\n",
"Here you should define your network. As with MNIST, each image is 28x28 which is a total of 784 pixels, and there are 10 classes. You should include at least one hidden layer. We suggest you use ReLU activations for the layers and to return the logits or log-softmax from the forward pass. It's up to you how many layers you add and the size of those layers."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# TODO: Define your network architecture here\n",
"from torch import nn\n",
"import torch.nn.functional as F\n",
"model=nn.Sequential(nn.Linear(784,128),\n",
" nn.ReLU(),\n",
" #nn.Linear(256,128),\n",
" #nn.ReLU(),\n",
" nn.Linear(128,64),\n",
" nn.ReLU(),\n",
" nn.Linear(64,10),\n",
" nn.LogSoftmax(dim=1))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Train the network\n",
"\n",
"Now you should create your network and train it. First you'll want to define [the criterion](http://pytorch.org/docs/master/nn.html#loss-functions) ( something like `nn.CrossEntropyLoss`) and [the optimizer](http://pytorch.org/docs/master/optim.html) (typically `optim.SGD` or `optim.Adam`).\n",
"\n",
"Then write the training code. Remember the training pass is a fairly straightforward process:\n",
"\n",
"* Make a forward pass through the network to get the logits \n",
"* Use the logits to calculate the loss\n",
"* Perform a backward pass through the network with `loss.backward()` to calculate the gradients\n",
"* Take a step with the optimizer to update the weights\n",
"\n",
"By adjusting the hyperparameters (hidden units, learning rate, etc), you should be able to get the training loss below 0.4."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# TODO: Create the network, define the criterion and optimizer\n",
"from torch import optim\n",
"criterion=nn.NLLLoss()\n",
"optimizer=optim.Adam(model.parameters(),lr=0.003)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training loss: 0.4966787086335072\n",
"Training loss: 0.3830598427463315\n",
"Training loss: 0.3485023667181987\n",
"Training loss: 0.3292146279994867\n",
"Training loss: 0.3124102537375269\n"
]
}
],
"source": [
"# TODO: Train the network here\n",
"epochs=5\n",
"for i in range(epochs):\n",
" running_loss=0\n",
" for images, labels in trainloader:\n",
" images=images.view(images.shape[0],-1)\n",
" optimizer.zero_grad()\n",
" output=model(images)\n",
" \n",
" loss=criterion(output,labels)\n",
" loss.backward()\n",
" \n",
" optimizer.step()\n",
" \n",
" running_loss += loss.item()\n",
" \n",
" else:\n",
" print(f\"Training loss: {running_loss / len(trainloader)}\")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1EAAAGwCAYAAABIAu+kAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzdd5hmdXn/8fdnC7B0AalGMBoVRESwlwAK9oLGFowRLFE0ys9oUKOJ2LHFEmNX0NhDrIAQUVejgIUioBQLK1KkLLALbGHL/fvjnHEfHmZ257vs7OzMvl/X9VxnnnPubznPDMvc8y0nVYUkSZIkaXxmTHYHJEmSJGkqMYmSJEmSpAYmUZIkSZLUwCRKkiRJkhqYREmSJElSA5MoSZIkSWpgEiVJkiRJDUyiJEmSJKmBSZQkSZIkNTCJkiRJkqQGJlGSJEmS1MAkSpIkSZIamERJkiRJUgOTKEmSJCBJ9a89JrsvG4vJ+szvSLtJju/LHjPeepMc3p+fu3Y91obGJEqSJE0rSTZPcmSSbye5LMmiJLckuTTJCUn+Lsmcye7n+pJk3sAv9yOvFUnmJ/m/JK9Ksvlk93Nj1SdYxyTZd7L7ovGbNdkdkCRJWleSPBn4BLDzwOlbgJXAHv3rb4B3JXleVX1/ffdxEt0C3Nx/vQmwHfCI/vWiJAdV1TWT1bkp5CrgYuC6hjIL+jKXjXLtcOAAYB5w7h3sm9YTR6IkSdK0kORw4Bt0CdTFwPOAHapqy6raGtgWeAYwF9gV+OvJ6emkeW9V7dy/tgN2AN4OFLAXXfKpNaiq11fVvavqww1lvt6X+fuJ7JvWH5MoSZI05SXZB/gY3e82JwP3r6rPV9X8kZiqWlBV/1NVBwHPBm6anN5uGKpqflW9ETiuP/XUJLtOZp+kqcIkSpIkTQdvBzYFrgAOq6rFqwuuqq8C/z6eipPMTHJQkg8mOSvJ1UluTXJlkq8nedRqys7o17z8oF+DtCzJtUl+leQzSR43Spm7JflokkuSLO7XdP0hydwkr0+yw3j63eBLA1/vN9CPP2+gkGTTJG9Icl6Sm/rz2w71+6AkX0vyp/7z+dOaPp+h8nsn+XJfbkmSi5L8a5JNx4jfMskzk3whyQVJbuw/r98m+USSv5qgdsfcWGI1bdxuY4mRc3RT+QCOG1q3Nq+P+0z//oQ1tPHmPu708fZLa881UZIkaUpLshvwxP7th6pqwXjKVVWNs4k9gcG1U0uBW4FdgEOBQ5O8oareMUrZ/wIOG3i/ANiabirdXv3rlJGLSfajm264VX9qGd1aprv2rwOAcwbLrANXDHy99SjXNwN+BDyo78+i4YAkbwPe0L8tuvvckVWfz7FV9frV9OFhdNMJtwAWAgHuBbwFeEKSQ6rq5qEyhwP/MfD+JroBgrv3r8OSHFpVp63jdteVxcDVdGvTZvftDyb/1/bHTwFHAE9Osv3g6OqIJAGe37/9zAT1VwMciZIkSVPdgXS//AJ8awLqvxX4b+DJdOut5lTVlsBOwL8CK4C3JXnwYKEkf02XQK0EXgVsXVXb0iUlu9IlAT8eauu9dAnUT4H9qmqTqroT3S/5DwQ+QJegrEt3Hfj6xlGuvxy4J/AcYMv+HvagS+5I8hxWJVAfBnbs+3xnViU5r0vyd6vpw0eAXwP7VNU2dJ/BEXRJxUMYfdRwfl//w4Bt+3Vvm9ElvV+g+8y+mGSLddzuOlFVX6mqnYGRkaOjBtas7VxVD+zjTu/7uAnw3DGqezSwO9335CsT1WetYhIlSZKmuj3741K6DSXWqaq6pKqeVVUnVtXVIyNYVXVNVb0NeDNdEvfSoaIP6Y//W1UfqKqb+nJVVVdV1Wer6jVjlDmqqs4Z6MOiqvpFVb2qqs5Yx7f44pFmgJ+Pcn1L4Nn9L/239v35Q1Ut60dA3trHfbmqXlFV1/Ux86vqlayaLvi2JGP97rkUeFxVnd+XvbWqjgde1l9/YZLdBwtU1Zeq6pVVdcbI6GP/2V5Et6nIaXSJ3DNWc+/N7U6ST/XHI8a4/oL+eMLIz5kmlkmUJEma6rbvjzc0TNFbl77dHx8+dH5hf9xxNcnDsJEyu9zhXq1Gkk2S7JXkU3RbvkOXBF07Svh5VfW/Y1S1L3CP/uu3jRHz5v64O92UwNF8rKquH+X854DL6X5nfdoYZW+n/zk4qX87/H2ZsHYn0OfoRkT3TXL/wQtJtmFVH53Kt56YREmSJK1Bkjn9Q2nnJrmm3yCi+o0BRkaMhne2O43uF9/9gLnpHvK7pt3vTu6Pn0tybJKHJJm9jm7jTQN9Xgr8Cnhhf+1MVo2+DFvdyNfIRhTXVtWvRguoqotZte5qv9Fi6NaBjVZ2JfB/Y5VNcpck7+o3/Lgx3UOER+7x/X3Y6j7ztWp3fevXQX2jfzs8GnUY3TTG31TVj9ZrxzZiJlGSJGmqG1lof6d+etk6lWQXuoeg/jvdxg53pktCrqXbGGDkoau3WXtTVb8FjqRbX/NIuk0mrkhyab/73m1GFHr/TLdGZivgtXQJzMIk309yZJI5d+BWbun7ezVwJXAh8DW6qW+PrKrR1kPBqg0ORnPn/njFamKgG9UZjB+2uvIj125TNskBdPdwNF2isw3d5hIj9zgyqre6NVHN7U6ikSl9hyXZZOD8yFS+49B6YxIlSZKmugv746Z0O6utax+g21jh93RT37brH+C7Y78xwEPGKlhVnwHuBvw/4Jt0Cd8edOunzkryL0Px84FHAIcAH6Ib5doEOIhuE4QLktxlLe9j8GG7u1XVXlX1N/3ztJavptyKcdQ96nbg68jtEuN+dO7zdOu1TqN7cPKcqtp25B6Bfxqr/Nq2O8lOAy6lm776FIAk9wEeQPc9+uzkdW3jYxIlSZKmuh/SbYoA/S+X60r/F/+n9m+fW1Vfq6obhsJ2Wl0d/WYUH6yqQ+lGNR4EfJ3ul/S3pntQ8GB8VdVpVXVUVe1Htx36S4Drgb9k1TS1DcHIKNVdVxsFI4nfWKNaq5tyN7I+bLDsQ/s6rweeWlX/V1VLhsqt9vuylu1Omn6d18iap5EpfSPTMU+tqivXf682XiZRkiRpSquqy1m1lugVSUZ71tHtjHPq3w6sGmU5Z4yYg8fTHvw5Qfo58ExWbVzwiDWUuaGqPgGMjFodsLr49ezs/rhFklE3jUhyT2C3ofhho95T/z165ChlR5KyS6rqds+t6o3n+9La7kRYOdLsOGKPoxt1emy/a+DItvFuKLGemURJkqTp4I1065TuQvdsoM1WF5zkWaya7rU6C1k1ynXfUerZBXjFGG1sMtp5gKpaQffgWuiTtCQzksxaTV8WD8ZvIM4Fftt//S9jxBzTH+cBPxsj5sgk245y/u+Av6BLNL42cH7kWVl/Ndr3Oslj6KZArklruxNhZO3WaP24jaq6AvgOMJPuWVh3phspm4jno2k1TKIkSdKUV1Xn0j0UtoAnAuf0u+FtNxKTZJskT0/yA7oHkm41jnpvptu5DuAzSfbt65qR5NF0UwnHGkF4R5ITkhw61I+dknyIbq1UAd/tL20N/DbJG5LcN8nMobbe3seduuZPZP3op5i9sX/71CT/kWR7gCTb9/f5t/31N/a73o1mM+CUJHv3ZWcneT7wsf76p6vqsoH4nwCL6NYHfa5PZkd2UXwB8D+s2nBkdVrbnQgjuxo+vd+ufE1GNpgY2br981W1bKxgTYzV/bVDkiRpyqiqTyeZD3wcuDfdbngkuZkuWRlMmv4AfH+cVb8K+AHdSNQ5SW6h+0P0HLo1OS9g1fbTg2bRbUTxN30/FtIlXIP9eGNVXTDwfne65y29DViW5Ca6Xedm9td/z/hG0NabqvpKkvsCbwD+EXhZkgV0/R75g/2xVfWF1VTzMuCTwPl92Tl0G2pAl8Te5p6r6sYkrwc+SDc18pl9uS3oPvdz6aa4fWgN3W9qd4L8F/Aaummd1yW5hm6U8vKqGm2q50nAVaxas+VUvkngSJQkSZo2quobdJsvvJxundTldL9Uz6KbTnYC3XN17jXeZ+pU1U/pNjL4BnADMBu4hi5Z2xf45RhF3w+8km5XvkvoEqhNgT/SjYT9dVW9YyB+IfAkut0Af0Y3TWsruq3Jf06XpOzbrwHboFTVG4FH093rdXS75s2nm2Z2cFW9fg1VnA48GPgq3bTMAi4G/g04sB8RHG7zQ8DTWTUqNQu4CHgT8DC67c7XpLndda2qLqLbjfEUummKO9Ml06PuwtjvpDjygOefDyXhWk8yOQ/2liRJkrQ2klwC/BVwZFV9bE3xWvdMoiRJkqQpol8fdxrdCOWuVbVwDUU0AZzOJ0mSJE0BSXYA3tO//YwJ1ORxJEqSJEnagCV5L/AsuvVSs+nWnd2nqq6Z1I5txByJkiRJkjZsO9A9t2ox8L/Ao0ygJpcjUZIkSZLUwJEoSZIkSWpgEiVJkiRJDWatbcFDZjzTeYCStB58d+V/Z7L7IEmSVnEkSpIkSZIarPVIlCRJmhhJLgW2BuZNclckaTrbA1hYVXdrLWgSJUnShmfrOXPmbLfnnntuN9kdkaTp6sILL2Tx4sVrVdYkSpKkDc+8Pffcc7uzzjprsvshSdPW/vvvz9lnnz1vbcq6JkqSJEmSGphESZIkSVIDkyhJkiRJamASJUmSJEkNTKIkSZIkqYFJlCRJkiQ1MImSJEmSpAYmUZIkSZLUwCRKkiRJkhqYREmSJElSA5MoSZIkSWpgEiVJkiRJDUyiJEmSJKmBSZQkSZIkNZg12R2QJEm3d8EVC9jjdSf9+f28Y584ib2RJA1yJEqSJEmSGphESZIkSVIDkyhJkiRJamASJUmSJEkNTKIkSZIkqYFJlCRJkiQ1MImSJAGQ5JVJKsm566Cu45PcPI64uUnm3tH2htqtgdfyJH9M8uUke62rdsZoe/MkxyQ5cCLbkSRNPp8TJUka8YL+eL8k+1fVWZPam7W3GHhU//Us4B7AG4HTk+xVVVdOULubA2/qv547QW1IkjYAjkRJkkjyAOB+wLf7Uy+cxO7cUSur6sz+9eOqOh74B2AbwCfWSpLuMJMoSRKsSpqOBs4E/jbJnMGAJHv0U+Rek+TVSS5NcnOSM5I8ZE0NJHl4kuuSnJhki9XEbZ3kvX39tya5IskHVldmHBb0x+VDbe2d5JtJbkiyJMm5SZ4/Sp/umuTzSa5JsjTJhf1nMKO/vgdwbR/+poHphMfcgT5LkjZQJlGStJHrk6W/Bc6oqouATwPbAk8fo8jLgYOB/wc8F9gCODnJNqtp41nA94CvAk+tqlvGiNsc+CHwfOBDwOOBdwGHA99KknHe06z+tVmSvYH3ADcAJw/E3As4HdgLeEV/v78Gjk9y9EDcnfu4Q+imBT4FOA14L/DhPuwq4HH9158GHtq/PjWe/kqSphbXREmSnkE31e24/v1XgA/QjU59YZT4m4AnVdUKgCRXAT+lS3i+PByc5LXA24F/qap3r6EvrwT2AR5cVb/oz30vyRXACXSJynfWUMcWwLKhc1cBT66qqwfOHQPMBg6qqsv7cycn2ZZuNOnjVbUA+CdgN+CBA306NclM4KVJPlBVlyQZWUN2eVWduYY+AjBQZti9x1NekjQ5HImSJL0QWESXPFFVN9GNGB2Y5C9HiT9pJIHqndcfdx+KS5KPA28GDhtHAgXwJOAC4NyB0aRZwKlAAQeOo47FwAP714PpRpguoUuQHjoQ9yjg+wMJ1Ijj6TaJeOhA3K8HEqjBuLBqEwtJ0kbCkShJ2ogluQfw18D/ADP6URjoRn2O6F//OlRs/uCbqlrSz7KbMxS3CfBs4FesefRoxE50u+kNjySN2GEcdawcTniSnAr8Efh3ViVH29ONUA27cuD6yHHeOOKaVdX+o53vR6j2W9t6JUkTyyRKkjZuL6AbTXlG/xp2eJI3VdXKtah7KXAQ3SjSaUkeV1U3rKHMdXQjSS9YzfVmVbUoye/odiAcMR/YeZTwXYfaGm+cJGkjYRIlSRupfk3P84HfAS8aJeSpdJtHPAY4ZW3aqKpzkhxAtxHD3CSHVNU1qylyIvAvwPyqunRt2hxNki3pRrgG2/4e8LQku1TV4IjU39NNbzxzIO71SfarqrOH4gr4Qf9+aX8cHpGTJE0zJlGStPF6PN1oymurau7wxSS/Al5Gt2ZqrZIogKq6MMkj6RKpHyU5eJR1SCM+APxNH/d+uvVWM4C70iVzH6iq09fQ5IyBLddn0G0K8UrgTnSbSYx4M90arLlJ3gJcT7fb4BOBo/tNJQDeT5cwnZTk34A/9DEvAz5aVZf093lTksuAJyf5LnAjcOUEPtxXkjRJTKIkaeP1QuBWVu3KdxtVdW2Sr9ON1oxnLdKYqur3A4nU/yV5dFX9fpS4W/q419E9IPdudNP7LqMbERrP6NQc4IyRKulGny4EnlZV3xho6+IkDwPeAfxnX+5C4Ij+Ab0jcdf2ce/sX1sDv6d7pta/D7X9Irqtz0+iWxP2Zm6buEmSpoFU1VoVPGTGM9euoCSpyXdX/ve4no2k6SPJWZvsdPf9djn8g38+N+/YJ05ijyRp+tl///05++yzzx5rk5/VcYtzSZIkSWpgEiVJkiRJDUyiJEmSJKmBSZQkSZIkNTCJkiRJkqQGbnEuSdIGaO/dtuEsd+STpA2SI1GSJEmS1MAkSpIkSZIamERJkiRJUgOTKEmSJElqYBIlSZIkSQ1MoiRJkiSpgUmUJEmSJDUwiZIkSZKkBiZRkiRJktTAJEqSJEmSGphESZIkSVIDkyhJkiRJamASJUmSJEkNTKIkSRuFJIcnqaHXNUl+kOTxk90/SdLUYRIlSdrYHAE8FHgY8BJgJXBykidOaq8kSVPGrMnugCRJ69kFVfWLkTdJTgFuAA4DTpq0XkmSpgxHoiRJG7slwK3A8pETSY5J8rMk1ydZmOTsJC9MksGCSTZN8r4kf0qyKMmPkzwoybwkx6/n+5AkrSeOREmSNjYzk8wCAuwE/DOwBfClgZjdgY8Bl/XvHwL8B7Ab8JaBuOOAZwPvBr4P7AWcAGw9no4kOWuMS/ceT3lJ0uQwiZIkbWzOHHq/FPjHqjpl5ERVHTHydZIZwFy6pOuoJG+tqkqyF/C3wLuq6vV9+HeTXM1tEzJJ0jRjEiVJ2tj8PXBh//UOwNOA/0wys6o+DJDkEOB1wAO4/ajSjsDVwAH9+68OXT8B+K/xdKSq9h/tfD9Ctd946pAkrX8mUZKkjc2FgxtLAKck2R14d5LPA/cCvkM3+vRi4HK6NVOHAm8A5vTltu+PVw9WXlXLk8yfuO5LkiabSZQkSXAe8FjgnsBzgGXAk6pqyUhAkkOHyowkSjsBVwzEzWJVgiVJmobcnU+SJNi3P15L99yo5cCKkYtJ5gDPGyrzo/74rKHzz8A/UkrStOY/8pKkjc3e/WgRdCNGTwcOAb5eVZcmOQn4J+DLST7Wx7yGbgOKP6uqXyX5EvCaJCvpdue7D/BqYAFdMiZJmoZMoiRJG5vjBr5eAFwKvAr4KEBVfT/JC4DXAt+mm6r3SeAa4NNDdR0BXAW8sK/jXLqRqVOAGyfuFiRJk8kkSpK0Uaiq44Hjxxl7HLdNtkZ8ZihuKd3I06tHziV5GLAN8AskSdOSSZQkSWspycHAg4Gz6ab73Y9ua/TfAF+bxK5JkiaQSZQkSWvvJuDxdCNRWwHX0W2P/vrBnf0kSdOLSZQkSWupqn4KPGKy+yFJWr9MojZWSVt81cT0Q2tl5SP2XXPQgBk/PneCerKBa/05Xxv+tyFJ0kbH50RJkiRJUgOTKEmSJElqYBIlSZIkSQ1MoiRJkiSpgUmUJEmSJDUwiZIkSZKkBiZRkiRJktTA50RJkrQBuuCKBezxupMmuxuStM7MO/aJk92FdcaRKEmSJElqYBIlSZIkSQ1MoiRJkiSpgWuipEl23bfv2VzmtH0/0hT/3Mc8v7mNFRf+prnMBqdqsnsgSZKmIUeiJEmSJKmBSZQkSZIkNTCJkiRJkqQGJlGSpAmR5MFJvpHksiRLk1yd5Iwk75vsvgEkmZfkxMnuhyRp6jGJkiStc0meBJwObAUcDTwGOAr4CfDsSeyaJEl3mLvzSZImwtHAPOCxVbV84PyXkxw9OV1av5IE2KyqFk92XyRJ65YjUZKkibAdcO1QAgVAVa0c+XpkSl2Sxyc5O8niJBclecFwuSQ7J/l4ksuT3Jrk0iRvSjJrKO6YJD9Lcn2ShX29L+yTmtVK8rIky5O8eeDcJkne2PdraZJrkxyX5M5DZUfu5VlJzgOWAC8Z16clSZpSHImSJE2E04EXJ/kA8F/AL0dLqHr3A94HvBO4GngR8Okkv62qH0GXQAE/A1YCbwF+BzwUeCOwB3DEQH27Ax8DLuvfPwT4D2C3vuzt9AnWe4BXAi+qquP78zOAbwKPBN7d39fuwJuBuUkeMDTStD9wL+CtwOXA/NV8RiQ5a4xL915dOUnS5DKJkiRNhNcB96RbB3UUsCTJT4ETgY9U1aKB2B2Ah1fVZQBJfgQcDBwG/KiPOQa4E3CfkTjge0kWA+9N8p6q+jVAVf05oeqToLlAgKOSvLXqtk9hTjKHLtE7GHh8VX1v4PKzgMcBf1NVXxso80vg58DhwEeH7uURVfW7cX5OkqQpyCRKkrTOVdX1wIFJ7g88GngQcBBwAHBkkgdV1cgozbkDiRFVtSTJJXQjPiOeBPwAuHJo+t53gPf29f4aIMkhdEncA4Cth7q2I91o14jtge/TjVI9oqouGIp/EnAj8O2hds8F/gQcyG2TqPNbEqiq2n+08/0I1X7jrUeStH6ZREmSJkxVnQOcA5BkNnAs8E/Aa+k2n4DRp7wtAeYMvN8JeDKwbIymdujbeDBdYjUXeDHdlLpbgUOBNwzVCd1o2Z2AT46SQI20u21fx5jtDrhqjDhJ0jRiErWxuu1sFo1h5tbDf8Res784bazf8UY3Z/GC5jYedfbt1tyv1tK3tv+nvmLFPk3xt87frCk+K9a4xv92tv7NzKb4La9c0d7GaRc1xa+4sf37t7GqqmVJ3kKXRO3dWPw64Dy6RGg0V/bH59AlWk+qqiUjF5McOka5M4D/pluDBXDk4MYXfbvz6ab0jeamoff+4ypJGwGTKEnSOpdkl6oabVRmz/545SjXVudE4AnA76rqhtXErQSWA3/OoPs1T88bq0BVfTbJLcAXgS2SPL+qRsqfSJeYzayqnzb2WZI0TZlESZImwilJrgC+DVxE90iNfYFXAzcDH2ys79+AQ4DTk3wIuBjYjG5nvicAL6+qPwAn0Y10fTnJx+jWPL0GWLq6yqvqhCSLgBOAOUn+tqpuBb4MPBc4OckH6XYIXAbchW6N14lVdULjvUiSpjiTKEnSRHg78FTgVcAuwKZ064VOA95ZVRe2VFZVVyV5APCvwD/TJTE3AZcCp9Kvq6qq7/fPmHotXQJ3BfBJ4Brg02to4+QkT+jLfTPJ06tqcZKn0O0w+Dzg9XQjXZcDP6SbYihJ2siYREmS1rmq+irw1XHE7THG+QNHOXcdq7ZMX12dxwHHjXLpM2tqu6rmAlsNnVtO9xyr962h3dvVJ0manmZMdgckSZIkaSoxiZIkSZKkBiZRkiRJktTAJEqSJEmSGrixhCRJG6C9d9uGs4594mR3Q5I0CkeiJEmSJKmBSZQkSZIkNTCJkiRJkqQGronSxJkxsy1+5YqJ6ceAy//nPk3x79zn681t/Mv5T2uKnzljZXMbu22zoCn+igXbNLdx2D1/0RT/4+vu3hS/9SZLmuIB5u+5RVP8shWNP4PAdUfs2BS/8Ja7Nrex+7POby4jSZI2HI5ESZIkSVIDkyhJkiRJamASJUmSJEkNTKIkSZIkqYFJlCRJkiQ1MImSJEmSpAYmUZIkSZLUwCRKkiRJkhqYREmSJElSA5MoSdK0keTBSb6R5LIkS5NcneSMJO8biJmX5MRx1HVgkkpy4DjbflmSw9e+95KkqcIkSpI0LSR5EnA6sBVwNPAY4CjgJ8Cz16LKs4GH9sfxeBlw+Fq0I0maYmZNdgc0ja1cMeFNXPrlfZri373P15ri3/v7xzbFA8yYsbIp/m53ur65jWsXb9EUv9VmS5vb+NkNezTFX7Fgm6b4K7N1UzxAVZriF92yaXMbW2+1uCn+FXvPbW7jW2zfXEbjcjQwD3hsVS0fOP/lJEe3VlZVC4Ez1xSXZE5Vtf3gSJKmNEeiJEnTxXbAtUMJFABVdbu/biR5fJKzkyxOclGSFwxdv910viRzk1yQ5KAkP02yGHhnknnAfYAD+jKVZO46vj9J0gbCkShJ0nRxOvDiJB8A/gv45WgJVe9+wPuAdwJXAy8CPp3kt1X1ozW0sytwPHAscBGwGPgscAKwgG5aH8DCNXU4yVljXLr3mspKkiaPSZQkabp4HXBPunVQRwFLkvwUOBH4SFUtGojdAXh4VV0GkORHwMHAYcCakqg7AU+rqh8OnuxHpRZW1RqnAEqSpjaTKEnStFBV1wMHJrk/8GjgQcBBwAHAkUkeVFXz+/BzRxKovuySJJcAu4+jqRuGE6g70Of9Rzvfj1Dtty7akCSte66JkiRNK1V1TlW9t6qeRTf17t+BvwReOxA2f5SiS4A542jiqjveS0nSVGYSJUmatqpqGfCW/u3e66radVSPJGmKMomSJE0LSXYZ49Ke/fHKCe7CUsY3kiVJmuJcEyVJmi5OSXIF8G26XfNmAPsCrwZuBj44we1fADw7yTOBS4GbquriCW5TkjQJTKIkSdPF24GnAq8CdgE2pVu/dBrwzqq6cILbfxOwG3AcsAXwQ+DACW5TkjQJTKIkSdNCVX0V+Oo44vYY4/yBQ+/nAlldzNC1eXTbpEuSpjnXREmSJElSA5MoSZIkSWrgdL6NVDbdtCm+li6doJ6scpczt2wus88m5zfF/8cfHtUUf+PizZriAZYsmd0Uf+3iLZrbmL+wrcwud1rY3MasrGiK32bOkqb42TPb6gfYZEZbmVu3nNncxtULtmqK/9ZV92tuY+aebuAmSdJU5kiUJEmSJDUwiZIkSZKkBiZRkiRJktTAJEqSJEmSGphESZIkSVIDkyhJkiRJamASJUmSJEkNTKIkSZIkqSq562MAACAASURBVIFJlCRJG6ALrlgw2V2QJI3BJEqSJEmSGphESZIkSVKDWeutpWTi26ia+DY2QNl00+YytXTpBPTktvY5u+17vtumlze38e2r9mmKv+7mLZri97rz1U3xAL+/cfum+Cuv3K65jfveve2z+sMNd2pu47Kr2/q1cnHjPycz1uK/15WN/46sRROzr2+7j3sdfHFzG+fvvm9zGUmStOFwJEqSJEmSGphESZIkSVIDkyhJkiRJamASJUmSJEkNTKIkSZMuyYOTfCPJZUmWJrk6yRlJ3jcJfdkjSSU5fC3KHtiXPXDd90yStKEwiZIkTaokTwJOB7YCjgYeAxwF/AR49iR2TZKkUa2/Lc4lSRrd0cA84LFVtXzg/JeTHD05XZIkaWyOREmSJtt2wLVDCRQAVbVy5Oskz0ny3SRXJVmc5MIkxya5zQPgkhyf5OYkf5XkO/3Xf0zyviSbDsXumuSrSW5KsiDJV4Cdh/uR5AFJvpxkXt/2vCRfSrL7uvsYJElThSNRkqTJdjrw4iQfAP4L+OVoCRVwD+Ak4P3ALcC9gdcCDwIeNRQ7G/gW8CngvcBfA/8KLADeApBkDnAasCvweuA3wJOAr4zS9h7AxcCXgeuBXYAjgZ8n2auqrluL+ybJWWNcuvfa1CdJWj9MoiRJk+11wD3p1kEdBSxJ8lPgROAjVbUIoKreNlIgSejWTF0I/DDJPlV13kCdmwD/VlX/3b//XpIHAofRJ1HA84E9gadW1bf6c6cm2Rx4wWAHq+oE4ISB9mf2/bu6r/NDd+wjkCRNJU7nkyRNqqq6vqoOBPYD/hn4NnAf4D3A+Um2B0hyj34K3Z+AFcAy4Id9NXsOV0uX5Aw6DxicfncQcNNAAjXi88N9TLJVkvck+V2S5cBy4GZgi1HaHreq2n+0F3DR2tYpSZp4jkRJkjYIVXUOcA5AktnAscA/Aa9N8lbgR8Ai4I3AJf3XfwF8DZgzVN2iqlo8dG4JsNnA++3pRpKGXTXKuS/RJV1vBX4OLKRL1E4epW1J0jS3/pKoqolvI2kvMnNmU3ytXIv7WLUuepzxbW3U0qVt9QP18H2b4l/z2S80t3Hqgvs2xX/q4oc3t7HdFoua4rfcrO2zumT+nZviAZataPuZ2nXX65vbaHXfHUf7nXD1rt5qq6b4BUs2W3PQgKXL2v/5WVlt/41vM2dJcxsL7tx2HztuclNzG7NuGW25jwZV1bIkb6FLovamW/O0C3BgVY2MPpFk2zvQzHy69VTDdhl807fxBODNVXXswPlN6TbFkCRtZJzOJ0maVEl2GePSyDS5K4GRv0bdOhTzkjvQ9A+ArZI8Zej83w29XwlklLZfBLT91USSNC04nU+SNNlOSXIF3Vqoi+j+wLcv8Gq6dUcfpEukbgA+nuRNdOuhngvc7w60+zngVcDnkryBVbvzHTwYVFULk/wI+Ock1wGXAgcALwRuvAPtS5KmKEeiJEmT7e10CdKr6LYl/w7wSrrtxx9UVedX1XzgiXRJ1eeBz/RfP3ttG+13/XtU386xdLvv7Qo8Z5Tww4DvA++iW4P1AOAQui3TJUkbGUeiJEmTqqq+Cnx1HHFnAA8b5VKG4g4HDh+l/DHAMUPnrgCeMY46x4rbYyhu7nBZSdL040iUJEmSJDUwiZIkSZKkBiZRkiRJktTAJEqSJEmSGphESZK0Adp7t20muwuSpDGYREmSJElSA5MoSZIkSWqw/p4TlbV4bEbVxMYDtXx5c5kNzW/f/5DmMr979sea4g+79KDmNn517c5N8ZtvemtzG7eumNkUP3PGyqb4TWataIrv2mj7OVybB8rMX7x5U/xVN23d3MaWmy5tip+Rtvtetrzteweww1a3NMW3fr8BVqxo+9vSLrNvbG5j+RY+ok+SpKnMkShJkiRJamASJUmSJEkNTKIkSZIkqYFJlCRJkiQ1MImSJEmSpAYmUZIkSZLUwCRKkiRJkhqYREmSJElSA5MoSZIkSWpgEiVJkiRJDUyiJEnTTpL7JjkuyaVJliS5OcnZSd6WZKcJavNhSY5Jsu1E1C9J2nDMWm8tVa23pjY0M+9zr6b4f/jGSU3x99vkx03xAPuf9YKm+JUr2/PtxYs3aYqfkfafkSW3zm6K33yzpU3xa3PfM2asbIpfUWluY7NZy5viZzf2CaDWol8ttpzT9r2A9p+Reb/fsbmNzee1/Ux9cvNHNLdRO66/f3o3RkmOAD4OXAK8B/g1MBt4APBi4D7A0yag6YcBbwKOB26cgPolSRsI/08uSZo2kjwY+CTwXeDQqhrM1r+b5L3A4yalc5KkacPpfJKk6eQNQAEvHkqgAKiqZVX1bYAkM5IcneSiJEuTXJPkc0nuMlgmySFJvpXk8n5q4G+TfDzJDgMxx9CNegFcmqT61x4TdJ+SpEnkSJQkaVpIMhN4NHBWVV0+jiIfpZve9x/AycAewFuBA5PsV1XX9XF3B06nG+Fa0Mf9E/DjJPetqmXAp4DtgFcATweu6suOHMfq81ljXLr3OPovSZokJlGSpOliB2Bz4NI1BSa5N/APwIer6qiB8+cAPwVeRTeqRVV9bOB66BKqucAfgMcD36qqy5Nc1oedU1Xz1sH9SJI2UE7nkyRtjA7qj58bPFlVPwMupBvRAiDJTkk+keRyYDmwjC6BAtjzjnSiqvYf7QVcdEfqlSRNLEeiJEnTxXXAIrrpdmuyfX8cbbrdlcDu0K2botukYme6qX7nA7fQ/RHyTGDOHeqxJGlKMomSJE0LVbUiyWnAE5LsVlVXrCZ8fn/cGRheP7UrXUIGcN/+dXhVfXYkIMk91lG3JUlTkNP5JEnTyTuAAB9PcruH1SWZneTJwPf7U383dP0BdFP0vtefGnnI2q1DVb1klLZHdgN0dEqSpjlHoiRJ00ZV/TTJP9A9bPcXST7Kqoft3p9uM4kLquppST4BvDJJAd9h1e58fwTe31d5EfA74Nh+at91wJOBQ0Zp/oL++I9JPk+3duq8qhpOwCRJU5xJlCRpWqmqzyT5Bd0Oe68FdqFLaC4Bvgh8uA89ki5BeiHwcrrty08BXl9V8/u6lvUjVx+k2xJ9OXAacDAwshvfiLl0z4p6HvBSutkedwPmTcBtSpImkUmUJGnaqarzgCPWELMSeHf/Wl3chcBjRrmUobgCju5fkqRpzDVRkiRJktRgvY1E/fGND2svtO/Cdd+RIVvOWbrmoAH32Pa6NQcN2WurXzbFf+yPBzTFX3rGXZviAZbt1jZFf5PN26f0b7F522fbLUtos91WtzTFz56xcs1BA5atbP87w8rKmoMGzFyL+75x0cSvW1/eeO+bzV7eFH/z4k2b4gHmX779moMG/MVeVze3ceNOmzXFP+Uu5ze38a2VB605SJIkbbAciZIkSZKkBiZRkiRJktTAJEqSJEmSGphESZIkSVIDkyhJkiRJamASJUmSJEkNTKIkSZIkqYFJlCRJkiQ1MImSJEmSpAYmUZIkSZLUwCRKkiRJkhrMWtuCKw+4f1P8gU89u7mN/bec1xR//Yotmtu4btlWbW3c2t7G6fP/sin+kst2borf7F43NcUDbLHJsqb4hTfPaW9j61ua4mfNWNncxvKVbX8HWFlpil+2YmZTPMCipZs0xa9Y0f63jKSay7TaYau279/Njfe95Nr2n6l77HNFU/xlZ96luY1tftMW/6d/3Lq5jc1uWNFcRpIkbTgciZIkSZKkBiZRkiRJktTAJEqSJEmSGphESZIkSVIDkyhJkiRJamASJUmaEpIcnqQGXkuS/CnJD5K8PsmOk91HSdLGwSRKkjTVHAE8FDgEeDlwLvBa4MIkB09mxyRJG4e1fk6UJEmT5IKq+sXA+/9J8n7g/4CvJfmrqrp6tIJJNq+qReull5KkacuRKEnSlFdVlwGvBrYCXgKQ5PgkNye5X5LvJ7kZ+OJImSQHJ/lekoVJFiX5SZJHD9ab5M5JPpHkj0mWJrm2jzt4IGa/JCcmuaaPuTLJSUnan/YsSZoSHImSJE0XJwMrgL8eOLcJ8A3gI8DbRk4m+Tvgc8A3gecDy+iSr1OTPLaqvteHfh64P/AG4BJgW2A/YPu+ni2B/wXm0U0tvBrYGTiILqFbrSRnjXHp3msqK0maPCZRkqRpoaoWJbkO2HXg9GzgmKr67MiJJJsDHwROrKqnDZw/GTgbeAfw4P70w4BPVdUnB+r85sDX96JLqF5YVYPnv7oObkmStIEyiZIkTScZ5dzXh94/DNgO+GyS4f8PngIcnWSLqroF+BlweJL5dCNO51TVsoH43wI3AO9KsjPww6q6aLydrar9R72JboRqv/HWI0lav9Y6iZq58Nam+HmP3qS5jXk7P7wp/srH7tTcxq0HLGyKP3D33za3sdvmC5riF+y8WVP83be5rikeYHZWNsX/atbOzW3csrTtez5rZlufujIrmuI3nbW8KX67zdrXn2++bdt/G1vMaovvyixtit9yZls8wM0rNm2K//m1d22Kv8c+v2uKB9h/m8ua4r+xX/u/OzcvaPt35MgdftjcxlMf8YDmMlqzJFvQjQqdP3B6UVUN/0M/8k0+YTXVbQfcAjwbeCPwIuCtwE1Jvga8rqr+VFULkhxAN93vncCdklwJfBJ4+1DCJUmaJhyJkiRNF08EZgJzB87VKHEjf3l6BXDmGHVdDVBV1wH/D/h/SXYDDgXeRbfu6XF9zPnAcwCS7A28EHgTsAQ4dq3vRpK0wTKJkiRNeUnuCrwXWAh8Yg3hPwFuBPaqqg+Pt42qugL4z35nvlGnSlTVBcCrkhyO0/EkadoyiZIkTTV792uZZgE7Ao+kewDvCuDQqrpmdYWr6uYkr6BbE7Ud3bS+a4A7A/cDdqqqlyTZBvgB3bboFwE3AQ+kG4H6GkCSJwEvo9sB8Pd0a7KeTreL33fX5U1LkjYcJlGSpKnmuP54K92I0oV0U+w+VVXXjqeCqvp8ksuAo4GP021Hfg1wLt3W59BNx/sp8DxgD7qd/v5AN0XvPX3Mb/o+HE23K+CtdAnX4YM7AkqSpheTKEnSlFBVxwPHN8QfDhy+mus/An60mutLgSPX0MbFwGHj7ZMkaXqYMdkdkCRJkqSpxCRKkiRJkhqYREmSJElSA5MoSZIkSWpgEiVJkiRJDUyiJEmSJKnBWm9xvnLz2U3x1z3rPs1t3OniJU3xu37xouY2Vvzngqb4389u/8hWnLxdU/wBO/22Kf6Ei/dtigd45B6/b4p/3V+d0tzGNcu3bi7TatHKTZriZ1JN8ctqZlM8wIIVc5riV1T73zJWVprit5t1S3MbrQ7e5eKm+NlZ0dzG7xfv0BS//w6XN7fxgwdv1hT/5J+8vLmNza9r+/5JkqQNiyNRkiRJktTAJEqSJEmSGphESZIkSVIDkyhJkiRJamASJUmSJEkNTKIkSZIkqYFJlCRJkiQ1MImSJEmSpAYmUZIkSZLUwCRKkiRJkhqYREmSJElSA5MoSdKESXJ4khp4LUlySZIPJ9lpLeqbm2TuwPs9+noPX5f9liRpdWatbcH85Nym+B1/fafmNpbtvUdT/C0PvUdzGys3SVP8Vhde39zGNbe05aqPu9t5TfGn/uDhTfEAV5x9t6b49/3FfZrbmLlkZVN8zWj7XgCsnN1Wpma21b9WfWr8r2rlrPY2srKa4mcvaosHqMZurdi0rcCM5W31Q/tnO2tx+33vdFNbxxbuvklzG9tdeEtzmWngCOAiYA7w18DrgSckuW9VbZQfiCRp6lrrJEqSpAYXVNUv+q9/kGQm8K/AocAXJq9bEyvJ5lW1aLL7IUlat5zOJ0maDGf2x92THJPkdsOGA1MB92itPMlTkpyRZFGSm5J8N8lDB64f2tf96FHKHtlfu8/AuQck+VaS6/spieckedYY/X1sks8mmQ9c0dp3SdKGz5EoSdJkuHt/vBbYbV1WnOQwutGtU4G/BTYFjgbmJnl0Vf0YOKlv+wjge0NVHAH8vKp+1dd3EHAK8FPgpcAC4DnAV/qRpuOHyn8a+CZwGLDlGvp61hiX7r3mO5UkTRaTKEnS+jAzySxgM+CRwBuBm4BvAUeuq0aSzADeA5wHPKGqVvbnTwZ+B7wLeHhVLUvyeeClSbauqoV93F7AA4GXDVT7EeBXwKOqamTR3KlJdgDekeRzI+30vltVL19X9yRJ2vA4nU+StD6cCSyjS5xOBq4GHl9VV6/jdu4F7Ap8fjCxqaqbgf8BHpJk8/70cXQbXTx7oPwRwBLgSwBJ7kE3KvSF/v2skVd/H7v0bQ76+ng7W1X7j/ai24RDkrSBciRKkrQ+/D1wIbAcuLqqrpqgdrbvj6PVfyXdHw/vBCyqqvP76XSHA5/sE6PnAd+oqhv7MiPbsL+3f41mh6H3E3VvkqQNhEmUJGl9uHBgd75hSwCSbFpVSwfODycn4zG/P+48yrVdgZXADQPnjgM+nOSedCNKO/XnRlzXH98JfG2MNi8eet++t74kaUpxOp8kabLN64/7DJ1/8lrUdTHdjnjPTfLnh5cl2QJ4OnDG0JbjXwSW0o1GHQFcDpw2crGqLgZ+A9yvqn4xxuumteinJGkKcyRKkjTZTgauBz6d5N/opvwdDvxFa0VVtTLJ0XRrmE5M8nG63fn+mW4a3+uG4m9I8k3gBcB2wLuHNokAeAnwnSSnAsfTJWnbAXsCD6yqp7f2U5I0tTkSJUmaVP3OeI+j23Ti88DHgAuAt69lfV+ke4jv9sBX6KbnLQQO6rc3H3Yc3TS+2XRJ0nB9PwAeBNwIfIBupOqjwMHAd9emj5Kkqc2RKEnShOmfoXT8OOJ+Djx8lEufHoo7cOj9PCAMqapv0j2raTx9PGW0OoZizuO2u/iNFnM847hXSdLUt96SqBU33LDmoCEz/q+tzGbNLQAzZjaFr1i5ormJW3/ysKb4/73rfZvil2++2v/3j2rmtQua4pfsvdrnRY4qW7UNdGZ4As24yrSt3565rK3+2Te1f79n3tp2IzWz/fu3srFM1mKZezV2a9bitviZS9fiG954HzWr/bOdsbytke1+vWjNQUNyxi+by0iSpA2H0/kkSZIkqYFJlCRJkiQ1MImSJEmSpAYmUZIkSZLUwCRKkiRJkhqYREmSJElSA5MoSZIkSWpgEiVJkiRJDUyiJEmSJKmBSZQkSZIkNTCJkiRJkqQGsya7A5Nu5YoJb2K3d53eFP/zd81sit+ZtvoBljfGb3fcZc1tSJIkSdORI1GSJEmS1MAkSpIkSZIamERJkiRJUgOTKEmSJElqYBIlSZIkSQ1MoiRJkiSpgUmUJGnCJalxvg6c7L5KkrQmPidKkrQ+PHTo/auBZ4xy/tfrpzuSJK09kyhJ0oSrqjMH3ye5erTzY0kyB1hSVTUB3ZtQSeZU1eLJ7ockad1xOp8kaYOS5HH91L7nJPnPPuG6Bdi0v36/JCcmuTHJ4iRnJzlsqI6X9nXsPEbdDxk496Ak30lybZKlSa5I8u3BsklmJDkqyXlJliS5PslXkuw+VP+ZSX6R5DFJfp5kCfCmCfiYJEmTyJEoSdKG6n3A94HDgS2BZUnuC/wE+CPwMmBBf/0LSXaoqg+1NJBkW+B/gQuBlwLXArsAjwK2GAg9Hng28H7gNcCd6ZKjHyfZt6rmD8TuDnwSeDvwG7oEcKz2zxrj0r1b7kOStH6ZREmSNlTnVdXzBk8keUv/5YFVdXX/9UlJvge8Ncmnq2rMpGUU9wG2AY6pqlMHzn9loM0DgecBL6+qjwycPx24CHgltx1t2gF46HinKkqSph6TKEnShurro5x7FHDqQAI14rP9tQcCcxvauAhYCLwvyV2BH1bVJUMxTwJWAF9MMvj/zT/SbYRx4FD8VeNNoKpq/9HO9yNU+42nDknS+ueaKEnShuqqwTdJZgJbD5/vXdkft29poJ+GdwDddL53Axcn+WOSN/btAewEzARuAJYNvfalG3kas9+SpOnHkShJ0obqNjvxVdWKJAuBnUeJ3bU/Xtcfl/THTYfihhMequpc4JlJAtwX+AfgrcDNwAf6OpcDj6AbkRo2vPPelNtBUJLUxpEoSdJU8j3gsUnuPHT+7+mm5f2ifz+vP+4zFPeUsSquznlV9Y90idHIdLoT6f7ouFNV/WKU16/uwP1IkqYgR6IkSVPJm4DHAHOTvB24EXg+8GjgqIFNJX4CXPr/27vzYMnK8o7j358QAREQTZAYl1FDIIGoxRAX9gFRq4xIRChCMIuimCCuSblUuYWxNBalKFSBBDdAhJJEMZF9iywxmhkBkQExMghRWWWRGZDlyR/n3Ng0fZdzb/e9t2e+n6q3zvQ57/ue97z3nb793POet4HPtN8xdR9wALBTb2VJ9qdZ3e/MNv8GwIHAJsD5AFV1YZKTaFYAPBa4DFhDc/drN2BlVZ0wqguWJC0+BlGSpLFRVT9IsivN8uHH0UzXuxY4pKq+0pPvoSSvBo4BTqS5s3QK8G4eu2DFdTRLkL+fJih6gOb5qMfURxNoXQ4cSrMaHzTPYV0OfG+4VylJWuwMoiRJ866dMve2SY6dA2SKslcCr57BOVYBLx9wKD15fggcNIO6CjihTVPle+lUxyVJ6wafiZIkSZKkDgyiJEmSJKkDgyhJkiRJ6sAgSpIkSZI6MIiSJEmSpA4MoiRJkiSpA4MoSZIkSerAIEqSJEmSOjCIkiRJkqQODKIkSZIkqQODKEmSJEnqwCBKkiRJkjowiJIkSZKkDgyiJEmSJKkDgyhJkiRJ6sAgSpIkSZI6MIiSJEmSpA4MoiRJkiSpA4MoSRIASWqGac85nmd5W89TZpD3liQnzrDeXZN8JMnmU+R5d5LbkmyQZIc2/7O7tF+SpA0XugGSpEXjZX2v3wO8fsD+a+enOQC8Brhnhnl3BT4MnAjcO0me/YFvVNUjSXZo818A/HSuDZUkrT8MoiRJAFTVd3pfJ7l10P75VFXfny5PkidV1ZoZ5HsGTUD4j8NomyRp/eV0PknS0LTT5D6U5Poka5PcneTqJG8bkP13k5ye5N4kv0hyYv9UvP7pfEkObacC7pPk5CR3AjclWQ58vM12c8/Uw2f2VPc6mrtaFyU5FPhqu//Snvy79lzH+9rreDDJrUm+3AZive27LMmVSZYl+V6SB5LclOQf5tSRkqRFzTtRkqRh+gDwIZq7PZcBTwS2A7YckPdfgdOAfwZeCHwMeBR4ywzO88W2/J8DTwa+257j74B9gdvbfLf1lNkf+GZVPZTkTGBr4EjgMODqNs8P2+0JwN8AnwHOBp7X5t09ydKququn3t8DTgaWA6uBA4BPJtmoqpbP4FokSWPGIEqSNEw7A9+vqt4pc+dMkveEqvp0++8LkmwLHMzMgqizq+rtvTuS3Nz+8/tVdUvfsa2A3WjuRlFVtyf5cXv42t4pi0m2B94IHF1V7+rZfzVwOfAOmmepJvw28KqqOnfiepP8DvD+JJ+tqsmezyLJikkObTdZGUnSwnM6nySpsyQb9qW0h74LLE1ybJKXJ9lsimq+2ff6amDTJE+bQRO+3rHJ+wFrgfNmkHevdntS786qugK4Adi7L/8vewKoCacCTwJe3LGdkqQx4J0oSVInSTYEHurb/QbgFJopbfcBfwH8LfBIkkuA9w5YJOLOvtcPtNtNZtCMn3dpM80qg9+qqgemzQkTQdygc/wMeHrfvlsH5PtFX10DVdXSQfvbO1Q7TlVWkrRwDKIkSZ1U1cNJ/qRv90/aYw8BRwFHJdkC2Af4BHBekmfNMIiZUTNmmjHJlsAymqmCMzER3G3Nb4KhCc/g8UFTf1A1Uba3LknSOsTpfJKkzqrqv/vSXQPy3FNVZwDH0Tw3NOovtX2w3fbfyXotzZ2zs2aY/6J2e0jvziQvBbYBLuzLv2WSV/btOxhYQzO9UZK0jvFOlCRpaJKcBVwJrKBZIe+5wBE0d6p+MuLTX9Nuj0hyKvAwcBXNVL5zq+r+vvwTK/G9Ocn9wK+B66rqh0m+ALy7fdbr3PY6jgRuAj7bV88dwOfbZdZvBA6k+ZLgD0+1qIQkaXwZREmShulimkUc3gxsTjMd7lzgyKp6eMTnvgD4FM3zWIfTzLZ4DvBy4ND+zFX1oyTvBd4GXNrm341mafa3AD+mWeb8CJrvlzobeN+Au27/C7wH+CSwA82y6u8H/mm4lydJWixSNeNp5Y+xzxMOmF1BSVIn5z/6tUyfS4MkOZjmO6W2qqp7RlD/ZcCTq+pFQ653xY477rjjihWTrYAuSZqrpUuXsnLlypWTLfIzFZ+JkiSts6rq1KraaBQBlCRp/WUQJUmSJEkd+EyUJEmzVFW7LnQbJEnzzztRkiRJktSBQZQkSZIkdWAQJUmSJEkdGERJkiRJUgcGUZIkSZLUgUGUJEmSJHVgECVJkiRJHRhESZIkSVIHBlGSJEmS1IFBlCRJkiR1YBAlSZIkSR0YREmSJElSBwZRkiRJktSBQZQkSZIkdWAQJUmSJEkdGERJkiRJUgcGUZIkSZLUwYYL3QBJkvQ4S1atWsXSpUsXuh2StM5atWoVwJLZlDWIkiRp8Xny2rVrH1m5cuVVC92QMbRdu71uQVsxnuy72bPvZm8h+24JcO9sChpESZK0+FwDUFXeiuooyQqw72bDvps9+272xrXvfCZKkiRJkjqY9Z2o8x/9WobZEEmSJEkaB96JkiRJkqQODKIkSZIkqQODKEmSJEnqIFW10G2QJEmSpLHhnShJkiRJ6sAgSpIkSZI6MIiSJEmSpA4MoiRJkiSpA4MoSZIkSerAIEqSJEmSOjCIkiRJkqQODKIkSZIkqQODKEmShiTJM5N8IcnPkjyYZHWSo5NsOep6kuyc5KwkdyVZk+TqJO9MssHcr2z05tp3SZ6W5NAkX0/y4yRrk9yT5LIkb0ryuM88SZYkqSnSacO/0uEbxrhry0zWD7+Yotz6Pu7+epoxVEke6SszNctbcgAABpRJREFU9uMuyeuTHJPk0iT3tu0+ZZZ1jeX7Xapqvs4lSdI6K8nzgSuArYAzgeuAFwPLgOuBXarqzlHUk+S1wL8ADwCnA3cBrwG2Bc6oqgOGcIkjM4y+S/JW4Djg58DFwE+BpwOvA7ag6Z8DqueDT5IlwI3AVcA3BlR7TVWdMYdLG7khjrvVwFOAowcc/lVVHTWgjOMueRGw3ySHdwP2Ar5VVX/aU2YJ4z/urgReCPwKuAXYDvhKVR3SsZ7xfb+rKpPJZDKZTHNMwLlAAUf07f9Uu//4UdQDbA7cBjwI7NSzf2OaDycFHLTQ/TPqvqP5sPoa4Al9+7emCagK2L/v2JJ2/5cWug8WwbhbDazucF7H3fT1/2dbz759+9eFcbcM2AYIsGd7PaeM+mewmMbdgv8QTCaTyWQa9wQ8r/3lfeOAD/Gb0fy19n5g02HXA7yxLfPlAfXt1R77j4Xuo1H33TTn+EB7jmP69o/1h9lh9t0sgijH3dT179DWfwuwwbo07gZc66yCqHF/v/OZKEmS5m6vdnteVT3ae6Cq7gMuB54EvHQE9UyUOWdAfd8G1gA7J9louotYIMPqu6k81G4fnuT4M5IcluQD7fYFczjXfBp2322U5JC2H96RZNkUz5g47qZ2WLv9fFU9MkmecR13wzLW73cGUZIkzd227fZHkxy/od3+wQjqmbRMVT1M81feDWn+6rsYDavvBkqyIfCX7ctBH7wA9gGOBz7Wbq9KcnGSZ8/mnPNo2H23NXAyTT8cDVwE3JBkjy7nXt/HXZJNgEOAR4ETp8g6ruNuWMb6/c4gSpKkudui3d4zyfGJ/U8ZQT3DOvdCGXX7P0Ezteqsqjq379ga4EhgKbBlm/agWZhiT+DCJJvO8rzzYZh990Vgb5pAalPgj4HP0Uw9OzvJC0d47oUwyvYf2JY7u6puHnB83MfdsIz1+51BlCRJo5d2O9clcWdTz7DOvVBm3f4kbwfeQ7Pi1xv6j1fVbVX1oapaWVV3t+nbwCuA/wJ+Hzh09k1fcDPuu6r6aFVdVFW3VtWaqrqmqt5K84D/JsBHRnXuRWou7X9Lu/3coIPrwbgblkX9fmcQJUnS3E389XOLSY5v3pdvmPUM69wLZSTtT3I48BngWmBZVd0107LttKCJaVi7dznvPJuPn/3x7ba/Hxx3AyT5I2BnmgUlzupSdozG3bCM9fudQZQkSXN3fbud7PmJbdrtZHP/51LPpGXa54GeS7Ogwk+mOfdCGVbf/b8k7wSOBa6hCaAm/bLYKdzebhfztKqh990At7Xb/n5w3A02kwUlpjIO425Yxvr9ziBKkqS5u7jdviLJY363JtkM2AVYC3xnBPVc1G5fNaC+3WlWt7qiqh6c7iIWyLD6bqLMe4FPA1fSBFC3TVNkMhMrgi3WIACG3HeTeFm77e8Hx12fJBvTTBt9FPj8LNs1DuNuWMb6/c4gSpKkOaqq/wHOo3kI//C+wx+l+avySVV1P0CS30qyXZLnz6We1hnAHcBBSXaa2Nl+oFvevjxu1hc3YsPqu/bYB2kWklgB7F1Vd0x17iQvSfLEAfv3At7Vvjyl2xXNn2H1XZLtkzy1v/4kz6G5oweP7wfH3eMdQLNIxFmTLChBW9dYj7uu1tX3u7RfTiVJkuag/YBwBbAVcCawCngJsIxmOsrOVXVnm3cJzVK8N1XVktnW01NmP5oPFw8ApwF3AfvSLAd8BnBgLeJf+MPouyR/BXwJeAQ4hsHPRKyuqi/1lLkE2B64hOYZFoAX8JvvovlgVS1nERtS330EeB/NnYEbgfuA5wOvBjamebbnz6rq133nXu/HXV99lwK7AvtW1b9Ncd5LGP9xtx+wX/tya+CVNHfPLm333VFVf9/mXcK6+H43H9/oazKZTCbT+pCAZ9EsFf1z4NfATTSLGzy1L98SmtWjVs+lnr4yu9B82P0lzRSYH9D8VXuDhe6X+eg7mtXjapp0SV+ZNwH/DqwGfgU8CPwUOB3YbaH7ZB77bg/gqzSrGN5N8+XEtwPn03zHVhx30/6f/cP2+M3TXfu6MO5m8P9tdU/edfL9zjtRkiRJktSBz0RJkiRJUgcGUZIkSZLUgUGUJEmSJHVgECVJkiRJHRhESZIkSVIHBlGSJEmS1IFBlCRJkiR1YBAlSZIkSR0YREmSJElSBwZRkiRJktSBQZQkSZIkdWAQJUmSJEkdGERJkiRJUgcGUZIkSZLUgUGUJEmSJHVgECVJkiRJHfwfm1UCcBMudF0AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x648 with 2 Axes>"
]
},
"metadata": {
"image/png": {
"height": 216,
"width": 424
},
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"%config InlineBackend.figure_format = 'retina'\n",
"\n",
"import helper\n",
"\n",
"# Test out your network!\n",
"\n",
"\n",
"dataiter = iter(testloader)\n",
"images, labels = dataiter.next()\n",
"img = images[0]\n",
"# Convert 2D image to 1D vector\n",
"img = img.resize_(1, 784)\n",
"\n",
"# TODO: Calculate the class probabilities (softmax) for img\n",
"with torch.no_grad():\n",
" logps=model(img)\n",
"ps = torch.exp(logps)\n",
"\n",
"# Plot the image and probabilities\n",
"helper.view_classify(img.resize_(1, 28, 28), ps, version='Fashion')"
]
}
],
"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.6.9"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment