{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%matplotlib inline\n", "from matplotlib import pyplot as plt\n", "import numpy as np\n", "import torch\n", "\n", "torch.set_printoptions(edgeitems=2)\n", "torch.manual_seed(123)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Files already downloaded and verified\n", "Files already downloaded and verified\n" ] } ], "source": [ "from torchvision import datasets\n", "\n", "cifar10 = datasets.CIFAR10('data', train=True, download=True)\n", "cifar10_val = datasets.CIFAR10('data', train=False, download=True)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdAAAADECAYAAAAvbXA5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzsvXmUZVlZJ/r7zrnzEPOUETlW1kBVQVXJDFLIpDSIr4GHQ6s8tcX1XNoqaitPm+fDbhF7cAB5LUucHqCtNMJCGuxGGYUqpCioecjMyjkyI2OOuPNwzn5/fN8+374RkZExVWVWsX9rxbo3zj7DPnu6+5t+Hxlj4OHh4eHh4bE9BFe7Ah4eHh4eHk9H+B9QDw8PDw+PHcD/gHp4eHh4eOwA/gfUw8PDw8NjB/A/oB4eHh4eHjuA/wH18PDw8PDYAa7qDygR/QgRfXYX1/84EX1lL+vksfcgoi8S0dsuU3aQiKpEFF7p3GcSiOg0Eb1mg+N3EtHj27zXXxDRb+1d7Tw89g7P5PF5VX9AjTF/aYz5nqtZh28XXKs/TMaYs8aYkjEmutp1uRZgjPknY8xNV7seHr243IbH49sb16wKl4hSV7sOHh7XEvyc8PBgXCtz4Sn5ASWi/4uIniCiChE9QkRvkuM9KlgiMkT0s0R0HMBx59jPE9FJIponov9MRBvWm4jeS0TniGiViO4lojudsncR0UeJ6ENSj4eJ6PlO+SQR/S0RzRHRKSL6+SetQXaBTdryXUT0Eee8w9J2KSJ6N4A7Abxf1KXvl3NeSkT3ENGKfL7Uuf6LRPRbRHSXXPMpIhomor+U9r2HiA4751/2XoKjRPR1Kf8kEQ2tredl3vdfE9GjRLRERP+LiA7tUVNeC3iB9OESEf05EeWI6BVEdN6eIJLPO4joAQA16c/vIKJvyhj4GwC5q/cKTz8Q0QEi+rjM9QUiej8RHSWiz8v/8zLOB+T8DwM4COBTMhd+9eq+wbWNzcYnEb2BiO4jomVZW25zyi67Bsv69jEi+ggRrQL48af0pS4HY8yT/gfg+wFMgn+wfxBADcA+cCN8xTnPAPgHAEMA8s6xL8ixgwCOAXiblK29/kcBDANIAfhlADMAclL2LgBNAK8HEAJ4D4CvSVkA4F4AvwEgA+A6ACcBvPapaJ89ast3AfiIc95habuU/P9F227y/xCAJQBvlfb6V/L/sHP+CQBHAfQDeETa/jVy/ocA/Pk27jUN4NkAigD+1tZ1s3oCeKPU4Wa57zsB3HW1+2CP+vE0gIcAHJD2+yqA3wLwCgDn15x3n5yXl/F5BsAvAkgDeAuADoDfutrv9HT4k7l/P4Dfl7GYA/AyANcD+G4AWQCjAL4M4A/W9MNrrnb9r/W/zcYngOcCmAXwIumHH5N2zeIKazB4fevImhBAfh+u9t/VauT7APxLbPwD+qo15xoA/8L5/2cAfE6+91y/wXOWANzudMA/OmW3AGjI9xcBOLvm2l+D/EBcy39OW74L2/sBfSuAr6+5190Aftw5/985Zb8L4O+d/78PwH3buNfvrGn7tkyiy9YTwN8D+EnnugBAHcChq93ue9BvpwH8tPP/6wE8gY1/QP+18//LAVwAQM6xu+B/QLfa7i8BMGfH2ybnvRHAt9b0g/8BvXL7XnZ8AvgjAP9hzfmPA/iuK63Bsr59+Wq/39q/p0SPTET/B4BfAi+WAFACMAJgI8eRc1c4dgYsgW30nF8G8DYpNwD65DkWM873OoCcqA4PAZgkomWnPATwTxu/0dXDJm25XUyC29LFGQBTzv+XnO+NDf4vbeNea/swjSvX+xCA9xLR7zrHSO679nlPR2xpXK85bxLAtJFVxbnWY2s4AOCMMabrHiSiMQDvA5s6yuDN2tJTX72nPTYbn4cA/BgR/ZxTlpFrIlx5Dd7ot+Gq4km3gYrN6oMA/g1YpTcAVl3RZS7ZKD3MAef7QfAOZ+1z7gTwDgA/AGBQnrOyyXNcnANwyhgz4PyVjTGv38K1Txmu0JY1AAXn9Ik1l69t1wvgAe3iIFjVul1s5V5r+7ADYP4K9z0H4P9c0y95Y8xdO6jjtYgrjmuB23cXAUwRkTuuD+51xZ7BOAfg4AY29/eA2/k2Y0wf2BzktrFPW7U1bDY+zwF495r5XDDG/DdsbQ2+5vrgqXAiKoJffA4AiOgnwLaw7eBXiGiQiA4A+AUAf7PBOWUAXXlOioh+AyyBbgVfB7Aqzhp5IgqJ6NlE9IJt1vPJxmZteR+AlxPHVfaD1R8uLoHtChafAXAjEf2wOKb8IFi1+j92UK+t3OtHiegWIioA+PcAPmauHLryAQC/RkS3AgAR9RPR9++gftcqfpaI9otD1a9j43G9FneDx/nPS1u/GcALn8xKPsPwdfAi/ztEVBTHre8Erx9VAMtENAXgV9Zct3b+eGyMzcbnBwH8NBG9iBhFIvpeIirj6bMG9+BJ/wE1xjwCtp/dDR6EzwE7TGwHnwQbmO8D8GkAf7rBOf8LbDM7BlYZNLFFkV8W8u8DcAeAU2DJ6E/AzjPXDDZrS2PMP4AX4AfAbbX2h/C9AN4iHp/vM8YsAHgD2NlqAcCvAniDMeZKUuFG9drKvT4M4C8gjl0ArujlbIz5BID/COCvxfPuIQCv2279rmH8FYDPgp0lToLtRJvCGNMG8Gaw/X8J7Ej28Sevis8sOHP9egBnAZwHt+Fvgp1cVsBrzNo2fQ+Ad4r36L996mr89MJm49MY8w0APwXg/VJ2Qs572qzBa0G9quprD0RkANxgjDlxtevi4eHh4eFhcc0SKXh4eHh4eFzL8D+gHh4eHh4eO8A1r8L18PDw8PC4FuElUA8PDw8Pjx1gW0QKAwMDZt/kvp5jSbCPhP1sGnTphAat+7bRhQaXL9vsMRvdykraG9RBpXCVxs26L+srdrlzLly4iOXl5W3Wej36+gfM6Ni+ngdYGuAgIHm07oG0uaQvnHrR2rNo3RG9vkcrIc8xveesualiCxqNzc4wmzT8+l7iCxZmL6CyurTr9i4PZM3oZBHVSic5FhDTeIZBCABww9tsH6TCNH8GmaQsDPn8TrcNAGh161qWjvn8TCT3jJOyOLbHpA/dcEVpHDf6JwwzUhceB+Rwk0QRn9/tkNw7dJ7Tu3fuRh2njOsTR3wv47R4FHHZ4oXavDFmFLtEoZA3AwP9iDrrny8Z7nrGWTab7fl00W5zWzdrNQBAq9XSQnsPaVfbXoD2re0z+wkAYSq17lgQ9B4LQr0XyX0DS9cdXF5G2WRp6S0lwsUL01he2v0YDwIyqVSAwA3TXLd2Xz78tRvp+LLvaN8wdue+zI1go/YOuf2iiLks4niDuR6vX7y0C7V+Ycjf09JPHWccRVIf+zy3enaeZdLBunsSEWr1Nlrt7hXbe1s/oJNTk/jLv/pQzzFKGkgGk9NQugj0ntN7LFh33Xq4L2cXkfXLaW/sLnrOs4tB5AyAdDrdcw+3zE5iY9Y+z7mnXWjiuOe6H/nhH9vkXbaO0bF9+O33/hlSKW03O7A6HX5muqihrmE6z59G+sI47SZ1jhqyyDQbSVkmx4tRBL5ntVFNygLislKRvclN4LZR72IPOD9y8jy3R+xEidf8KHNZb3u7fWHvH9t+ci6M4xjv/pV/hb3A6P4ifvujr8a99zyRHHvoXm6vAxPPBQCUi/mkrJTndi6mhgAAIwP7k7Kx8UE+Z4Truhren5Q1cpzusxkz6Urc0B/ebMTtXSzLuHN+6FIhEz/1lbRVCxk+v1Nj3oxGrZSUrS6sAgBOHGMimDA7qC8rY+X8NJNzlUtah+WlCgCgLT/+gP4QLa+sAAD+22/evSfsR8MjI/ilX/klpGLt74P7mZNjcIiJqtqUTsooxfW048Qdx7ksl3WrXMeTx44lZStLi1z/Rf48e+ZUUjY3w6+SkmbNZ/R5UZs3PmlnDuZy3I6pLG+ucuViUpYvc/sPDPPeYmBIyaX6B2RM9POcLffr3M2XygCAMMtcKPaHGwAymQze+oNvwV4gnQowNV4EBTqGYtkUZTPSfl0laQrteyfrtV7XV+T3bld4wzK/vJKUlQZ5vRiQ9yoUlOOlLMdOnz4LAOhEOr5yshb19Wn0ytISE0Ll8tzek/vGtH6yJuwb4zm4tKJr16lzF3qeXShqHZp1Pm9ihJ9DzkpVq9fwj3dtLejDq3A9PDw8PDx2AP8D6uHh4eHhsQNsS4VLAFKp1Bp9sVXBhj3/87FeFe5GZXofWvd9rZq3F5uocF11q/0UFaGrntC62Lq7NqK45xxjHDWtqDxisV3FQa8KdyNV8k4QxRFWa9Uevf783AIA4Pz0LAAgzKn6qFRmFVE2YDWIo8FFu8v3iDv8/vWKqjryabEnyXtU2hW9rs03ue7IDQCA648q5W0+xyqVtSpsAInu1jiqkdgaZe3HBmrxjZCMA1hVbnzZc3eDTqeL6dkFTB5RVWcYsrppqGRZ3LQvpk+dBACcmr4IAJiaVDtnzfB1gylWP3X7HkvKghL3YavDqsLKso7JoRSrmTIZbo++flXJlvP75TqtQ7vLalp0uU1WLqlZcukkT+9j37gPAFA8oM+Zup7VYLki12G1spqUtZpynqhO5xfm9HmdJvYSuVweN950M44/fjw5Nr/C469QZvVaNq8q1WaTx21G1I1xW1W4tRa3P/sNAC+ZOpyUTZ89DQCor7Da/CXf+bKk7OIlpmzOyDywakcAeOiBewAAX/rcZ5Jj0Sz3e+KH4NrkRI1s6xfGWpaWYymx3xYcc0D/8DgAoDzEfTw4OJSUDQ8Po17RObkbEBEyqaBnLR4cGQYA1Bqiro50HbTrpTUB7ZtQ9enEKF936gSbPEZSqnadmGSTQtC1NmFH9Suq2OF+bmcTOu3Qz/dw1a1hwHUYHWeVfs5RsVdWWW3cNTwn+ge0DlNdsYHKr1wqrWtMNuQ+iNtsOugrqzrddOJeG/Em8BKoh4eHh4fHDrC9dGZECIJgjSeidR5KySmulBms+XRv1StlplLrq6LeeBtJp+j5XHuewjqzWE9ElV6so4ox5J7ac96GjkK0tszxfKTunkmg1VoNd33tblRrjlMPePfVaIkTRbSQlKUz/D0Ux5PIqUZTsjdFIgUWM0mSeOTF0zOX5b6MgnZSVqvxzu4bD3wLADA7rwlDrjtyBAAwMqJZyfJisLfOTj2OWSLFk3WM2WIMstUe2J2+WeNEtFexzM1mhGPHKjh8nUpxR27iRBInj7NTQa2ufVEs87tWGrwLfujxB5Oy0iRL7MNlbsuuo6U4f1L6zPD1gxl1NDHgfspluA5D/eNJWXWFJZjHHlVJcrDIO/1yH7dpZ1ilh9o0l81cGuB32a9lhRKf3425Du2mvlcqw2VLiyz11GsqdTpKmj1BGAYYLJdx3fU3JMfOn2OnnsVFzp7XV1apIptjaSUT2nGsi0qjyW1tZOC7yqb+ftYqtFsssXYjHeMHjh4FAORz3E6lwkBSNnKAx3jdGWOf/QRz/oci4WRClYjSMd83Fme9wPFuborEGss4nnM0KeaESOChOBE5DpfZbBZLjhZgNwjDAP195cQhBwDGxliqnF3gcZlzPJxXllhiHx8ZlbpovfKiGZg6wOOsWFRtWKfNjZ8Bj9lsRu9Zb3AfHJjk55q0tkNGJHjrUQ0AI8Pc/ymZQ61WLSkr93F7NaRfKyuaga7V4rVneIQl3XxRf2NSxGWpNj+vWVNNRrfV2fKa4iVQDw8PDw+PHWDbNtAwDNdIoDaOptcWysdozTnGuY7LbFzZ3Jwm7ugry46hoLrx9c8zPf9rDXul0iQea5PoQytcurFHa0NVXEkqssdki+vaVYM42DsbaBRjudpQCRkAyXukxA5QcOIEQ9EC2F1f04kJ7MpeqVLn3Vujpru4rIgVJcO7xNAZFeks90GzylLIE+c0xeeZixwCMeC4nB/YzzacUbGrDAyqPTFl4+1Mb8hKzzvLodiNXE1CiUTi75FA945Jq902OHc2goHuRleHOaFPO2ApM0qpRDEgdqobbmIp5dKsuvHXxFb4wMO8q+864T8DIyJtGZbw0lmV8AaH+J6lAkv1lVVth/lL7O4ft7WDcn08V1bb3M4PNjXjVmuI+yAYY4mukFNtxdIyh3NcvMB16LZ0DHdaXJ9qje2i7vjOZdbHX+4GzXoDjz54P/qG1baWT4kEvMB2/kZDpZGxCcnRLu3ZMTr/2yIRkoyJwBkb6TS32eAg27q++tUvJGXlPL/TLbdy1q1WqPY3MZGhb1TT63ZSPCdseEUhpRJUQaTRrGjUKKXtZWtjq+X6KCQ+FuJ/4M6NSt2g29VxtxukUimMjAz3aNTaTe7vcbFvFnK67mYl1nXfKEugnY7a+RfmuX/KMgZTae2LuC1hdin7G6Dv06iLvV3eP8jpb0ZLbNqttoa22Jjf6iq3TbGk/WPX5YVF7otsWqVguwy35V6VqqvJ48L2aiTnaPuWisXeONRN4CVQDw8PDw+PHcD/gHp4eHh4eOwA21PhEiEM03DVoetVuHDK1qpUHZVKhh/90DcfAQB84I80R/Ybvu8NAIA3vel7+SrjstJYuq317EZWhenqcCPruJI4E6nqwroqWwcj06Pm7XVYcbWNVu3cjdarcLvdqKdOu0FsDBrtOFE/9dRLnBOME1ZBoTADSV3dkIOO3KJc4LCIyqqqYlat2kTUOtYFHwDKGUuHxcdqXVWtWGel1ryqLpeXWU1SLLEaaN8+dZA5eoTViyVRA2ad59hQnY5Vp8MJKVqj8u3pC9MbKrMbGEPottJYnlWVYacuqqEiP3RwQsMLTJb7fex6btPVWFVEVVE75sHnLyxoX5QzrPKe3M/OKh3MJmUrMZ9XW2STRi5U9XhVNMvlPlULdjNcv9kaq98+8wmte2zY4etohsssQxUAzF9gNVq7aV39tQ2b0hfWaavkOPGQ2Zu2TuofdbC4PIeH7vvn5FhaQnImjnDIVLvrqEhLrKIrFDhUxaWytKfVG6zqc6dhR9R4j91/LwDgm1/8bFJmnV/2jfI9xw+oCjMjc+85t9yeHEu99WcAANPi7LSyrOanyiqrxqur7HxTc0wlDXGesWPd9ITg8XtkRD2cSatjUqFQQHhJ77MbEIAAMdotHY+RtI11dGs1dW1ICU3hqqj8XapII+rT6YscxtXvhP8UhDFqtcVrg6uSzuSEdk/U0h1HXWupEOOu43wo61rWhq8487/e4GszwuBkQ5EAoJDjsZoVx6SV5eWkbEVYk0o5YSJyqBoLff0Iwq2t4V4C9fDw8PDw2AG2HcYSrvllXs9pqzvUVCrdU+aSEdj7VCSg/8EHHknKyiV2iHjNq18BAOgfUKOxRVd2KAuOe/fsJd4JZrK6g7zhWeywkU0LWYLLdxzYd9iYULj3RR3SduvoEq93homieF0b7RSxMWi0mmh11vML54TEwJWZrXBgCQti52VrEgqTy8uuLK11jIRsvGld/B1ycyP3yNjtfM+WSxyaXK5eOb8i4R4rxx9NyuYXuH/KsuvbP6XcsYPibKR95xAwWGctqVbXqURkoj2TQAMQspRGp+E49Uyw88j0JQ6pWG2qE5UJmGv19mffCAB4yWvV0aSY4d14p86fx445jklLPGbz4rwSZXS3fX6V+UGHy7w7nxx0tAFDIp04718Tx5knzrM0dPIrqg1oVzjAnQ7wsfqskiXsO8RzKj8g9w/0nQPRNhQKPH/bjhNPOlg/F3eDMAzR19+PU0540PwMt3Uj5jYoj6iDkR3/lsRjeFQ1HHa9aQkhQD6vbXf8GI/Du7/yTwCAwHEKXJ7ncXnhPDuMZcvDSVlGNDYD/eoMd+crXsX3kLWu0VTpsF5n6bdW4Ta/dF4pg0+fYv7d4yc4JMoN+9i//wC/jxAq5PO6hg0NDeHku9+NvYEBwSCT0aXfrl82oUDL4RcezHMd0zZxQuCQWrR53meEE7jd0nHSXuU2yYgmytVqkaw9kWiz8o7TUkececp9Gkpk1zqS0BPXGagjXl4kkqc9lwvlfer8nKit8yaTEl5pcdrrdFSLuFqrJ46iV4KXQD08PDw8PHaA7Umg4B3gRmEs9tOVvh5++GEAwIpkcHjRi16SlJVkZ2J3Wi6RwoMP8m7x9Gne7X/H857lPI+f/Y1vsC3jAx/446RsYX5Z7qm75Lf/8tsBAC9/OVN3me569+TNwk4osfGulyr1Xd3r6QqZZbYOYwzaJgZF66ny4mCDOmfFPip2izjQXZVt3o7YOzMp3amVZKdeb7MU0oVeJ3wNaEm7ZQMnbEbslK4dqhOLtCi2ErctZhbZ1nehxeEUJ86cTcpGRzlsY3KSd+Ilx56Skx2uESnYDV2IogjRHoWyRFGMylIVfSN6v4VVtu/kJANKteaEe4gW5LFHWLK4OK3vUy5zncfH+X3GDusOvH6Gd+fn5lhCzJe1f4dHOcxisI/7IgjOJ2UpIb/IBGqT7La53eKOVT9oIPnNz+F596wj/FkuqK1pcJSfWa9LRo221q+ywBJgJKEI+YwjdUZ709YJKABS2SQkCAAunTwNAMiJJLl6Xtv1kmgC7v3mNwEAtzi2yYJkJrL2PXeKPPDNrwMAVsQ22XVtbJH1k2C4GiUrEVWNSpk2sUhWMtrknYxI/YNCkSj2uowjsa2u8Pu86lVM3DA+riQZJaGSS+X45m6YSS6XQ2aD9G07A69PbphGXigFm6J5yjiScVSTMSPhchNOnbsLcg/J2lN0QpxaolnsF5+Bel3tqhYj4xwa06qq5BoKfWTasWXmbCidZInKZlRiDTIsSa5IPTsdJ9Wf+Kg0m+In4qTzsxqMlEjGzY7WYW5+Dp0NKF83gpdAPTw8PDw8dgD/A+rh4eHh4bEDbFuFuxZrnYhcFe45Mcp/9G/+OwDgC5//p6Tsf3/Lm7gCQntjORABYG6WnSy+dvfXAADPfd4tWmE5/+RJVps9+MBDSVk+z+L88rI6S/z1X38UAHDTjTcBAPaNK2+rcThsL4e1PKyMy4fnAMEmnEfbgwHQNb3G7EhUpM0qOyu4qm/LfZsSLls34iCdFicA2+WukVwcf0qiduo62ypLW9ux2WwcDlHL8mScMINIVLeRcJU6Xu+J8xWJmqbb0etWL7Dq8czF0wCArMPVaxPiWgcBN/wlnU6j3VqvHtoRDEAxIXBCOqoN4QIdl1AQqPr0wgVWDa0artfqkrZNKsdjeKHGn/1ldULJifmib5idqPJZ7cPxwX1yzM4jDVOy6qlORxmFjLC/rC6xOqxPtYl4xXezM0xWwmT2TWhml4zc/9iD3AeLS9qGzVVW8xtRc/aP6HVR98pzZjswxqDZjZHJOdk3ZEx3Ra1mHCe1mQv8Lk+c4rXlblkjACAQFiC7RowOqSMKJKRLSI5QWdXsJsOSBNuuQeSYHSJZI2zWDgBIp/k8myA7dkwsTWH1OfY4m6G++sXPJ2WnT3MWl8lJZlOaX3L6UdaUlGRXSjlhLN1Op8dxZjfodCNMz630qKmLLa5/qZ+f3XTetRTy2J7aJ5meCk7mGbEWDBa4PQYKOmfLE7zOtoSB6NiMcmgPDPAgbdX4Bs26qkvT8rzOqh5rtoSBy4YwOg6QVVkHu+L31HZMDKPifDrUx3U/XjmZlA2L06K1zPU5mXHiThmpUPtmM3gJ1MPDw8PDYwfYvgRKa/I4rpG33LKX3/lyAEBagmo//rFPJWW/857/DADYf4Dd0CPHaGulrK/edRcA4NXf/fKkbHiYdzbnz/GOxjU2Z8SI7XLHWgn1C1/4IgDgh3/oB/RVktPsDnIz2XF92caE/eYK99k6jDFoddo9Tk6W+zVxPW+py3lDJLG0SJKhE3qTFRd/I44C5ATVJ+E4drftBiqLIb4tbeSSRLSlXmmnvY0EY3cCm+lG75UEJ5N1kHHeNakLH2w3dMe9WpMdsZV+W1pGRMqtuUvEcYxqpYKwphUrSyB9R5wgAqikls/yzjgg3jWXB1XiiUJut0abJdD6JZVOj0zdCgDoz0vWl47jtLLC0tCgzYeY1uvqNlwipXMlthqZE9y/g+M6H577PJZA8+BQrk6k7dasScaSDjvltBsqkdlcifmicCM7/nMUbM29f6sIU2kMjIzhkhPulJIHNsWJCE7IheVWtVJ7ta6OUV0JW4htEL9DcBBJ2/UPcB+1nUFuJZyqSHkphwy62uQyN19kLJoTG25Tq2nbPS7hMt+4h4khTp58PCmryf1PnWHnMZcgJZY5ZEOIXE1et9vF8rI6h+0Gxhi0ujEWFxeTY4U6z8chkfjTzs9CTogrmjLHqo60aL2uQlm7WxXti1GR6h8/zprCkqNhKInjaEvWrsF96kBGkWinnH4V3gVUmkKokFVJd+aSSLYx37PUr3PQjh87LvIO5265yO28KM5OTYdYolwqeSIFDw8PDw+PJxPbzMZCIAQ9URsBekkIXImjTwwyr3vd6wAAhw9pzr+PfOTDAIAvfOFzAIBKxdnZF3jXc/wEB6q/57f/U1Jm3b0vzXB4gQ2eBhxKPUfysiz7n/oUS793fudLk7LDhzjEIDY7s+tsnDPO7JUAijiOUW82kXJFtbjXhtmoXUqKMkK7NzQutjXntQKRJEMJWTGB2tZWxBbTqPIu89CRm5KySof7YmmJQyGyWd1JdmTH6tJ7JZlSumv+h0ZAZMSuF4QOBaKEYUTW6OoSV0j+v3iZ7V4L02rLgAnQaeyNfYgICLMBGk1tm+oZli5a87xbHpt0bEdChLAidtJySnfNQ+O8g52bEykucuyILZGwqjzms6RhA0HIO+jFeS5LFbVtF2SH33DtYSk+/9w0j4t9+5VIIVfi/kxJnsxGQ/vOtPi6/VNc1l/UshkJs7FZL4yTH5Z0uu0JMpkMDhw4jGP33JUcW5Cwt8YSv+/+wweTsmBdhie9l2brkVAqx5ZXlPyXqxXuz0pN+yov97KhMaedrDplIVAoFrSPMtIIx449BgBYWlYyl9Onj8sxnlORs7YkoSNSZzfDk3V1MPH6nLdBECT0f7tFKhVibKiMrpP/tVwSzZ2Eo4QpnXuWjMJWp+6QarTFWSIrIuLNN12flM2IdN6SOLiRUc2xawkbYsltbOkZAaBd54YI846tVbRZtUXul5W69k8XHRHJAAAgAElEQVS//MZU65J/ONZ2yood2YakTB08kJTZbE9Lq9wObtjQwNDolkMRvQTq4eHh4eGxA/gfUA8PDw8Pjx1g+0xEpjdhNNmsGWIEd13AlTOWvzzrZk32+3M//9MAgLFxNiB/8IOajWV5hY3/pYjZaB54UENVypJs24rYrvhv2UVs1gMASIvB+aSw3nzmf/59UvZTP/kTAIBUan0ibqzjVzWX+b4We8fUYmDYucq55aCwcvSJyq1RcLqQxAlA0nbknHiUsTEOw2iKKqvtJOjNi4E/lATmBScWYqDIYRUTI+JK7qg6mtLBdefYzByrbjo1VmumjT4n1WVDfRhzPTsddb5ISRLjGFy/2GE8gji4rF44DQBoLanaulptodvdK8cWAzJdmKaq1kb72GktbIhasKI6zFgcWdpNrt/8vLLVGAkbKkqC39Ex5WwdE0e40QHheO2ow0JanEg6IauWVmuqHjx/iR0yZs7r+y/K127rNgBAeUDPn5lnful+4rYtZDQcbGyS+Xsnp3g+UVcdMyo38zhod7kOEal5pZ44rX0Se4GAAhTCHPYdOJwc64hqvNsSLtO2ToDlVR5DHVlv0nmtt2Xsipo2u4j2lRHHqFRWQl1a2sctYbZ66DirXxfuvS8pK0hoXMYJF7NOig1xUnFNQFaNHIb22Y4zStDrABi4mesluxRM7znyZknGqN0iIEIpG+Lmo6oWz0uYmK3PzLmLSVlX+GqLJR6ry1V1tgkpk9QOACorOp/nZnkNV82z9oV11oplbajXdd5UpX/7CspE1obNDiRmKOc3pk9+D/KyDrq83JYNLBTHR3ftOnWWzUEkDmcZx2moUm9umd3MS6AeHh4eHh47wA6IFAhruV97P92StYZ+3QEcOMDBxDZA3TWSd4UZf3lJcjE6PJBtcTm3OzSXT9JKpU1XApU6DA5yAPynP60S6PgIG7b/5RtfD6B397IZVALfYJeyl1ShxgDdNvqd3diA7LSmL7JE3XD5J8VRiGY4A8SRYc1iMSbt/dgFdvu2zgoAUKhxe/UXecf24Ln7k7LSBO8OS7JzP3VMs+ZERXawGLjhNj1/kh0JamfYnT+saohJn+GdZ73K0mm9onkwM2nJqdnkPsgPqNPBsDgUVC2pgDPUKAgA2iMJ1Big00TGcUyzuUvTkQT3O44plOXdciHH5yzM6hiOZKN+83XsuDA1fCQpS8mut1kT3k9oEDeJJFIVqevxU8oDe3GZvwcO32e8zPcYMtyHNw46+TElPKEtvMdhR8M6rKYok+dzxkfUwW+kj6WTVQl0b3XU4aaY0kwle4E4itGs1DE1qQ4epQHWSjUu8TstLqnTSE3CGxKHQYfwNrbOKUnolU7GpVUehxkJ8SLnuoZkEalKKIP7vlarFTqyho3asm0Y9ISZWUcmW731C0IUbTReLx8OSLQ+XHCnCAkoZcIepygb9tYv7e7472BpgZ2hHn6UHTq7sbZDVnhoh2QduDCtmYoWJMNNUzQbq450ah0EreOUG6JjKWndzC6FAq8JQ8OSu9NxMGxJ/1gHrYaTScagd6y0WtqvliAj77SDRSqd2ZQf3YWXQD08PDw8PHaAXVP5WZgNv/F3K4mGjs5/ZYV3hF/+8lcBAM2G7g5sVnEriTbrDllAje0OoUiLbWdXYR/t7tXGiyy91aosSU2L7hsA/uz/41Ca2257NgDgJscN2+5QNtqI2N3hRruUjckVdghjEEQdTJQ0BOLSEkttnbJQf5VVOg2El6rb4R3doefempQtifTfHhR7J2lfBH28S1wWerOKs4uL6ywttprcF/19anM6J7aM2pzSXh2SQPXJm1gqXX5EbSa1aZaMly7x52pNr4vEXrvSkED5QZVAywf4e1eCud2xEgThntmHwjBAX38BOYfWy4h9vDjAfdCNXOmEx1RVsmyEVe38bEru0RBptqEUkpTi94m6fM9sWvu3I1LUimzKzerNSVm+IxKCUQk5G7JmYWb5GwCAwynVOuzP8bjuSMhSw8m5udJmO1csoQEUq6ZgoMjf44DnYWVVJd5MUSkJ9wLGxGg1Gz3kBYNCvda149Al9mjYbEI81htNHV+xaLFS4XqfhkDsj82mEGI4Uow9sd1WqUfrJ7l1XTunvbFImxsFwSXXOZW3maQ2k24SydNstKLuHpl0GvsnxpL1DQAGhZIwlPUjPaJ9PDHKGofPfeFLAIDYyWgyIGvQzEXRYgzq2jDQL7Sqs9xf87MzWjbIPhZFITPoH1Sfi3KRx3i5XykziyUhV5C+P3lCc6yGos2pi8Tq9mFb7NyhZKciRwOaF61RJCFJrga002omFK5XgpdAPTw8PDw8dgD/A+rh4eHh4bED7EiF6xq4rdHcGtKjHnVarxjsOuksLrJq0DJWuElHXAPy5Z5t1buVtqqerGrEzWSwssScjwkJiMPlenGGXf4feJAdY2688UbnQWKctmroDUJcNmYi2ht1IsCcoEN9ZYw4yaWXJW5hKMfvmE3r82ybjB1lJqHr9qljxsNnmb1nQDJOdJ0EsmMTrHYNJOtGzWEiCcp8/tIcq2AOje1PyuoZvsdSpG7oi0vcpsE+dkTZf8uLk7Lp88zcYjkq06HW3QhNUShMIq1ldTCag2RcsHy0oZtQG3sHYxC2DCJykmZbV3vLxFLVd00L81OfhIlknbGV6YqaKjwEAAhbR5OyuMGOb/m08HZG+j4kL7SvzNdNDGj7NSJuh9qiqthPzbI6azDFyev7jTIKHRzjZz46w9yrAalqLk38XlbN1WxoQzZKzOMaSeLi1aYT4rKsIQ57gTiOUK8v4Yww+ABAPifZPfp43Lcc9VrAywZGh1nV56rsGjI+2nK+ZSEDdO2x6rxOx2HBEkeUyKrtNuD67tHoWccgWr8OJIxscgFtlPh+E9h7md6D27rHpveHgTExshldI5M2qfHYzrrzMt3LEBY4oUHJqJU5e+iQOspZ5qH9FyUJdlav65OsL6E8Z3ZWnY9e+qIXAgAmJjXsq2tYRby6wGvL0rw6HS0sc51Tkv1pdERVvzZ8MpY51e+YwpbEqclI/7QbagqIOt0kHOlK8BKoh4eHh4fHDrBrJyL7S20lAXIzc9iAYXH3dqWFpnAqdmxYgGvUX2PAdTMT2LO6kc32sX7313F2pS3ZlaZzQhJQ0F0ISdD6PV9nDszXvOqVSVn/AO+STCJF751kuVVk0iEOTQzhza97VXLszMnDAICKcFm2mvqu3Rbvqg9PsvRnnGBgMzIBAFgRybPmOJTsH2HHE5t7tFrT3ZgRY3vJiKOB43ww3s9tWpvV4P3qNLd3R3IMFsdVYp289U4AQNxhx5XZC08kZXXJ6we5f19R+zwFyU8po7VTdxw6QJfRBOwAHSCeNYjzOv7aAbdFRjhBM2kN4wjaksVGOETjrk6nsck7AADpiLUBcxfUMSlt813mub+itjomNWRe5IQgwOWT6B9gUotMn6PJGeU6ZIRYY7Wpu/NLDSYgKU3wrMlFKoG2mjwPwoh3+sYZ3zOL3wIAZNMsAQ4NaZhS0NH5sxeo1Sr4+j1fwvTZU8mxdIr7sybhTqmctl1JpIj9+7gtVkSTBQBLsibkhYhhaVnLbOx9V0JIGg3VJISQ/LKbjKPedMDU87nR+NtsRNIG1202hvdsfIOl8rPnzqNU1PCNSoXbwmqn2k4O2khCugrirNhuqOQ+Nio5QgOen0evm0rKsnKvIM19l3Ek0Hyev1unKuNkAmoJN22nX7Usw/tYqgwk6eehA7qmZHOsgVwV4paMk7knRTavLL9P6GhAI9FyhpJ/1XR1DpaKQ8im1VFpM3gJ1MPDw8PDYwfYtgS6NqA3lC1yuAEJgc2xdvIk7y6fOKESx9IS7xgqFd5B9GQfQK8buutSbN3Ps5KVvCdLwXoP8CR4NpSA+NCh5LL5Qz//pX8CADz3eXckZT/4Q2/me20Y9PzUICSDvrCJlzxXabdeeCvv8ioSUN4xugfqdMU+LGE/jabuqo60+bq62LyqNYdsQvIS2mDz3JFMUtawxBUDHIYxPaM2sOMS5H/LoIZOnJ2TPIPi7h7l1H5bOvRcAMCdRw8DABbP6Xh4/Jv3AgBmZzh/YpGc/IeSjaUZ8T3JGQ+pdIh2tDeZKnKZIm7Z/zxEBSWniMSevk/eP9evLvckZBRzc9wOizXdnYc5DolqNtnO2eioVJ/LswTebvMxG5oFADWxQ9lMHVGk90xoy0oqkU1LezeFCvGiQ/1XWhC78iCf31k9nZQVAu7jwfxhAEAq49jSW1xWzLK0vX9CSRbSUCljL9BqNvDE4w9hcV5JHq67ju2/WZHCm21tA9tm6ZQNTVBtRCgLRkXGv3Fs0lmRYruSu9M46rC25B9Whc0G4WnOdytBrv3cDTaTMreaGWQriOMY9UYryUYCAG2xAQ+NDsk52t5NyUx04AD7UzzykOY3tblZ902wvXN0VDUcoZCbWHeUTFbX3UJBiD2srbUxkZQ1ZA1anFMfCCNaoHyOeq4HgL4yt9tqneeBcdaCvPS5pevrOH4ffXmeL5G8Q19B17x0uHH44kbwEqiHh4eHh8cO4H9APTw8PDw8doBtqXCNMcJgoeqGR4UjcWbGMk1o2fHjJwAADz30YM//ANAUBpHFRRG9HeeUzdx2rNOSzRwQOA5GlvPQZd1PVLhpUWvW1GBt1SZNUa/96Yc/lJRZp5HXvfY1AICsY5ymdfyWvdzAe6DRAQDE3S6qi0s4f0qz0eyfYlfxqX0cCpFyeHJjMZqvijrM5ZgcHmJ1XK0hYRlOYlzL0lSpsrH+pqOaNceqFC2/8Ghe1ZtpyZbxvBdpkvLFOh87PSNqykDVLZF1FReWocnb1O199LbvBgB0JdPK4qP/nJSdeugeAMD8EzzWgow6gASpGOSEJOwGhXwJt93+CgT9DruTZPsZsBlrHF7mUDJMPPw4swAtnNUsKadmxHktJeqnkhPiIlloTIfHWG1F1eldw+PVcrYmzlUATp5mlXcpp+qmSBKsV0U9NVdRdqejncMAgMVp7pOzpx9NytJtrs9Aies8eVjd/1e6Evo1wO88lHbUwlltm71At93B/PlpxJEzaeSd8gVWf8/OndfnS3aUSpXHdtpRPds1xQ7tfEHV7StC7WQkC1Ehr040qxLCE4sJJOj1GOLrnHUtYf/eCqOQg0BUykmoyqZOS7Th992CiBCE6R7nw6yoOFvizJbNOWFsHXESbfMYrSypY1ZdeK6PHORwqXxW61mSdanfmg+c7E9RJA48Ej4zMqJjalaYiy5aUxCAex96AABw/fVsypqd09DFCxd5bHaF99aGPgFAWn5JspKRq+uYGVsyViwleGFoIClbrVa37DLqJVAPDw8PD48dYPtORCZOHH8A4KMf/SgA4O67WGLI5dXBoVqRnbYlP+jqrsc6GKXFyuwy5ccijVrj+UY7tW7iBLA+E8JGuzcrQVGgmR1CcdEeGOTdx7RkKgGAP3jv+wAAk+Iu/+IXPtd5TnfNc9znBdirkJcwCDGQL6KyoDySF+UdRyb4Gf0Oh2ixLLsokaBC0l1fWbqlX0gZTKBSjCVVePQRJjoYHVUe2kKBd32WQOD2w+pE8l3P5zZpdLV/6iIM3nCA++fSgkpXF2Z4VzlzivmIz0Z6XVN2rPkBdlEfePa/SMruuOklAICpU7wTfeCuzyRlczOnYJx8lbtBtlDE9be9ACbtSM0py6/K7x9GTv7JPO9o6w/xu06fU+lvscnfyxJ20Z3Rvihk+djYEDtfDfep9FeV3IjWWabjSArVZeECdpw8AsmtWm1ym1adstWY5x8JD2yaNHPRI+LQ1z/C5yylnJ17ketaFUl5YUlDno6MPx97iSiOsdpoouC0+aqEn6TEiajg5PwUfze0xEGu5GTTaAp3rhHNSMdo29lQI7uURM6a0o16dV5uto/dhpe459g8lrEci7bIAhJvkZd1K0in0pgYmUA2re9YkJCTfIHfvxtpu6XFs6ovx+Pq6JSOoQHJHzw5xutOKasSXp9kdmoGEsYS63qzusL3spzT6YKGuMzM8Vg7t6hz+vETrCWZmRVChRUdj50Of7/lZl6nSzm9VySOltah0e2LnGh4InGgImcd7UbdLWe/8RKoh4eHh4fHDuB/QD08PDw8PHaAbalwiQipVBrzTszWiRPsGLQqqbAaTqqpdMJJa3khA6dM4kfFCSjvqH4btWryPPcTULWHSuOuqL2et9bSpsbifNSoqQPKwCDHLVkHpr6yOh1Ydo6PffyTAIBn3/KspKwocUiWLtF9Hov+e8Mckg5D7BvqBzmcnouXOD7q/ge43b/lxGWNT3Gs1p3f9XIAwNSoqgabSzYNnLSzo8JNSWzswUluj7yjBslmuAH7MsKxWtbrOsJsU2lo/RriDPLo8dMAgKWWOqA89zpWDVfH+HmnLqpq+tEzrD6+/yS/VyWrRv2RPn72LeOsPn7+y787KfvW3f+AMye0T3eDIAxR6O/vSRqc+LakbaygqpZy4hjUkdjLS8c12bgR56PRCU4pd+JxNQ80SOLTajxXUlOugwp/v3j2NACgVldzSV3Yo0JH9UdG3j3Hak/j8ECfm2G17qBwjx44qAwurRbXodHme7ZbqhYrD/E9msIm1V5Vs0cWGru7F4iNQaPdQQhVPS/Oc1uNjnN84NSkxhnnRN24uMBr0LyTSs8m1C5I+raMEwc6Nsn3mpnnd1la1fddr8Jdb4LZyCy0XRWu5dq1pqmN1rWNYj730onIEGCCALm8cibbmNp0lj+bFV3DO5K8vV/Wxjvu0LR8+bSYBtLcJzZRPODwCksMp+uEWZL0ZJms5Q3WsrS8/yOP6bpWE8dECOd2q6XrTSa0rEZZeT/HpBdw3VfFfFepayx2Sljo2hJj3G1pWbvV8unMPDw8PDw8nkxsz4mICKkwTPgoAWBkhMMj5mZ5R+gmuK3WePccSXhJmLr87srluw1l52hZ9N1QFbtT23xT5mS3sGKiGMPJyeRRFdYLe6/ASeKakbCFh8Sx5tw5zRhwy83Mb2rDZtyNKJHZs+QJjXoND3zrHpgF5WXsH2Yp7t6HuV6PiaQHAN/5ylcDAD7yl5wo/Pte/bKkbDDHlcrl2VkkldYdaEOSDI8O804/zqpjxpKbsBy97deRdibHAeTEGQ45+P3f+30AwPysuqO/6MVcnzd8/1sBAGMT6qxUFJ7LyS53xsPLugOMA27n2bPcDjccVEeG6266BTPnNTxqtwhCwDjsP5a9pBuJ23vGcXar8E6YqiwFdasaxjI4yiE6rTk+VpvVRO5d8Z3vSBjAwpxeF4ojRqNhNToqgVbq/JzQJcgNuV77j/CxsX2qRbGESlYKqnVU4j9ymJ3DUpEwVLUf1jZIcR+2I5ZSiyWVXOO9IX1KYOII3cYKYncvL9lpyHA/pFI6Fib2sSQ5NsJj4O+fUIeyyX3M6ytUq6g7Dlg1kaS6NkOH8zybbHujebsZ25B17tmIj9tqocwG528kZdpjGzlO7iUXromBdqeLisN+FZR5LWgs85hzQ04Ksl6EorFaXlBtREsk0JUqz92Ow7VshJfbshWlHW1A3SalF0VK29FaFoSxaMZhPGsZXl9aoWgWHEk3zIkjn/Bjdx0e9GyGz1sR57KZBQ3rM5D6GNu/qtXJZ1NbpiLyEqiHh4eHh8cOsD0J1BjEJsY+Ce0AgLe97W0AgLPnmA/0zBnNqvDooxy4ffYMl83Oqr2iIXyViRTn7NVSYh+1uQpdvlvdja391B1kELj2CpE80fsJAB0JHLaSaL6gUlmxj3dTC4u84/rWffcnZTfecLTnee7udA83i+hEMeaW63jMCWQPpQ3PXuQd2stf/Yqk7Nff+e8AAH/4/v8KAPj0p/4uKXvWFGsK0hneeRUde6+V6of6mQtzdEglPGsfzchuLiAdMlWR1NqOZuGPPvDnAIBHHmPyjGxad4uf+Lv/DgDYf9NzAADPuUHzr+Yl2LlPpI5JJ+lHV+5fE4OkcbKXHJo6iG84z9gNjDFotJtoO7kxmxJAHhk7XlWi7oJ3u3XJLRg4geSpIrfT8jyPrfmLSgbQlvyG3YilgNKAzqduU7QvbS6rN7TvmxHbv8nJ5ZgSKWBkP9/j+huVnGJmgSXbjHQ1BSrptmv8HhOD3BcINP+iKXGdH3+Md+z7RnU8FLM6R/YCmVSAgyMFDA/pfQcG+XlpIUJoOmEVc/PcBoemeA4emFKe6NERtpt3xRZ64WEljpgX6apt/RYcKVCJUbYXsrJxGBt6jlFPTuTLS7NW8rSaOLsu7jW6URfzS8uYHNOsQlYa7cY8Lock1yoAVFalrMufLUfCs9zBj53gNT8gfdeMaKoOHuZxFZSUgKRZE55nuVe3raFuWblueUkl3WPTrHk6MspjfKismsLUEI+RWo37fKmr16XE7loRApclJ+dnbCyXMp+TdnIA1+qtJEfsleAlUA8PDw8Pjx3A/4B6eHh4eHjsANvjwgUQdeMeop3nPIdVQLfd/mwAygYCAAsLom48xw4UJ46fTMosL+7Jk3zs0iVVL1n+z1qFXc3rdTV423AUVdc6ybYD++kyifCnVY0EblJVUUF2O3z+0uJ6I3Mo6sHPfeHLSdmdL2NnmKlJVim4PL57mXg7k81i6vD1iKB8qB3h7c0UWce574AyAxlRRR2YZKePf/zk3yZllRlWSReEyzbrhA3ZOmeFmankJB0viLt7Rtohl9HrbLLtOSch7sOPcijHa17DDk2333F7UvbBP2H17t1f/nsAwHUTGqqSKXB7zwun8v3HjyVlaWEsGe/j8yNHxZrPBHvW4gZAFJOT1grIZdiJoiMp1drL6tyw2OHQkcIw1+u7vufOpOxCncfSuUV2Phs9qiqsWJhuog6P6zY0pKLYxyqv2XP8nGZbVbg33CGqtbxWcGGF59jAmPQLqXq3UeWWGRplp7Cu0fE9Ms5qsNFR67yi4QnLDe7z0QFJHRiqenX2gs7vvUA2k8LRAyMolHXMpYvcnmcusGPigsN8Vq8J5+9BUUFPqfp7bo7HzsnTvN5Mz2jbgYSNxn7GGzn+bA1WnZskhHZVvwkbWnJzLTI2BM+uTz1J0no+erB3SwranQ7OXbiAdNrhEBcV6oED7KBVq6uJZLVqVbiSGs91BhJ2p0dP8BqecsouyPgdGeJ1p79f57pd+227/W/f+5KkLGtYJTs4oMxY+VVWzy4IQ1XcVlWxfY/VKo/RWktD2uryXoGkrWx29DrLPGQdu5aqqvodKbtr4+bwEqiHh4eHh8cOsD0JNDZotzu9SaxhOWbtbkyRl4wHBw9wgtyBfjVOHzjIxv/Dh7nMOhwBwIxw0lrJ05VA60KEYMNlIsfYbp1hum4YgpAQWL8im82F34e/F0TicnlHZ87zLrZPdk5nzmkIwP0PsXQ0NcnSHzkSqNnDLYmBQRcRIme3nBEnjqI4htgdIgBcmuUd97xI0udn1GnLZqHIZSU7Qseps3xmxXmrmFUpxiZKz+fYySeXU2kkloS4Z50wDOsW/sY3vQkA8NKXaqaWc+fYkeYTf/cpAMC37j+UlEXS9kuXJIvLgoYNpSLejda7LKmdXNKQkEI2g1Zrb6QiHt9x4lgAAGRJFSJxNsipJJmTXXKpxp+Vk1qv59/KITpHb5VdeaCOOO0G3/OeL/P58/Pa3nlJml1v8Lv2D2nZbS/g9jo1q0HmKHN7Tx5k6WFwUCWyUpGl2UaX+6fiSBax4fuen+dMP0MDKoG26iyd9udZeug4En+r2RvWtFuEYYBifxGBQ5xRlzCWWBxKUqROYnkJ86nUeJzUOjr+T55mZ5bFRZZYu/F6CY9sdpUep6De0JGNw1LcW8l5UpRynBZjG74ia0u8jicb6Mj6FDlrkb1FIGMv3oAgZi9gAHSNwcKKSlx9Qgxj15IwpeM/Fk1crcFlbgSOiXnelYUTetbhr73vQXb8KeZ5TWo13d8Mfu+MhKA8elzD9MYLPA7LRR33ExN8bOEMr8GU0jadneP779/PTlFRrGUtkZrrkoGr65RFtu59vPa3nbFSa8eIttjkXgL18PDw8PDYAbYlgUZxhNXV1cS2CWg+T/tZrao9x9od7ae7s7PZV6xEmXEoyAoSTpKV3IsDA7o7tTprKwW70rANtag4dbBZWOx5lYra6xpS1kxonHSHYs+3Euv5cypdfPaznwUAPP92pmkbG1HJOo73brfY7UaYX15Ap+tQUNlAa3Gz/tYDmiv0Obc/T45xCEnH2R+1hcKv3eG+uHhR6Rjt+2dk5+mYR5IWSUvohKVgBHQHXXXs3kMS4D4yzDvCyqrar2wQ/OIS7xo/+1kNgm9KtpeFBe67mpMRIyV221C2/IPjSsAwNj7hZObZHYwBonaEyCEDSaUk/Clld6xqH4kabJOZPsvak+MPKaFDOcfUj80h3jU3OqrdGM6z9iWQsIHRQQ3nyYrWpiX2mv4RHfsdsTlVKtp3U/u5LUiIHr70ec2jmi7wPcYOcvtkQpWeZy5wH7QjnsuLVQ1jGcqxZqW/xGqOrhOm1N3DzCAAZ0TqH5nA2Ys6L89IjsdIpL92QzVKTUn2uVzj9yVnPLZEq2KnYMqVpCQEyq4fPa9Bve+0EYmBK4imQptVRfwxXI1FWijlhB4wdG2giYbMSrqOdGrDKiRMjNw6UbRndtBUmMLg8Aj6+pQsJSdtuCh0rHmH5q/T5jq3Zb1JOVlcMkKr2JawodlF7cNml88bkgxR+69TDUdH8veuVnj+nD6vturMqFDzGe3zUoGfQ2OsEenLawiezVB0+sxpAMDRGzWsqS3t25a54UYUWan0oITB5J0cu61GG1ttcC+Benh4eHh47AD+B9TDw8PDw2MH2KYTUYxms4kVxwB95gwbgB8TJ6CZGXW2Wcv9uFFGAwtXFdsUFZq6iwfrrrOfbvLnvj4Wx63qF1D1cVmcM6ya131mVbgcVx13+ZUV/lGFRg4AACAASURBVD4nRupcXlUeaan60hI764yNKquHieM9s/kbMogoBoVa56o4VDVETT3jZKP4gz98PwDgzAnuk2pbVZsnpuekfuuT+XZE3UTCURm6XMLW+UIcSYzD2JH0oKPyyhf5HlbNn824iXS5TVvCk3n6tLLzkKiIrKe5cZyV7N1tKE0xqyEP9Vq0Z2pzIoN0uoOO45iVEuamZsRq0wuXHkjKHvsGq8rLIden2FFO4Ee/eB8AIHuYW2nBUQsXjrJa6/B+fsfzl9QxJ5LsEClpt/GD2k+x4T6P69qmBclCcerx4wCAu/5Z23T/LeKQUpZsG10dp91VvsfQKJ9z+pRmWXlshc0x3/NKDsuZ2K9q61pXx9teIAbQ6gLnL8wmx85L+Eni2OFkx+lK+xSKPB9TXdXLRR3rwCPrhqNuTCixLX+tUwdCLw9tT/3i9SrchM1sg8TYNszDMh1lnLlkwl4HJjdRdixzMBaWrcB1MArNnkWyRHGMSr2O2CE1nhxnDuyMqG7rLTU3FIUNilI28bS2XDoj64aoa+uOs1lGkqCXhsVBM9B1o5uShNoD/Lw4pea7isy9G65TB8PuDI/7bo3X6ZWqsoHdcP0NAIDz53j8dxwGIesMWBU2JZf/uCRmQqserjncwGGhzKTYW4CXQD08PDw8PHaAbUmgsTFotVqJhAg4oSaWT9GRJC2foObwdHZcNiuCNcQ7UoQNsF2boQBYn72l5WQLsZLx8LDutK3EmZMwjKkpJR6wnL6DQ3x+obCe59M6HaWdXdL4GO/YxkT6jSLX4E97Z/BPpYSXUndDDXG2aQmRQuA42ywvsVF+eJTr1z+k0nmShcII/2THkXokFMiGtsQdJ4eh9F1LdqWx6/4vfRc4+7BlcRr66l1fBQC88pWvTMoefuRRuSf/77qOh/KOceLq70gWNv9fm88/d0YdusJsOQlV2i0i08ZS5xzaTliM3ZheWmZp88LSl5Ky+Rlu74k0O5MNk/bTqjgYpWd4B59xHGHORxwGddOreJe9EC8nZUsXeEqO7uNGuu0F2ra5Io/h+Xl1lJib4914scQalptv1swpffu58iYSPt+OTveZaR5HtUXLO61zelmCyqdvZsePYlnzcV6cVwl8LxBHMRq1eo8GKkiIJqwkpGPBOvCEMg5TznDMyMSLRQPV7uEz7c2S4oqgSTamwDoara9nD7+21CeUdCKBc7NAHFZCOT/vODKlJCSMZJz0rJXJeLfHtBJhSFjYozUlCAMUigVEXZUyW1KPlHgPph1uac2SJWuxLoNIpXsbquVItSTvWugXx07HedPmfrZjN5VS0oTBPD+nMKCOQqUcj99xyW887xCCFApcobGx9U6LVgFnu67PIXOwzoCrKzz33BzXJihtmYvYS6AeHh4eHh47wLYkUALxjsTZDdlfaivFuNJIKK7YNku4K6hZN+84ttKp7uJsELG1EbiZE0L5biUjVxq20qZrWxgcZNdnaxdddXYoVuK00mmxqBKota3e/CzO/Zlzwmzs/S3BQY8NjvYuI4uBQYS4531S4jqeFUIF11V/cFBcxWXn7dbL5lTtSpaP2MlwESV90UuTCABdcTmv1tgO4Ur8Nldm5Oz0bfn/+PSnAQAPPfJIUvaNe78JACDZxkbOQOpae5LVSHRd+5BQLtp3cewTOdOBifcmc0U37mCpehG1VbXjRw2W1JarbCOMnZCd/oIEaq9w+EpxyKGVlBCQdI41BX0dzSARjHPfDY5KBpp+bYezj/OOmEQiX7ykY7/V5V3y+IRKmeemuT8X5rmeJq39OiYm2Wx2fRaQVovb9+Ixng9FJ6frjXdwRpeqSKLzS47dK7s3IUMWJo7QrFbQbWi7kg0BgbUxOnZ3S8UnGhSXxMAOJyOZfbpGx2o7yfq0XpSLbGhLQqSwQT2dkBNLjmB7puDkKy2Ig0SfJGMtFLRd7Ry0c7aXcrSXAjDl5N1NZwJcWjq9vlI7QECEXD6DwCGnaIjdNRsLaUpWy0hmXcbGtoXaDn1CjNNcFfKTlI69VDaWe4tE7vhxWOVXu8ENfbGp0t+QaAg7F9UmnhfiilyZ6zDarxqR+QXO9DXULxKrIyJXu/ygmyRPbGwcGsI6S8t1yeIy1O+Gi6kG4UrwEqiHh4eHh8cO4H9APTw8PDw8doBtqXDDMMTAwCDajtNGrSIqrgU2CLvZWLoNOc8a6d3E0/Y79bJ6uEjS3Dq6327cq25Er/aU61RTRn7L4WpVi64K0qp/La9uw1Ej2XukrOrTyV6SOBRtEJ6zlxm1CQSiEGnHHZ+sCkWYVdKOajnxj5D6ZEOXUoiPSY5ZEFS1ZNW0UdKm61W/w8K2ZFlE+DRRZTv9Y1Xy1i18xsmyc/gwqwYrojapN1wOW37mWlUuoLyiti6u6isICLNNdVDYDeKog0ZlBhQqM0q6zGOjv8Dt1zqpav7yqLBhjfDYp7QyUk0OcXai89OsDl45rqFft0zdAgAolSR7zn5VfS1c4HudfITLGqvah2GB2zST13Ybn+RnzpxnNVgr1rFv+9E6vfQNaHjXkaNs2pg7wQ5ZXScEZ3WR58jMRQk7itTJadhhRtoLGGMQd5sY6nOShItKVKKdYGJV/6VDPi8jczDjqPOjmI+tiLo257AUdXPCSiOZPLqOo5wd9lFiwnC4cGGdFh0+agnp6BenrvEhVc/35/mZuYzN/rSRA2RK3jO9rowCyXrizN0wDJDJaHjSbkBEyIRBj8OkNYdZp6jQUdNGwjLUFacj46iWKxWuY0PMYvZ6AMjlxDlN1ouO40RXX+HxlRF2tPKQM6Ykc0qnrmM8zBgp4nFgnH61zkBZcVoacBwnzarMy0DMfRWdG406H8tJO6xdw8Nwa7Kll0A9PDw8PDx2gO1JoEGAUqGE1IReZvNFlsqSJaRfCQdOHOfg1gXhyXWzilhjdGCN8650aiWpDYKe7T/W1b03wFmclRwpqd3mnZOVPF0pM+HClc+W45DUkesSJylHQLZ1TurucmfuYe4+A4IxIYyTRSAhNpBDroNRIo0m7vJ6XaDeCQDUGQsA0tIvNpTADQxPHDPknNDJN2mz3riCblrumxcOzKmDKj1Yp6aG+Je70mziMBb2ZsZwy+yu3K1fq9XCyqI6IewGpttEY/ExhFnVUrTEES5TZmlj363KGWvDfrpZ0aKsqOv96ixLi9VlIb64qOPuwXs4jGW4T5xJ0koM8eJX8Dw6fIQ5hYdGtS59Y7w7zw87jikB8wvPT7N0P7uofLxx9qxUVPrMkeQyll9UhNJyydUisERfrYrzlhMEn8ttPVfiVkAwIHQwOqR1Gx1OSz1smIhDjBL0Llk9ZATyva/Oczed1bXIhqG0msLt6iSVWSt5umPPOqxlHC1QPsPzpGQdhRzuWCu52PkVONKcrXuQOLo4TkTJwob1ZbHpCVfbDQIiFDNZpBxnKntn60y5EZ95Rpww846jZXJMbtBYUU3F+BiHWjVFKh0o6phNj4okKV3XgXaGXVPyJYe4RsaqrXLHWddGRnnuZGJu29CR6rPiTGbEmazg5DnO23vK+639XTBb1CR6CdTDw8PDw2MH2JYECiIQUQ9V3piQClgJdHRMXYwPHDgAAHjooYcBAGfPnE3KKkLrlti6XCnO5tRLDqzPz2clqo1IFtxdaVukKiuJujuNtflG3ZAY+91KrpmMu+vfnOZpq7uXK8HEBu1m1CNJWtW8lfTcd7V5/GwQs3FkdxsaZHMSBo4kmc7zdxNyW2U31P+vz6NopXMrrQNqy7ZldSd7fBJ6JLlJe+wOlubMkm4472XDk9yQHYtCobAhBdtOkA4IE/kU6lmtV0psxUZsWZlBHT/tJcndKR73S48qzV2mKuErLQ7w7joSTEvILOKI58zSJR13FQkNuu4IhyS1HCl98RzfP6iqi3+uxPc9cuR2AMD4lEqIS02ep3NzLFHGbR3DYYbf8fYXHeb/Iw1OjyFSc1dy/Tr2cmuj21MYg5RjK7Tf0xJak3ayyKwdh642oi00f1bSK/c5uWulzSkhJdE5bG1kRPbd1lOOuv4bQVLWew5/7/WLCEMnt25gbfhpOUfHs5WQNa+ym3iTrrjmbBUEIG0MAic0KCM2WavdcueTXV9stiyXYCCW8LGcnN9fVgnPRoHkMkLX59CKFkp8rCPkLM2G0ui1JCSukNG2SYtdtCbrdK6smp6G9HlD7pU2G7R3yOMocpq03uD3Wl5eWvdevN74MBYPDw8PD48nDf4H1MPDw8PDYwfYXjYWYxDHca+bt6gqCgU2+h48oDydA/3sKj+5j9klHj92PCk7fowdKS5OTwMAahU1XBsRp2kDVeh21aOWIWmtMxHghLFYJyKnbG3YSzajZUnGBVov5u+hDxEAy4DiuJVb1h/iT1edrk5A/GmTYAOqiklBWIAc1WA3SS4hzEout6dVLSVu9o7zUVYckhzuTHueVa25KuaOqG4DUf3EjvrNJsW2SbPjrhsus965Q+sXYK9aPWVCjHQH0dqnKqLZ88vyyeE43YKOg1SbwxeCaXGJX3QYkSRLCrp8r+L1qk4cPioOWXI9ZtX5YuYkPydaYnXV2BGHwcgyxbT2JccWV9g1Px2xeWR4fDwpmxjicJmoyXPs3LSGFOVLlg2J69ltqpo2ZdMNzXM9WytO5p7m3rA+uaAg6AnbyMi4zeX4M+WoQa2aMWEDc8aQVfsX0qzGTjsOPHZ8USAOaY7ooOrToOcZ8o/cXA/ZYagcug4D1ZrwPDerhz0voHD9dfLsJITEuBmRgh4V8m4QECGfSa9pNxu+wu1ss1oBjnOfPN+qPPk6Hgv9EuJXctSuRsZqoyXt7jiQxh12+isLn7c7rW2tao6XV1qc4BoNPtYN1IwyvyIObwtsEhwY0MTdCzWuay5vHRO1fkuLPL8qohbOO2GK+Xy+Z93aDF4C9fDw8PDw2AFoOxIdEc0BOPPkVWdTHAbQBnDhKj1/OzhkjBm98mmb4yls7yyAo/I5DWB289OvOVzr7f0cAKcB7A3jw7WBa73Nt4JJ8Jg/dZnyWwGcxbXRb8+E9t4NngfgIcCJeXlysaX23tYP6NUEEf0FgPPGmHde7bo800BEfwpg1Rjzi1e7Ls9EENFpAG8zxvzj1a6Lh4KI3gXgemPMj17tujwT8GSOc2IX6RuMMSeuePJTCK/C9QCAQwAe3qiAiPbGf95jVyA35sHD42mGZ+r4vWZ/QInoO4jom0RUIaK/ATQYjYh+iohOENEiEf0dEU06Zd9DRI8T0QoR/Vci+hIRve2qvMTTAET0eQCvBPB+IqoS0V8R0R8R0WeIqAbglUTUT0QfIqI5IjpDRO8kCXgjopCIfpeI5onoFBH9GyIyz9QJswvcQUQPyLj8GyLKAVccy4aIfpaIjgM4TozfJ6JZuc8DRPRsOTdLRP+FiM4S0SUi+gAR7S1t0NMYRPQOIpqW9eRxInq1FGVkbFeI6GEier5zzWkieo18fxcRfUz6riJr0+1X5WWuQRDRhwEcBPApWUd+VcbvTxLRWQCfJ6JXENH5Nde5bRwS0a8T0RPSxvcS0YENnvUyIjpHRK98Sl5uMxhjrrk/ABmwnv4XAaQBvAWcqv23ALwKwDyA54LtF38I4Mty3QiAVQBvBnsY/4Jc97ar/U7X8h+AL9o2AvAXAFYAfCd4g5UD8CEAnwRQBtuijwH4STn/pwE8AmA/gEEA/wj2WUxd7fe6Vv7A9s+vg21uQwAelXa77FiW6wyAf5Br8gBeC+BeAANg/9CbAeyTc/8AwN/JuWUAnwLwnqv97tfCH4CbAJwDMCn/Hwbb/N8FoAng9WBmhfcA+NqafnuNfH+XrCVvkTXp34Jtp+mr/X7Xyt+a9jos4/dDAIoyfl8BNsNd7ppfAfCg9BcBuB3AsJQZANfLHDgH4IVX+32NMdesBPpi8CD9A2NMxxjzMQD3SNmPAPgzY8w3DZMc/hqAlxDRYfBEeNgY83FjTBfA+wDMrLu7x5XwSWPMVw2nW+kA+EEAv2aMqRhjTgP4XQBvlXN/AMB7jTHnjTFLAH7nqtT42sf7jDEXjDGL4B+3O7D5WLZ4jzFm0RjTAPdFGcCzwP4LjxpjLhLHGPwUgF+UcysAfhvADz1lb3dtIwJvUG4horQx5rQx5gkp+4ox5jPGmAjAh8GL9uVwrzHmY8aYDoDfA28uX/yk1vzpj3cZY2oyfq+EtwF4pzHmccO43xiz4JR/P4A/BvB6Y8zXn5TabhPX6g/oJIBpI1sPwRmnLPEiM8ZUASwAmJKyc06ZAbA3eYC+vXDO+T4C1QhYnAG3N7Cmzdd891C4G7k6gBI2H8sW7nj+PID3A/h/AVwioj8moj4AowAKAO4lomUiWgbwP+X4tz0MO568HSxFzhLRXzuq8rX9ktvE/OD2RQxeWyYvc64HYzvrwQEAT2xS/nYAHzXGPLi7Ku0drtUf0IsApoh6ooctQ8MFsNMLAICIigCGweEXF8GqRFtG7v8eW4a7cZkHSz6HnGMHwe0NrGlz8CTw2Bo2G8sWvcmIjHmfMeZ54BCLG8Fqr3kADQC3GmMG5K/fGFOCBwDAGPNXxpiXgdvbAPiPO7hNMrbFB2A/nh5hdU8VNgrpcI/VwBs9AImDorvJOwdWrV8O3w/gjUT09t1Uci9xrf6A3g2gC+DniShFRG8G8EIp+ysAP0FEdxBRFqyq+mdRLX4awHOI6I2yi/xZABNPffWfORDV1kcBvJuIykR0CMAvAfiInPJRAL9ARFNENADgHVepqk9HbDaW14GIXkBELyKiNHgxagKIRBr6IIDfJ6IxOXeKiF77lLzFNQ4iuomIXiVt3ARvNqIrXLYRnkdEb5a15e3gmMSv7WFVn+64BOC6TcqPgSX875Ux/E4AbqaAPwHwH4joBnGYu42Ihp3yCwBeDf5d+Jm9rvxOcE3+gBpj2mBHoB8HsAS2wX1cyj4H4P8G8Ldg6ecoxNZjjJkH71L+E1gVdguAb+CpC759puLnwAv2SQBfAS/8fyZlHwTwWQAPAPgWgM+ANz87WaC+rbDZWL4M+sDtvQRW/S4A+C9S9g4AJwB8jYhWwc5cNz05NX/aIQu2zc+DVbZjAH59B/f5JHgtWgL7ALxZ7KEejPcAeKeYEN6yttAYswLgZ8A/lNPgNcU1sf0eeEP+WbAz6J+CnY/ce5wF/4i+g66B6IqnDZHCTiBqlvMAfsQY84WrXZ9vBxDR6wB8wBhz6Ione3g8TUCedMFjA1yTEuhuQESvJaIBUdf8Otgd2qtZniQQUZ6IXi+q9ikA/w+AT1ztenl4eHg82XjG/YACeAnYk2sewPcBeOMWXag9dgYC8Jtgtda3wDGOv3FVa+Th4eHxFOAZrcL18PDw8PB4svBMlEA9PDw8PDyedGyLrzQVBCYTBj2BPVaCtceI9Dc5TFkecpJzNUmpTSZrr3cjPgO5h73eTbZrkzB3JOFy6GTGTafTPfcGgEiSONtku67AbRPopjOcENpNotputXve3a1DIM+M5WY2MTcARHGMTqeLKIp2nQE3nU6bbC7Xk/zWtr7Nu5tJOe8v31Ph+oTfSb/IoW7XSagrn/Yd3UTmsfSZkYS4FKx/rTjWe7nt5F7Pj6aez8A5N7TJjKXOsVMHsyZhtukpAxaXK6jWm7tu7yAMTSqdBpmewQgAyEhyZ7cq7Wanp37uWLTfbXPZsQnwGAGAbsRjOJX6/9t7kyDJsis77P7J5yk85siMzMi55gGoKhQKhYlgNxrNRjfYTTZJazOZFjItJKPMpAV32mnLpUwmI400kyiJbQYJzSYG9oChAFQVUKgJNeY8xjx6+Oz+Jy3uef/eyMouZEYGevXuJjL9uX////33n9977rnnymOYRDyWhKbJsbq/Zp2SzKlpGB/HaHysTtDMk1k/rjpWSgeblN8LiTL3QjdzNu8b9Abb6RG01yrXm+nE7PHsfPg78P34/8Elh70E/4vVeWdvw5pz1QfN+jJvT+4BvP32sTgz1w/6OYdam8vU39996DVerdXTyZlZGg/72WvReIjz4sMHOWmunsvzv72A156e0+GgS0RE4xFnyFK1T939jJu9loioXKkSEVEex05jadI+GJjz+uQeNBzw98Tq/bJ+cS2RPBtJYsb4Nf2c+fhtSVEsoO9JkhAN+gMajca/cb4f6Ac053l0rtmgSD3A5l9+nic4Vd3jC0WumTUPcLPZzMbm5rg8c3t7g4iIwrH8CM3O8HO5eJwFWQo4NhHR5voaERHt7e0SEVG13sjGpmdmiYgoyElpkdn4+x2+2QP1wxji5HfR1fzW7dvZWKfH7zc/5rWK1KQfm5/na8D3Xbp4MRvbbbfo0s2jEeNJiSgoFKi3vZ291sTaPoV/nJsrZ2NLJ2eIiKiQx2YRq03J4TnsD/n6+wOp7Amx+fr4VS748jmzID2Xl0o+L3PbH/b4PYnM6dQUl20ZHyYcyfcUfT7nEe6BfhBKJb4Ox+X146h1RHj4+vjBikKpHPD8PP27v36PjsJ8P6CZ2ZNEifywjz2+/oljvM5mpmS+t9Z4DboOv5ZT684hPse5aX4GnvnMU9nYXnufiIiuXGPRlWJJmPpnTvKan5vg76sU5Zj5Cv97pOZ7hPltt3gNB0pEZ2t1i4iIbtzi9Zhr1rIxr8DXGDt8rGJNNk3zvFULfF2B/oHH8/Sv/9W/PZKeko25Rfrv/rfvZ84EkWyd0Yhf005BzuNzMRvyKJa14CQ4BvaSUlH2jSAwjie/NlTlh+bHNcRupvzoA999P5YFEtmx5fMuNusQzlGovufuz2tzHIf+93/5Bw90Hn+XNSan6F/+z/8LBaP97LXtZe4Qlvq8PhaWHpVzhtM1M8d7nu/Iffrg7VeJiGh9mdfxbEP29xOLZ4mIaPEsk/EXjonWyozZpwO+B1Ek69nsCfq14ZB/OL/97W8TEdF7772VjXnYq6KQ1/N4JDM4wOf223tERDQ5Kb8VhSKvI9/nm7Cz08rGxqOUXn/1HbofsxCuNWvWrFmzdgizP6DWrFmzZs3aIeyBINyUUoopPZCfKpQZogoKDAElKgdqoFuTFyuXBf7KIZ8z0ZwgIqIwUlBfleHSCmCsgoYNAf/lyngP8HQioka9TkRE47HAOgZy2u0wVLyxJeL+5t+3llnOMlL5ulqTvzsNGVLYviWCGd024/R5j6+5rHIGwyB/IGf0MOYSUdF3DohdnZzk71qa5WudmRbYpGhgUHz/YCSw+DDk+U0xlisqgY8IuYKE31NvlmQo5LFcwO9XaQ7yAFmOFPweRnz8Esb8snxPAa9FDkO/rprvyOQRMXWVspxDt9fHsfm+6pxYp72f5cUf1hzHoXzOp1Slr2MDg0e8hmcmprKx4S6f16DLa6TgybWWSnz+j15gKOvc+aVsbL8LuLWAZ8WV5+mxJ/l9p5ZYo3w86mVjqcvfo1L85CO3mowBC/YE+hr3OE3y4pAhOSeQdeqWAOHmMKcy3eQGWCMOOAX3yIH+639FR2JpmlIYJQfSDVnuExcaHshr4XwN2KnyuoRUhIHSI0/tG3iOiwFy074cM8uxZzwJDaQ6d/2lT+Ksan4Mj0LyxyrvnPFF/u5c6L1y0WmaHiZxem9LU6IwpPFI9sh+n9fM0nlOH3R7subGIT/bzSneb/xArufcufNERPTSi9xC9diswLT1OqfhQp/XZakg98JkiBzk7wdIlxERjZCeKRVlQU40ODV15vRjRET08ceX5Hocfv9oxM9ivTaRDSFtS/tt3vtTkmfD/C7s7fG1Dvry+8PTfX/zbSNQa9asWbNm7RD2YBFoSjSOI/JzQvDwcob0gd9ilRg3EajxxjWbtAcvJ47hFSgvbmuXPfRiE96mLy73dh8eJET9ez3xFCbm2EuqlOW1Sx9/TEREv/6AiT7bu3tyPYYYU+IotpQT0kGpwtHc7DR7Ujvrm9lYu8UJ+ItXrxMR0UxdCEaB7x9gvz6MOU5KBSeialVu0/lj7GFNFnlOgkSiv+4uyDkJz9GgLwl/F5dWa/C5+orw0gKJynBFmlXx/jptvk9jEIYGQ/FcjedeUchCOObEvRvzwQKFHsQgfBiy0kh5wTnD8gMRZNSV+0SITvJYBpFieez3RhTfi1J5CPM8h8oNn/xE/MpqzFFbEYxBR5GzSyBFDYdtIiLqd4XslZb4GJur/J53YmE9Dsfs7U7OsGc9f1z6HcwvcIRbbPDnZEUSGS5dISfPg4ncwh48aEWcGeVAJhuBlRqrxz3P96A4w89MVJQ5HOEiU4df0+x0zao+KlPNle9pjpMceC8REXkHWfz8Pr6mEKzQnIo4crhXipqWmSEPSSXBvU7ywAn9nedqzMxZeA+WcJKa9fXJubzX3nGU7OA0SSgaDshRLPx8jpGTfZAVJ+ckkjzxOCMoM4uMiASBWpFAhMKI96CLa4Lu9a8zgS10+R5cev/X2djzj3Ik+aUXnudzUnPUBsHu9i1pcpMDcpLLMclpalq6/d2+c4XHCrxndQcSPbfbfD0+EJVaTfY1w/Y13DXN3s3nc/dzi4nIRqDWrFmzZs3aoeyBIlBymNacV/kzz+Rg8Itt6jOzD5DkQHU+oNtl3HsEj6GocpkDJP3ev84ehFMUXDvy+X1JivqdXaFjjxzujRuM29lrb7/xJhER3UAOs9GU0rXJKY4APESe3a7C/pEXGA7Yy3ICiaQqkxwl7Owz9dlRDRkmm4171koexnzHoYm8T0UVxdWRU5yu8bzHqgbT/Curv1W1VyPkjkwtlK8iidjUcQFF2NwUSncMyn2nzx5bPxavvlJEWcRI1YHCq3YRvXh5ybsNeigvCGo4B/E8hyivGSBXlSi/u9Xlz7X6fA1dFVkPQ5fG0dFERbmiT0uPz1J+qHKzHT6PlRWek0vviZftpjyXI+TEnUgUI11EfTfehEedk0fN5NqnZnn97akItJxwuctMjfOWc/MyVsojEndkbsYdgED34wAAIABJREFU/s7umOdk3Jb7073JUUB7cw/vFbRigDKbqfPc4tKdULnqGUYpnIap4ZP1HLgH63wf1lIiCik9UHt8d9ZR52DD0NR/f7K+MMYTYMCwUiCfM6n4COt4pJK+Izp4Tfrpldr1w1333TXLd792f+bcdVaHtzRJaNTvUaUoz2UNe+Jnnn6GiIgWT5/LxjrYzy9d51Kodl+QlG6Ln4mdFj8Ta+uCGtWQAyWXkZHv/vn/m40Ff8o36Muff5n/H8j+OTeH/uSpoDmtPUbI3n6Hy9V8tReXq7yXREBixl3Zu8w6mAZPJFZ7184uH98gmbpGtNGoKw2DTzcbgVqzZs2aNWuHMPsDas2aNWvWrB3CHgjC9TyPao0GpRqiNHRtvFZU8G6CsLoD2n5eUZlNGUunw7BpdyBh/CaIQmMQMRaffCwbi/IML7U7LVyAwIe/+oATytGOKAr1dlktxgFhqFQWqLhcQfgPeGRySpGBgLJs7XCo31HSVwmuOQAM4hcl3Hd8l44KbvE9h6YbBaoGcvwCFGRcj09Qz3cIYkCSSSeqkgaUqsQo8UkU7JwC2kh93JOxQNlxzN/Xj438nMCbnR4fY2VX3h+4PF7rgtCxLlDMYJ/n8MQUiAkzQlZwqgx1jvYYDtJw+j6gx+19hitv3hHYPvZ8Go112uDwVm9U6fe+9UXq3RTC2Os/4E54HspJ+m0Fmce8PosA5+oloaiUA37fpMcQUaNUly8y8BDUU9wVSTm8+11Wd7n17kdERPSV330pG3vikSUcW9ZDbh9qPdv8fTu3d7Ox4UVW7eqtM5Q7HAnEvNrm5+fWFYbm/Ek5v9IJTpk89jtPEhFRUJLnNox/CyQi52BpkmfWL147UAqC10wpiB/IFuZmKSMQq5S60RB7UHeV52Tq/BPZWIg4wmQCEkVKM9/nJHKCd0sNfhrn6ACEezd0+6lIrhpM09/05vs2x3Uonw8o9FTKrMj73o02r493f/5GNra7w6m2lVUuBQk8DefzhI2gGmTSMERE89N8XzbXWbCqptTkOi1e75dv3OD3zktpWID7Ob8oqYsF/Pv2Oq/VS++L0tvMPEPFN29jn1HyTsmY/x2jlKagiJN5n5/VwZDHajVR6fL9PDn3GVvaCNSaNWvWrFk7hD1QBOq6LuXLRRqH4tkZgoEp6M6pYm1T5tDusccRueK9j0HrX97jxLOjauEHMXsr5Wn2gPPN03IOcMT8AZ9Dd+9aNjbaYi+korzFAPT1Tsrf5ylCggtigCmLWFgUevRkgb0yIwK+uSNRiRElOHaMNR3n6qpUIxyR7x+NXxL4Hi1Ml6mWk/mulHhuhLikyBcgPIxA0XaVbzxZ5QijXOb5aO9LZFiH99VBicqtFRnrjniOcnDsjpWUIHOAiFDpSI5SlNeA6FKviaf70mNccN1eAwGsL+den+J5HvX5+N2uzGEe92Bxjo9ltDSJiDbaQ9q5vE5HYcVSQE88c4yuKp3g/T2ey0mUOmkd3u0OR3vzDb4nZxtyrQYZMdq0E0prNlfksp8Y/muhIChCucz3bH+Tj33puz/OxhrrIBhNiLccwetPoHsdDGRO80YHuoX7qUvMgAa0tjkyK21JxB9CV3f0LD933pLccyU9eyQWjsa0cuM2eapUJUCE7txdIkdE+azcCfM7krEERJCCiZJUqUaU8ufyc0tERLSnCud7jmnCAD1vRdIyZTs6InENcclEqvcQXkizv2Kf0F84QDY0oTVKj7SYuhMeWSmL6/pUKs3SZkv2lKt3OKL76MMP+D0qqo9RajYAUui5cp8GI97XWx3+21GCCDeXuXywXORn4sKZC3ISiFhf/dlPiIjo5KlT2dD5CyzOMKkQkXyBz6de433WjQSB6o1MyR7fzwHWLhFRHDNyVSjyOuq2ZawG8lEeiJ4W3+n3+wdKtz7NbARqzZo1a9asHcIeWMovjGMKlJCCwfVNRwPdMsnQjRuogO8pablbd27jNf6lr6tyhwTU6XwD5StlyU36iC5LI5baaysfwEh++arsozzJGPnKFuc+9vcl35QLOBI4+RiXDOTVObQ77K00Gg0cW87dlNBMQHJQ6S/QKB7fV6H1/ZjvOdSsFskfS4SXh3dYynNubaRyxyFECBqYN51zGSNfF0Kaq6S6y6xusfd27RZ7dlsd8U5NxchJ5Hm/9cVnsrHj83yMb791PXvt9ascDZoOLb6Sqeu0OBfX7/L3VauqrB3yeQW0DcsVJM9XgqSc6dhxAkXdRETV3Q69d2OLjsI8z6F6PaDtbSlVCVxeIxXINu4lkkeklOcyh0TZiaoIShSx5sdYnqOxfK6D6C8H7zxV5RYlh79nZorzQjnVGad/h+d2bVOuN0L+2nURxaYybz7EEqpNHhu1JeoqYa3vdvme9zckd1qv8vsrDj9HsSvrYXzEPb9645Devr1GlKqWfabNoIkMFZLiI3dlEA6VDibT0G6mztHFkuo+M4copgK5y4FqQeig+47pkjNQ0pSmXZynBASMVKCJEj1VAjEa8hxn7bzUXjAajw8c01ct7opAIVwgFnqaI/dgK8iHMc/zqdGcoqt3Lmevrd3kXGQp4HPf70k5SrfNyJuDiKzVkSizNeB58vN8HaYsi4ioCMTr2NLTRES0qJ7nG79+nc8Fgh2hEtjZwrP35JPSEebsOUZCFpHvrLz4bDb23kX+HRkN0ekp0J3C+P4nKc/3+roSZ8BvRH3CnLMgMIPB4L4FQ2wEas2aNWvWrB3C7A+oNWvWrFmzdgh7IAg3SRLq9/s0OTmZvWYgTgOt7GitWTJamvz/1RUhe7T3OWSuVFglIk10wh//AJw3zikaO7p9eBWGCM4//4VsbL3AX9S/c1XeD9jPROStfYFDm02+DsM5uHjxY7kuNBMuQEFGd5LpIVl+/SoTmKYnRNWkWi5mTbwf1nzfp5nmJA12BVIyEE8XqjwDVcLhOyg5gXqQ9o4GIcMlDRBQxqr7xXV0o9lFiYYpZyEi8gDJ1wo8NuNLIr6wy5DPuZpQztea/P6NFkM/o75Q29+5zLCRC6g9LAvERnUQg1BuVK+rOcV8DpHoT5XS1NJ0mfLB0fiBjuNSMZc/oBPa2eP14gLC9R1V/hOh/CFiKDsMVRlLia8xwPyZci0iohzgumoF+qxK29asLYJubbMh626I5tm6+UyILhTD3i6+R8qtSmV0PAJcv6lUigrQDk0Tvp9DRaK4c5uf01N3GCqeWZJyozgRGPgozHE9csqNA0Qc8y/TG1nJD1NsRgHLldSzFoLhVO7z85JWJJXTaKI8oor9oyEpjG3sRdc2ee6u7si9cjxzb2ReHcdoMwNOVupMY6SpDHKrkzkGwg1BRHOVilIhg3CNxq9AiDnvoG70w9ho1KNr196gi9dkj1xd430sxhqt1mXNXTi3RERETzzKZT9rW5KKuAXi2fQcP7snzwgZqDrJ0OgGup2k2zeysdu3GHbdgoLRo1KlSL9znqHbXle+x/w0pJi/D3/xejZ27gKnlGbR8P4Xb/w0G1vf4H3CqFcNB7KS9qBuVKzw5zRk2+v3LInImjVr1qxZ+23aA0WgjuNSPp/PuqsQEc2go4QhrPQH4jnswHvfQGJ4Z1uRYeAB+/Diem1VHA9yDxk6dV48+wjuSN5o57pyCdUTTJXeWd/IXut2+bsdn79PexYxiC63brA3pj2UXAPRKcLTr331S9nY5UscqX7wHl9rXhXoOs6DyQt/mvl+QBNT0zRRkTIH1+W5aLU50g8VddyNjZACuksoOnoF0U5I/Pfj60Ii6EEkoAChi4LSbS2iL+eEx17cW1dlbqMxtGDrEoFOT6BrCRL4mnzVB5Gmh/KVsdJNdkLTlYf/BIrin8LDD0DWiEaqd1+cHlmrRO6VGFGgIrwAPmajjo49iRDN7qBTzQjRYmcoHwwCjlgMoS0KZW0dX+SIrj7J6Mv2jpCWQrwvwi0Ix/I5U8IxVGU2MUqW+iAItXclOk8jkIGm0XNXlZ91IYLRh45xGMkkDlHacuMylzdMfV5IW75m7RyBpWlK6Wh0ALUxHUlED/mTwi2mJidS5S8FEJFMR5/1fRXF4LWbLWjhJnIdLczFPhhzfYXOtDFnroo1zLkKQU6iQ/M+U1J2YG2ilCZJQBRS32NKblJDpjrQZYZoFB/NIu912/SLn/4N+bNSVnLmUS4XLEJ44NHHRAv3wnleq/EQkbErc9oj0+2EnwnPa2RjYcTrvodSr7pCyoxu7W1oNBcqK9mY6ed5+sxS9lqKOR3g3l385bsyNuBzfuLrv0dERE8+JSWPgzf5Wbh29SYREZVKgjrUGwZF5flutwU5HY36lNoI1Jo1a9asWfvt2YNL+dVqVFElECNEA8aLjiLxxkzPz+2tg3J6RERBwJFNOGYPYKiiigj0eQeenqedL+M4IkJpR+IDVBYfISKiE67k8Aaga7e3Oa8TjiQKbqHAfAgvszohBfoJjn/uEfbUvvQliUBXb7M8lQ+avWY8h2F8dBEROURuQE7wyS6GeeSHSyT5Ch/+kMmthKpyPl/knPH2OkcX/W3xuE43QQFHsFgoC8Jw4QyLS7gYjDw5F+O1+Z6gB9Ucn8/kxBkiIjpz7kQ2duP2r4iI6OJl9jhzvu4Cz5F0hNDLVXlYUzZl0INERSSO4x6RcCKXT7V39qi3I3MzAQEFIwM2VrmoBBJhfYe98j1V1F+tmXIL9CIsC4rQQH63WuFr3G9J5LoDJMYjfsammyLOYGw4VHlI1JWMET10u6o/LNCJPGTUYhXVb6NMaw/HGioJNCMUsgpBjYPXfMR1LGmKsg4VceE8M7RIR2NY26ZMJFKiB1UItRRwG7a7qgcr8tNuiwf7qh7HCC8Yic6yFnwBnyCOBWUyqESK6CVR8nYml5YiMj5QDZEaiU3z3nvMZXY9KiecHBRWeBgLxxFt3tmmZ5/+R9lr+TyXhzSxt84vCDdhF8IEd67yHj5OZB5cqN94PiTzUrUu8RxnnZ6UBGSljm5WkOt0c7KHyZyo68VHKwWUJy0sZkMF/Di4xGv9ySckD2v4OX85+GsiIlpfk+f62AyjKrHDz0ug0Lp2u00fByIX+GlmI1Br1qxZs2btEGZ/QK1Zs2bNmrVD2AMzXhznIBHHkB76gGt1I1JDxR6Dtu0rNQ8PMOsIn9dwRoqEugN411PkjDgEJFDAsQoS/qcV/vfxYxLGD+qclL7+S9YUHalmzF00X40TEEWa83JdKH+ZnWOCTKBg1Du3mYbdhaqRo2DUqanJA/T0h7EkTWkwDMkJlfoN8Xn1oC88DuW7Ipeh2G6fYZd2X0pOji2CuBDxayenBHY6s8DX1oeUy7HzT2djOajt7O3zPSw2pISJdvheL87JvLWwDk4/wkSEmirxqU0wRX1vC/DhvkC/AWAcN2WIKFRlTWa5xYbQoTDbND0qcIuPlYxDClUpSBNktX10kNgayDlPneS1NVHm+VtfljKt2pDnxHR9mGwKwaJSQkmMh841Sid39TbPd693F4xJRF1AkkPV1Bg8ONpro+l4R0hHCbrx+OiIk1NKSV2QavZB5BqlMqkjqH0NE6MVLTMch7qo5AjM4U5OjvNJopB5LU0/STCi7I9qqA0d2Tz0Wru+wOZtQNTlIrS7c0ozGPDdPlS9dLebCgh1N/fkuvv4TtOZRJ9D1jjm7pYtRHQ3J0rvEuYadTnfb8Nc16dSpZl1myIiaqHkLI812lcN6o1gU3GCn4O80hmnoSl7w39DWZeFIlIxUBtKVPquMsnwaS5lWNgrTmRjKUq6EkeVDcXYGzw+RlCW35Ei0iDRiPeUnRUhOU6WGZr+o9//OhERvfnrm9lYF4TR4YhLtUaK/NqoNsj37o8sZyNQa9asWbNm7RD2wN1YSqUKhar8oANtxC4ij+kZ6e1maPNZD0mVnDeuWhmEpHgo3uIIPShdEBwCRWIYIfKqN5jw0y6I9z6CxznKSxI8LjB5xkeh8qArnoWL8ghTqrK2JnTqypg9IBPf5JW+7hy6gVx879d8bE++b2pqinz/aEpZUkopduJMDIJIPFWjnVmpSoS3iiLnG8vsVfnKzcxtsFjCcIPHzs1IRP21r3C0eG2FPcLqsWm5nkmOwDe32LNrqMJ+N4FurSok39ziOfQLHN1vtdaysZU1XiuGQNaoqc4O6CKSopON7lSRwCs3uqKOq6MOOjJzyCGf3KyDChHRGCUjbazzgeqj+vLvcK/Oxx/jaPPn/9f3s7HtFb4X89BlrVeFeDeG1uoIz1GiWpyMRoh08Mzs7IpGLUHEQEcpvS40Svf5mLGjSB6Iftd3+JmZbyjhihKvnw6EFEaJQjJQzO+B9h8fCA6PmETER72n1usn+mfq1xAVxypyHZqetV2OuFNHOnoE6CM8W+OIpag0u09Cd/jUDK/LckHGABLQz64KuvCTK3z8XXTA8eiTEXKEsiB9CVn0bKLNVIenBy7rgB2RtDYRsY7v/IlTB56h4ZDXx0ab132uofbwCN2fgMANulI2FyLi932Uanmy9kro8DQzyftAuisRnunm5WDN6Z7GZisx+rVERDHK81wgA6m6d91eB8fiG5VX19XGnlUscbnYlz7/VDZ26RoTQT/4iO9rt62EToLCgZ6wn2Y2ArVmzZo1a9YOYQ8spOB7BdppiVfcRT4mQReI/lB134DcnIk2o0Q87WHInswUpPyGefHQO+gGEu1ztDTeENmpvRWOcAoh56JyS2fk/OBVO5oCDm/Fq6FzSigdA3LoVtGY5LFhJDTsImQBTWcKX3k2iwuM4c/Ncj5w8biUv0w2qpn83cOa57nUaFQo8nXeFjJloNfvdyQnd+v2Bt7TxTXIeazdYC9zFrnjY8dOZmONBc4ZBx242wWJTo8//QK/tM7zXoykE0hMJl8npRPzJY5ex4gGHNVJ53iZ563a4Ki2syNe/eYGl0GF6LwyHCtKPArWy+ggMh6IFxzkgoP5s4cwh1zKpyWam5Y19VbMc7oHKbeFx2X9vPQV1iB75FG+rknVK/W//D8/JCKidovPtd+TyH132+SvEVGq/rGdEV9LF9J6E0o0IY+yiVghQC3ka8eIeIKcIDJDcA/2hpAVVKUbA4/vywBdKMaq5Kkf8Tl7VY4oSmU5Znx0NVpExBFlGIcHPHnXlIfds8zjrihOfRB6FhSgpOG5hkRET3+We9HO1PhNifqgQVAWp1HqomVFIx7zL8gz3h7w+F9dQ3SlOsk4WPdGVjNV+0aanbtJ6qsoy6As5r06s586n2wmekhLHaLU8Q6IavRR0pRHJNhpy/4+BgrYRy9N1TiIqmWe3+kJ3sNrTVnj0w0+VuwzCjDIy/ftnuTnZRQDnVK50xi9QhOVa42R03YQgTaakjNN0Ffa8CPqdYlmc0BLWh3cp1D2jWce5T2ogTX+3e/+dTa2tbFNkZqfTzMbgVqzZs2aNWuHMPsDas2aNWvWrB3CHrgby2AwJIeENGJyrYbqfntZmpa2WgwvGlJNrHCI/oAhgXGFE/ee0pMtoYtCd5vVIG4MJcTf3uQE/vryRSIiamw8kY2df+krRERUPi7qLf4Eh/v5JofsrmrqXcNXVgFB1IsCXYZ9DveXl7lk5Z133svGOn1OiJ86w1CfqxQ4NldXKQqPpnNCEkfUae2QP5ZyFNNk2NwCTbfuoznyBMoVGgp6G+wxbDizwLDzsae+nI19sMywyeWr/Pel+WY21mrxa7NnuLTFVV0pxqCANxQBpL3JUGwREOR8Ux0Lai7BU3xPBopg9Or3/5KIiJbRAcTLafUlhnPAMyIN+LlheG+o7xCWxCn12yG5ioQ2AiK0cJLVT37vn72YjZ29gKbXRf7+x1+WthJGy/bn/+Y/ExHRu9ek6bgzwvNgygVUN5ZdQLZNaAr7RaWqBRitsy9QVA+cIw8U/1Ek5Rb7qEHoA6L8eEXg99vb/L4OIEddRjbCfNemGH6rKGWq3a6QLY7EUlapSRUMn7oH76e+v0aj1CgRpQp69nxoslaX+D0lWSejHj8buz4/G9WSPBtXtvjZ+NVFhvp6O7KHleY4veEqJlWI1FQF0OJQwY2pY/Y684LsBfFdykqJUm0z5Up+Vhqjr9+no8NwU6JoTH4i66SOqVis87c+clqVXIGs6GHf6bVFyW3Y5zktlvk6LpyTZ33xJGvougGnirot+dziPJPuLtzg8plaU+5FE92ifKVEZn5jTK94rZQWDVHahvcEmhxF/CxNTnG6oqvKv3otTh8dm+aU07e++bvZ2F9872/J920ZizVr1qxZs/ZbsweKQNM0pTgKKVJe7vYWexHm113rZgag0U8jCtxVvTiHKMgemP55utAWhbKd1jIREcXKI0ygxdqHRmP4a/Eq8qhpyH1NotkKvru5+DgREa2v3srGoiF70xPTnyUiotNPCc35V698l4iI/tN3/wv//5cfZGPVEh+/WQXFeyQJ52G/R0n8SUr+Yc1ziGJFmknhm7oQVIgd8ZT2MPXtNggWI7lP8+jx9/xXv0pERMcvSCT1//37f0dERHMg/HhjoZyvXOdegXOnOboqTJ7NxsopdHV3N7PXignP9xhdQraVKEFjmr35ybklIiIadCXSc/HPOGfWg/L4sVZMn04n1SQP/8gi0DAKaXlnnV57/7XstekzHIX96X/7x0REdPoxofg7Ps/TCN1sxmM5ryc+y6IRt97m+fvbP/9RNpYb870I0QlFU/brBb7uxflj+BK5ti6IVYYURETUGvFaNJ5woEqXOgHKwBrssd9Zlq4v6x0emzrBpKjVZYlOoxBlZA6v7/aeICCaaHcU5hCRR86Be2iisUxcQEeg+PfdJSFERA7Kqu70+e/FfdmLPtphNKsObeFE1T+10LUlXP6IiIj8vZvZ2Lf+jNfs1orsQWfwLLkFPtZrt0Rj1eh21yHAUM3L85nPYb8AajRSPVgHQLX2IU6wNbp7az4aoly1XKIvf/6zdPoxEUtZBTHz2AJHkOfPCYlubprXh4eSm05H9vARyD/mWa2onsmm+5OX4wg2UBHvoMdr7TNPcHS6dH4pGwtBNE1VbBdB9CNFdO4p3doQpNXEiKwoQp6DZ4nw2kghg6YLWDzm65meErLjy198nl5/4326H7MRqDVr1qxZs3YIe8AyFiLfdWg8lAglD0/L99kbG/bFQ52dZeq3D8+rrUouCugQEaGIPAwlN1nKs9eSR5+9UEW8icsedxyxB1FVZTN7H79DRERXlWzahS98jYiI5s6xx7Xx3s+zsS6i2LSIjuqPvZyNbayyx/qD73AOa39footTiyhlSNnLWqgKhl+u5I6sZ6JDHIDEynMyBdDG0UoHagyBSXOSI465kkQ2n3nuPBERPfoSR557mxLV5iO+L6ePc94iUT0W52Y4R2ByDf2W3AvTzzMcyDKK0UXk2gqjB+9/8GY29tKL/NnJOc7DtjsSuUJbgaaW2ItNtFgCIrsIEfX+lvKCO6UD3eQfxoJ8jubOHKeoItf4zHO8bs4+zTn0OFWF5DGv2bERQlBdOXIVnpMTT7JIRfc7P87G/JDXbLvHz0pOec3PPML9DJdO8d991e+1t8nP3Xpf7vlGn6/d80xnDIkWK3O8Dr/w+yz4sPGf38jGVkOOqP7oz/4hERH99EevZ2O/eIVRmhVEpeFIOuo4ztGsbW1emqren0Q55HMj3NdR9EkhkSwnqMpRHGQejRThjorUc7g3VaBOqoKEKkN0ZUo5Fxqq9RTtcZ5+/c4leQ2Iwee/yj0op4ry/M9UeF9anOT9sKgQAbPnZZwQJdNoetzeWOe1/W9/fjMbWxvGR4aylEpF+uxTj9Djz0oEOniCI84yRD8ONpAB4oWIrVmW3r9m6s0d0LKTWRkI9q7RSH4zzpzl9VSEfOegJ78LqUEilZhJChTG5Om1eIYRPBhDii9OlNCLb9A6PsPOjqBht27w/v6Fl58lIqJ+KM9NqeAckAv9NLMRqDVr1qxZs3YIsz+g1qxZs2bN2iHswSBcYuhwflZppU5z4tkkdhMFjYyRJF9eY7jIVxDXVJNhvDy0bDfWBc6bqDCEO1FnuvP6smjUbneNnirDIbVAQvZezPDM/oo0Q93dYHim0mDYde7x57KxG28zVPfBTX5P6/s/y8ZGO/w9uRrDuzWlI5oDbN3vMdwS1hWxJIgyyOFhLU2JkiimwUhBUSD6+CBoea7AjWfnmMBTKLJftHRSGs8+/TKTh+YvMFHq3df/fTZ2YpE/N/f4k/wdSonHLzGJpj+EFmxboA4Dc+9tLGevxSAWFAFrT02pLjarDLHPgiAT9RU5CuUbTo8JGXEqkI+Zz2Ie2rtzqql33iH3gVbx321e4FFjvkn/zf/4X2ev5TCXocvX7UqBArl4fIpFhuu0Ik0E3dqFkwx5nX/0XDa2/D5Do2k8wveKesoYpRjvQqtzsyXw1voWz9fWvtzzNiBV1+P5qhQE3v3cV79IREQvfONzRET0+q9vZGP9q3zvyg1+jr75x9Iw/vKH3+FzeJOJc1/5ppz73JKowByFOY5DucAnR+lk14ucpulDXUmvububnWjLeabRNTquKCj2BGrWHpvl9M7unqQB9kF0Mx2ANtuyLn/yyitERPTEc5/PXsvn+b5PoARvUe2H04BwGyAauiodUoIKmIvzHCsSUQuddi7d4b0yViktJ/HoqMpYXNelYrlMlYIQLctGQQulG1oG1pC1jA61Tpck4cESKK2vGwEINlBo6shYpcG/GUYjPU5UWiAx5UnqOTMHQSlR7Mvznyk2Ic3nKBWpPI4bxNBdH6pOYRv8vGxdZ6Wx4xeOZ2PbbtdCuNasWbNmzdpv0x7Qd0+JkijTqiQicuBpGDJRpS6R2j48xzoK+ze2pFfbzDRHoOdAllipSdR4/DhHTscXmeb8wXsfZWOv/oLJDilKG6JUEsN99MYsjyUMdvr8vraHotqnpHyj5/F5bd/i6Hf7LaEuu9DTPHaSyzcPZRMjAAAgAElEQVTitui2mj6OT6PnpW6ut92+Tonynh7GHMehwPNpT5WCxOjZWYTur6eKzmdAHrqzxt71mc/8XjZ2/Enzb44gwo4UxNerHGVOn3+GiIh6vhREf/jOr4iIaDTg97dVIfX2CotMeLFERIUCr4NjpzjKfOq8lL1EmO/A4yggyClauSn6v8VoQxKpaA7LrQv6f2lSUIfZhUkKgqPqv5pQb9ShsirsTkBkM9Glo3SOo5EptxAFU2NjRBCNWY5Ov/kn38jG/uM6i0b0W8abF894B4jC1Azfk24kEegI5SW+KiQverzWZ6YZKfnc50XM4cV/yOVZToPPb+GU3NcEJR9Xr3JU+s1/9EI2duECIz9vvc3EmeWbInhx8uwCHaV5rkvlcok8T+Zud59RiD60e2PdcgdRjnO3riyJhm0MGOwzx4VM+CUU+ScoOdtXO5/RX+2D5FipSRcXo6H73ItCMKwguhyD1HYgWjEdVvAnp7o4hSDULN9kxOanb/46G3tzjffKj1vQuB4fJMMcVUMWz/OoWm9S6kkU18d1pCAyjVT5Ww/CGWPstyNVphhBCMRcV6h6xfZR1thHt5RIEYyqTZ7fap3vT6MqCF4BhNNYlb2QgxIVlO5VFWlzZxN9PVHqlySCkDjEx0qA9NSqci9OnuDnZdDn60sVdFqvlsm7z57ONgK1Zs2aNWvWDmH2B9SaNWvWrFk7hD0YhJuyFuVAaQpGgLZMMnd/VyCniQmGac9AM3ZrR5RQAtR6nV1imLas6sscj0PvEDWOtZpAT/NNJgNtbjEM0g+FbDJw+XPNQHQU80hwR0iadyKBdU6+xPqHZ56AqtGetPEpFDE1qFW8+YYokXzmKYbJTi0wzHJpVXROB9Q5Mgg3TRIaDYZUysttcgpIjLtQ51AFbcUKj/3hP/tDIiJ66Rtfy8ZqUwxZbFz/mIiIPFe3xOJ7tnWTIbvVjpz/T/7iL4iIqAKd4OFICBZzswzF1KoCN91YZih+jOM3F5aysfNPMqRI0MTdbQn5qA9oem+AZrupXPNwwPBP1yjTdIVg8Wjj3k2ID2NpmlAUjSnRbiXWtw/4NNKqOHh8UpxrGMl5pdBJjaAGtPjUUjZWnOM0x/7HDFc7ihSx+DlWvvnDP+W1ubYh8OnmJsPnnZ6C0QBvHZtnGOzECWm3NvbRzmzAz93xk/Ic+S7fs+uX+RzK/1Qgtuc+w7D7O29fISKiQU/gtDg8OpUtIm7j1W63Dxx3bHRuAaPl7rFLmf1G3yoPZLOzs3xtf/blx7OxfbTc24Ma2oR6plagIf3UE/xcf+7lf5CNTaB1VlHdozz0bSdqDCUW1AnmsO53tpko9uFFqR/92eu/ICKiV3/2Kp+LL3tR86U/ICKiPurbE0ftIUl0VEq41Gq16S/+8gcUB0KY3NtDG8R9JlNqKWID525s8Hti9bA1oVI0MQVCqCfz0Nvleb58hfebtmrEvXiK93wPTbpr1cls7NQprhE9vij1pqdOczqoifaTVdVuMTEpQ6R3QrUfeqiv9vC52SUFFYNUFuL59uQng5rNmtXCtWbNmjVr1n6b9mBauI5DiZunWOlhGoqxSbr2YhmLUvZeCj6THiab4gGs3mFSzu0V9mz8vLgAXRBc9tusDBK44nGcWmK68RBlFUPlLtWQsG9OC8liAO/b77K3mC+pkgGca6XOn5ssiUc42mXP/OMPfkJERGVfotM8msNu7IB8tC8EKMcdZMSqh7WUUkrSMZGiZjtI3Efwgh1VMlNAF5FnPsuRXj6QefvoXS4h2VtlbdaR6krTQeR95yqTtbqpzFEAtZ0KPLJaQTXNneAIdG1DCFamE02/w/fnzo3b6oo+5ON3OeIv+HLuUZ692Z2Ir6Go1F1KaGpe9IEi9NvyuSP0zrnHh3Ogm47xRA0Hoq+UttIsSgYdX3XXCOAlj+GiFhvi0VYWeJ2tg2BRV8S7mTMc8dSXuFypsCCNz886/O9wIBFhFw2PE3jerioHcUCwyXs8b1PT4ulXET3lUAZWqirizAtMjpv4DpdwJKq5UDF/RDVDsDRNaRzHlCoykA8FGQdlb6o6iCL4/DmQiFJFNput8B7yj19gYuLxhuwpfZSmzDaY1DWhNGqnylyi8ugF1i+u1SVSH0N/OO+psgo8e7ubjA7cunktG3vjzbeJiOhXbzNB6KrqwtPp8rqNQRqb+Ny3srFBzPfDAaEpUGQ1St0jIxG1O136mx+/Ro3jF+TwMc/NO6+xWtbJ41LSMTXJa2ZlmZ/xSO1FJSi+jYG2bCzLPvi1F3hOn3mKUYC+2m9clDzeuM2lWpevyPy9/wHvU426aNP+yT/5x0RE9IXHWU0tp9Snjs8z4XSMCFRraJvymhCIoOurEpcGz3cRv1uJJ89UQNK3/TeZjUCtWbNmzZq1Q9gDCik45PgBjfpSAmHo56asYnJKvNwAEZDRSAxUHqHbYe/70hXOs0wo/dqpBnvhMX3SGzu+yN7RDgrM13ekNKaGTgtPnJHC5g7c5/VV/h6nJr1CgxJ7qF1oMe5simDDxlWOltavovi/Ih7yzescSdcn2Etqd7azsfo0kXNkbklKRAklSgvYh2hsDM97TIL5z9Z53v7qL7mTTHP2w2xsxnhq6OEXBKpjTRk9+NA3sqwi17kZvp+DDpcWFD353M4WX3eoupBU0T9wjJzHlXdEC3ft4mUiIhpFyFsrzeDYfPdxRLhluWY3z95rAVTzCZII+dHHT1GxIF7+w1iSpjQYp+Sp9ZaDbqmJc/uK4j8YQlzB/WQZS9njtRFjMbiueOCNeb5PEUoJXHUvmsi5mVzOmCT8c4H8OOo1QsRpygycVFxnkyfMIcFTqcmzOQGBi/ljXJYSu4IsTJ7gz504w+9PVS9M/35d8wcwh1IitY5N/jsHhYx6SSJJ06s0gj6uF8raO17hub6A+R0M5V45QJvKQFBOnpLI3kWOLY+exLHqRtTZ5sjrratXs9c+/JCfq3d+zVHmtesqyuwgysT5JbGcn6nUKUwyH6E6fSwbS837TecR0jm45Mi0cCeak/RP/8V/RfkZEcfod/gar7zP1zM/JwIsZm0XC7xHjBOZm/NPAKmYZ/SoPyUlJH/wDdZYNuhRT0Wgpn2q0ToeKu7A5iajYbduqJ6sJf7udXQTuvnhFTk/lL9dhxDPC78rQjknl3htm2fJLahEZ4CyNFO+onLOOSexEag1a9asWbP22zT7A2rNmjVr1qwdwh6MEeA45AcBlSoC9yB3S1VAo6ZZLJFoPQ4RZjcaQlRYWmK68uQEQ7e6CXUVeq+hzxBMRSmvJCnUWIyupHIBFpp8XqcUYaNt4OaIoYH2lpQF5EogqgCK66+IVqhp4p0D9DBUMOru1h4+zzBYuSqQp+8rBY2HtdShJHEopyjVBR/zhGR56sm9SDDf24CdultC7imGDC0lgIaaEwLnNRbQsgww18qqfC4rFwCcNlatpTwH11+Q+wOOE3nmH4rkFI8ZPnaB4bT70oh4nGdoqLrA59AriuJRB6okwx7f7Mna6WxsamaS/OBoiC1pSjQMiVylmhIijRCGgE/V9eRAfDNweqIo/kNAvcMx1FrUKVZBkPByKEkqCCSdDzg9MEKbssgV0lIy4vIxX2mHGk6H0X/N2kgRUR9NzUco79rdldTLYMxjpTJ/97YqP4sAi5ZBLOr1BN7qq1ZqR2GO41DeC7QYE51fYEjwzDyvy5NKGaoFZZx9/M0p+K8a8noaoyn1SDW6r1Z5jZby/FdJ1FK5zMff22MY8Mc/lhKP1177JRERfXxRiC7bO/geQOq6LRllqkn811OlHV6OvzuY5L3Pyclz42KNO54pjZJjpmlEdERUOcchyudcunzxg+y19v46vgekm7EiqWGejfJTIS97XdjnfXN/iz+3cVtIRD/4qx8QEdEeUnX7XVlf1RpDsvUJJmuVa5LCWF7mfXdmSuDtQo3Xw8++x8fcvfJeNhZjz7u6zqm85Z7oJp+D/nS9VsL3ye9PEXt/vczXExRkAZZKeUrT+8NwbQRqzZo1a9asHcIeyHX3PI9K1QodXxKacwghgwo6EySKcDBCEn+ABtyF/CfLAwKQNHQDE5O4npllz6NWE5r/CpLF23ucUB6ryHB+CiUQIxFs6LdQOB2xx12Ilc/Qw+XDG6/UZWy4yt5rD5HHTFOo7TlEPOOQvbN8Q3mLzvjgxTyUOeQ6eSrkJUJJQbYoF3m+y0pHsg/91ckqGvcqYsZ4nz20BNFIP5Bznp3l4v0EnueFp+T+vvbjH/LnoTkcqOz6AB0kalXVqQb304OL3x1KhHBjjT33VovPa+RIRDR9nuf+WAMkpFQS/nvb/D25ISLeYxI9D/oxJUdU2x8nRL1xRFGoSVtoxtvhdVQtSzQ0DYp/Ci1kTfQwBJZBH41+PTlJo9Xq5nguW10py7l1g+doYp4RHa+oOtagcXcSirfcwbM1RLmFPgejURrh/G7fEfRlH2QXF9enC91dzP0AzeqvXBVy3X77aCPQajFPX37qHDVKct5npnk9lUHAqfuyjkPsGwNEDlFP1tCobzo84696Dks5fi1A2Vt3W0gq3VWeix/+kgmD/+Hb38vGtjdZEEGvsQRxR2I64aQyJylKmhwQw3J5iTJzOT5nfwbRlS9ryUAJCRmkQ0VAaUxHFYEmUUidnXX60X+Sa7yzzoImLvby996T9WjYNIa0pUP3v/nuj4iIKIdrfebZz2Rj4xyv3zZQk+u3pdvWzg6LK4zR8Hx1/WY2duMmjz337Gez1/6H//5/IiKiN6CDHu3L/t6Gfu8A83P9TYmCf/YWr/cyBEWCnDw3Hkoeq1hHx08uZWN/9Cf/nMbR/cWWNgK1Zs2aNWvWDmEPngPNBVSuSpFrBOkp8+u+vyMYtIPExrEF9riu35A8gulW4cNbnGxIVDE9xVFVjDzA5o6UibzzHnuJKxvsQTbqUpbSQM/OnWXJZbbR2aFQ5LFSTnKGxls3nQJafaFoD9HrM4fzO3FMorIaqNmJg96keYlYhmHvQIeIhzHXIcr5LvVHkgfzQMNPUE6ipQw9RBr5HJ9foHql5tDXs17j19ZVZ5w+rm1mkSXcVjZlvh9//gtERNTd4vm+fllKY3pdniPfk3MwogBGTGJtRTz927eQA83zOdRmxTufbuJziFidXTn3iT10eJlhFOB4Q+7F1Y/WaTQ4mqgoSWLqdLuU01KQKL3K5Ux/RyWriH+Px+gkoyQuwzBLTuo/PJaiBKPAa6vVklzw977/t0REVJv8fSIiWjotz1qM8pUo1nlOXhsdRJCRylEHiHhcdF5Z2xDPfYy8rZ/3D/yfiChGNGuei9Xbcg93diRSPQqbKOfpT58/Rbm8zNCtNY76XnuFc5GPzwgC4+DejBFdXrskubyz57jQ3nTtaK3IftPbQ9nbGkdCV67J2J1tnpeoxPJxzWOnsrHUM6UtMq8mOBmZjlB92fOKAfpnQv1hqEr+4gLva8UJRtYMokAkAgWmD6aOQOM4ovSI9CqDIEfzs/N0bkldI55VH4IInvpu07vUfH9OCalQwBH0Avb3r3z969lQtYS8Y4FLWz76QDrPXL7Kcz93bImIiIZKGMEDsvbB5YvZax9d5vK30hILXayuSrnMBEoeZ9DFpVSRtbK7zkINOytcgrS1LXveELnqEHyMtZY81y99zSH1OHyq2QjUmjVr1qxZO4TZH1Br1qxZs2btEPbA/P8oTej2inTRqIIiXEg4hL6jILtqieHVycnmgb9EUv4SouF1pBRe9nYZ0kqhhfnRJelo8NFFhhBNw9WZhflsbHaBob20LaG6Cw1Lo/7huwKJeY7pCsIlLtt9gac8KCvlhgyzFIpCtU4yNQ6GbgJFjuqNRxkk8rDm+w7NTrsUqi42A5T7GO5EqrRPfRB4alCcySlFoUGPiQFFU/Ixllv/5muvERHR6Quggi9LGYvROi6Bvu4pJaJikeGcXld1xBnwvyOQuypq3l56liG2AkhHkSewWBwy/Dm4w3Co2xGCxQzW0bPnWVdzpjGbjb21duNA6cbDmOs4VMznqKAUS3Ig2RRAgc/7MjYY8LnuQxVrMBAIt1Lha0wBzWl417it5To/O88+L+SLm3dYZeXf/K//JxERfflL0uj6kadYIaY+K3OamrIuD1qqqhNQBNhxCx1Irl67+YlziAEnx4kih4FMVoSyT9BRXTYGR1imRURp6tAg9Wm3J2Szi2gu/eoHrM28XJLnaRIQXT3g865VJYVTRNnN8hqnIK7ckufmrXdZo/YKyiQ6Q/WMQmP5HzzL3Vh+/1EpkwLKToWczPnKJsPAy0h1tNX6v/whQ8qX3uJnSisR5ea5rMKkX+K+6GuTISQBoj4I4R4diSiKItrd2qUXP/dS9tpLX/4yERHl82YtSVxlCJ0J0lKeqjcyCmSmJEqnznaxb+5u8zVevyqQ+eom7y+VGTRnz8uzbkp7xkpv/W9e+TkREZ088yQRES02VYkLyutKIDKNhgKnX2/zb0UF+41Z60RE63u8109NLRERUV91A/rRK29QpyPQ+6eZjUCtWbNmzZq1Q9iDdWOhlJIkyYrKiYi2N1HcDU9da3GWUGC/CY+tVBYvzhRw9+DFuEpFfwWq/hMznHTX/TWHEDbwQGdfUJ0DSvA0FAeECui+EJUgzjAQn6GHovDjZ5g8E6vI4zZKLnKYIi0e4Xsczfl5Pq9iUc69O7h/Jf/fZLmcQycWc1R3xEO7eofnewPFy+NYadpW+Fx70LuNExVRw1fa3WKvvNMVb2wY8vu9lP9WK5Kk31hnD3IZEUKi7u8suns4ql3HHggxedxrTfLKwbMdGe1cpY3cG/HYuItSFdWU8yx6Ay7M8ffdWRaEYWerT1F0NBG/Q0QBxeTGEmUVPF6nRlAiVfUMCYgIeXjQuZysHxOdd9CVJo4lAi2giDsC2eXMBdFlPf8kR9ff+3PuhPKd//vVbOx3exypPvc1eX8CD9yIHzhKiNkUg29umnsuUd7iyRN4jT32dZRrEBH5RoN2kv+6gfQY7fbuzzO/X+uGEf1idY9GQ9lT1jb4nMBDoV1F0rmBMrYFEBn/+FtfzMYee/JpIiLKFYF8zYum68wj3H3kq4jKZ5pSVN9A7986CCz5gjxvZfw7UIotXZD6doGerbVkXn86zXvWAKSbVYUepRDD7e9yFKwq/qiI/SmFJrSOQI9KB5eI99lyKU87bTnnd957i4iIZmb4uZ+dkdI4Uwq1twdhE1WW5uO5P3aKI8nFCXnWVy5zCUmvizLAWenvWZpk8RwP+rr9gRxzfp7X5fqqoJzbO7wvzS9A1EHNR3eEvQcoQqi6xeTxDOYxl+MdWeOEDl+zIDKNFQKapvcf79sI1Jo1a9asWTuEPVAEmsQJDTo98hT9OkDkaSqNS77qzg4nqrPPEdvmpiq5QNlLETJm/aF46Hl4e30UzHqqj1ttgr2WChT647F4L7dQJlNTHcsdkweEF7K3LSUat6/z+7/afJmIiB49uZCNdc6xJzSCjNmJRcm7eQGkvHCpsScF6o57NPk4IiLPd6g2EdBgS+ZmYgY5CMgbbm+I5z5E7srPoXOCSlcliFBCyPXtD6R0oow85bDPczkYyhyN8bkYf03OjYio24aQQk2o47Uae/YmH2hkz4iIKojiHdxfJ1KyeD4fw6RDcqroeensEh+zz+//6U8/ysbeu7xJg+HRzHmaJhSNhxSN5byMimKpZEqDJMr0EKmZshcdKZiIKjEISyxrMhrhXgDJ2d2TKOXzX2Kq/ude5q4Sv3hFyoZu3GKvfO6OoA75CkcudfSwHCsRiHabPfYOBC/OPXYmG2s0OCKoTfAFtvaleN5DFHTiHOeahn3xs/vjo41A4zimvd09UtU35GB/yTkoWXHleueaPMfHzz5DRESnn34+G6sCbTJ5u1pFoSWTF3BM/r+rSs0cxBsO5BBjHfHheRkrlMNFvrKEMqHZuux5n3uO71u+wlHWd3/0w2zs9iqXVcTgUESBRLouOvP4ZCRKZf07jkNHFYS6DlE+SGg0FKnM117jc0xRWlhTPZND8AuG4Db4KuY6ucQR/hMvcu74zAnZP1t3eK2u7/FeklNciDOTvPa2thidefLCE9nY40/yffqP/+H/yF4zcxICBRurPT/rB1tAaVhevmfpFOeyN++AQ6PmtAiE7NFHmZcxVPyXxfkZeiUnz+unmY1ArVmzZs2atUOY/QG1Zs2aNWvWDmEPBuEmMXW7HfKVTEOxiFAXWpOlvJSJFIoMUfgI33US1zQo3m2D8KJKAKZATTewo6eanZ47wwoa9QoTSoqqO8AQyv+9XYGxvByfg1eEWkxHugI4EUNFfRBfkqEca2GGIZh2i49VUMQCBx1QRlBhikKBioIgOKhj+RDmOA75BZ8KNYENmygt8KFAExQFWmrvGUzZNMEV8kcM7dt4BIWlktz6AKUZnsew8EjBWwYSNIQULfObAkqJBVGRpumg/bf2BMIdoHNCvWEaeCu6PM6hD2LNxrYQR/ZAeOqg8fnf/kRUSjb6RMPx0UC4cZJSrx9SGEmKIoTszHiMcp6i6i5jShQwN7rzRgzoNoRKUl+RtjZWGLKdBeFkoi7N5PuAdU8+yZ1I9obSHD7n87ko6VwKkTLIFVGOomBxHzqss1CaWjot8NYYc2Y4R2Olr7uPZ7KMkpFiQR2zdH/Q1v1a4Lk0Xy9TqMo9QofnI1/mv7clS0G5Os/ZF7/EWqlNpYoWAmZNoALUVdwyM3dVRTA05uP+GdUdTxEaswlS5JQUJT8ZZK+eiQa6Ul3APvXRJSmzW1lhCNeoDnkKUsy6f5hDKrJaeveXPIQlScJdetSz9/Vv/AGPAZ73VFmY6ZKVou7QU2VcBaSR1lsM73Zal7Ox3QHWF/bNS+9K0/Gd1/l34PQphmufPyvNvccgFBVV2VAKIpMhG7nqOTPVVwPMl69Uuk4eZwh32OXn7bGaEEHfeIsV7VZvMbw7UOS4tL9HY6X+9mlmI1Br1qxZs2btEPaAEWhKvfGIKrrnJ7w9NDmgUIUoayBHOMazU2UixsPqQJ8wpwkYWdSDXoqqbGaiymSJBoqmyyXxVEx0qQkChKhnhF6UqSJZzDZBOUch9MqdW9nYEMXBvS5KVdT3eOjJubLK0VxhUREM8iUiUiHCQ1iSONTtBkSeeNmVMnthASKhsipCrtfRAaU9wF8p9+j2ERGhV2I1J9rDBRCtInhdvi9+FYAFCvKGXi9jJZTNuGoVGZ3WHEoDag3Ru93d5aiyg/tTa8o59CG8cOUmr5mL70tXhVno5M4ex7Fcme+pepU2OkejhRvHCbX2B3e9xufVH6BMJBEPd4ROKCby1OUPRju3C2JWqCLDapOjlM9/maOoE0sSpbgQCKiit+0zzz+WjZVQZK67E40I54Cb4Kh7lzcRDr56qMgXpjyhUOQos6oECXIgYng56OQqbzynSBpHYXnfo9NTtUwYhYioheerj8j83ISUVZ35LJeqHDvGJL9xKPfeg/BKNtMqaDO9WkV4QumvIo5wsshTPnivKFOOmRw4trkeIqIaSpXOnjiRjV27zlHY8i7vD6nqxuKit65Br3RZ31Hp4Jrjlis5qqtDVqeZSDPCfS6ouMoQuVKsk3xJ9vBkyMSbDjr7eCVZlzNn+N6dKUHUQumgG9GIAHvqytrtbGhyauLAXyKi8aCH8+M9vKdEN0Yg/4SmV67qTTyLPse31ngf3Lgt5zBEf9JrH77L3zcpSE860bzv0iEbgVqzZs2aNWuHsAeW8iMiChXn3EE04PvsMQ1UtLi5yQXDpsB86dRSNhYgkllAgW2g04bIEQx77F04Y/Eyc8YxMJJ2+5IrS5G78lSE3IeEnet/MvlRQr7CpBvyqu/mKGKvZ4xIdHNTojkfnu76Gr+nkpPza87lspzYw9p4TLR8i2jUEk+1Os1zXyginyjBKTWbfDu7PT7nVkvyyns7Ofzl/3uJzFECbyvL6al8j/GwjHfuqTKlAXKtSiGLAhRXR5Ap07ntGPnRFsoqxvI1tIuo+eZVPsHWjuQkxiglmqvzWnn0pEh5tQdEV9aPJuIncimhnORxibKC624PfT3Hsr57XeSMEPVNNFS/QRNdIGIrqNzhHCK78hSv72JV/NgYAhJ+wp/zJ+RzZXSxCdQ9CJELd1GVbwQViIjaQGRGOGcdnfo4BwPW5AsSWfpAJHp9HFuVkXQ7KuF9BOa7Lk1VixQqaclunxdU6QmO0BenJLK5cJojhRxWphuoXD4euwC3wZfbkZWo+EDIDqQ5TWkL8oL3iv5SJeZi1rvpqpOq9xupO1Ma9tSTj2ZjI4Sxf/3zN4mIaHNf5tLFSXgZwiPHdBwnO/+HtSQZUr9zmUgJlQQObyIbG7xernx0MxsroLwsBzRgakYiw4UpRgGzjlp1QZSwPdMQ5XIzM3IPjy0wiri2zpJ+ly9/nI0tjTl3PFKoRwfruN/nPbitSq5MBBqPgcTkJc/54QeMMBqRhJkZKUU89hSXzsxM82tT0yL0UMiX6Yev/pjux2wEas2aNWvWrB3C7A+oNWvWrFmzdgh7YAjXS4lipRvYhwpMyeHQ2VcwaBnKMwaW6LYk9DZJ/IpJTgeCtxjugwfII+wITBuALDEALLWqiD9TTYYZqmVJJBtKe4QQP040WYkh3BhEjyCnCRL8PQayHCilJAPRFnIMYezvCvHEzUUUxUeT9E8dn+JgisLcc3LOCWC1iJPzhbpAO41phg0nUNrQ7AvZprXL89za5skd9FTJRQR4G41tE6W6MgR13MDwnsLFTEeLgdJYDVJeG1UX8Lgr9zwMQbYp8/wUApnvRo4/d5r4Hj75tEAxF55i4sjSWdYsfuFFuRfLq1169ZooJz2MpWlK4zClSBFTBihD6QEWz2slIh/rG1OZOjI3I5R6jYBlhUrBx8CB+Rp0bB2ZvzFIXvGIPzfqCZQ19niONMS8vVGJCZ4AAAHGSURBVMvasM0JnrdEkR+20ZjaKFRNzQtMFQMy3G2bMiP5nCkTWFtFeZd6ZmIF7x+JpQml0YiGCrIrQt3s8bNMwFmYkBRGEd2HXM9AnrquCuePOdBDBiI1OqqpuozENQQj/hvFClKPjYKXHKw3BlkPalODkTwvcYr9Avc/9uRezR9nDePJiZtERLTTFqKcuQ4HmLpzIA3k0D1ZTIexJKVkPCRXxU4+SphqKHV76xevZGPrG/xsOXhWX3jhs9nYy5/nfWl/nyHW997+ZTbWg2bu5dt8jddv3szGBuhMZEp3CjUh8LTbIBruyTPdwxo1M2JSaERE9Srv9QunGPqdmBRC3swCNLSf5S4uTVXGkjNlOSbdp55dSt0DSlCfZjYCtWbNmjVr1g5hzoMo/TuOs0VEt37jG62dTNN0+je/7dPNzvd9m53vv3+zc/73a3a+/37tvub7gX5ArVmzZs2aNWtsFsK1Zs2aNWvWDmH2B9SaNWvWrFk7hNkfUGvWrFmzZu0QZn9ArVmzZs2atUOY/QG1Zs2aNWvWDmH2B9SaNWvWrFk7hNkfUGvWrFmzZu0QZn9ArVmzZs2atUOY/QG1Zs2aNWvWDmH/P7wz/pJuLgchAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "class_names = ['airplane','automobile','bird','cat','deer',\n", " 'dog','frog','horse','ship','truck']\n", "\n", "fig = plt.figure(figsize=(8,3))\n", "num_classes = 10\n", "for i in range(num_classes):\n", " ax = fig.add_subplot(2, 5, 1 + i, xticks=[], yticks=[])\n", " ax.set_title(class_names[i])\n", " img = next(img for img, label in cifar10 if label == i)\n", " plt.imshow(img)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torchvision.datasets.cifar.CIFAR10" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(cifar10)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "isinstance(cifar10, torch.utils.data.Dataset)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "50000" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(cifar10)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "img, label = cifar10[99]\n", "print(img)\n", "plt.imshow(img)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "print(img)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.imshow(img)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "label" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['CenterCrop',\n", " 'ColorJitter',\n", " 'Compose',\n", " 'FiveCrop',\n", " 'Grayscale',\n", " 'Lambda',\n", " 'LinearTransformation',\n", " 'Normalize',\n", " 'Pad',\n", " 'RandomAffine',\n", " 'RandomApply',\n", " 'RandomChoice',\n", " 'RandomCrop',\n", " 'RandomGrayscale',\n", " 'RandomHorizontalFlip',\n", " 'RandomOrder',\n", " 'RandomResizedCrop',\n", " 'RandomRotation',\n", " 'RandomSizedCrop',\n", " 'RandomVerticalFlip',\n", " 'Resize',\n", " 'Scale',\n", " 'TenCrop',\n", " 'ToPILImage',\n", " 'ToTensor',\n", " '__builtins__',\n", " '__cached__',\n", " '__doc__',\n", " '__file__',\n", " '__loader__',\n", " '__name__',\n", " '__package__',\n", " '__path__',\n", " '__spec__',\n", " 'functional',\n", " 'transforms']" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from torchvision import transforms\n", "dir(transforms)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([3, 32, 32])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from torchvision import transforms\n", "\n", "to_tensor = transforms.ToTensor()\n", "\n", "img, label = cifar10[99]\n", "\n", "img_t = to_tensor(img)\n", "\n", "img_t.shape" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "cifar10 = datasets.CIFAR10('data', train=True, download=False,\n", " transform=transforms.ToTensor())" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Tensor" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "img, _ = cifar10[99]\n", "type(img)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([3, 32, 32])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "img.shape" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.float32" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "img.dtype" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(tensor(0.), tensor(1.))" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "img.min(), img.max()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.imshow(img.permute(1, 2, 0))\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([3, 32, 32, 50000])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "imgs = torch.stack([img for img, _ in cifar10], dim=3)\n", "imgs.shape" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([0.4915, 0.4823, 0.4468])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "imgs.view(3, -1).mean(dim=1)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([0.2470, 0.2435, 0.2616])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "imgs.view(3, -1).std(dim=1)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Normalize(mean=(0.4915, 0.4823, 0.4468), std=(0.247, 0.2435, 0.2616))" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "transforms.Normalize((0.4915, 0.4823, 0.4468), (0.2470, 0.2435, 0.2616))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "cifar10 = datasets.CIFAR10('data', train=True, download=False,\n", " transform=transforms.Compose([\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.4915, 0.4823, 0.4468),\n", " (0.2470, 0.2435, 0.2616))\n", " ]))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "cifar10_val = datasets.CIFAR10('data', train=False, download=False,\n", " transform=transforms.Compose([\n", " transforms.ToTensor(),\n", " transforms.Normalize((0.4915, 0.4823, 0.4468),\n", " (0.2470, 0.2435, 0.2616))\n", " ]))" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "img, _ = cifar10[99]\n", "\n", "plt.imshow(img.permute(1, 2, 0))\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "label_map = {0: 0, 2: 1}\n", "cifar2 = [(img, label_map[label]) for img, label in cifar10 if label in [0, 2]]\n", "cifar2_val = [(img, label_map[label]) for img, label in cifar10_val if label in [0, 2]]" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "import torch.nn as nn\n", "\n", "model = nn.Sequential(\n", " nn.Linear(3072, 512),\n", " nn.Tanh(),\n", " nn.Linear(512, 2))" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "def softmax(x):\n", " return torch.exp(x) / torch.exp(x).sum()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([0.0900, 0.2447, 0.6652])" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = torch.tensor([1.0, 2.0, 3.0])\n", "\n", "softmax(x)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor(1.)" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "softmax(x).sum()" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[0.0900, 0.2447, 0.6652],\n", " [0.0900, 0.2447, 0.6652]])" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import torch\n", "import torch.nn as nn\n", "\n", "torch.manual_seed(123)\n", "\n", "softmax = nn.Softmax(dim=1)\n", "\n", "x = torch.tensor([[1.0, 2.0, 3.0],\n", " [1.0, 2.0, 3.0]])\n", "\n", "softmax(x)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "model = nn.Sequential(\n", " nn.Linear(3072, 512),\n", " nn.Tanh(),\n", " nn.Linear(512, 2),\n", " nn.Softmax(dim=1))" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD8CAYAAAC4nHJkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAGXFJREFUeJztnXt4VeWVxt8lAUEDRQhICtiAYos3Lg14G6yCqPg4g1i1OtWh1hHt6Iyd6Uyljq20tR3tU7XaUgWrI/YRFeu99YYpLVQZJCImYqxcREECJGKEiBhD1vxxDhriXisn+5yzT9Lv/T1PniTrzbf3OvucN/ucvfa3PlFVEELCY59CJ0AIKQw0PyGBQvMTEig0PyGBQvMTEig0PyGBQvMTEig0PyGBQvMTEihF2QwWkdMA3AKgG4DfqOr13t/3LhHtXxatvfWGM3Df6PA+Pe0h3aWbqfXaz37YBxSXmFofDIyMFzn/Qxux3dQ27lhjasW97TsvP2cqQHcjvssZYxxeAP7Zwbs3dLcR398Zkw8ajHiTM+ZD8ygC3qPevqPZ1Jo+dDa509Es3jfiuwFtUclkExL39l4R6QbgDQCTAWwEsBzA+ar6mjWmrFz0+5XR2j+f4uxsWHS4z0jbxAOKbIuMPqq/qU2bcLGpTZbLI+MDnZf0C3jO1L5bcYapHTvpI1OzRwEDjPhqZ4xxeAEAxY7m/UNpNOLjnTFxaXG0J4z4emdMDQabWjNsgz9XscXU3qpxdviyo1k8acTrAf04M/Nn87Z/PIA1qrpOVZsA3A9gahbbI4QkSDbmHwxgQ6vfN6ZjhJAuQDbmj3pr8ZnPECIyQ0QqRaRyR10WeyOE5JRszL8RwNBWvw8BsKntH6nqXFUtV9Xy3tYHUkJI4mRj/uUARojIMBHpAeA8AI/nJi1CSL6JXepT1WYRuQLAM0iV+u5S1VXemG5wrh5/1Rl4WXR4+0j7yuv2I981tTc329qaF+fY2sTow3X+2JPMMcc5hblfT+praqthXzk2CiYA7CvwQ5wx9lEE6h3Nzj7uVf3hjnaUqVRiuan9z2PvRMaLh0aGU5TYj7riVrsK02OMs007Rbse6WE90R0o3mVV51fVJ2EXHQghnRje4UdIoND8hAQKzU9IoND8hAQKzU9IoGR1tb+jbAHwS0ObdKk9rsKoD44a49VW7HLeK99729YeX2drU74TGa+eZZehJo+vMjWvwuNMWMRGR7MqSlOcMYMc7VhH64MDHdU6/l5h0S6jvYAzTW3hY3Y5ddmZ86KFs+wsjv6VnQeOtKWmF20Nbzqa5cJFzpgcwDM/IYFC8xMSKDQ/IYFC8xMSKDQ/IYGS6NX+D94Bnr8mWjv4Onvc5V+Pjs9+yOl/5LVNGudo3rzEp6LDSy+3r+j/vbM572r/TY7mMdmIe9fYvTZefdz+LNE9DQHgMuPRTcah5phxTjfBOqehWPXQC0wNMK72OwfkS6W21jDB1v7qXdF3tlmo2TE88xMSKDQ/IYFC8xMSKDQ/IYFC8xMSKDQ/IYGSaKkPmwH8JFpa6wyb/Q+G4M1+cRrMHeysDrTWKxHOjw5vchrdfWOxsz0n/4Exl7axFhuzSoAAcKi7AJi97NkfPtus+RN2GU/AMNiTsZbC7oV4ntfkcawtmY+8bKE5YqG55hSwabazK2/G1QZHs5Y3yjM88xMSKDQ/IYFC8xMSKDQ/IYFC8xMSKDQ/IYGSValPRNYD2AFgN4BmVS2PvbF7Hc0qvzn91PBNW2p2lmo6+le2tsxaImm1k4eHM4Ow8WZb+5eDbM1aCHmJk0Y13je1Mkdb6WxznNHf7z38yRxzH86xNxi1JnRGnB0dbt7fHLFp9qP25ryZewc4WidcoToXdf6TVNVb0o0Q0gnh235CAiVb8yuAZ0XkJRGZkYuECCHJkO3b/uNVdZOIDASwUEReV9W9bmhN/1PgPwZCOhlZnflVdVP6+1YAjyBiWXZVnauq5VldDCSE5JzY5heR/UWk956fAZwC4NVcJUYIyS+iqvEGigxH6mwPpD4+zFdVY87eJ2Pi7ezHRvweZ4y3zpQzm+6Lc2ztEiN+hLOreqcB5owX3zG1ndX2NkddbGvWBDFv1uTxjvYtR7NmEAJAKaLrkdXYbY65oMqpYY5yOmfiZ44WA++BTXQ0u8cosNTRrBl/MWf7qWpGhdHYn/lVdR2AUXHHE0IKC0t9hAQKzU9IoND8hAQKzU9IoND8hARK7FJfrJ3FLfVNMeK9nTHeTLv3HM1qFgoAJxhxZ+2/rzrVK6fHKO5c4YheM0ij8efhzlpxzlw6t4zpTI5EmRGvQX9zzIkVh9kbPNmaUgkAy23JKr+NdDZ3rqN5DV5rHc1Y5zEfZFrq45mfkECh+QkJFJqfkECh+QkJFJqfkEBJdrkuDy+TNUb8n2Lua4GjPexo1gpPZfaQhy53tucsybWPvaoVBjnLU40w4hc6aRziaB5eWzpLa8a79qCFh8ZL5G7nar/B1Om2NsgZN+dSR7RXAOuU8MxPSKDQ/IQECs1PSKDQ/IQECs1PSKDQ/IQESucp9TU72g4j7k2y8HB6+LlHZLIR9yYYbXa0eU4aV9rahO7ONg28JZWsh9UecQ6/Nz0HN9iTfuD0Qrx9+mmmdgiejox7x2O9o7kDvddwJ4RnfkICheYnJFBofkICheYnJFBofkICheYnJFDaLfWJyF0AzgCwVVWPSMf6AXgAqfls6wGcq6peZ7zssMpl850xzqw4c+ob4Pf+O8CIe7MLvRmEznJMTU6fvvXDbW2IEe+JA80xT2GLqXl9Bp9wNGsipo+3N3u9qzKnh5/1lHn5NcOeXTjqyjdM7ZUjnY3+0NGs16pXkh5gxP/sjGlDJmf+uwG0LaTOBFChqiMAVKR/J4R0Ido1v6ouBrCtTXgqPr1FZR6AM3OcFyEkz8T9zH+gqtYCQPr7wNylRAhJgrzf3isiMwDMyPd+CCEdI+6Zf4uIlAJA+vtW6w9Vda6qlqtqecx9EULyQFzzPw5gTxe06QAey006hJCkaHe5LhG5D8CJAEoAbAFwLYBHkSpiHQTgbQDnqGrbi4JR20pubTAPr0OjNwvPKuV4H2p6OZoznc5b5usc7O9sNHp9qhKn1FePKlP7P2dPv/jQEW804vc4Y1b/xtZG2p1Qv/baR6Y2wYh/CUeZY8bhFlNrxhxTK4L9pC3Hwaa22Tj+jbDLiq/r2sj4/HEbsaXyo4yW62r3M7+qnm9IkzLZASGkc8I7/AgJFJqfkECh+QkJFJqfkECh+QkJlM7TwLOz4M2kqjbi33PG/NyWpjvlPGs2GgCsh93ossQoKRU5T/VKZ1+/8O7g+KOjWY0uvVmTWGdLk+0npgF2qc+q3BY75c0ifNfUSvG2qR1q1jeBSfi6qVmtULfhHXNEPzk5Mr4Emd9LxzM/IYFC8xMSKDQ/IYFC8xMSKDQ/IYFC8xMSKF271Odl762b1uBo7mJyBk4jTr+0Zdf6ijDN2Z3dKXKIMVutHu+aY5asMCVg6UJby/m6dT81laMP2NfU/t3ZopWi18BzidMQ1Ht5/AgXmNpwZ5vA5yOjy/GBOeJUnORsLzN45ickUGh+QgKF5ickUGh+QgKF5ickULr21f5YV5QR74p+XKJb6qWk9+yr2x/uOs/UDinpZm/UeEaLnIrEJWPbLsj0KReNtcetsZs2o/qZ6Ek6f1hwg71BPGoqE5rtyTunftJL9rPc+MnaMnsTZyUsAKh1tDcdbYjTF9B6arz+iZUf3h0Zr23xmlDuDc/8hAQKzU9IoND8hAQKzU9IoND8hAQKzU9IoLRb6hORuwCcAWCrqh6Rjs0CcAmAuvSfXa2qT+YryU6PU87r1/gDU3twtr2E04C+djmvYYS9v0aj0rNmtV0qKxthT5rp2dfe14SJ9srsg46L1p4660pzTMvDdqlvqVNHe80o5wHAaCM+DIPNMRuc3nm9Hcs0w37O/tfpMzjEiE8xRwA9e0VP4Jq/z/vOqL3J5Mx/N4CoQvDNqjo6/RWu8QnporRrflVdDKDdRTgJIV2LbD7zXyEiVSJyl4h4naYJIZ2QuOa/DcDBSH2kqoW9IDNEZIaIVIpIZcx9EULyQCzzq+oWVd2tqi0A7gAw3vnbuaparqqZryZACMk7scwvIqWtfp0G4NXcpEMISYpMSn33ATgRQImIbARwLYATRWQ0AAWwHsCleczR5PNldolq2AnmmxEU7bIf9p8XLOp4IsP+w5S2vTnBHlf3liltHbG/qdVutstU26rfiBaqVpljVjXaveLQaJeOHho3xtR6jIkuY7Y87PQEdHjeWioNwK+dcb2NeJ1TzhvpbG+yM5W0r6N5bSOtjozj4c2AvCwy2gtfccbsTbvmV9XzI8J3ZrwHQkinhHf4ERIoND8hgULzExIoND8hgULzExIoiTbwHNz/8/jXqdElip4n2GWjnmMOi4yfNGy4OabYqvHAnYSHswZdYWoVt94fLVjlNQCofttJxC7nod5eQ2tb3YHOuOjGmXBKW0B/R3PW8lpiz1hsWmJt83POvhycUp/Xj/VpI772OmeQ16XTaWh66cW29hdnk1b+xzkNTe1EnLJtG3jmJyRQaH5CAoXmJyRQaH5CAoXmJyRQaH5CAiXRUt+gslJcdef3k9xlh6mpdxa1w7tG/PfxdubtqsYrv51tS32PjY43OGVFOOVIZz0+H+tYWfH4eGvamS9w75XvTRN0pvzNcZqdmlP3AKwaFh1/ovtSc8xPMDkyvt1JoS088xMSKDQ/IYFC8xMSKDQ/IYFC8xMSKIle7e8K1Fd7kymSxLsqPseWGqw+cnZ/OcCYsNSZcF6pqx5zxp0QHf7yTHvISxuc7RnLoQEAvHGnd3zcSxvtIbcZj6sjtRme+QkJFJqfkECh+QkJFJqfkECh+QkJFJqfkEDJZLmuoQDuATAIQAuAuap6i4j0A/AAgDKkluw6V1Xfy1+qHaMJm0yth1NGK6q2l6dqyiqjpPgbXUxphqMNdTSjwlntvFK/6PT367vD1mqcMmDPXra21eg3ebjd1hK7PoyOa4s9pi2ZnPmbAXxHVUcCOAbA5SJyGICZACpUdQSAivTvhJAuQrvmV9VaVV2R/nkHgBoAgwFMBTAv/WfzAJyZryQJIbmnQ5/5RaQMwBgAywAcqKq1QOofBICBuU6OEJI/Mja/iBQDeAjAt1U1454BIjJDRCpFpLKuri5OjoSQPJCR+UWkO1LGv1dVH06Ht4hIaVovhXFbsarOVdVyVS0fMGBALnImhOSAds0vIoLUJeQaVb2plfQ4gOnpn6cD8KZXEEI6GZnM6jsewIUAqkVkZTp2NYDrASwQkYuRagJ3Tn5SBLYZ8UZYS1MBDfqcqQ3CFlPbmWlSJFGOnm1ry56xtT7GqlbeC7/WaWl40UFHmdq0g6pMzZtTeY0x7JhJ9hirJeBrHbiK1675VfUvAMSQnfQIIZ0Z3uFHSKDQ/IQECs1PSKDQ/IQECs1PSKB0iQae/Yx4MYabYzb/8R1Te6p+iantV2znsdNbXotkz5SY4162pQNOjY5700+nHWRr52BfU+vpbHORox0/MTruTVa874Xo+LYOvEZ55ickUGh+QgKF5ickUGh+QgKF5ickUGh+QgKlS5T64lAybLCplU20OyOOqbbLgM//JHpu1pevsvN4yZb82tBqR5vvbTRBjnW0pTG2d40tTcbnTG30TPtlvMZo1rpc7X3tsqaxAbgJy03Nq1Q6y+5hgrG/OifHDW9Gx5s60GWWZ35CAoXmJyRQaH5CAoXmJyRQaH5CAiXRq/0tsHvkNRrLDwFAX2OpoyJ8YI4ZPtye9NO4Y7GpWVf0PWrmOOLpjuZ1Mh/R4TSSpyHGmCGO5iyFdd1Eexk1jHS2aVQQ9nEmcD1gXEkHADgTZ54+ztZOczY5wYg3OFWHhrOi40/d6OyoDTzzExIoND8hgULzExIoND8hgULzExIoND8hgdJuqU9EhgK4B8AgpKp1c1X1FhGZBeASfFqwulpVn/S2tQ+A/Qyt3ikb9TBKfVvxe3PMgw+cZ2pX2JL737DFiO/0Sl5xJ+EsjDkuSTpeFQWM5xIA8A1H2+xoXoO88dHhFq+Jnzcp6VxbWvtzW5ttzxfDGGOVy4tgT06r7hXdo7JbLpfrQuop/o6qrhCR3gBeEpE9L82bVdV5yISQzkoma/XVAqhN/7xDRGoA518SIaRL0KHP/CJSBmAMgGXp0BUiUiUid4nIATnOjRCSRzI2v4gUA3gIwLdVdTuA2wAcDGA0Uu8MIm8sFJEZIlIpIpV1dd79rISQJMnI/CLSHSnj36uqDwOAqm5R1d2q2gLgDhiXVlR1rqqWq2r5gAEDcpU3ISRL2jW/iAiAOwHUqOpNreKlrf5sGoBXc58eISRfZHK1/3gAFwKoFpGV6djVAM4XkdEAFMB6AJe2t6FG7MILqInUajesNcdVvxYd/+0iu2b3wLPtZRONVc7rVPybo92a431da0s9jrS1prMNwetNGBen/GbOFKx3xixwNK+YHXM5t18aM1qPNMp5AHBHVXT8Y2d2bFsyudr/FwBRkwvdmj4hpHPDO/wICRSan5BAofkJCRSan5BAofkJCZREG3hu/7geC2vvjtSqX7jXHNe4OrrksehlZ2deE8YuzqSv2VpFrkt982ypyZvNOM6I26tdxWeYow014t1j7itmOc9ryPqK8Tp+xGkIWmI8rroemafEMz8hgULzExIoND8hgULzExIoND8hgULzExIoiZb6PvpgG1a/GF3SK+ptz2AqMZowTnDWaKv4L1vrY0vY7mgWp06xtWeeirFBAJOsUhmAMWNsrcKa8Re3BLje0fo6mlXa8pp+eqVbjziNRE9ytH90tLgNWb3ZjMZaj9c7axeOOjU6/l63jDPimZ+QUKH5CQkUmp+QQKH5CQkUmp+QQKH5CQmUZEt973+MNU9Gl/SKrdlXADYaWQ5yymFTH7W1eqd5Y4OTx67F0fGlccs/DhXO7LeKmc5Aozv6frfbQ3bOcrbnNMc8/Ou2dohRnu3p7OoRY806AGjyOkYOcTTrud7ljHFKyHnBKnE6B6vamMnY4j2uNvDMT0ig0PyEBArNT0ig0PyEBArNT0igtHu1X0R6AlgMYN/03/9OVa8VkWEA7gfQD8AKABeqapO3rf49gYuMCR+vO1fZrfkjzc6i4IPG2trmFbZW41y5b4lch7gAeH3k7okO73T67X35x7a2wVlYedUNjnZKdHw/Z1LST6faWo2jPae29pa19FatPQaljuZUmGL393uv40OKjErAxx04nWfypx8BmKiqo5Bajvs0ETkGwA0AblbVEUilf3HmuyWEFJp2za8p9vxP657+UgATAfwuHZ8H4My8ZEgIyQsZvUkQkW7pFXq3AlgIYC2ABlXdM5N6I4DB+UmREJIPMjK/qu5W1dFI3Us1HtH3QEV+8hKRGSJSKSKVjXE/ExFCck6HrvaragOAPwE4BkBfEdlzwXAIgE3GmLmqWq6q5cXF2aRKCMkl7ZpfRAaISN/0z70AnAygBsAiAGen/2w6AOfObEJIZ0NUnToJABE5CqkLet2Q+mexQFV/JCLD8Wmp72UAF6jqR962RpeKPmvUBDZeta857r4bozc735ns0eBMzujrlHkaFtraTlvKPSWO5pWbYvYMNJngaM4kkj5GqW+7s4zaF75pa2dMsjVjLhMA4NZ10fFttziDnDIxnNKnu0Scl+TDRtzrTWhN1JoB6OsqzshPaLfOr6pVAD5TnVXVdUh9/ieEdEF4hx8hgULzExIoND8hgULzExIoND8hgdJuqS+nOxOpA/BW+tcS2B3WkoR57A3z2JuulscXVNUrLH5Coubfa8cilapaXpCdMw/mwTz4tp+QUKH5CQmUQpp/bgH33RrmsTfMY2/+ZvMo2Gd+Qkhh4dt+QgKlIOYXkdNE5K8iskZEvMWn8p3HehGpFpGVIlKZ4H7vEpGtIvJqq1g/EVkoIqvT3532pHnNY5aIvJM+JitF5PQE8hgqIotEpEZEVonIlel4osfEySPRYyIiPUXkRRF5JZ3HD9PxYSKyLH08HhCRHlntSFUT/UJqavBaAMMB9ADwCoDDks4jnct6ACUF2O8JSE0cfbVV7GcAZqZ/ngnghgLlMQvAfyZ8PEoBjE3/3BvAGwAOS/qYOHkkekwACIDi9M/dASxDqoHOAgDnpeO3A/hWNvspxJl/PIA1qrpOU62+7wfgNGb+20NVFwPY1iY8Fam+CUBCDVGNPBJHVWtVdUX65x1INYsZjISPiZNHomiKvDfNLYT5BwPY0Or3Qjb/VADPishLIjKjQDns4UBVrQVSL0IAAwuYyxUiUpX+WJD3jx+tEZEypPpHLEMBj0mbPICEj0kSTXMLYf6oLiOFKjkcr6pjAUwBcLmInFCgPDoTtwE4GKk1GmoBJLZUiYgUA3gIwLdVdXtS+80gj8SPiWbRNDdTCmH+jQBar89jNv/MN6q6Kf19K4BHUNjORFtEpBQA0t+3FiIJVd2SfuG1ALgDCR0TEemOlOHuVdU9ja0SPyZReRTqmKT33eGmuZlSCPMvBzAifeWyB4DzADyedBIisr+I9N7zM4BTALzqj8orjyPVCBUoYEPUPWZLMw0JHBMREQB3AqhR1ZtaSYkeEyuPpI9JYk1zk7qC2eZq5ulIXUldC+C/C5TDcKQqDa8AWJVkHgDuQ+rt48dIvRO6GEB/ABUAVqe/9ytQHr8FUA2gCinzlSaQx98h9Ra2CsDK9NfpSR8TJ49EjwmAo5BqiluF1D+aH7R6zb4IYA2ABwHsm81+eIcfIYHCO/wICRSan5BAofkJCRSan5BAofkJCRSan5BAofkJCRSan5BA+X+oAC6reFaYfAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "img, _ = cifar2[0]\n", "\n", "plt.imshow(img.permute(1, 2, 0))\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "img_batch = img.view(-1).unsqueeze(0)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[0.3700, 0.6300]], grad_fn=)" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "out = model(img_batch)\n", "out" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([1])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "_, index = torch.max(out, dim=1)\n", "\n", "index" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[0., 1.]])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "softmax = nn.Softmax(dim=1)\n", "\n", "log_softmax = nn.LogSoftmax(dim=1)\n", "\n", "x = torch.tensor([[0.0, 104.0]])\n", "\n", "softmax(x)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[-inf, 0.]])" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "torch.log(softmax(x))" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[-104., 0.]])" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "log_softmax(x)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([[0., 1.]])" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "torch.exp(log_softmax(x))" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "model = nn.Sequential(\n", " nn.Linear(3072, 512),\n", " nn.Tanh(),\n", " nn.Linear(512, 2),\n", " nn.LogSoftmax(dim=1))" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "loss = nn.NLLLoss()" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor(0.6509, grad_fn=)" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "img, label = cifar2[0]\n", "\n", "out = model(img.view(-1).unsqueeze(0))\n", "\n", "loss(out, torch.tensor([label]))" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch: 0, Loss: 6.085078\n", "Epoch: 1, Loss: 7.642984\n", "Epoch: 2, Loss: 7.857845\n", "Epoch: 3, Loss: 10.936703\n", "Epoch: 4, Loss: 5.475904\n", "Epoch: 5, Loss: 4.957893\n", "Epoch: 6, Loss: 6.895187\n", "Epoch: 7, Loss: 10.755869\n", "Epoch: 8, Loss: 12.918125\n", "Epoch: 9, Loss: 4.106812\n", "Epoch: 10, Loss: 6.995234\n", "Epoch: 11, Loss: 13.307779\n", "Epoch: 12, Loss: 11.295286\n", "Epoch: 13, Loss: 11.715748\n", "Epoch: 14, Loss: 5.716065\n", "Epoch: 15, Loss: 12.081475\n", "Epoch: 16, Loss: 13.451443\n", "Epoch: 17, Loss: 7.890855\n", "Epoch: 18, Loss: 9.953497\n", "Epoch: 19, Loss: 8.284361\n", "Epoch: 20, Loss: 0.169342\n", "Epoch: 21, Loss: 10.418673\n", "Epoch: 22, Loss: 15.180997\n", "Epoch: 23, Loss: 9.269197\n", "Epoch: 24, Loss: 7.858950\n", "Epoch: 25, Loss: 13.322937\n", "Epoch: 26, Loss: 11.278272\n", "Epoch: 27, Loss: 5.976104\n", "Epoch: 28, Loss: 17.907284\n", "Epoch: 29, Loss: 1.840534\n", "Epoch: 30, Loss: 11.822458\n", "Epoch: 31, Loss: 5.583863\n", "Epoch: 32, Loss: 8.620731\n", "Epoch: 33, Loss: 14.190363\n", "Epoch: 34, Loss: 13.488304\n", "Epoch: 35, Loss: 10.535601\n", "Epoch: 36, Loss: 8.254050\n", "Epoch: 37, Loss: 0.261973\n", "Epoch: 38, Loss: 3.067056\n", "Epoch: 39, Loss: 4.871025\n", "Epoch: 40, Loss: 18.584633\n", "Epoch: 41, Loss: 13.785204\n", "Epoch: 42, Loss: 9.089006\n", "Epoch: 43, Loss: 6.186524\n", "Epoch: 44, Loss: 6.467283\n", "Epoch: 45, Loss: 17.263308\n", "Epoch: 46, Loss: 12.370136\n", "Epoch: 47, Loss: 16.243193\n", "Epoch: 48, Loss: 11.944864\n", "Epoch: 49, Loss: 2.639148\n", "Epoch: 50, Loss: 8.317636\n", "Epoch: 51, Loss: 3.065086\n", "Epoch: 52, Loss: 6.468037\n", "Epoch: 53, Loss: 17.549107\n", "Epoch: 54, Loss: 13.484421\n", "Epoch: 55, Loss: 9.103813\n", "Epoch: 56, Loss: 11.152215\n", "Epoch: 57, Loss: 0.192421\n", "Epoch: 58, Loss: 16.463699\n", "Epoch: 59, Loss: 13.476598\n", "Epoch: 60, Loss: 15.396954\n", "Epoch: 61, Loss: 16.937923\n", "Epoch: 62, Loss: 9.423496\n", "Epoch: 63, Loss: 2.592801\n", "Epoch: 64, Loss: 4.887858\n", "Epoch: 65, Loss: 0.539292\n", "Epoch: 66, Loss: 13.283802\n", "Epoch: 67, Loss: 6.153891\n", "Epoch: 68, Loss: 2.114802\n", "Epoch: 69, Loss: 1.858715\n", "Epoch: 70, Loss: 6.796784\n", "Epoch: 71, Loss: 0.656889\n", "Epoch: 72, Loss: 9.981268\n", "Epoch: 73, Loss: 17.885258\n", "Epoch: 74, Loss: 1.237922\n", "Epoch: 75, Loss: 2.207324\n", "Epoch: 76, Loss: 8.979786\n", "Epoch: 77, Loss: 12.604208\n", "Epoch: 78, Loss: 9.154669\n", "Epoch: 79, Loss: 12.818685\n", "Epoch: 80, Loss: 0.981717\n", "Epoch: 81, Loss: 0.101931\n", "Epoch: 82, Loss: 9.648873\n", "Epoch: 83, Loss: 8.516686\n", "Epoch: 84, Loss: 5.563206\n", "Epoch: 85, Loss: 8.263742\n", "Epoch: 86, Loss: 4.537128\n", "Epoch: 87, Loss: 2.518454\n", "Epoch: 88, Loss: 2.902316\n", "Epoch: 89, Loss: 7.178005\n", "Epoch: 90, Loss: 0.373539\n", "Epoch: 91, Loss: 12.102324\n", "Epoch: 92, Loss: 9.976801\n", "Epoch: 93, Loss: 8.617476\n", "Epoch: 94, Loss: 13.540915\n", "Epoch: 95, Loss: 2.964375\n", "Epoch: 96, Loss: 7.133181\n", "Epoch: 97, Loss: 16.373030\n", "Epoch: 98, Loss: 0.624338\n", "Epoch: 99, Loss: 12.166788\n" ] } ], "source": [ "import torch\n", "import torch.nn as nn\n", "import torch.optim as optim\n", "\n", "model = nn.Sequential(\n", " nn.Linear(3072, 512),\n", " nn.Tanh(),\n", " nn.Linear(512, 2),\n", " nn.LogSoftmax(dim=1))\n", "\n", "learning_rate = 1e-2\n", "\n", "optimizer = optim.SGD(model.parameters(), lr=learning_rate)\n", "\n", "loss_fn = nn.NLLLoss()\n", "\n", "n_epochs = 100\n", "\n", "for epoch in range(n_epochs):\n", " for img, label in cifar2:\n", " out = model(img.view(-1).unsqueeze(0))\n", " loss = loss_fn(out, torch.tensor([label]))\n", " \n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", "\n", " print(\"Epoch: %d, Loss: %f\" % (epoch, float(loss)))" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "train_loader = torch.utils.data.DataLoader(cifar2, batch_size=64, shuffle=True)" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch: 0, Loss: 0.379931\n", "Epoch: 1, Loss: 0.510971\n", "Epoch: 2, Loss: 0.447792\n", "Epoch: 3, Loss: 0.653534\n", "Epoch: 4, Loss: 0.447541\n", "Epoch: 5, Loss: 0.291345\n", "Epoch: 6, Loss: 0.486947\n", "Epoch: 7, Loss: 0.270207\n", "Epoch: 8, Loss: 0.547912\n", "Epoch: 9, Loss: 0.238432\n", "Epoch: 10, Loss: 0.257918\n", "Epoch: 11, Loss: 0.356446\n", "Epoch: 12, Loss: 0.538808\n", "Epoch: 13, Loss: 0.226758\n", "Epoch: 14, Loss: 0.299214\n", "Epoch: 15, Loss: 0.311655\n", "Epoch: 16, Loss: 0.138688\n", "Epoch: 17, Loss: 0.289396\n", "Epoch: 18, Loss: 0.329703\n", "Epoch: 19, Loss: 0.491818\n", "Epoch: 20, Loss: 0.121620\n", "Epoch: 21, Loss: 0.239407\n", "Epoch: 22, Loss: 0.256800\n", "Epoch: 23, Loss: 0.362643\n", "Epoch: 24, Loss: 0.146391\n", "Epoch: 25, Loss: 0.224057\n", "Epoch: 26, Loss: 0.317490\n", "Epoch: 27, Loss: 0.242224\n", "Epoch: 28, Loss: 0.189765\n", "Epoch: 29, Loss: 0.247376\n", "Epoch: 30, Loss: 0.152678\n", "Epoch: 31, Loss: 0.370835\n", "Epoch: 32, Loss: 0.170147\n", "Epoch: 33, Loss: 0.153687\n", "Epoch: 34, Loss: 0.224271\n", "Epoch: 35, Loss: 0.091529\n", "Epoch: 36, Loss: 0.133091\n", "Epoch: 37, Loss: 0.123274\n", "Epoch: 38, Loss: 0.120532\n", "Epoch: 39, Loss: 0.040173\n", "Epoch: 40, Loss: 0.077782\n", "Epoch: 41, Loss: 0.119338\n", "Epoch: 42, Loss: 0.207575\n", "Epoch: 43, Loss: 0.036836\n", "Epoch: 44, Loss: 0.031540\n", "Epoch: 45, Loss: 0.073133\n", "Epoch: 46, Loss: 0.129386\n", "Epoch: 47, Loss: 0.092641\n", "Epoch: 48, Loss: 0.117379\n", "Epoch: 49, Loss: 0.246189\n", "Epoch: 50, Loss: 0.077856\n", "Epoch: 51, Loss: 0.225766\n", "Epoch: 52, Loss: 0.092543\n", "Epoch: 53, Loss: 0.174685\n", "Epoch: 54, Loss: 0.207113\n", "Epoch: 55, Loss: 0.109654\n", "Epoch: 56, Loss: 0.086468\n", "Epoch: 57, Loss: 0.230137\n", "Epoch: 58, Loss: 0.095007\n", "Epoch: 59, Loss: 0.045218\n", "Epoch: 60, Loss: 0.051149\n", "Epoch: 61, Loss: 0.053290\n", "Epoch: 62, Loss: 0.069704\n", "Epoch: 63, Loss: 0.060160\n", "Epoch: 64, Loss: 0.063453\n", "Epoch: 65, Loss: 0.040084\n", "Epoch: 66, Loss: 0.057160\n", "Epoch: 67, Loss: 0.048737\n", "Epoch: 68, Loss: 0.143186\n", "Epoch: 69, Loss: 0.022943\n", "Epoch: 70, Loss: 0.072831\n", "Epoch: 71, Loss: 0.047167\n", "Epoch: 72, Loss: 0.079771\n", "Epoch: 73, Loss: 0.026133\n", "Epoch: 74, Loss: 0.023044\n", "Epoch: 75, Loss: 0.009115\n", "Epoch: 76, Loss: 0.034258\n", "Epoch: 77, Loss: 0.026321\n", "Epoch: 78, Loss: 0.020228\n", "Epoch: 79, Loss: 0.041864\n", "Epoch: 80, Loss: 0.015119\n", "Epoch: 81, Loss: 0.065924\n", "Epoch: 82, Loss: 0.028201\n", "Epoch: 83, Loss: 0.028321\n", "Epoch: 84, Loss: 0.016032\n", "Epoch: 85, Loss: 0.052133\n", "Epoch: 86, Loss: 0.019488\n", "Epoch: 87, Loss: 0.017666\n", "Epoch: 88, Loss: 0.030908\n", "Epoch: 89, Loss: 0.041762\n", "Epoch: 90, Loss: 0.015059\n", "Epoch: 91, Loss: 0.013321\n", "Epoch: 92, Loss: 0.015525\n", "Epoch: 93, Loss: 0.031511\n", "Epoch: 94, Loss: 0.020010\n", "Epoch: 95, Loss: 0.018195\n", "Epoch: 96, Loss: 0.014210\n", "Epoch: 97, Loss: 0.022998\n", "Epoch: 98, Loss: 0.006648\n", "Epoch: 99, Loss: 0.011917\n" ] } ], "source": [ "import torch\n", "import torch.nn as nn\n", "import torch.optim as optim\n", "\n", "train_loader = torch.utils.data.DataLoader(cifar2, batch_size=64, shuffle=True)\n", "\n", "model = nn.Sequential(\n", " nn.Linear(3072, 128),\n", " nn.Tanh(),\n", " nn.Linear(128, 2),\n", " nn.LogSoftmax(dim=1))\n", "\n", "learning_rate = 1e-2\n", "\n", "optimizer = optim.SGD(model.parameters(), lr=learning_rate)\n", "\n", "loss_fn = nn.NLLLoss()\n", "\n", "n_epochs = 100\n", "\n", "for epoch in range(n_epochs):\n", " for imgs, labels in train_loader:\n", " outputs = model(imgs.view(imgs.shape[0], -1))\n", " loss = loss_fn(outputs, labels)\n", "\n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", "\n", " print(\"Epoch: %d, Loss: %f\" % (epoch, float(loss)))" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch: 0, Loss: 0.326693\n", "Epoch: 1, Loss: 0.394001\n", "Epoch: 2, Loss: 0.328502\n", "Epoch: 3, Loss: 0.178092\n", "Epoch: 4, Loss: 0.364719\n", "Epoch: 5, Loss: 0.454674\n", "Epoch: 6, Loss: 0.548658\n", "Epoch: 7, Loss: 0.352326\n", "Epoch: 8, Loss: 0.636690\n", "Epoch: 9, Loss: 0.390800\n", "Epoch: 10, Loss: 0.355435\n", "Epoch: 11, Loss: 0.222640\n", "Epoch: 12, Loss: 0.202111\n", "Epoch: 13, Loss: 0.172411\n", "Epoch: 14, Loss: 0.271181\n", "Epoch: 15, Loss: 0.219212\n", "Epoch: 16, Loss: 0.613340\n", "Epoch: 17, Loss: 0.204373\n", "Epoch: 18, Loss: 0.314177\n", "Epoch: 19, Loss: 0.236539\n", "Epoch: 20, Loss: 0.180212\n", "Epoch: 21, Loss: 0.297169\n", "Epoch: 22, Loss: 0.147050\n", "Epoch: 23, Loss: 0.395495\n", "Epoch: 24, Loss: 0.217830\n", "Epoch: 25, Loss: 0.346799\n", "Epoch: 26, Loss: 0.122175\n", "Epoch: 27, Loss: 0.310462\n", "Epoch: 28, Loss: 0.117975\n", "Epoch: 29, Loss: 0.108739\n", "Epoch: 30, Loss: 0.289741\n", "Epoch: 31, Loss: 0.162111\n", "Epoch: 32, Loss: 0.343498\n", "Epoch: 33, Loss: 0.067240\n", "Epoch: 34, Loss: 0.145010\n", "Epoch: 35, Loss: 0.326151\n", "Epoch: 36, Loss: 0.075940\n", "Epoch: 37, Loss: 0.142854\n", "Epoch: 38, Loss: 0.160554\n", "Epoch: 39, Loss: 0.324590\n", "Epoch: 40, Loss: 0.072031\n", "Epoch: 41, Loss: 0.051867\n", "Epoch: 42, Loss: 0.088255\n", "Epoch: 43, Loss: 0.124502\n", "Epoch: 44, Loss: 0.222815\n", "Epoch: 45, Loss: 0.123690\n", "Epoch: 46, Loss: 0.098991\n", "Epoch: 47, Loss: 0.060653\n", "Epoch: 48, Loss: 0.073836\n", "Epoch: 49, Loss: 0.079879\n", "Epoch: 50, Loss: 0.142623\n", "Epoch: 51, Loss: 0.051674\n", "Epoch: 52, Loss: 0.034129\n", "Epoch: 53, Loss: 0.056633\n", "Epoch: 54, Loss: 0.028228\n", "Epoch: 55, Loss: 0.052061\n", "Epoch: 56, Loss: 0.038059\n", "Epoch: 57, Loss: 0.031738\n", "Epoch: 58, Loss: 0.147242\n", "Epoch: 59, Loss: 0.061352\n", "Epoch: 60, Loss: 0.063811\n", "Epoch: 61, Loss: 0.032167\n", "Epoch: 62, Loss: 0.023267\n", "Epoch: 63, Loss: 0.036451\n", "Epoch: 64, Loss: 0.104468\n", "Epoch: 65, Loss: 0.020089\n", "Epoch: 66, Loss: 0.053532\n", "Epoch: 67, Loss: 0.045569\n", "Epoch: 68, Loss: 0.010450\n", "Epoch: 69, Loss: 0.064581\n", "Epoch: 70, Loss: 0.017714\n", "Epoch: 71, Loss: 0.031624\n", "Epoch: 72, Loss: 0.034551\n", "Epoch: 73, Loss: 0.039539\n", "Epoch: 74, Loss: 0.021144\n", "Epoch: 75, Loss: 0.008193\n", "Epoch: 76, Loss: 0.055955\n", "Epoch: 77, Loss: 0.024295\n", "Epoch: 78, Loss: 0.013203\n", "Epoch: 79, Loss: 0.014967\n", "Epoch: 80, Loss: 0.009689\n", "Epoch: 81, Loss: 0.029018\n", "Epoch: 82, Loss: 0.010666\n", "Epoch: 83, Loss: 0.010389\n", "Epoch: 84, Loss: 0.100264\n", "Epoch: 85, Loss: 0.026471\n", "Epoch: 86, Loss: 0.042246\n", "Epoch: 87, Loss: 0.019857\n", "Epoch: 88, Loss: 0.075708\n", "Epoch: 89, Loss: 0.101994\n", "Epoch: 90, Loss: 0.018711\n", "Epoch: 91, Loss: 0.050570\n", "Epoch: 92, Loss: 0.009092\n", "Epoch: 93, Loss: 0.012307\n", "Epoch: 94, Loss: 0.006614\n", "Epoch: 95, Loss: 0.024891\n", "Epoch: 96, Loss: 0.011157\n", "Epoch: 97, Loss: 0.006983\n", "Epoch: 98, Loss: 0.024198\n", "Epoch: 99, Loss: 0.019835\n" ] } ], "source": [ "import torch\n", "import torch.nn as nn\n", "import torch.optim as optim\n", "\n", "train_loader = torch.utils.data.DataLoader(cifar2, batch_size=64, shuffle=True)\n", "\n", "model = nn.Sequential(\n", " nn.Linear(3072, 512),\n", " nn.Tanh(),\n", " nn.Linear(512, 2),\n", " nn.LogSoftmax(dim=1))\n", "\n", "learning_rate = 1e-2\n", "\n", "optimizer = optim.SGD(model.parameters(), lr=learning_rate)\n", "\n", "loss_fn = nn.NLLLoss()\n", "\n", "n_epochs = 100\n", "\n", "for epoch in range(n_epochs):\n", " for imgs, labels in train_loader:\n", " outputs = model(imgs.view(imgs.shape[0], -1))\n", " loss = loss_fn(outputs, labels)\n", "\n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", "\n", " print(\"Epoch: %d, Loss: %f\" % (epoch, float(loss)))" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 0.999700\n" ] } ], "source": [ "train_loader = torch.utils.data.DataLoader(cifar2, batch_size=64, shuffle=False)\n", "\n", "correct = 0\n", "total = 0\n", "\n", "with torch.no_grad():\n", " for imgs, labels in train_loader:\n", " outputs = model(imgs.view(imgs.shape[0], -1))\n", " _, predicted = torch.max(outputs, dim=1)\n", " total += labels.shape[0]\n", " correct += int((predicted == labels).sum())\n", " \n", "print(\"Accuracy: %f\" % (correct / total))" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 0.818000\n" ] } ], "source": [ "val_loader = torch.utils.data.DataLoader(cifar2_val, batch_size=64, shuffle=False)\n", "\n", "correct = 0\n", "total = 0\n", "\n", "with torch.no_grad():\n", " for imgs, labels in val_loader:\n", " outputs = model(imgs.view(imgs.shape[0], -1))\n", " _, predicted = torch.max(outputs, dim=1)\n", " total += labels.shape[0]\n", " correct += int((predicted == labels).sum())\n", " \n", "print(\"Accuracy: %f\" % (correct / total))" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "model = nn.Sequential(\n", " nn.Linear(3072, 1024),\n", " nn.Tanh(),\n", " nn.Linear(1024, 512),\n", " nn.Tanh(),\n", " nn.Linear(512, 128),\n", " nn.Tanh(),\n", " nn.Linear(128, 2),\n", " nn.LogSoftmax(dim=1))" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "model = nn.Sequential(\n", " nn.Linear(3072, 1024),\n", " nn.Tanh(),\n", " nn.Linear(1024, 512),\n", " nn.Tanh(),\n", " nn.Linear(512, 128),\n", " nn.Tanh(),\n", " nn.Linear(128, 2))\n", "\n", "loss_fn = nn.CrossEntropyLoss()" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch: 0, Loss: 0.467440\n", "Epoch: 1, Loss: 0.546665\n", "Epoch: 2, Loss: 0.235942\n", "Epoch: 3, Loss: 0.552646\n", "Epoch: 4, Loss: 0.438913\n", "Epoch: 5, Loss: 0.405718\n", "Epoch: 6, Loss: 0.651299\n", "Epoch: 7, Loss: 0.365505\n", "Epoch: 8, Loss: 0.202632\n", "Epoch: 9, Loss: 0.583006\n", "Epoch: 10, Loss: 0.558033\n", "Epoch: 11, Loss: 0.271199\n", "Epoch: 12, Loss: 0.385183\n", "Epoch: 13, Loss: 0.509575\n", "Epoch: 14, Loss: 0.445199\n", "Epoch: 15, Loss: 0.341095\n", "Epoch: 16, Loss: 0.433102\n", "Epoch: 17, Loss: 0.606591\n", "Epoch: 18, Loss: 0.261556\n", "Epoch: 19, Loss: 0.388963\n", "Epoch: 20, Loss: 0.314825\n", "Epoch: 21, Loss: 0.200921\n", "Epoch: 22, Loss: 0.257796\n", "Epoch: 23, Loss: 0.440425\n", "Epoch: 24, Loss: 0.600442\n", "Epoch: 25, Loss: 0.460757\n", "Epoch: 26, Loss: 0.788530\n", "Epoch: 27, Loss: 0.327609\n", "Epoch: 28, Loss: 0.194952\n", "Epoch: 29, Loss: 0.240534\n", "Epoch: 30, Loss: 0.114583\n", "Epoch: 31, Loss: 1.155974\n", "Epoch: 32, Loss: 0.187521\n", "Epoch: 33, Loss: 0.234861\n", "Epoch: 34, Loss: 0.171355\n", "Epoch: 35, Loss: 0.366816\n", "Epoch: 36, Loss: 0.610443\n", "Epoch: 37, Loss: 0.072456\n", "Epoch: 38, Loss: 0.066273\n", "Epoch: 39, Loss: 0.171720\n", "Epoch: 40, Loss: 0.129383\n", "Epoch: 41, Loss: 0.061699\n", "Epoch: 42, Loss: 0.116119\n", "Epoch: 43, Loss: 0.075789\n", "Epoch: 44, Loss: 0.049374\n", "Epoch: 45, Loss: 0.258949\n", "Epoch: 46, Loss: 0.246653\n", "Epoch: 47, Loss: 0.129849\n", "Epoch: 48, Loss: 0.012059\n", "Epoch: 49, Loss: 0.019218\n", "Epoch: 50, Loss: 0.060403\n", "Epoch: 51, Loss: 0.090742\n", "Epoch: 52, Loss: 0.006393\n", "Epoch: 53, Loss: 0.111232\n", "Epoch: 54, Loss: 0.179592\n", "Epoch: 55, Loss: 0.043882\n", "Epoch: 56, Loss: 0.017224\n", "Epoch: 57, Loss: 0.017671\n", "Epoch: 58, Loss: 0.041312\n", "Epoch: 59, Loss: 0.052816\n", "Epoch: 60, Loss: 0.053634\n", "Epoch: 61, Loss: 0.130217\n", "Epoch: 62, Loss: 0.080901\n", "Epoch: 63, Loss: 0.006689\n", "Epoch: 64, Loss: 0.004042\n", "Epoch: 65, Loss: 0.012127\n", "Epoch: 66, Loss: 0.028898\n", "Epoch: 67, Loss: 0.005961\n", "Epoch: 68, Loss: 0.119102\n", "Epoch: 69, Loss: 0.017317\n", "Epoch: 70, Loss: 0.003502\n", "Epoch: 71, Loss: 0.022188\n", "Epoch: 72, Loss: 0.006730\n", "Epoch: 73, Loss: 0.017476\n", "Epoch: 74, Loss: 0.043492\n", "Epoch: 75, Loss: 0.016351\n", "Epoch: 76, Loss: 0.018563\n", "Epoch: 77, Loss: 0.007171\n", "Epoch: 78, Loss: 0.001406\n", "Epoch: 79, Loss: 0.010133\n", "Epoch: 80, Loss: 0.013176\n", "Epoch: 81, Loss: 0.018422\n", "Epoch: 82, Loss: 0.014295\n", "Epoch: 83, Loss: 0.002282\n", "Epoch: 84, Loss: 0.005552\n", "Epoch: 85, Loss: 0.005069\n", "Epoch: 86, Loss: 0.002914\n", "Epoch: 87, Loss: 0.001302\n", "Epoch: 88, Loss: 0.004973\n", "Epoch: 89, Loss: 0.000853\n", "Epoch: 90, Loss: 0.002953\n", "Epoch: 91, Loss: 0.001070\n", "Epoch: 92, Loss: 0.002545\n", "Epoch: 93, Loss: 0.005381\n", "Epoch: 94, Loss: 0.004644\n", "Epoch: 95, Loss: 0.001291\n", "Epoch: 96, Loss: 0.002208\n", "Epoch: 97, Loss: 0.009738\n", "Epoch: 98, Loss: 0.003220\n", "Epoch: 99, Loss: 0.000590\n" ] } ], "source": [ "import torch\n", "import torch.nn as nn\n", "import torch.optim as optim\n", "\n", "train_loader = torch.utils.data.DataLoader(cifar2, batch_size=64, shuffle=True)\n", "\n", "model = nn.Sequential(\n", " nn.Linear(3072, 1024),\n", " nn.Tanh(),\n", " nn.Linear(1024, 512),\n", " nn.Tanh(),\n", " nn.Linear(512, 128),\n", " nn.Tanh(),\n", " nn.Linear(128, 2))\n", "\n", "learning_rate = 1e-2\n", "\n", "optimizer = optim.SGD(model.parameters(), lr=learning_rate)\n", "\n", "loss_fn = nn.CrossEntropyLoss()\n", "\n", "n_epochs = 100\n", "\n", "for epoch in range(n_epochs):\n", " for imgs, labels in train_loader:\n", " outputs = model(imgs.view(imgs.shape[0], -1))\n", " loss = loss_fn(outputs, labels)\n", "\n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", "\n", " print(\"Epoch: %d, Loss: %f\" % (epoch, float(loss)))" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 0.999900\n" ] } ], "source": [ "train_loader = torch.utils.data.DataLoader(cifar2, batch_size=64, shuffle=False)\n", "\n", "correct = 0\n", "total = 0\n", "\n", "with torch.no_grad():\n", " for imgs, labels in train_loader:\n", " outputs = model(imgs.view(imgs.shape[0], -1))\n", " _, predicted = torch.max(outputs, dim=1)\n", " total += labels.shape[0]\n", " correct += int((predicted == labels).sum())\n", " \n", "print(\"Accuracy: %f\" % (correct / total))" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 0.818000\n" ] } ], "source": [ "val_loader = torch.utils.data.DataLoader(cifar2_val, batch_size=64, shuffle=False)\n", "\n", "correct = 0\n", "total = 0\n", "\n", "with torch.no_grad():\n", " for imgs, labels in val_loader:\n", " outputs = model(imgs.view(imgs.shape[0], -1))\n", " _, predicted = torch.max(outputs, dim=1)\n", " total += labels.shape[0]\n", " correct += int((predicted == labels).sum())\n", " \n", "print(\"Accuracy: %f\" % (correct / total))" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3737474" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum([p.numel() for p in model.parameters()])" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3737474" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum([p.numel() for p in model.parameters() if p.requires_grad == True])" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1574402" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_model = nn.Sequential(\n", " nn.Linear(3072, 512),\n", " nn.Tanh(),\n", " nn.Linear(512, 2),\n", " nn.LogSoftmax(dim=1))\n", "\n", "sum([p.numel() for p in first_model.parameters()])" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1573376" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum([p.numel() for p in nn.Linear(3072, 512).parameters()])" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3146752" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum([p.numel() for p in nn.Linear(3072, 1024).parameters()])" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(torch.Size([1024, 3072]), torch.Size([1024]))" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "linear = nn.Linear(3072, 1024)\n", "\n", "linear.weight.shape, linear.bias.shape" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "conv = nn.Conv2d(3, 16, kernel_size=3)" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([16, 3, 3, 3])" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "conv.weight.shape" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([16])" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "conv.bias.shape" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [], "source": [ "img, _ = cifar2[0]\n", "\n", "output = conv(img.unsqueeze(0))" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(torch.Size([1, 3, 32, 32]), torch.Size([1, 16, 30, 30]))" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "img.unsqueeze(0).shape, output.shape" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.imshow(img.permute(1, 2, 0), cmap='gray')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.imshow(output[0, 0].detach(), cmap='gray')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([1, 16, 30, 30])" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "output.shape" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [], "source": [ "conv = nn.Conv2d(3, 1, kernel_size=3, padding=1)" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([1, 1, 32, 32])" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "output = conv(img.unsqueeze(0))\n", "\n", "output.shape" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [], "source": [ "with torch.no_grad():\n", " conv.bias.zero_()" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [], "source": [ "with torch.no_grad():\n", " conv.weight.fill_(1.0 / 9.0)" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "output = conv(img.unsqueeze(0))\n", "plt.imshow(output[0, 0].detach(), cmap='gray')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [], "source": [ "conv = nn.Conv2d(3, 1, kernel_size=3, padding=1)\n", "\n", "with torch.no_grad():\n", " conv.weight[:] = torch.tensor([[-1.0, 0.0, 1.0],\n", " [-1.0, 0.0, 1.0],\n", " [-1.0, 0.0, 1.0]])\n", " conv.bias.zero_()" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "output = conv(img.unsqueeze(0))\n", "plt.imshow(output[0, 0].detach(), cmap='gray')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [], "source": [ "pool = nn.MaxPool2d(2)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([1, 3, 16, 16])" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "output = pool(img.unsqueeze(0))\n", "\n", "output.shape" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "ellipsis is not a Module subclass", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[0mnn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mTanh\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[0mnn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mMaxPool2d\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 8\u001b[1;33m ...)\n\u001b[0m", "\u001b[1;32m~\\Miniconda3\\envs\\book\\lib\\site-packages\\torch\\nn\\modules\\container.py\u001b[0m in \u001b[0;36m__init__\u001b[1;34m(self, *args)\u001b[0m\n\u001b[0;32m 51\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 52\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0midx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmodule\u001b[0m \u001b[1;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 53\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0madd_module\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0midx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmodule\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 54\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 55\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_get_item_by_idx\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0miterator\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0midx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Miniconda3\\envs\\book\\lib\\site-packages\\torch\\nn\\modules\\module.py\u001b[0m in \u001b[0;36madd_module\u001b[1;34m(self, name, module)\u001b[0m\n\u001b[0;32m 171\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmodule\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mModule\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0mmodule\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 172\u001b[0m raise TypeError(\"{} is not a Module subclass\".format(\n\u001b[1;32m--> 173\u001b[1;33m torch.typename(module)))\n\u001b[0m\u001b[0;32m 174\u001b[0m \u001b[1;32melif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtorch\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_six\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstring_classes\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 175\u001b[0m raise TypeError(\"module name should be a string. Got {}\".format(\n", "\u001b[1;31mTypeError\u001b[0m: ellipsis is not a Module subclass" ] } ], "source": [ "model = nn.Sequential(\n", " nn.Conv2d(3, 16, kernel_size=3, padding=1),\n", " nn.Tanh(),\n", " nn.MaxPool2d(2),\n", " nn.Conv2d(16, 8, kernel_size=3, padding=1),\n", " nn.Tanh(),\n", " nn.MaxPool2d(2),\n", " ...)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = nn.Sequential(\n", " nn.Conv2d(3, 16, kernel_size=3, padding=1),\n", " nn.Tanh(),\n", " nn.MaxPool2d(2),\n", " nn.Conv2d(16, 8, kernel_size=3, padding=1),\n", " nn.Tanh(),\n", " nn.MaxPool2d(2),\n", " # WARNING: something missing here\n", " nn.Linear(512, 32),\n", " nn.Tanh(),\n", " nn.Linear(32, 2))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sum([p.numel() for p in model.parameters()])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model(img.unsqueeze(0))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class Net(nn.Module):\n", " def __init__(self):\n", " super(Net, self).__init__()\n", " self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)\n", " self.act1 = nn.Tanh()\n", " self.pool1 = nn.MaxPool2d(2)\n", " self.conv2 = nn.Conv2d(16, 8, kernel_size=3, padding=1)\n", " self.act2 = nn.Tanh()\n", " self.pool2 = nn.MaxPool2d(2)\n", " self.fc1 = nn.Linear(8 * 8 * 8, 32)\n", " self.act4 = nn.Tanh()\n", " self.fc2 = nn.Linear(32, 2)\n", "\n", " def forward(self, x):\n", " out = self.pool1(self.act1(self.conv1(x)))\n", " out = self.pool2(self.act2(self.conv2(out)))\n", " out = out.view(-1, 8 * 8 * 8)\n", " out = self.act4(self.fc1(out))\n", " out = self.fc2(out)\n", " return out" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = Net()\n", "\n", "sum([p.numel() for p in model.parameters()])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import torch.nn.functional as F\n", "\n", "class Net(nn.Module):\n", " def __init__(self):\n", " super(Net, self).__init__()\n", " self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)\n", " self.conv2 = nn.Conv2d(16, 8, kernel_size=3, padding=1)\n", " self.fc1 = nn.Linear(8 * 8 * 8, 32)\n", " self.fc2 = nn.Linear(32, 2)\n", " \n", " def forward(self, x):\n", " out = F.max_pool2d(torch.tanh(self.conv1(x)), 2)\n", " out = F.max_pool2d(torch.tanh(self.conv2(out)), 2)\n", " out = out.view(-1, 8 * 8 * 8)\n", " out = torch.tanh(self.fc1(out))\n", " out = self.fc2(out)\n", " return out" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = Net()\n", "model(img.unsqueeze(0))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import torch\n", "import torch.nn as nn\n", "import torch.nn.functional as F\n", "\n", "train_loader = torch.utils.data.DataLoader(cifar2, batch_size=64, shuffle=True)\n", "\n", "class Net(nn.Module):\n", " def __init__(self):\n", " super(Net, self).__init__()\n", " self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)\n", " self.conv2 = nn.Conv2d(16, 8, kernel_size=3, padding=1)\n", " self.fc1 = nn.Linear(8 * 8 * 8, 32)\n", " self.fc2 = nn.Linear(32, 2)\n", " \n", " def forward(self, x):\n", " out = F.max_pool2d(torch.relu(self.conv1(x)), 2)\n", " out = F.max_pool2d(torch.relu(self.conv2(out)), 2)\n", " out = out.view(-1, 8 * 8 * 8)\n", " out = torch.tanh(self.fc1(out))\n", " out = self.fc2(out)\n", " return out\n", " \n", "model = Net()\n", "\n", "learning_rate = 1e-2\n", "\n", "optimizer = optim.SGD(model.parameters(), lr=learning_rate)\n", "\n", "loss_fn = nn.CrossEntropyLoss()\n", "\n", "n_epochs = 100\n", "\n", "for epoch in range(n_epochs):\n", " for imgs, labels in train_loader:\n", " outputs = model(imgs)\n", " loss = loss_fn(outputs, labels)\n", " \n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", "\n", " print(\"Epoch: %d, Loss: %f\" % (epoch, float(loss)))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "train_loader = torch.utils.data.DataLoader(cifar2, batch_size=64, shuffle=False)\n", "\n", "correct = 0\n", "total = 0\n", "\n", "with torch.no_grad():\n", " for imgs, labels in train_loader:\n", " outputs = model(imgs)\n", " _, predicted = torch.max(outputs, dim=1)\n", " total += labels.shape[0]\n", " correct += int((predicted == labels).sum())\n", " \n", "print(\"Accuracy: %f\" % (correct / total))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "val_loader = torch.utils.data.DataLoader(cifar2_val, batch_size=64, shuffle=False)\n", "\n", "correct = 0\n", "total = 0\n", "\n", "with torch.no_grad():\n", " for imgs, labels in val_loader:\n", " outputs = model(imgs)\n", " _, predicted = torch.max(outputs, dim=1)\n", " total += labels.shape[0]\n", " correct += int((predicted == labels).sum())\n", " \n", "print(\"Accuracy: %f\" % (correct / total))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import torch\n", "import torch.nn as nn\n", "import torch.nn.functional as F\n", "\n", "class Net(nn.Module):\n", " def __init__(self):\n", " super(Net, self).__init__()\n", " self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)\n", " self.conv2 = nn.Conv2d(16, 8, kernel_size=3, padding=1)\n", " self.fc1 = nn.Linear(8 * 8 * 8, 32)\n", " self.fc2 = nn.Linear(32, 2)\n", " \n", " def forward(self, x):\n", " out = F.max_pool2d(torch.relu(self.conv1(x)), 2)\n", " out = F.max_pool2d(torch.relu(self.conv2(out)), 2)\n", " out = out.view(-1, 8 * 8 * 8)\n", " out = torch.tanh(self.fc1(out))\n", " out = self.fc2(out)\n", " return out\n", " \n", "model = Net()\n", "sum([p.numel() for p in model.parameters()])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = nn.Sequential(\n", " nn.Conv2d(3, 16, kernel_size=3, padding=1),\n", " nn.Tanh(),\n", " nn.MaxPool2d(2),\n", " nn.Conv2d(16, 8, kernel_size=3, padding=1),\n", " nn.Tanh(),\n", " nn.MaxPool2d(2),\n", " nn.Linear(8*8*8, 32),\n", " nn.Tanh(),\n", " nn.Linear(32, 2))\n", "\n", "model(img.unsqueeze(0))" ] }, { "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.6.6" } }, "nbformat": 4, "nbformat_minor": 2 }