{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### Hello Torch\n", "https://pytorch.org/tutorials/beginner/pytorch_with_examples.html" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "import torch\n", "import numpy as np\n", "import pandas as pd\n", "\n", "tnn = torch.nn\n", "topt = torch.optim" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Data for training" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# sample data\n", "study = np.array([2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8]) / 24\n", "sleep = np.array([2, 4, 6, 8, 2, 4, 6, 8, 2, 4, 6, 8, 2, 4, 6, 8]) / 24\n", "score = np.array([4, 3, 2, 1, 6, 5, 4, 3, 8, 7, 6, 5, 10, 9, 8, 7]) / 10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Define network" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "#input size, hidden-layer size, output size\n", "I, H, O = 2, 3, 1\n", "\n", "# input tensors\n", "ip_train = torch.FloatTensor([study, sleep])\n", "op_train = torch.FloatTensor([score])\n", "\n", "# define model\n", "model = tnn.Sequential(\n", " tnn.Linear(I, H),\n", " tnn.Sigmoid(),\n", " tnn.Linear(H, O),\n", " tnn.Sigmoid()\n", ")\n", "\n", "# define loss calculation method\n", "loss_fn = tnn.MSELoss()\n", "\n", "# define solver\n", "optimizer = topt.Adam(model.parameters(), lr=0.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Training loop" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0.030134161934256554\n", "5 0.00017758358444552869\n", "10 0.03192787617444992\n", "15 0.044801026582717896\n", "20 0.0010099004721269011\n", "25 0.016756907105445862\n", "30 0.033700164407491684\n", "35 0.18690210580825806\n", "40 0.03417925536632538\n", "45 0.08602585643529892\n", "50 0.08201203495264053\n", "55 0.020945297554135323\n", "60 0.10403700172901154\n", "65 0.041797857731580734\n", "70 0.008493759669363499\n", "75 0.0030204292852431536\n", "80 0.011585894040763378\n", "85 0.003865890670567751\n", "90 0.0048505403101444244\n", "95 0.0007336459821090102\n", "100 0.0041505410335958\n", "105 0.0007972802268341184\n", "110 0.000833025318570435\n", "115 0.009658309631049633\n", "120 2.211573246313492e-06\n", "125 0.0021663231309503317\n", "130 0.0004632914497051388\n", "135 0.00036355803604237735\n", "140 0.008904978632926941\n", "145 0.0005223557236604393\n", "150 0.0008889708551578224\n", "155 0.0001572765759192407\n", "160 0.0006042248569428921\n", "165 0.00014972696953918785\n", "170 0.0003896082052960992\n", "175 0.001079699955880642\n", "180 0.0005464814021252096\n", "185 0.0008756780880503356\n", "190 0.0003214924072381109\n", "195 0.003954426851123571\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO29eZwdZ3Xn/T11l95bW0vWbskbXvGCLCABEwiL7WRsSEhiZuKYxAmTTCDJkGECwxtggHlJ8DtvMpnxJBAwY5KAbTAJTrBxwNjYBluWbEuWZFnWYi2tpaXe17tVPfNHLbfuvXXXVquvbp/v59Mf3a5b1fXc6tavTv3Oec4jxhgURVGU1sWa7wEoiqIoc4sKvaIoSoujQq8oitLiqNAriqK0OCr0iqIoLU58vgdQTF9fn9mwYcN8D0NRFOWc4vnnnx80xiyPeq/phH7Dhg1s27ZtvoehKIpyTiEih8u9p9aNoihKi6NCryiK0uKo0CuKorQ4TefRK4qinAmy2Sz9/f2kUqn5HsoZpb29nbVr15JIJGo+RoVeUZSWpL+/n56eHjZs2ICIzPdwzgjGGIaGhujv72fjxo01H6fWjaIoLUkqlWLZsmUtI/IAIsKyZcvqfkpRoVcUpWVpJZH3aeQztbzQf3f7MSZS2fkehqIoyrzR0kJ/ajzFH963nUd2npzvoSiKsgDp7u6e7yEALS70GdsBYCZrz/NIFEVR5o+WFnrH1XmynuAriqLMB8YYPvaxj3HllVdy1VVXcf/99wNw4sQJbrjhBq655hquvPJKnnrqKWzb5oMf/GCw71/8xV/M+vwtXV7peMskpnMq9IqykPmv/7ybl4+Pn9GfefnqXj79b66oad/vfOc7bN++nR07djA4OMj111/PDTfcwDe+8Q3e85738MlPfhLbtpmenmb79u0cO3aMXbt2ATA6OjrrsbZ2RO8JvUb0iqLMJ08//TQf+MAHiMVinHfeebztbW9j69atXH/99Xzta1/jM5/5DDt37qSnp4cLLriAgwcP8pGPfITvf//79Pb2zvr8LR7Ru/9mNKJXlAVNrZH3XGG8oLOYG264gSeffJLvfe973H777XzsYx/jN37jN9ixYwePPvood999Nw888AD33HPPrM6vEb2iKMocc8MNN3D//fdj2zanT5/mySefZPPmzRw+fJgVK1bwO7/zO9x555288MILDA4O4jgOv/zLv8znPvc5XnjhhVmfv8Ujel/oo++miqIoZ4P3ve99PPPMM1x99dWICF/84hdZuXIl9957L3fddReJRILu7m6+/vWvc+zYMX7zN38Tx6sm+cIXvjDr87e20HuBvCZjFUWZDyYnJwF3Nutdd93FXXfdVfD+HXfcwR133FFy3JmI4sOodaMoitLiLAih12SsoigLmRYXevdfjegVZWFSrtrlXKaRz9TiQq8RvaIsVNrb2xkaGmopsff70be3t9d1XEsnY/1fcEYjekVZcKxdu5b+/n5Onz4930M5o/grTNVDSwu9rb1uFGXBkkgk6lqFqZVR60ZRFKXFqUnoReRGEdkrIvtF5OMR739URF4WkZdE5DEROT/0ni0i272vh87k4KuhE6YURVFqsG5EJAbcDbwL6Ae2ishDxpiXQ7u9CGwyxkyLyO8BXwR+zXtvxhhzzRked00Y7XWjKIpSU0S/GdhvjDlojMkA9wG3hncwxjxujJn2vn0WqC9TMEfYjk6YUhRFqUXo1wBHQ9/3e9vKcSfwSOj7dhHZJiLPish7ow4QkQ95+2w7kxly7UevKIpSW9VN1JLjkaa3iPw6sAl4W2jzemPMcRG5APiRiOw0xhwo+GHGfBn4MsCmTZvOmKFudMKUoihKTRF9P7Au9P1a4HjxTiLyTuCTwC3GmLS/3Rhz3Pv3IPAEcO0sxlsX2utGURSlNqHfClwsIhtFJAncBhRUz4jItcCXcEX+VGj7EhFp8173AT8LhJO4c4rv0WsyVlGUhUxV68YYkxORDwOPAjHgHmPMbhH5LLDNGPMQcBfQDXxLRACOGGNuAS4DviQiDu5N5c+KqnXmlHyvGy2vVBRl4VLTzFhjzMPAw0XbPhV6/c4yx/0UuGo2A5wN4RYIxhi8m5CiKMqCosVnxuZfa1SvKMpCpaWF3g51rdPGZoqiLFRaWujD7UmzmpBVFGWB0tJC74SFXiN6RVEWKK0t9CFt19mxiqIsVFpa6G2N6BVFUVpb6I0mYxVFUVpb6AvKK3NaXqkoysKkxYU+HNHb8zgSRVGU+aO1hT4U0mc0olcUZYHS2kJfMDNWPXpFURYmLS704YhehV5RlIVJiwt9/rVG9IqiLFRaW+gdLa9UFEVpbaFX60ZRFKXVhT7/WiN6RVEWKi0u9Nq9UlEUpbWF3gn3utE6ekVRFiatLfRq3SiKorS60GsyVlEUpabFwc9VjDFYAjFLNKJXFGXB0tIRvW0MlgiJmKXJWEVRFiwtLfSOAUuEZNzSiF5RlAVLiwu9QQQ3olehVxRlgdLSQm+M688nY5a2KVYUZcHS0kJvO0atG0VRFjwtLfR560Y0GasoyoKlJqEXkRtFZK+I7BeRj0e8/1EReVlEXhKRx0Tk/NB7d4jIPu/rjjM5+GoYTcYqiqJUF3oRiQF3AzcBlwMfEJHLi3Z7EdhkjHk98G3gi96xS4FPA28ENgOfFpElZ274lXGMIWaJJmMVRVnQ1BLRbwb2G2MOGmMywH3AreEdjDGPG2OmvW+fBdZ6r98D/MAYM2yMGQF+ANx4ZoZeHdejh2TMIq3WjaIoC5RahH4NcDT0fb+3rRx3Ao/Uc6yIfEhEtonIttOnT9cwpNpwDIhn3WhEryjKQqUWoZeIbZG1iiLy68Am4K56jjXGfNkYs8kYs2n58uU1DKk2/BYISbVuFEVZwNQi9P3AutD3a4HjxTuJyDuBTwK3GGPS9Rw7VzjGEPNaIGhTM0VRFiq1CP1W4GIR2SgiSeA24KHwDiJyLfAlXJE/FXrrUeDdIrLES8K+29t2VrCdsHWjE6YURVmYVO1eaYzJiciHcQU6BtxjjNktIp8FthljHsK1arqBb4kIwBFjzC3GmGER+RzuzQLgs8aY4Tn5JNFjx7LQiF5RlAVNTW2KjTEPAw8XbftU6PU7Kxx7D3BPowOcDY7xZ8Zqm2JFURYuLT4zFmLi97pRoVcUZWHS0kJva/dKRVGU1hZ6Y/JNzZpN6KfSOZ7eNzjfw1AUZQHQ0kLvOORXmLINjtM8lTf/tP0Yt9+zhdHpzHwPRVGUFqe1hd4YLMuN6AGyTvNE9eMzOYxBWzMoijLntL7QezNjgaZKyM5kcoDbj0dRFGUuaXGhz7cphiYT+qwNqNArijL3tLjQexG9L/RNlJCdzrhC7xgVekVR5pYWF3qwLKHNE/p0tnmE3o/ocxrRK4oyx7S20HtrxrbFY0BzRfQzfkSvQq8oyhzT2kJfZN00Y0Rvq3WjKMoc0/JCLxKybnL2PI8oj+/RazJWUZS5psWF3ut104RVNymtulEU5SzR2kLvuG2K8xF98wi9RvSKopwtWlvoTWEytpmEfkbLKxVFOUu0uNDnV5iC5vLo8xOm5nkgiqK0PC0t9MYYYtKc1o0f0eeaqP+OoiitSUsLvR1YN82VjHUcE0T0qvOKosw1LS30jrc4eLN59OFxaB29oihzTWsLvTdhqi3RXBG9H82DzoxVFGXuaWmhNwZilgRtipslGTvttSgG7XWjKMrc09JC73v0liUkYtI01k0qFNFrHb2iKHNNSwu94y0ODtAWjzWNdeNPlgKto1cUZe5paaE33sIj4DY2axbrZiajEb2iKGePlhZ6xxhiliv0bXGreSJ6tW4URTmLtLTQ207eunEj+uYQ+pRG9IqinEWaXuiHpzL89r3bGJnK1H1s2Lppi1tV+9EPjKf4z9/eMecWT9ij1zp6RVHmmpqEXkRuFJG9IrJfRD4e8f4NIvKCiORE5P1F79kist37eqjeAb7UP8oP9wyw5+R4vYcGdfTgJWOrNJZ55sAQD2zr59DgdN3nqgeto1cU5WwSr7aDiMSAu4F3Af3AVhF5yBjzcmi3I8AHgf8U8SNmjDHXNDrA2bTzDXv0tSRjz1aP+HAyVuvoFUWZa6oKPbAZ2G+MOQggIvcBtwKB0BtjDnnvnXETfCrtTi5qRBBtrwUC1GbdzJwtoc9qeaWiKGePWqybNcDR0Pf93rZaaReRbSLyrIi8N2oHEfmQt8+206dPF7wXRPR2/YJoQtZNMm5VtW5S3o1grjtKTmsyVlGUs0gtQi8R2+pRp/XGmE3AvwX+UkQuLPlhxnzZGLPJGLNp+fLlBe9NZRqP6P2FR6C2iP5sWTeprB1UA6nQK4oy19Qi9P3AutD3a4HjtZ7AGHPc+/cg8ARwbR3jC6ybxjz6cNVN9WSsL/Rz7ZtPZ3J0t8W9MarQK4oyt9Qi9FuBi0Vko4gkgduAmqpnRGSJiLR5r/uAnyXk7dfCVLrxBTocxxTOjM02STI26wRCr8lYRVHmmqpCb4zJAR8GHgX2AA8YY3aLyGdF5BYAEbleRPqBXwG+JCK7vcMvA7aJyA7gceDPiqp1quJ3emy06iZfXll9wlTeo5/rqpscXX5Er0KvKMocU0vVDcaYh4GHi7Z9KvR6K66lU3zcT4GrZjPAKX/JvQaSsY4BK1ReWa0FQr7qZm6TsTNZO4jodc1YRVHmmqafGTs9i/LK4u6V1SP6xm8q9TCTCQm9evSKoswxTS/0U5nGo2zHGGKhqpuM7WAqCGvKuxE06tHnagzPpzM2HckYlsz904OiKErTC/30rMorC9sUQ+V1Y/1mY42c68TYDJd/6lFe6h+tum8qa9OZjBGzpCHr5rXBKd74//6Q46Mz9R+sKMqCo/mFPj27FgjhZCxUEfpc4+caGE+TsR0ODVXvkzOdselIuELfSHnlocEpBsbTvDY4VfexiqIsPJpe6Ccb9OiNMRhT2AIBKi8QPjOLiN63YMItiMueJ+taNzGRhm4q/vj8OQaKoiiVaHqhb7Spmb97fuGRGFB5gfB8RF+/n+IncGeq1OqDe0PpSMSwrAaF3vN7ajmXoihKUwu9MSbfAqHOShjfEgmsm0T1iH42dfT+MdXEN2s75BwTWDezi+hV6BVFqU5TC30q6+Bb2PVG2b7Q+9ZNMlZ7MnY24jtTxbrxn1A6kjHiljRUXunPEvYT1YqiKJVoaqGfCglZ/R69+2/Q6yZRezK2kTp6305JVYnoZ0JCb4k0NDPWH59G9Iqi1EJTC/10uvF2vv7+XiBPMuZ69OWsm5ztkPUEdFYRfRWh96PwrmScmCUNJn7dY6azGtErilKdphb62UT0eY++OKKPFuJU6AbQkEfv3SSma7RuOmcR0Wd9odeIXlGUGmhqoQ970LXOOvXx9bPW8sqw5dJQ1Y1TWyVMXujdiL4Rj972rsWUevSKotRAUwv9ZChibaSOHihYYQrKe/SzXcfVt1Oq1dH74tzZ5iVjZ2ET1RrRj01nef7wSN3nURSlNWhqoZ8OTQhq3KOvrY4+vH02CdKqEb0nzl3JeON19IFHX5vQf/2ZQ3zgy89qS2RFWaA0tdBPzSLKrt+6maVHX2cytnMWM2ODZGyNM2OHpjJkbIesNlBTlAVJUwu9L4rdbfG6BbFu6ybbeIUPhDz6epKxDfa6yQYefW0R/Xgq645xjtsvK4rSnDS10Pt14r3t8YYjeqsooi+3QHg4GTubqptqdfS+R9/VFm/Yo/ePmakxGTuRamx2saIorUFTC/10Jocl0NkWr7sSxq9miRW1KS63QHjYuplNRF+tvHImYyPi3nisBuvo/Xr/WiP6SV/o1bpRlAVJUwv9VNqmK+lGvnX3unH8Fgju90ELhDIR90xBRN9IeWVtHr3/mUSEmNCQdePf9Gr16CfS2YIxKoqysGhyoc+5ZYixyhbHN587wuN7TxVsK26BICLuAuFlI/rZefR2jdbNdCZHZ9KtAJptU7PprF1xxSwf37rJ6gK1irIgaW6hz+ToaosTs6yK0eiXfnyAb2w5UrAtmBkb+oTJuFXVo0/GrYa8bH+2atY2FQV1OmMXCH0jboo/PmMKLadyqEevKAubphb66UzeuqkU+WZtU7IIh13UAgEqLxDuC30jFT5QOJu2UlTvRvTuwuBur5vGbSKoPjvWGMOEX3WjHr2iLEiaWuin0q7NEa8iiBnbKRF6Eyn0VtU6+q622KyqbqCyTz+VtulqiwVjayTIDt9Uqs2OTefyzdqyGtEryoKkqYV+OmO7ZYhVPPqs7QRLDvoUl1eCK/TlZsbOZG0SMaEtHpuVbw6QylSwbrI2HaGIfjazcN2fVzmi92voi49TFGXh0NRCP+UlLmOWVTEazeaihL5wwhS4/nulpmbt8epPD+UIN12rJL7T6Rxdnkc/2143UL0nve/PAzozVlEWKE0t9NPpejz6QsHz97es4oi+vHXTnpz98n5QeXasm4x1I3qr4cXBQzeVKh59WOgbieiNMQxNpus+TlGU5qEmoReRG0Vkr4jsF5GPR7x/g4i8ICI5EXl/0Xt3iMg+7+uOegbnl1dWWqDDGON69JlcgQ1SXF4JfjK2TD/6rE17wvIi+sZnq0Jlj76kvLKRpQTt2iP6yVTjrZ4Bntw3yJu+8BinJlJ1H6soSnNQVehFJAbcDdwEXA58QEQuL9rtCPBB4BtFxy4FPg28EdgMfFpEltQyMMcxTGZy9LQnvIg+WqSyoVLDcDfHKOumLWGVLUf0rZtGI/qwtVSp6mYqY9PpJ2Mb9Ohtx9DT5j4VzFTx6CdCHn22gXMNjKfI2oaBMY3qFeVcpZaIfjOw3xhz0BiTAe4Dbg3vYIw5ZIx5CShW0fcAPzDGDBtjRoAfADfWMrCpTA5joKet8pJ74Zr1cOVNVDK2MxkrK8IzWdtbsLuxOvrwjWimTDI2aztkcg5dnnXT6OLgWcfQ25EA6vPoG1lQxb++/uxaRVHOPWoR+jXA0dD3/d62WqjpWBH5kIhsE5Ftp0+fBgiSq93tlT36sNBPRvSvD3v0HYlY2V40fkRvWY3NjM06JuinU866CXeuBGbRptihpz3u/czaq24aKa/MejmNsAWkKMq5RS1CLxHbalWMmo41xnzZGLPJGLNp+fLlQF5Yetq9mbFlRCrcpCwsRsVtigE6krGyIpzKOrQlLDeibyDyte2wnVLmqSG0jCDQ8MIjWdvQ2+5G9NWaqM02GevfHCZU6BXlnKUWoe8H1oW+Xwscr/HnN3zseCrfi75yRB9OTFa2btoTsbJL/aWyNh2J2VXddHtRdrn2wfkWxbON6N2nh0pPKD4FQt/ADcy/kRaXryqKcu5Qi9BvBS4WkY0ikgRuAx6q8ec/CrxbRJZ4Sdh3e9uq4gtLT3ucWKy8Rx+ui58sEPrC7pXgWjflI3qb9kSs4aqbnOPQ7Uf0ZTx6fxZrR8IT+lhjC4/kHEPMEjqTsZIZwcVMzNK68Z8CahX6wck0u46N1X0eRVHmjqpCb4zJAR/GFeg9wAPGmN0i8lkRuQVARK4XkX7gV4Avichu79hh4HO4N4utwGe9bVXxBap61U0ZoffXjC1Kxuac6KZjqaxDe8JqOKK3HUNb3CIZsyp49PlFR/yxNfT0YDskYkJnW20RvW8pNVJeGSRja7Ru/teP9nPnvVvrPo+iKHNHvJadjDEPAw8XbftU6PVWXFsm6th7gHvqHdhkyLqpVHUTjugjrRur0LoB19de1FF4j5vxrJvJWK5B39whHrPoqFDZU5KMnUXNfswSupLx6hOm0lmWdCWZSOcaKq/MC31tVTfHRmc0casoTUbTzowNWzeJmFVj1U3lOvoOT2CjhNi3bmJW+XNVwnYMcUtce6hMlD0VLAyenxnbUK8bxxC3LDqT1SP6yVSOJZ1u4raRiL5ej35wMl12FS9FUeaHphV6PxnblfQi+jL+cth3ngzVeuc9+sLySihtUeA4hnTOoW0WHn3WdqPsSpU9xRF9PNbozFiHeEzoTMZr8OhzLO5Mesc1HtHXGqUPTWbI2qamBVEURTk7NK3QT6ZydLfFsSyp2GiscMJUaURf7NFDafljKpdPks7Go0/ELNorJHz9pf98j96N6Os+VUEytlpEP57KsbTLFfpGmpplc/WVVw56fXE0qleU5qFphX4ilQ0mBcUswTFE2hxlq268zcXllVAq9P4NorttFt0rPfHtSFgVrJtij77B9WltQ8Ky6GqL15CMzbLkDET0EzVYN9OZXDAe7X2vKM1D0wr9ZDoXlCvGPaM9yuYoN2GqXHkllFo3U6FIu+E6er8SJhmvOGHKEreLJrhPG46hbpsj5xhiserllZmcQzrn5D36Bmf8QqEtVo7BiUzBuRVFaQ6aVugnUrlgAlLMW/g1SoD9iLOnLV6wrF7UhCk/GVsi9KEk6Wy6V8Ysz7qpkIztSsaDvIH/ueo9ne04xC2huz1eMdLOl6h6n6uR8so6WiCcDrUz1oXIFaV5aF6hT7udKyEf0UcJsC8oS7qSkROmYlZ1j963G7ravKqbhhYHd0h4ydiy5ZVpO7jZuGNz/633CSJnu1U3ve0JL2qPPt9E0EYiQbzCpLNKhOvoqz15DIaEXiN6RWkemlboJ1PZYKKPL9ZRAuwnC5d0JiKtm3B5ZXmPPhTRNyiIth3y6MsJfdYOErGQr/GvW+gdQzwmgbVVroPlRKhfUMKyGoqyfWss51UmVaJA6DWiV5SmoWmFfiKVC5Kx8Zgf0ZeKRzoU0UdNmKqlvLIwom+w0ZgnvpXaLEyn84uOQL4iqN4Sy5xv3XhCX24y09iMu31RhxfRzyIZ656nsn2jHr2iNCdNK/ThZGysQuTre8hLOgutm3LdK6F8RN8VePQNdK/0JjF1JOMVPfoCoZ9NRG9JcCMsJ8C+0Pd2JIjHGuvKWThPobLQD02pR68ozUhTCn3OdpjO2EEytiaP3hN6X+B98Qx79O3xyhF9p7dmbLlSzmpj9mvb0zknMvEZXi82PLZ6zuU4BmPcRG53jUK/qCNBwpLG+tEXRPSVK2/Uo1eU5qQphd73nP1kbC1VN0s6EziGYKnAqKobyxLaE1ZJsnQyVF5ZqZSzEjnHkKjim0+G7Cj3c5W/gZXDn/QUjwk9bYmC8RfjLzqyyI/oG2pqZuj1xlyt8mZwIhN8JvXoFaV5aEqh95et85OxiVh5Qcx4UerizkLRi6qjh+hWxdOZHDFLaItbFW8qlch55ZWBbx5Rdz5eJPT+TaieVsX+uMLWTbka97GZLHHvKSMek4abmvkza6tNmhqcTLOytx3QiF5RmonmFHq/c2V7sUdfKh5Z2yEZz9sYvtDnPfpCpY9arGMqbdOZjCEiQcljvZU3OTtf2+7/zNLPlQ2eUgo/V+3nyoUsqVqsm0UdCUSEhNVoRO+wxBf6KhH96ck0qxa1e8fpzFhFaRaaUujDnSsh79FHiUcm55CMWcGC235i1de0sEcP0B7RdGzam8jk7u9F9HUIleMYHOPaKX75ZHGU7c9S7WkrtW7qEnpvXImYVVMydpG3iHjDVTc5h2We0E9W8OhTWZuJVI5VizsAjegVpZloSqH3k375qpvKHn0iJiURfTnrpjNZupzgVMam01veL5/4rV2ociE7pTsQ+ug8QHfYo5dGInp3XK7VFCMZs8oK/fhMlp6O/KSzRqybjG2C7peVqm6GptzSytVBRK9CryjNQpMKfX5GJ1SvuknE8t64nzCsZN2URPTpcERfv/gGvnnEOHwmiz5Twbnq8OjzEb17bHd7vKxHP14Q0VtlV+mqRNZ2l0hMxq2KHv3ghFtxs1ojekVpOppc6Kt79JmcKRT6IKJ33y8W+vYojz5j53vEN1AJ40fZhR59oSiOFz2lQH5mbD3llfmyUfdX19MeL1sNU2DdzKK8MhETetvjFT16v4be9+i16kZRmoemFPrA5ijqXhnlMfvJWF/Q/NpxXxCtiKqb4vLKqRonZ5XDH1fcErqTftVNUUTvfd8bsm4aKeUM20TgXqPKHr1fudRYMjZnm+BJpVJ5pT8rdjYR/dZDw9z+1S1q+yjKGaY5hT6Vw5LCtVWhvEefjFn0ekI/7gl90OumSOk7I5OxNp3+TaVCKWc5gkqYmEWX5/UXR/TFlUSQf9qoJ0nqi7U/zu626A6WxhjGU7nCZGydHr0xhoxvjbXHK3r0fudKX+gbEetth0Z4at8gA+Opuo9VFKU8TSn0E6ks3W35dr6VxDeTc0jEhUTMXUPVj+hNGeumI1naRngqnaMruKnUX0cftm7iMctdZLwkovdbBpd69PXU0RdH9D3tichIezLtLnKet26suq0b/1xJb3JWxYh+Mk13Wzyw2xqJ6P0b8PBUpsqeiqLUQ5MKfa5IEMuLrx9xgjsDdKw4oi+ybqKW+gu3JojP0roBd4ZtsZ1SnHdwPxezOFfeoy83OQug17uOiVj9/ej9qNyP6McrlFcOTmZY1p0kbgkijUX0ae/3MjSpQq8oZ5KmFPqR6Uww0xVqq7oBV9QCj75S1U0oojfGuAuCtBXaRA2VV8b8KLt00e7Auimoo/cXHmmgvDJk3URF2mPT+fYH7tisuq0bvwV0ImYV3ESjGJxI09fd5k7OillBV9F68G/AQxrRK8oZpUmFPr/OKVSbGWtIhiJ6P+osZ910JmPkHBNEnKmsgzHMKqK3A+vGHUdXW6l1M5HKkfQWDw8+V1BHX/OpCloggBfRRywKEm5oBnhNzeoTX79yJhG3WNKZYHS6UkSfpq/b/Z21xazgJlEPqSCiT1fZU1GUemhKoR+byRZE9JV63fhVN+C24x2b8cory1TdFC8+4i8jWBrRz64SplToswWJWAAraLdQuwBni6yb7vZ45KIg4RbF0NjMWH9cyZiwuDPJTNYuu3qWK/RtgHtjyNiVFy2PYsZrSKcevaKcWZpS6EemM0URfQWPPucEN4Lejnio6sZ9PyoZCwSzY8O96CEvoA355t6TRZSdMpkubGgG+Yi+nnlMdolN5Ap5cU5gfCbKuqnTo8/lbyrF5athcrbDyHQ2EPpkgxG9b6kNqkevKGeUphT64oi+Yq+bomTseJFHH9W9EkIRfTq/uhSEIvp6Sh4jIvrwQuXgLXbeVgIGzsYAACAASURBVCj0vljXV0efb4EA+Q6fxb3igxbFnWHrpj7xLbRu3BtvlH3jR+B9PX5ELw1NmPLXvh2eUutGUc4kNQm9iNwoIntFZL+IfDzi/TYRud97f4uIbPC2bxCRGRHZ7n39TbVz2d7CGotr9uidAo9+wisrNMZgSeFSgpCvzfdnx05n8uvFQkh864roC8W3KyqiT5VG9EGb4kaamln5pwco7UMzNpNFhGACl9sCoc5krB22btwbxuh0abTt19D3ec3PkjGrIaH3I3pNxirKmSVebQcRiQF3A+8C+oGtIvKQMebl0G53AiPGmItE5Dbgz4Ff8947YIy5ptYB+dHxklqrbrwWCJAvJRyfyeIYU2LbQJRHXyain0XVTXd76SSm8VSWdUs7C7bNJh8QCyVjobS3zthMlt72RDBhLB6rPxkbLq/0rZuRiIjet1qCiD5mNVRHn8ppeaWizAW1RPSbgf3GmIPGmAxwH3Br0T63Avd6r78N/LwUh9I14kedYeum2szYRNx9P+wjO6bUn4e8deN79NPpooh+VnX0XpSdjJPJOQViN5nOFbQohvz4GpmcFW5qBvm6eZ9wnxtwnwDqLq8MCb3fk35splSE/YZmvkffFrcaqqPPR/S1WTe7jo3x5Kun6z6Poiw0ahH6NcDR0Pf93rbIfYwxOWAMWOa9t1FEXhSRH4vIW6NOICIfEpFtIrJteGQUKLRufAGN8s0ztkMy5oq3L2zjqSyOY0r8eShdIDyI6Iu6VzbU1KxIfMO19BMR1o2/fyMrTOU9+ujlBIuFPmZJYGnVSiZUR7+4w7duoiJ6X+iTwf4NRfTZfMnrdKb8LFyfux7dy2ce2l33eRRloVGL0EdF5sVqUW6fE8B6Y8y1wEeBb4hIb8mOxnzZGLPJGLOpu6cHoLDqpoJvXhDRd4YjelOy6AjkI/rpoqqbzrbqfXXKUVzbXuybG2OYTOdKyisb6kcfMTMWSpOxJRF9rHxCu+y5Qk8PnckYiZiUsW7StMXzHUSTDUb0qaxNm1cqW4t9s//UZMmTjKIopdQi9P3AutD3a4Hj5fYRkTiwCBg2xqSNMUMAxpjngQPAJZVOVq9H768wBXmPvqJ1UxLRF5dXRp8raztla8h98YyVEfqZrI3tmIK2DpBvuNZQX52ip4dij358JktvR6hTpneN6qvZz1s3Im4tfaR1M5kJZsX6+zfa62aN1xStWkJ2Mp3j2OhMyQxkRVFKqUXotwIXi8hGEUkCtwEPFe3zEHCH9/r9wI+MMUZElnvJXETkAuBi4GClk9me5RK9tqpTsq9jKCivBBifyeGYMtaNn4wNPHobS6A9YXnn8uvoC8/1P364jzd87gc8+Hx/if3hC7U/jmLrJqrPDTS6wlTh00MiZtGesEqsm5HpbLCod3j/eiL6sHUDsLgjwchUdETv2zbgRvSZOks5jTGksjZrlrhCX63E8sCpSSB/E1UUpTxVhd7z3D8MPArsAR4wxuwWkc+KyC3ebl8FlonIflyLxi/BvAF4SUR24CZpf9cYM1zpfH7HxbDt4gtiVJQNpUI/NuN69FERfVdRtD3lrRcbdMosU0e/d2CCqYzNH39rB3//7OGC94pr2/1zTBQJfXEdfbkVpv7iB6/y0fu3l4w9PC4/Qgf3phieyOROYMqwrKst2OZfo3oamwXllZ41trgzwWiFiN4nGbPI5OqbGZuxHRxDENFXmzS13xN6oGTOgqIohVQtrwQwxjwMPFy07VOh1yngVyKOexB4sJ4B5RxT4M+Da3FYUhr5BhN6PBujPWGRiElg3UR59O2JGG1xKxDG6XR+vVgo79EPTaZ50wVLOTI0zfOHR7j9zRvyYy6qbfera3w7xffPe4usm6BNcdG5ntx3mp39Y3z+fVcG1UDh6xM+FmBpZ7KgbcDIdBZjKIiyG+mzX3wjXdyZ5OjwdMl+g5NpXr9mUfC969HXF2X7iVhf6Ku1QdgXFvp0ruTaKoqSp+lmxtqOKSit9Inqvpj1fGA/gSciQZdFx5swFUV4Bq0f0QfnKePRD01lWNHTznmL2kuizaASJlYY0fvWTdTC4FC+wufEaIqcY3j+8EjJ2O1Q73ufpV1JRkITmfzyxKXhiN67CdWTJC0R+o7SxmY522FoMs3ynvDTg9Tt0fv5j6XdSdoTVtXGZvuLhF5RlPI0p9B3RAi9Vx4YJlMkROA28RpPuRF9uVL+cMvdyXSupoh+2Ou3vqyrLSgn9Mn61SlWUYK0ikcfzIwNWTdZ22Fgwl1h6dmDQyVjD5qaxQqFPpy89CtWlkVF9PV49HaRRx9h3QxOZnAMnOetFQu+R1+f0Ps5k45EjGVdbVWTsftPTQSznCfT9TdQU5SFRNMJfZR1A64AF4tUtihZCK49Mh549NHnCAt9cUvkoGY/JPSprM1EOkdfdxvLe5LlI3rfo08WCv1kGY8+anLWybFU0GL52YOl6Yx8KWf+My/tKrRuiuvaIVx1U39rB98aW9yZJJUtrD466S37t7I3L/SJmBU8bdWKPyu2PRFjWXeyYnllKmtzZHiaqzy7SCN6RalM0wm9a92UCn3ckpLSwHDTLZ+wdROrIaIfLe6UGdTs58/li+iyLjeiH55KF/jqxa2DY5Zbd+4LvN9grJbyyuOjMwBctWYRO46Olkwc8sU3fBNb2pVkdDobvBdE9AXWTf2tHUo9+tJJUyfHSoU+Ga9/4ZFwRL+ip63iurGvDU7hGLhm3WKgdLKYoiiFNJ3QOybao49FTOEPN93y8f33StZNb0joh6cykWWIYZ3KWyFt9HUncQwFnrhdVNsOhR0sx2ayWEJJC4Qom+j4mCv0v3TdmkifPucYEjEp+Gy+RTPqfaahqTQxSwomTAURfR3WTbbYuunwz5P/7L4gn7eosOomazt1zcL1k7FtCYvVizuCG14UfiLWF/paZtEqykKm6YQeCidL+cQtwS62biI8ej9aN8Zglfl0/j5Z22EilSvTVyev9INecnNZd5JlXhlh2EMunjAFrtD7szaHptynBqvISwrq6E04oneF899cvRpLKBF62ymd8es/kfhPHkOT7s0rfL54MDM2OtI+NZEqqf7xE6q+dbMkKqIfTxG3hL6uQqE3pj6byLeDOhIxVi3qYDyVK2vJ7DkxTiImvD6I6Ov36H+yf5BPfGdn3ccpyrlIUwp9lHUTs6R8RB8PJ2Ndgc2VqaN390kwkcox4gljOKKPqtn3I/q+rragXtxv5AWlE6bcz5AIWvoOTxY+NYQ/ExSWVx4fnWFJZ4K+7jZW9rZzZKiwnDFrm6CCxmeZ97P9cQ5OZoJtPomI3IPP4GSat/754/zji8eKzuUUPD0simhVPDCWYkVPW8FNxbfS6qnwCYQ+GWP1YtcGOjEWHdW/fHycC5d3BzeeRjz6H7w8wDefO1JxHVxFaRWaUuijkrHxmJTMVk3nSiP6JZ1JbMcwMp2p6NEDHPFqwsM3lqiafb/Ub2l3MkhwDoYiel88w4F2X3cbgxOe0E9VFvqwHh4fnWG1V0u+bmknR0cKhd52nCCP4LPUG5NvJw1NpQsmMEHliP6l/lHSOYeX+kcLtocXXof8dSqO6MMVN0DQkqKeEku/JUV73I3oIf90U8yeE+NcvrqXjkQMSxoTev+JLGpegKK0Gk0p9NEefVREXxpJn+clBQfGU5EtECAv9Ie8aHlp0Y0lXpQPGJrK0Ba36ErGIiP6nO0Qtwp9876efBnm8HS00Ps3hvAN7PhoKhC6dUs7OTpcGNXmHFNQQx8e/1DIugmXVrqfqXx55Uv9YwAcOD1VsD1rF54rsG5mCoU+nIiF/BNWPSWWMxERfZRPPziZ5tREmstX9SIidCVL1+ethREVemUB0XRC/7rzerj4vO6S7VF19H4JXzJC6E+MpcpaN77QHx5yha34xhIrOpe/8LU/IStmSUHPdNsxBYlYcCP64ekMOdspG9GLeE8PpjAZu8YTunVLOjk5niooZ8zZpqC0Egh6xQ9P+kKfLqi4gcpNzXYdc4U+PAkJChdeB9c/b09YBTe5gbFUcM19Gono/WRsezzGeb3tiMDxsdKIfs+JcQAuX+U2Qe1qi88uoh9RoVdan6YT+mTcoi0eK9leqerGb1MMsMKboTmRypX36L2JS68NukJfLMLxopr94al8hGxZwrKuZGDLuOMoFd++7iTGuILi9p0pFXr3XFZg3YynskykcoF1s36Z+++xUGSbi0jGJmIWve1xhqfSzGRspjJ22Yg+qjXBTk/oT46nCqLjYutGRFi1qIMTXqXNRCrLVMZmZbF1E3j09Sdj25MWiZjFip42TkRE9C8fd4X+skDoY8G6v/XgN007ohG9sgBoOqEvR60zY1f05iPZ4ioXHz+peNizbopzArGifMBQUXJzWXdbUUTvREb04HZZNKb0ZpIfY35m7AnPkw48+iXu0oNhMco5TlAFE2ZZdxvD09lgXH1FQp8oU155aiLFwHiaN25cCsDB0/moPmubgmsLbr28L8ADEZOlwueqL6J3u4j6TwOrFnUEpaZh9pwYZ9Wi9uApprutfuvGGBN04Sy2xhSlFTl3hD5W3qMPWzedyXjQaqDSzFiAQ4NTtCesoEd9cK6ifMDQZDooqwRXRE+HZm5mI3xzX+hfHZgA8vZKMTHJPz34nrTvUftrzPYXCH30gipLOhMMT6UjJ0tBuKlZofj6ts17r3UXDQvbNxm79KayanF7MElqYNy9qZRYNw1U3cxkbNoTsSDPsWZxR3DjC/PyifEgmofGrJvJdC4IEtS6URYC547QW6VVN37EGPaRIW/fVPPoJ9K5yAofS/JPD8YYBqcKk5t93W0FTbfsMtYNwN4BVziLhTc4lyVBRO9H7msWuwK/vLuNZNzi6Eg+6ow6F7gNzIYmM0FEX2zd5JuaFd4sX+ofQwRuvnIVcUs4EI7oc05JRL96UQcDE2lsx+RnxS4qjujd656uJ6LP2cFaAQCrFrVzfGymYNJVKmtz4PQUl63qCbZ1NpCM9ecb9HUn6R+eKZk/EMX/fmI///uJ/XWdR1GahXNG6CN73URYN5CPMMtF9B2JWGgSULl2C+65JtM5MjmnYEJQX1Evlqgou6+nMKIvZ92EE7/7T03S0xbnPM9+sixh3ZKOglr6XIRNBG4t/fBUJl/zX6a8svhmuevYGBf0dbGoM8H6ZZ0cOJWvvClOxoIr6rZjODWRiuxzA41G9A7tYaFf3EEq6xQsXbj7+Di2Y3j92sXBtu62WN396P1E7DXrFpOxHU5NVO6U6TiGrzz1Gt9+vr+u8yhKs3DOCH1xySOEhb5Q+AKhL6P0IhL0L1/SFVHKGcuLb1QnyGXdbcxk7cAyiBLfnrY4yZgVCH1xhJ3/XBJU3ew/NcmFK7oLyjSLa+mjyivBraUfmc4EDddKkrERa8YaY9h+dIyrPeG8aHk3+4s8+uJz5SczpRgYT9HbHi+xvhqrurGDVb6AoPIoXGK546hb5++3PgDfuqkvGeuXVvqfu1pCdu/ABMNTGfpHaov+FaXZOGeEPqqOPioZC9WtG8jbN9ERff6mkrdCwhG91wbBE9Uo8RUR+rqTQYviqLkB/hh98dh3apKLVxSWlq5b0llQ652zoz36pZ1Jsrbhx6+eoqctXrJgSTAzNhRl94/MMDiZ5trzlwBw4YpuDg9NBTfQ4qobgJW9bqL4xGiKfQOTbOzrKhlLIxF9KmsX3DD8uQQnQiWWO/pHWdnbXpAT6G7Ao/cj+qu9G0a1WvqfHnDbRWdyDqer9MmP4qX+Uf7xRX0aUOaPc0boozx6v01xsljoq1g34LZBgGhLJRY6ly80K0ILa/jRsv+f3p0wVXopffumpy0eWTLqnyvnGEanMwxOprmoSOjXL+1kPJVjzLMw3KeHKI/eHdOzB4f53Z+7sOT9qBWmtnsR8rWe4F1yXjdZ2wQJ2SjrJjyZadexMa5au4hiKlXdpLI2dz36CqeL7JKZrE176Br5lUf9oaeZHUdHuXpd4fm62uKkc05dSyT6Hv3r1y5CpHpC9pkDg8HrRiZY/fUTB/iTB3fWNUZFOZOcM0If5dGncjZxS0osGt/jLte9EvIRfdmWyN65Dp6eQgQ2LMtHruu8BayPDLt+dtSEKchH/kvL2DaQj+h9cS2eLLZ+mZuYPTg4mT9XGesG4NKVPXzohgtK3vfFN2zdvHhklPaExetWusnNa9e5kb1/A4gqr1zUkaA9YfHMwSEm0rkCv9yn0szYrz79Gnc/foC/fapwjfjiiL6vO8nizkRgfY1OZzg0NB1E4T751bxqt2+GvZnOizoSrOptD8pso8jZDlsODrPZKz9tpEpn78AEmZxTMvNYUc4W54zQx2OldfSvnZ4KShDD+I/25XrdQF7ol5Zpt+Cf68DpSdYs7igQofOXdRG3JBT5RouvX3tfLhEbfC6TF/qLlvcUvH/FareUcJc3UShrm8iI/vJVvVy2qpcvvv/1JeIM4RYIefF98egIr1+zONj//GWdLOlM8ILXMTMbUV4pIqxe1MHT+90o9/UREX05j35kKsPfPHEAgG8/3086tID4TLYwGSsiXL6qN5ggtcNr03BN0Y2l21sdbLKOhKw/U1lEuGxVb0mPnzC7jo8zkc7xq5vWAfXX3aeydnAj2X18rK5jFeVMcc4IfcyySoT+5RPjwVT4MIFHX+HT9Xa4kWBUfXu46ubA6UkuXF4YZSdiFhv6utg3kI+yo3xz37op7qUTJuaVcu47NUl7wmKN97Tgs2ZxB0s6E+z0xKhcRH9ebzuP/OFbIyNsyDdQy3qfK52z2X1snGvX5/cXEa5dv4QXvYg+E+HRg1t5k8k5tCcsLlpe2q6i3MzY//3EfiYzOf70Fy9neCrD93edDN5LZ+0CoQf35vXKyQlytsOOo6OIwJVrS60bqK+xWbglxRs2LOHA6akgQVvMIztPYAm8/XXLWd7TVrd1c/D0VPB3u9u7aSnK2eacEfriSUzjqSxHhqe5fHWU0PsefWPJWD+idxzDgVNTJUIPcPGK7iAKL+ebB9ZNhYje8s61/9QkF/R1l9wwRISr1i5m57Fx71zRN5VqiAiJmAQR/Z4TE2Rsp6CCBVy/fv+pyaBff5TQ+4nSK1YvivzceY8+H7HvOTHO135yiPdft5bf/JkNrF/ayT9sORK8P5O16UgU/qzLVvWSzjkcGppi2+ERLlzeHVRL+fhCX08t/VBY6Ne7dtULR0oXYp9IZfnGliPcfNUqlnW3sT6im2g19p1yradFHYmzEtF/4eE9/Id/eH7Oz6OcW5wzQl/caOyVE+5/oKiIviMZo7c9XpNHX77qxuHkeIqZrM2FK0orSy5a0c3h4WnSOdtrNBbl0XvWTQWP3o/o95+ajGzmBnDVml72DUyQytrkIuyUWglXLm075K5He836QqG/zqvA2XF0lJxtIs+1ypsg5a/ZWkxxRJ+zHf7kwZdY1JHgEzdfhmUJt7/pfJ57bThYAH0mKqL3buLPHBzmmQODvOPSFSXn6m4goh8JCf3V6xYTt4Rth0uF/r7njjKRzgU5j3VLOuq2bvaenCBuCTdesZLdx8drWnXrb588yHe3H6u6XzHGGL67/TiP7h44K8srTqbLLw6jNBfnjNAXrxkbdDGMiOjBtTIq6eHqxR3ELClYAs/Hv6n4s0SjIvqLVnRjO4ZDg9NueWVEZLu8uwbrxhJGp7McG50pKa30uWrNYnKOYc+Jcc8mauzXlrCsoOTxX3cPcOnKniA69/ErUV48Mlo+ovcqb4orYILzeBfeT8b+7VOv8VL/GJ+55YpAYG9/8/msXtTO57/3Mo5j3GRskdBfuLybREz4mycOkLUNN1+1quRc/kLsjVo37YkYV6xZVLKSVzpnc89PXuONG5cGdti6pZ2cGJupq2z0Va8E9ep1i5lI5areKEamMnzx0Vf4s0deqbtm/8jwNCfHU9iOYetrpQvLn2l++96t/O7fn52nh0d3n4x86poLnnz1dMmCP3PF3z1zKGiuOJecO0JflIx9+fg4y7qSBWWPYT5x86X8+7eVlhn63HTlKn740bcFNk/xuXKO4YBnzVywvDSiv3iFmzTdf2rStW4iInq/wdryMmMEV+if9/6A33xhX+Q+fgnjrmNjZB0nWOi7XuIxt5ro1ESKrYeHufHKlSX79LQnuGRFD9sOD5OJaIEAbnXOeb1tvOmCZZHnCSdjd/aP8d//dS83XbmSX3x9XqjbEzH+5KZL2XVsnG+/0E+qKBkL7pPBxSt6ODY6w5rFHVwdkfjt8pOxZapuwi2ewRXwyXSuoEndpvOXsOPoaEHy+P97dC8nxlJ85B0XB9vWLenEMUT24CnHqwMTXLKyJ0iqV7NvvrfzBFnbcGIsxXOH6hPrLQfz+z/jPSnNFSNTGZ57bZif7B8sWHFsLkjnbD56/3Y+/d3dc3oecO26O+/dyue+9/Kcn+vg6Un+9Lu7+avH9s35uc4Zoe9KxhmfyQWPpC97qwyVs2fecel5ZYUIXIGNmuzjv+c4hgOnp+hpjweReZgLlnch4nqw5aybC5d381cfuJabriyNRH18j76vO1nil/usXtTO0q4kL/WPYZeZMFUL8Zg7EezR3QMYQ2SEDPD2S1fw0wNDTGXskjp6cJ+itvyXd5Y8Dfj4+YCxmSx/cN+L9HW38YVfuqrkd3XL1au5bv1iPv8v7n+qYqGHfDviX3j9qsjfdaVk7EM7jnPFpx/lP/zD8/xk/yBP7D3F0/vcaqGloZYWm85fQjrnBCL80/2DfOXp1/h3b1zPWy7O33zXLnU/b60+/XQmx9GRaS5Z0cPrVvYQsySoHirHP754jAv6uuhMxvju9uM1ncdny2vDLO1KsnnDUp45UJvQv3JyPJhXUA9P7x/EMeAYeGLv6bqPr4ctB4eZytjsPDY25wvF/PjV097Ew9Nzbn/94OUBAH64Z6CuWeSNcM4I/buvWEnGdvjeS8fJ2g57ByYi/fkzgZ/49StuogSmPRFj/dJO9p2a9Kyb0n1EhFuuXl3SIiCMf9g7Ll1RVsBFhKvWLGLb4REydvS5aiFhucnY7+86wQXLu8paRb92/Tpsx2A70R59LSRjFt/YcoRDQ1P8xa9dEzlfQUT44vtfT8r7Iy9OxgJcucb9HZe7Kfke/RN7T/H5f3mZf95xnKPD0zz32jAf+9YONizr5Md7T/PvvrKFD35tK3feuw0obOO8eeNSknF3vKmszX9+8CU2LOvik79wWcG5/LbRPz0wWJPXvu3QCMbA61Z2056I8bMX9fGtbUeZLlMKemRomucPj/Arm9bx7svP4+GdJ+oSgC2vDbF5w1LefOEydh8fq7oe7omxGW79Xz/h17+ypS47Clx7Y1GHu7bxD/cM1HTMqwMTDXn6j+0ZCP4OH919ssreLqPTmZp+R8X88OUBYpaQyTk8/sqpqvsbY3hq3+mSJ8da+MHLA7TFLSZSuZqewEanM/zZI69waqL2J0qfmoReRG4Ukb0isl9EPh7xfpuI3O+9v0VENoTe+4S3fa+IvKfuEXpct34xF63o5r6tR/nJ/kEyOaesPz9bYpYbje49ORHpz/tctLybPSfGSWXthn1zf0btOy87r+J+7712Na8NTjE4mY6chVvTuWIWB05P8uzBYW6+MjpCBtjY1xX0p4+ybmohEbfI2A6/97YLefOF5Z+sLlrRw3969yUAdLbFS97/1U3r+MpvbCr7tNMWt+hpj/P43tP8n58e4iPffJG3fvFxfvVLz9DX3cYD//7NPPmf387Xf2szD/7em/nS7W/g8++9khsuWR78jGXdbdz+pvN58IV+/ss/7qR/ZIb/9t4rS9pIrFncwdtft5y7Hz/AH39rR1nBdpOix/jQ321jZW87mze6n/8P3nERQ1MZ/uHZIyXHZG2HLzyyBxG49ZrV3HrNGsZmsnzl6YMl+0ZxbHSG/pEZ3niBK/SOgeeq+PT/80f7ydoOL58YD+Y31IIxbsT7lov7eMely70ouPKN4oUjI9z4l09yxz3P1XXzMsbw2CuneNsly7lsVW9BSW6lc23+b4/xyX/aVZfYZ22HH71yiluvXk1fd7Kmc/39liPc/tXn+OMHdtR1rsHJNM8fGeG33rKRrmSspnN97l/28Dc/PsAffPPFklLzapT+zypCRGLA3cC7gH5gq4g8ZIwJm1h3AiPGmItE5Dbgz4FfE5HLgduAK4DVwA9F5BJjTN23PxHhtuvX8fnv7eEj33yRC5d38fNVxLFR4pZF/8gMyZjFL15d3nZ5y8V9PObd9TdvWNrQuSzLFauwRRDFrVev4ctPvsaeE+OzsG6EF46MsqQzwb994/qK+962eR1bXhtuWOgXdyQ4f2kn//Fdl1Td9863XMDijiTvubw0Z9DVFuedl5f/PYsI//zht2CJsHpxOzv6x9h/aoKZjM07Lz8v6FEUFvYofu/nLuSbzx3hOy8c4+arVvIzF5X+PixL+Mod1/M/f7SP//HYPl7qH+Pz772Sy1b2svvEGNuPjpKMWfzolVP89MAQbzh/CX/969cFid9NG5bysxct40tPHuA9V6xk3dIOToyl2HlsjL9/9jBP7RvkEzddyurFHZzX2857rjiPL35/L6fG03z4HReVdCT1GZ7K8Kl/2gXAmy9cxsa+LhZ1JPjsv+zm4hXdnL+s05u9nf9d7j81wQNbj3L7m85naCrDX/1oH309bfzqJvdpbjqTI2sb2hMWYzNZfrp/iI5kjJ973XL2nZrk1ESat12ynEUdCR7Y1s83nzvCbdev57XBKY6NTpPKOnQmYyzvaWPt4k7++IEd9LQn2HZ4hD/9p118+pbLyeQc/nX3AFnHCXoYHRud4VvbjrKoI8kvXbeG9kSM/pEZfv/tF3FqPM1fPvYqzx8eZtWiDp45MMR01mbN4na62xL0dsQ5r6edP7zvRRD4xpYjXLS8m9vffD4vHhnl7549jCWuPtqlQAAACsJJREFUpXr9hqVkbYdHdp1gZW8HN1+1kmOjM4yncrz7ipV0JGN854Vj7DkxTtZ2+OGeUyzpTHDzVatY3JkgJsLx0RRfeHgPy3va+N7OE1zx415+82c28vT+Qe796SESMWFjXzc3X7WSRR0Jth4aYWNfF5s2LOH7u05iDPzCVas4OjzND14+yQd/ZgODk2ke2XWCC/q6uW3zuiDY+On+QR58oZ83nL+EZw8O84WH9/AH77yYLQeH+ftnD0daxwX/T6rdhUTkzcBnjDHv8b7/BIAx5guhfR719nlGROLASWA58PHwvuH9yp1v06ZNZtu2bZHvDU2medMXHqMzGeeffv9ny3rss+VrP3mNR3ef5DO3XMGlK8s/NRhjePbgMN947gi/cNVKbqzgxZfjL3/4KhMpdxJRNZ7Ye4oPfm0rv/2Wjfw/NexfzI1/+ST7T03yd3e+sWKUDW4S8ze++hwffsdFVUUyisNDUyztStLTHt3MrRm5+/H9fOnHB3j4D9/K2iWlM67D/GT/IH943/ZgAfgwSzoT/Md3XcIHNq8vuVE+f3iE2778DFnbsKgjEdgryZjFZ265ouAGbDuGz/7zbu59xv2PvH5pJznPUss5DrZjyNqGmYwbN338pkv5rbdsBNzy2A9+7TlmsjbGuGsDJL0F7mOWMDiZoSMR48cf+zniMYsPfX0b2w6P0JmMMZ0pH4eJgDFuH6mffvznWdSR4Na7n+bVgUkscT37cnzjd97IU/sG+esnDhCz3PWSo5abXNnbzlQ6x0TI5tnyX36eqXSOm/7HUxXXORBx58/c/6E38ddPHOCxV04FY17SmaAzGffWOXD370rGmPauEbgFAC/+6bvYeWyM2778bMnnDhO3hI5EjO//xxv4rw/t5l9fzltY65Z20NueYP+pyZLx+j9rzeIOnv6Tt/Po7oGC6qW2uEU6594o2xMx0lmbmazN+qWdfP+PbuBP/2kX33q+P/g5a5e453rkj2543hizKfK61CD07wduNMb8tvf97cAbjTEfDu2zy9un3/v+APBG4DPAs8aYv/e2fxV4xBjz7aJzfAj4EMD69evfcPjw4bLjeWzPAKsWdcyZbdPMGGP46x8f4K0XLY9sJlaNB5/vpzMZ46Yyfrfit0sun1MJMzqdYctrwxw8PcXGvi5+5qJlGMdd97ZcEztwbZaHth/n8NAUl63q5co1i7h8VW/ZXM6+gQkefOEY/SPTxC0hZlnELSEeE+KWkIxbvO/atSX/Jw6cnuQrT71GT3ucrmSc6WyO6bRN1nbY0NfFz71ueRDIGGP4/q6TPHNwiL7uNnra48QtIe1VXr35wmWMzWR56tXTLOpMcs26RbzhfPcp1nYMj+0ZYOuhYS5d2csFy7voSLpr+Z4Ym2H38XHOX9rJbZvXY4zh6f2DPPfaMFnb8IuvX8Wy7iQnvbbXbYkYb72oj6zt7nfg9CRLOhP82vXuDfD46AxbDw0zNJnhTRcsY2lXkuNjM8xkbAYn0+zsH+OKNb2879q1zGRs/uWl4xwdmWFFTxu/fN1aOpIxxlNZthwcxjGGt12ynJHpDE+9OsjpyTQX9HUF/z/2npxg78AEtuPwc5esYGgqzeOvnCZjO+Rsw9hMlhuvXMnmjUtJ52x+tOcUr5ycYN3STt57zWriMYvJdI4fvjxAKmtz/cal7BuYZOexUfq63aq1y1b1Yozh1YFJXjk5TjJm8fZLV7Dz2BgPecn4trhFW8Lil69bywXLu3EcwwtHRvjxq6dZt7STX7p2DfGYhYjMSuh/BXhPkdBvNsZ8JLTPbm+fsNBvBj4LPFMk9A8bYx4sd75KEb2iKIoSTSWhr8WA7QfWhb5fCxTXfQX7eNbNImC4xmMVRVGUOaQWod8KXCwiG0UkiZtcfahon4eAO7zX7wd+ZNxHhYeA27yqnI3AxcBzZ2boiqIoSi1UrboxxuRE5MPAo0AMuMcYs1tEPgtsM8Y8BHwV+DsR2Y8byd/mHbtbRB4AXgZywO83UnGjKIqiNE5Vj/5sox69oihK/czWo1cURVHOYVToFUVRWhwVekVRlBZHhV5RFKXFabpkrIhMAHvnexw10gcMzvcgakDHeWbRcZ5ZdJxnhvONMZH9SqqWV84De8tljpsNEdl2LoxVx3lm0XGeWXScc49aN4qiKC2OCr2iKEqL04xC/+X5HkAdnCtj1XGeWXScZxYd5xzTdMlYRVEU5czSjBG9oiiKcgZRoVcURWlxmkroqy1CPl+IyDoReVxE9ojIbhH5Q2/7Z0TkmIhs975uboKxHhKRnd54tnnblorID0Rkn/fvknke4+tC12y7iIyLyB81w/UUkXtE5JS3apq/LfL6ictfeX+vL4nIdfM8zrtE5BVvLP8oIou97RtEZCZ0Xf9mnsdZ9vcsIp/wrudeEXnPPI/z/tAYD4nIdm/7vF3PhjHGNMUXbgvkA8AFQBLYAVw+3+PyxrYKuM573QO8ClyOu1Tif5rv8RWN9RDQV7Tti8DHvdcfB/58vsdZ9Hs/CZzfDNcTuAG4DthV7foBNwOPAAK8Cdgyz+N8NxD3Xv95aJwbwvs1wfWM/D17/6d2AG3ARk8PYvM1zqL3/zvwqfm+no1+NVNEvxnYb4w5aIzJAPcBt87zmAAwxpwwxrzgvZ4A9gBr5ndUdXErcK/3+l7gvfM4lmJ+HjhgjCm/UPBZxBjzJO6aCmHKXb9bga8bl2eBxSJyVhbkjRqnMeZfjTH+itrP4q7oNq+UuZ7luBW4zxiTNsa8BuzH1YU5p9I4RUSAXwW+eTbGMhc0k9CvAY6Gvu+nCcVURDYA1wJbvE0f9h6V75lvS8TDAP8qIs97i64DnGeMOQHuTQtYMW+jK+U2Cv8DNdv1hPLXr5n/Zn8L92nDZ6OIvCgiPxaRt87XoEJE/Z6b9Xq+FRgwxuwLbWu261mRZhJ6idjWVLWfItINPAj8kTFmHPhr4ELgGuAE7uPdfPOzxpjrgJuA3xeRG+Z7QOUQd2nKW4BveZua8XpWoin/ZkXkk7gruv2Dt+kEsN4Ycy3wUeAbItI7X+Oj/O+5Ka8n8AEKg5Fmu55VaSahb+qFxEUkgSvy/2CM+Q6AMWbAGGMbYxzgbzlLj5mVMMYc9/49Bfwj7pgGfEvB+/fU/I2wgJuAF4wxA9Cc19Oj3PVrur9ZEbkD+EXg3xnPUPaskCHv9fO43vcl8zXGCr/nZryeceCXgPv9bc12PWuhmYS+lkXI5wXPo/sqsMcY8/+Htof92PcBu4qPPZuISJeI9PivcZNzuyhcvP0O4LvzM8ISCiKlZrueIcpdv4eA3/Cqb94EjPkWz3wgIjcCfwLcYoyZDm1fLiIx7/UFwMXAwfkZZcXf80PAbSLSJiIbccf53NkeXxHvBF4xxvT7G5rtetbEfGeDw1+4VQyv4t4hPznf4wmN6y24j5AvAdu9r5uBvwN2etsfAlbN8zgvwK1a2AHs9q8hsAx4DNjn/bu0Ca5pJzAELAptm/friXvjOQFkcSPMO8tdP1yr4W7v73UnsGmex7kf1+P2/0b/xtv3l72/hx3AC8C/medxlv09A5/0rude4Kb5HKe3/f8Av1u077xdz0a/tAWCoihKi9NM1o2iKIoyB6jQK4qitDgq9IqiKC2OCr2iKEqLo0KvKIrS4qjQK4qitDgq9IqiKC3O/wXt7wny6kqenwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "loss_values = []\n", "for t in range(200):\n", " # forward pass\n", " op_pred = model(ip_train.transpose(0, 1)[t%16])\n", " \n", " # calc loss\n", " loss = loss_fn(op_pred, op_train.transpose(0, 1)[t%16])\n", " loss_values.append(loss.item())\n", " if t%5 == 0:\n", " print(t, loss.item())\n", " \n", " # set grads to 0 before backpropagating\n", " optimizer.zero_grad()\n", " \n", " # backpropagate the loss\n", " loss.backward()\n", " \n", " # update params based on grad\n", " optimizer.step(None)\n", "\n", "# plot loss once training complete. ideally loss should reduce to 0.\n", "df = pd.DataFrame({\n", " 'loss': loss_values\n", "})\n", "df.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Test model" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9.802044034004211\n" ] } ], "source": [ "# test it on a single value of study, sleep\n", "test_study = 24 / 24\n", "test_sleep = 1 / 24\n", "test_score = model(torch.as_tensor([test_study, test_sleep])).item()\n", "print(test_score * 10)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# run it against training data\n", "df = pd.DataFrame({\n", " 'study': study,\n", " 'sleep': sleep,\n", " 'score': score\n", "})\n", "\n", "predicted_score = model(torch.FloatTensor(np.array([study, sleep]).T))\n", "df['predicted_score'] = np.array(predicted_score.tolist()).T[0]\n", "df.plot(y=['score', 'predicted_score'])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 4 }