uczenie-maszynowe/lab/linear_regression_pytorch.i...

558 lines
41 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 3,
"id": "fda33bda",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"epoch=0, loss.item()=161257439232.0\n",
"epoch=1, loss.item()=160922075136.0\n",
"epoch=2, loss.item()=146514542592.0\n",
"epoch=3, loss.item()=113313726464.0\n",
"epoch=4, loss.item()=12049310547968.0\n",
"epoch=5, loss.item()=4.334163566116261e+19\n",
"epoch=6, loss.item()=inf\n",
"epoch=7, loss.item()=nan\n",
"epoch=8, loss.item()=nan\n",
"epoch=9, loss.item()=nan\n",
"epoch=10, loss.item()=nan\n",
"epoch=11, loss.item()=nan\n",
"epoch=12, loss.item()=nan\n",
"epoch=13, loss.item()=nan\n",
"epoch=14, loss.item()=nan\n",
"epoch=15, loss.item()=nan\n",
"epoch=16, loss.item()=nan\n",
"epoch=17, loss.item()=nan\n",
"epoch=18, loss.item()=nan\n",
"epoch=19, loss.item()=nan\n",
"epoch=20, loss.item()=nan\n",
"epoch=21, loss.item()=nan\n",
"epoch=22, loss.item()=nan\n",
"epoch=23, loss.item()=nan\n",
"epoch=24, loss.item()=nan\n",
"epoch=25, loss.item()=nan\n",
"epoch=26, loss.item()=nan\n",
"epoch=27, loss.item()=nan\n",
"epoch=28, loss.item()=nan\n",
"epoch=29, loss.item()=nan\n",
"epoch=30, loss.item()=nan\n",
"epoch=31, loss.item()=nan\n",
"epoch=32, loss.item()=nan\n",
"epoch=33, loss.item()=nan\n",
"epoch=34, loss.item()=nan\n",
"epoch=35, loss.item()=nan\n",
"epoch=36, loss.item()=nan\n",
"epoch=37, loss.item()=nan\n",
"epoch=38, loss.item()=nan\n",
"epoch=39, loss.item()=nan\n",
"epoch=40, loss.item()=nan\n",
"epoch=41, loss.item()=nan\n",
"epoch=42, loss.item()=nan\n",
"epoch=43, loss.item()=nan\n",
"epoch=44, loss.item()=nan\n",
"epoch=45, loss.item()=nan\n",
"epoch=46, loss.item()=nan\n",
"epoch=47, loss.item()=nan\n",
"epoch=48, loss.item()=nan\n",
"epoch=49, loss.item()=nan\n",
"epoch=50, loss.item()=nan\n",
"epoch=51, loss.item()=nan\n",
"epoch=52, loss.item()=nan\n",
"epoch=53, loss.item()=nan\n",
"epoch=54, loss.item()=nan\n",
"epoch=55, loss.item()=nan\n",
"epoch=56, loss.item()=nan\n",
"epoch=57, loss.item()=nan\n",
"epoch=58, loss.item()=nan\n",
"epoch=59, loss.item()=nan\n",
"epoch=60, loss.item()=nan\n",
"epoch=61, loss.item()=nan\n",
"epoch=62, loss.item()=nan\n",
"epoch=63, loss.item()=nan\n",
"epoch=64, loss.item()=nan\n",
"epoch=65, loss.item()=nan\n",
"epoch=66, loss.item()=nan\n",
"epoch=67, loss.item()=nan\n",
"epoch=68, loss.item()=nan\n",
"epoch=69, loss.item()=nan\n",
"epoch=70, loss.item()=nan\n",
"epoch=71, loss.item()=nan\n",
"epoch=72, loss.item()=nan\n",
"epoch=73, loss.item()=nan\n",
"epoch=74, loss.item()=nan\n",
"epoch=75, loss.item()=nan\n",
"epoch=76, loss.item()=nan\n",
"epoch=77, loss.item()=nan\n",
"epoch=78, loss.item()=nan\n",
"epoch=79, loss.item()=nan\n",
"epoch=80, loss.item()=nan\n",
"epoch=81, loss.item()=nan\n",
"epoch=82, loss.item()=nan\n",
"epoch=83, loss.item()=nan\n",
"epoch=84, loss.item()=nan\n",
"epoch=85, loss.item()=nan\n",
"epoch=86, loss.item()=nan\n",
"epoch=87, loss.item()=nan\n",
"epoch=88, loss.item()=nan\n",
"epoch=89, loss.item()=nan\n",
"epoch=90, loss.item()=nan\n",
"epoch=91, loss.item()=nan\n",
"epoch=92, loss.item()=nan\n",
"epoch=93, loss.item()=nan\n",
"epoch=94, loss.item()=nan\n",
"epoch=95, loss.item()=nan\n",
"epoch=96, loss.item()=nan\n",
"epoch=97, loss.item()=nan\n",
"epoch=98, loss.item()=nan\n",
"epoch=99, loss.item()=nan\n",
"predicted=array([[nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan],\n",
" [nan]], dtype=float32)\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiQAAAGsCAYAAADt+LxYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABNn0lEQVR4nO3de1xUdf4/8NcwCkoyGKKCzChKZpZmZv4UXQq/meLXChZJs/pqu13WvAResmy3zLbNvloKu1nt9t3EtrwgjvrNNRIvKAVd1PymxrJqKojgjWRQFHTm/P5wZ5ZhbufMnJkzl9fTxzwecuYzZz7nzOW853N5f1SCIAggIiIiUlCY0hUgIiIiYkBCREREimNAQkRERIpjQEJERESKY0BCREREimNAQkRERIpjQEJERESKY0BCREREimNAQkRERIpjQEJERESKC6iAZM+ePXjooYfQo0cPqFQqbNq0SfI+BEHA22+/jVtvvRURERFISEjAH/7wB/krS0RERKK1U7oCUly+fBmDBg3Cr3/9a2RmZrq1j+zsbGzbtg1vv/02Bg4ciPr6etTX18tcUyIiIpJCFaiL66lUKmzcuBEZGRmWbc3Nzfjtb3+LNWvW4OLFixgwYAD++7//G6mpqQCAiooK3HnnnTh06BD69eunTMWJiIjIRkB12bgyc+ZMlJeXY+3atfjhhx/wyCOPIC0tDUeOHAEAfPbZZ+jTpw+2bNmC3r17IzExEU8//TRbSIiIiBQWNAFJVVUVVq5cifXr1yMlJQVJSUmYN28efvGLX2DlypUAgJ9++gknT57E+vXr8fHHHyM/Px/79u1DVlaWwrUnIiIKbQE1hsSZgwcPwmg04tZbb7Xa3tzcjC5dugAATCYTmpub8fHHH1vK/fWvf8WQIUNQWVnJbhwiIiKFBE1AcunSJajVauzbtw9qtdrqvk6dOgEA4uPj0a5dO6ugpX///gButLAwICEiIlJG0AQkgwcPhtFoxNmzZ5GSkmK3zMiRI3H9+nUcO3YMSUlJAIB//vOfAIBevXr5rK5ERERkLaBm2Vy6dAlHjx4FcCMAWbZsGUaNGoWYmBj07NkTTzzxBL766iu88847GDx4MM6dO4cdO3bgzjvvxPjx42EymTB06FB06tQJubm5MJlMmDFjBjQaDbZt26bw0REREYWugApISkpKMGrUKJvtU6dORX5+Pq5du4Y33ngDH3/8MWpqahAbG4vhw4dj0aJFGDhwIADg9OnTmDVrFrZt24abbroJ48aNwzvvvIOYmBhfHw4RERH9S0AFJERERBScgmbaLxEREQUuBiRERESkuICYZWMymXD69GlERUVBpVIpXR0iIiISQRAENDY2okePHggLc94GEhAByenTp6HT6ZSuBhEREbmhuroaWq3WaZmACEiioqIA3DggjUajcG2IiIhIDIPBAJ1OZ7mOOxMQAYm5m0aj0TAgISIiCjBihltwUCsREREpjgEJERERKY4BCRERESmOAQkREREpjgEJERERKY4BCRERESmOAQkREREpjgEJERERKS4gEqMRkXyMJiNKq0pR21iL+Kh4pPRMgTpMrXS1iCjEMSAhCiH6Cj2yi7JxynDKsk2r0SIvLQ+Z/TMVrBkRhTp22RCFCH2FHlkFWVbBCADUGGqQVZAFfYVeoZoRETEgIQoJRpMR2UXZECDY3GfellOUA6PJ6OuqEREBYEBCFBJKq0ptWkZaEyCg2lCN0qpSH9aKiOjfGJAQhYDaxlpZyxERyY0BCVEIiI+Kl7UcEZHcGJAQhYCUninQarRQQWX3fhVU0Gl0SOmZ4uOaERHdwICEKASow9TIS8sDAJugxPx3blou85EQkWIYkBCFiMz+mSicWIgETYLVdq1Gi8KJhcxDQkSKUgmCYDsP0M8YDAZER0ejoaEBGo1G6eoQBTRmaiUiX5Fy/WamVqIQow5TIzUxVelqEBFZYZcNERERKY4BCRERESmOAQkREREpjgEJERERKY4BCRERESmOAQkREREpjgEJERERKY4BCRERESmOAQkREREpjgEJERERKY4BCRERESmOAQkREREpjgEJERERKY4BCRERESmOAQkREREpTlJAsnjxYgwdOhRRUVHo1q0bMjIyUFlZ6fQx+fn5UKlUVrcOHTp4VGkiIiIKLpICkt27d2PGjBn4+uuvUVxcjGvXrmHMmDG4fPmy08dpNBrU1tZabidPnvSo0kRERBRc2kkpXFRUZPV3fn4+unXrhn379uHee+91+DiVSoW4uDj3akhERERBz6MxJA0NDQCAmJgYp+UuXbqEXr16QafTIT09HYcPH3Zavrm5GQaDwepGREREwcvtgMRkMiEnJwcjR47EgAEDHJbr168fPvroI2zevBmffPIJTCYTRowYgVOnTjl8zOLFixEdHW256XQ6d6tJREREAUAlCILgzgOfe+45fP755/jyyy+h1WpFP+7atWvo378/Jk+ejN///vd2yzQ3N6O5udnyt8FggE6nQ0NDAzQajTvVJSIiIh8zGAyIjo4Wdf2WNIbEbObMmdiyZQv27NkjKRgBgPbt22Pw4ME4evSowzIRERGIiIhwp2pEREQUgCR12QiCgJkzZ2Ljxo3YuXMnevfuLfkJjUYjDh48iPj4eMmPJSIiouAkqYVkxowZWL16NTZv3oyoqCjU1dUBAKKjo9GxY0cAwJQpU5CQkIDFixcDAF5//XUMHz4ct9xyCy5evIilS5fi5MmTePrpp2U+FCIiIgpUkgKS999/HwCQmppqtX3lypV48sknAQBVVVUIC/t3w8vPP/+MZ555BnV1dbj55psxZMgQlJWV4fbbb/es5kRERBQ03B7U6ktSBsUQERGRf5By/eZaNkRERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDgGJERERKQ4BiRERESkOAYkREREpDhJAcnixYsxdOhQREVFoVu3bsjIyEBlZaXLx61fvx633XYbOnTogIEDB2Lr1q1uV5iIiIiCj6SAZPfu3ZgxYwa+/vprFBcX49q1axgzZgwuX77s8DFlZWWYPHkynnrqKXz//ffIyMhARkYGDh065HHliYiIKDioBEEQ3H3wuXPn0K1bN+zevRv33nuv3TKTJk3C5cuXsWXLFsu24cOH46677sIHH3wg6nkMBgOio6PR0NAAjUbjbnWJiIjIh6Rcvz0aQ9LQ0AAAiImJcVimvLwco0ePtto2duxYlJeXO3xMc3MzDAaD1Y2IiIiCl9sBiclkQk5ODkaOHIkBAwY4LFdXV4fu3btbbevevTvq6uocPmbx4sWIjo623HQ6nbvVJCIiogDgdkAyY8YMHDp0CGvXrpWzPgCABQsWoKGhwXKrrq6W/TmIiIjIf7Rz50EzZ87Eli1bsGfPHmi1Wqdl4+LicObMGattZ86cQVxcnMPHREREICIiwp2qERERUQCS1EIiCAJmzpyJjRs3YufOnejdu7fLxyQnJ2PHjh1W24qLi5GcnCytpkRERBS0JLWQzJgxA6tXr8bmzZsRFRVlGQcSHR2Njh07AgCmTJmChIQELF68GACQnZ2N++67D++88w7Gjx+PtWvXYu/evfjLX/4i86EQERFRoJLUQvL++++joaEBqampiI+Pt9zWrVtnKVNVVYXa2lrL3yNGjMDq1avxl7/8BYMGDUJhYSE2bdrkdCAsERERhRaP8pD4CvOQEBERBR6f5SEhIiIikgMDEiIiIlIcAxIiIiJSHAMSIiIiUhwDEiIiIlIcAxIiIiJSHAMSIiIiUpxba9kQERFR4DOajCitKkVtYy3io+KR0jMF6jC1InVhQEJERBSC9BV6ZBdl45ThlGWbVqNFXloeMvtn+rw+7LIhIiIKMfoKPbIKsqyCEQCoMdQgqyAL+gq9z+vEgISIiCiEGE1GZBdlQ4DtyjHmbTlFOTCajD6tFwMSIiKiEFJaVWrTMtKaAAHVhmqUVpX6sFYMSIiIiEJKbWOtrOXkwoCEiIgohMRHxctaTi4MSIiIiEJISs8UaDVaqKCye78KKug0OqT0TPFpvRiQEBERhRB1mBp5aXkAYBOUmP/OTcv1eT4SBiREREQhJrN/JgonFiJBk2C1XavRonBioSJ5SFSCINjO+/EzBoMB0dHRaGhogEajUbo6REREQcHbmVqlXL+ZqZWIiChEqcPUSE1MVboaANhlQ0RERH6AAQkREREpjgEJERERKY4BCRERESmOg1qJiAKMt2dGECmBAQkRUQDRV+iRXZRttTiaVqNFXlqeIrkjiOTCLhsiogChr9AjqyDLZqXWGkMNsgqyoK/QK1QzIs8xICEiCgBGkxHZRdkQYJvL0rwtpygHRpPR11UjkgUDEiKiAFBaVWrTMtKaAAHVhmqUVpX6sFZE8mFAQkQUAGoba2UtR+RvGJAQEQWA+Kh4WcsR+RsGJEREASClZwq0Gq3NcvFmKqig0+iQ0jPFxzUjkgcDEiKiAKAOUyMvLQ8AbIIS89+5abnMR0IBiwEJEVGAyOyficKJhUjQJFht12q0KJxYyDwkFNBUgiDYziHzMwaDAdHR0WhoaIBGo1G6OkREimKmVgoUUq7fzNRKRBRg1GFqpCamKl0NIlmxy4aIiIgUx4CEiIiIFMeAhIiIiBTHMSRERBSUOPg3sDAgISKioKOv0CO7KNtq/R+tRou8tDxOj/ZT7LIhIqKgoq/QI6sgy2YxwhpDDbIKsqCv0CtUM3KGAQkREQUNo8mI7KJsCLBNsWXellOUA6PJ6OuqkQsMSIiIKGiUVpXatIy0JkBAtaEapVWlPqwVicGAhIiIgkZtY62s5ch3GJAQEVHQiI+Kl7Uc+Q4DEiIiChopPVOg1WhtVkQ2U0EFnUaHlJ4pPq4ZucKAhIiIgoY6TI28tDwAsAlKzH/npuUyH4kfYkBCRERBJbN/JgonFiJBk2C1XavRonBiIfOQ+CmVIAi2c6P8jJTli4mIiABmavUHUq7fzNRKRERBSR2mRmpiqtLVIJHYZUNERESKY0BCREREimNAQkRERIpjQEJERESKkxyQ7NmzBw899BB69OgBlUqFTZs2OS1fUlIClUplc6urq3O3zkRERBRkJAckly9fxqBBg7BixQpJj6usrERtba3l1q1bN6lPTUREREFK8rTfcePGYdy4cZKfqFu3bujcubPkxxEREVHw89kYkrvuugvx8fF44IEH8NVXXzkt29zcDIPBYHUjIiKi4OX1gCQ+Ph4ffPABNmzYgA0bNkCn0yE1NRX79+93+JjFixcjOjractPpdN6uJhERESnIo9TxKpUKGzduREZGhqTH3XfffejZsyf+9re/2b2/ubkZzc3Nlr8NBgN0Oh1TxxMREQUQv08d///+3//Dl19+6fD+iIgIRERE+LBGREREpCRF8pAcOHAA8fHxSjw1ERER+SHJLSSXLl3C0aNHLX8fP34cBw4cQExMDHr27IkFCxagpqYGH3/8MQAgNzcXvXv3xh133IGrV6/if/7nf7Bz505s27ZNvqMgIiKigCY5INm7dy9GjRpl+XvOnDkAgKlTpyI/Px+1tbWoqqqy3N/S0oK5c+eipqYGkZGRuPPOO7F9+3arfRAREVFo82hQq69IGRRDRERE/kHK9Ztr2RAREZHiGJAQERGR4hiQEBERkeIYkBAREZHiGJAQERGR4hTJ1EoUDIwmI0qrSlHbWIv4qHik9EyBOkytdLWIiAISAxIiN+gr9MguysYpwynLNq1Gi7y0PGT2z1SwZkREgYldNkQS6Sv0yCrIsgpGAKDGUIOsgizoK/QK1YyIKHAxICGSwGgyIrsoGwJs8wmat+UU5cBoMvq6akREAY0BCZEEpVWlNi0jrQkQUG2oRmlVqQ9rRUQU+BiQEElQ21grazkiIrqBAQmRBPFR8bKWIyKiGxiQEEmQ0jMFWo0WKqjs3q+CCjqNDik9U3xcMyKiwMaAhEgCdZgaeWl5AGATlJj/zk3LZT4SIiKJGJAQSZTZPxOFEwuRoEmw2q7VaFE4sZB5SIiI3KASBMF2/qKfMRgMiI6ORkNDAzQajdLVIQLATK1ERK5IuX4zUyuRm9RhaqQmpipdDSKioMAuGyIiIlIcAxIiIiJSHAMSIiIiUhwDEiIiIlIcAxIiIiJSHAMSIiIiUhwDEiIiIlIcAxIiIiJSHAMSIiIiUhwztRK5ianjiYjkw4CEyA36Cj2yi7JxynDKsk2r0SIvLY+L6xERuYFdNkQS6Sv0yCrIsgpGAKDGUIOsgizoK/QK1YyIKHAxICELo8mIkhMlWHNwDUpOlMBoMipdJb9jNBmRXZQNAbaLZJu35RTl8NwREUnELhsCwC4IsUqrSm1aRloTIKDaUI3SqlK/XQmYY1+IyB8xICFLF0TbX/3mLojCiYUMSv6ltrFW1nK+xsCTiPwVu2xCnNJdEC3XW5D7dS5mbZ2F3K9z0XK9xSvPI5f4qHhZy/kSx74QkT9jQBLipHRByG1+8XxEvhmJ2V/MxrvfvYvZX8xG5JuRmF88X/bnkktKzxRoNVqooLJ7vwoq6DQ6pPRM8XHNnFM68CQicoUBSYhTqgtifvF8LC1bCqNgfQE0CkYsLVvqt0GJOkyNvLQ8ALAJSsx/56bl+t2YDCUDTyIiMRiQhDgluiBarrdgWfkyp2WWlS/z2+6bzP6ZKJxYiARNgtV2rUbrt+NtAn3sCxEFPw5qDXHmLogaQ43d5nwVVNBqtLJ2Qby39z2blpG2jIIR7+19DznDc2R7Xjll9s9Eer/0gJmtEshjX4goNDAgCXHmLoisgiyooLIKSrzVBXGs/pis5ZSiDlP77dTetpQIPImIpGCXDfm8CyIpJknWcuRaoI59IaLQoRIEwfbnkp8xGAyIjo5GQ0MDNBqN0tUJWr5KmNVyvQWRb0Y67bZRq9RoerkJ4e3CZX/+UGYvD4lOo0NuWq5fjn0hosAm5frNLhuy8FUXRHi7cMxJnoOlZUsdlpmTPIfBiBcE2tgXIgodDEhIEUseWALgxmya1i0lapUac5LnWO4n+QXS2BciCh3ssiFFtVxvwXt738Ox+mNIiknC9Hums2WEiChIsMuGAkZ4u3C/ndpLRES+w1k2REREpDgGJERERKQ4dtkQEZHf81VaAlIOAxIiIvJr9vLnaDVa5KXlMX9OEGGXDRER+S19hR5ZBVk2q1XXGGqQVZAFfYVeoZqR3BiQEBGRXzKajMguyra7/pJ5W05RDowm54t1UmBgQEJERH6ptKrUpmWkNQECqg3VKK0q9WGtyFs4hoSI7OIgQlJabWOtrOXIvzEgISIb3hxEGKqBTqgetyfio+JlLUf+TXKXzZ49e/DQQw+hR48eUKlU2LRpk8vHlJSU4O6770ZERARuueUW5Ofnu1FV/2Y0GVFyogRrDq5ByYkS9mlSwPLmIEJ9hR6JeYkYtWoUHtM/hlGrRiExLzHoByaG6nF7KqVnCrQaLVRQ2b1fBRV0Gh1Seqb4uGbkDZIDksuXL2PQoEFYsWKFqPLHjx/H+PHjMWrUKBw4cAA5OTl4+umn8cUXX0iurL/ilw0FC1eDCAUIbg8iDNXZEqF63HJQh6mRl5YHADZBifnv3LRctjQFCY8W11OpVNi4cSMyMjIclnnxxRfx97//HYcOHbJse/TRR3Hx4kUUFRWJeh5/XlzP/GXT9gvc/GEpnFjIefIUMEpOlGDUqlEuy+2aukvSisFGkxGJeYkOByiqoIJWo8Xx7OMAEDRdG1KOO1CP0RfsdSHqNDrkpuXy+9XP+dXieuXl5Rg9erTVtrFjxyInJ8fhY5qbm9Hc3Gz522AweKt6HnH1a1IFFXKKcpDeL51fNhQQagw1spYzEztb4g+lf8CH+z8MmgRYUmaJSAnwQk1m/0yk90sPmkCV7PP6tN+6ujp0797dalv37t1hMBhw5coVu49ZvHgxoqOjLTedTuftarqFU9Io2JxrOidrOTOxsyAWliwMqq4NzhKRjzpMjdTEVEweOBmpiakMRoKQX+YhWbBgARoaGiy36upqpatkF79sKNh0jewqazkzT2ZBBHICLM4SIRLP6102cXFxOHPmjNW2M2fOQKPRoGPHjnYfExERgYiICG9XzWP8sqFgk6BJkFyu5XoL3tv7Hv554Z+obaxFXKc49Ivth+n3TEd4u3AA/54tUWOosdvF6Uqgdm24Om7zGBLOEiHyQUCSnJyMrVu3Wm0rLi5GcnKyt5/a6/hlQ8HG/J521hXZeprl/OL5WFa+DEbBtuVi3rZ5mJM8B0seWGKZLZFVkAUVVFafl7Z/OxNorY2ujhvgLBEiM8ldNpcuXcKBAwdw4MABADem9R44cABVVVUAbnS3TJkyxVJ+2rRp+OmnnzB//nz84x//wHvvvYeCggLMnj1bniNQEKekUbAxv6ed5X0wv6fnF8/H0rKldoMRADAKRiwtW4r5xfMB3BiYWDix0KYVRqvRYlHqIlH1C8TWRmfHzVl4RP8medpvSUkJRo2ynRY4depU5Ofn48knn8SJEydQUlJi9ZjZs2fjxx9/hFarxSuvvIInn3xS9HP687RfgFPSKPi4ek+3XG9B5JuRDoOR1tQqNZpebrJ039jLWGo0GZGwPAHnm87b3UcwTI9lplYKRVKu3x7lIfEVfw9IAH7ZUPBx9p7O/ToXs78Q38q5fOxy5AzPsXufveCnNeb0IQpcfpWHJFSYp6QRBQtn7+lj9cck7ctReUeJBVvTarRsbSQKAQxIiEiypJgkSeV739zbZpuzxIJmXSO74uiso5buHmfYSkkU2PwyDwkR+bfp90yHWiX+Yr+sfJlNYjNXiQWBGwnYyk6Vudw/15MiCnwMSIj8TCCsHB3eLhxzkueILn+68bRNtlW5Egty8Tqi4MCAhMiPBNIv/SUPLMELI14Q1VJiL9uqHIkFXa0n1fY5ich/MSAh8hOB+Et/yQNL0PRyE5aPXY6Hb33Yadm2azuZk7A5y3nSOgmbPVxPiih4MCAh8gOB/Es/vF04cobn4NEBj4oqb+6CkSOxINeTIgoeDEiIPCTHmI9A+aXv7Fjd6YLxNIsp15MiCh6c9kvkAXtJvbQaLfLS8iTlzQiEX/qujtXdtZ0y+2civV+6W1N2uZ4UUfBgCwmRm+Qc8+Hvv/TFHKsnXTDmJGyTB05GamKq6PwhXE+KKHgwICFyg9xjPuQY4OkOMd1NUo5ViYXkuHgdUXDgWjZEbig5UYJRq2wXmWxr19RdopcUMLdCAIC9ZerlvriK7W5y51iVyJoabJlag+14vIHnyP9xLRsiL/PGmA/zL317QYLca7k4WkPG3AXTOvhx51iVWNspmNaTkmtsUjDjOQo+DEiI3OCtMR+eDPAUy1UXjAoq5BTlIL1fOtRhar8f3xJspASLoYrnKDhxDEmQCIR048HAfJ5rDDWIjYx1WM6TMR/uDvAUq+REiaQpxnKPb+F71bFAzkfjKzxHwYstJEGATZe+Ye882+PPszv0FXo889kzosq2TWCWVZAFFVR2x7eIPVa+V52Tko8mWLqnpOI5Cl5sIQlwgZhuPBA5Os/2+OvsDvMx1F+pF1VezgRmrZ+f71XHAiEfjdJ4joIXW0gCmNSxAOQeZ+cZuNFKEBsZi+VjlyNBk+AXI/3bzj4YoR3h9Bha80YCM1+/VwN19gXH67jGcxS8GJAEMDZdyqvlegve2/sejtUfQ1JMEqbfMx3h7cJFnedzTeeQoEnwi/Nsr1uka2RXnGs6J3ofrhKYSeXL92ogdwv5IvNsoAZrZszOG7wYkAQwNl3KZ37xfCwrXwaj8O+BcPO2zcOc5DkYHDdY1D784Tw7mn0gNhiJ6RiDDx/6UPYLt6/eq4E++0LO8Tr2BHKwZubtc0TK4RiSAMamS3nML56PpWVLrYIRADAKRiwtW4rNlZtF7Ufp8+yqa0mMgqwCr1yYxJ6bH8/96PbMm2CZfeGtzLPBNIaH2XmDEzO1BjCjyYjEvESXTZfHs48HxK8FJZqSW663IPLNSJtgpDW1So24m+Jw+tJpvzrPbc+X0WTE6L+Ndnt/Oo3Oa8fg6r3alju/2r2RPVdJcn4ezOffUbdZoH1XmAV691MoYKbWEBFMTZdKNSW/t/c9p8EIcKOl5IGkB7Dq/1b5zXm2d75iOsZ4tM9HBzzqtWNw9l61x50ulmDrwpQz82ywjjcLpuy8xC6bgBcMTZdKNiUfqz8mqlyn8E5+c54dnS+x03kdWXtorVe7Mxy9V+1xp4uFXZiOBVuwRsGJLSRBwBfpxr1F6anLSTFJosv5w3mWY5yII774hdz6HO74aQfeKH3DYVmpv9o5+8IxBmsUCBiQBIlAbbpUuil5+j3TMW/bPJdjSKbfM/3G/xU+z67Ol6cc/UKWo6++7bTqW7vc6lGd2gqmLky5MVijQMCAhBSldFNyeLtwzEmeg6VlSx2WmZM8B+Htwr3y/FKJPQ8xHWOsunDE5iHpdlM3m21yjO+xN606TCWux1jKr3ZfrpgcSBisUSDgLBtSlL/MjLB3wVSr1MgZnoMHb33Qb7rCxJ6v7f+1HeowtaXew3oMQ9RbUS4H8CZ0SsAf//OPlgu3o7we5ouYmPEz5mnVUnky84OzL+yzF1zqNLqQDtbIu6RcvxmQyETqFyC/MG+Qe+qyJ+e1bZdCfKd4zCueZ/1LO0qLZ4Y8g74xfRV53cROU256ucmqVUdsIAPcOOeFEwuR3i/d46miYurraN8A8Frqa4qd62DF7x7yJU779TGpTdrBkC1RLv60kmx4u3DkDM+x7Mtey8CpxlNYWLLQrf3LoexUmahpymWnyqxalKR2eeUU5SA6Itrj8T1iplUDQHRENBqaGyx/m6cwK3mug5XS46CIHOG0Xw9JnbIaTNkS5eJvK8lKmcni69fN3TE3UsZhmAONkhMlHtdJ7LTqxwc+jl1Td2F15mosSl2EC1cu4MKVC1ZlQvkzQhQKGJB4QGqq6mBJbe0Nmf0zcSL7hOWitGvqLhzPPi4qGJH7vEqZyeLN181oMqLkRAnWHFxjSafu7vRN8ywLc6uTnJzVSey06r5d+iI1MRUT75iID/d/aLdMqH9GiIIdAxIPSJmy6k75UGNuSp48cDJSE1NF92vLfV6ldm9443XTV+iRmJeIUatG4TH9Yxi1ahQS8xJx/vJ5p4GFCiroNDqb6ZvmrjEpUhNT3Xqu1qbfMx1qlfPXsfW0an5GnLMXpBIFC44h8YDU5nOlp7gqrfWg0cTOiRjYbSAuXLng8cA6uc+ru8mh5HrdnK1YO7FwIuaNmIe3y96WPObG3DX2/OfPo6axxuHzmwerpiamuj2+p/XAyazbs7Du8DqHz9d6WnWof0ac4dgzCnYMSDwgtfk8lLMl2ptW25onX6xyn1dXSaQ83b8zRpMR2Z87z1y79tBarMtahznb5kjOtWHOlPqH0j9YDRg1axtouJPXw96Fs1N4JzS1NMEEk2WbWqXGnOQ5WPLAEss2qasCh8oMEWdBqtQ1f4j8Faf9ekDqlNVgW53XHntTChfsWOAyD4WUvBb2nrP7291tBkG21qVjF5yZd0b0eTVfAAC4DEpcvW5iplmay7z77bvYULHBZf12Td2FlJ4pHk3flJKTQuxUUWd5SwQIeHLQk+gU3glJMUmYfs90m4RzvlgVONAE60q9FBqYh8SHHF24HF1gpZYPJPYucAmdElB7qdbql7Ej7n6xeiMgAewfjyMbJm5we4q3lOcxW525GpMHThZd3hF/XOJeajAIBPbnxhV/SR5I5A4p128OavWQ1CmrwbA6rz0Op91eqhEVjADuD1gsrSp1GowAwIUrFyTvt/XMn+eHPS/psYC4qciOyrgiV7ee1IHE9gZVmre9uutVWQakentV4EDDcTUUKjiGRAZSV4H1h1Vj5ST3CrRSv1i9+YWtDlPj/OXzWPHtCodl7K1ILGYV4+zPsy1/S+FqZou32GvJ6dKxCwC4DAhbE/M6eHNV4EATymPPKLQwIJGJ1OyHnmRL9FbqZ3f3K/cKtFK/WL35ha2v0OORwkeclrF3QRQzffVUo3vnTIlF0ByNDZESiJiJfR3Mn5FQbyHgSr0UKhiQBBhvTf3zZL9yXQjc/WIdoR0BtUrtcn2XEdoRkvZrbuUQq/V58NbFcVHqIsvr4as1SeRsAXPndQj1FgKu1EuhgmNIAoi30s57ul85LgSefLGKXd/lra/ekrRfqS0/rc+DNy6O2igtfpvyWwCOE6eJeQ+ITa5lLvdayWuytYCZ19mRwlWWWTEJ2nzBm0nLgnXsGVFrbCEJEGLGJLQdx+Bqf6VVpagx1CDnixyP9iumSfmm8JvQdK0JJsH+AFcxOTQcqTE4TvLV2sKShRjQbYDo55DSytH2guhuLhNn8sblQR2m9ignhdiWMHdm/ogltfUoEFoIfJG0LNjGnhG1xRaSACFnSu3Wv66f2PgEzjed92i/rdOSt/0Va/57VcYqXHrpEmYMnYExfcZg2pBp2Dp5q+R1a+wdS84XOaLLS5mNIaWVo+0F0dk58YQn6/aIbQlzd+aPWO60HvlzC4EvF8x0d3kFokDAgCRAyDWwz92Ljav9OrtgFGQV4NDZQ0hYnoAV363Atp+24YN9H+CZLc8gol2E21+s5mNxFlC1JWVasZgF6dQqNQqyCuxeEKVMX3XF3FJVcqLErcBUbCDTcr1F1hlTrXnateLJAozewgUzieTDLpsAIcfAPk8GJ4p5fntNyucun8O0v0+zOxujprEGEwomOEwq5ownxyK2i6d1V4EjayesRdYdju+XMn3VGXOgUXKiRFT5tgGk2Ba29/a+55WWEbm6VjyZneYNUlou/aneRP6ILSQy8fYqnHIM7HNneq7UX7Wtm5Trr9RjUuEkl1NDn/3sWUnny2gy4k/f/sntC+fsL2aLbkbP7J+JeSPm2axYq1ap8cKIF2yCEXvvA/M5eS31NZctLnJpG0CKbWE7Vn/MG9WR1LXScr0FuV/nYtbWWcj9Ohct11tkqYM3PqOhPiWZSE5sIZGBLwa0yTGwz90vRXd+1Uppwbhw5QJKTpQgNTHV5YA9OQZbnm86L3pBMn2FHm+XvW1zHCbBhKVlS9EpvBP6xvS1tAbZW/DO/D5w9hqKlZqYivz/y5eck8KcwMyVXp17Sa6TPUtHL8Xg+ME4e/mspMGX9hZhnLdtns0ifFJ56zMa6lOSieTEtWw85GwxMUD+NTakLIjWltg1Mcy6RnbFBw9+4Fb9pT5X5m2Z+Pb0tzYXjOVjliP2pljUNtbiSP0RvFbymizjG8Ssq+JqbRaxzwNYvw/sXhyjtLhy/Qrqr9S7XHhxc+VmTCiY4PA57XWBvVP2DuYVz3NZ36WjlyLv2zyPZwe5s9bO/OL5ThdhfGHEC5agREoOFm9+RkNhwUwiT0i5frOFxANyT8UVw5Opf+ZuH7EX2OVjl7v9RS21NUb/D9sulFOGUy6zpLpLTN++HBloW78PHuz7IMpOlaH5ejPy0/MBwKoFYXPlZlmmttrrijhx8YSo+p5sOOm0JU5skOJqLFPb96/RZMSy8mVO97msfBneGPUGthzZIrq1w9uf0UCYkkwUKDiGxANyTsWVwt2pf62noorxj/P/cLuvPVCaqDf/Y7PD++Tq9ze/DxKWJ1gSmY3+22g8uflJq1lGYqa2iskeO3nDZBQeLrT8bTQZRQcSSTFJTuuxPmu9R2OZ7CV0i38nHmM+GSMqud20v0+TNMXWF59Rf56STBRI2ELigWAf0PZG6Rt4o/QNt/rapbbGKCX3m1yk9Eqxe2xyB1VtpyfbS2TmqgVMTKuNUTDikcJHsCFsAwCIHnOjVqkx/Z7pLusRFhbmcByMAAFLH1hqN0h21HVyrukcdp/c7bJ+ALD+8HpJrR2efEaldAsxaRmR5xiQeECuAW2+XpNEKjEZQNtq3ZTtjZwWcnLUZO/toMrRRdTZ1FYpwe2znz3rcEyKPXOS5yC8Xbjlb0f1MLcIOAp0Htc/jn21+6wGocq1Hs6la5cc3mevG87dz6g7g2D9bUoyUaBhl00rUqcFyjEV15M1SaRyd0yE+SIybcs0fPrDp6LOjdFkREzHGEy7Z5pbdfWlakM1th3dZrNdHabG5AHSBmZKZb6IDv+f4Zi5dSautFxxWl5Kq82FKxdEBQDmKczOZrG0/Wyk90vHpDsm2S8rGLG0bClmF822bJNjPI7Y6dKtgzZ3PqOOkgeeMpySNfOqt1MFEAUatwKSFStWIDExER06dMCwYcPw7bffOiybn58PlUpldevQoYPbFfYWdwIDMSnTnQ1o82XKacCzriMBAs41ncMTG59weW5an8v3977v9nP60n+u+U/84qNfWF0UjCYj1hxa45Pn31u7Fyu+W4HIxZHIWJthc7/54lXdUI3oiGjZnnfG0BloerkJb4x6w2HuD3ufjV65vbC8fLnTfed+k4uH1jwEQJ5uy4l3TBRVrnXQJmbcVOvPqKuWHAGCLJlXfflDhChQSA5I1q1bhzlz5mDhwoXYv38/Bg0ahLFjx+Ls2bMOH6PRaFBbW2u5nTx50qNKy82TwMDdAW1SU07L8WtKzjERjs6Nt9dB8aavqr9C5B8iMbtoNkpOlLhM0+4tmys3WwUlrS9eUzZNQUNzg2zPNVI3Er/b9TtEvhmJ2V/MxrvfvYvZX8xG5JuRmF883/Fno7EGJthfKLG1Lf/cgoy1GR6998wtOJ9mfupWi6Sz5HbzRsyz+oyKacnxdBCsr3+IEAUKyXlIhg0bhqFDh+Ldd98FAJhMJuh0OsyaNQsvvfSSTfn8/Hzk5OTg4sWLblfSm3lIXOWaEJtHQOo4ELF5OnZN3YX6K/XI/jwbpxqt81bkjZM20NRVzgSp2p4bOfJ2iLUodRF+vvIzcr/JdTgdddIdk7Du8Dq3nyOmQwzqr9Z7Uk2PNC1owufHPvfqOBxX56hTeCdcanE8bkOsxhcb0f/9/pLee+m3piO1dyqm3zPdMrbFfDEHAHtTbO39CJCSh+TTHz7FExufcFm3T375CR6/83FRx9GaXN83RIFCyvVbUgtJS0sL9u3bh9GjR/97B2FhGD16NMrLyx0+7tKlS+jVqxd0Oh3S09Nx+PBhp8/T3NwMg8FgdfMWKdMCnbVSmAe0mZuVCw4XOG3JENuEvfkfN5JgtQ5GAOBU4ylMKJgg6deU3CvQtp0yKcc4AbEutVzC8rTl2DBxg03rVNfIrsgZloNp90zDugnrEObmUCklgxEAmFs816sL3Wk1Wqw/vN5pOTmCEQB4aedLkqacA8CsYbOQMzzHaqCt1BZJqS2R55rOiaqb2HJtKZUqgCgQSPqmPn/+PIxGI7p37261vXv37qirq7P7mH79+uGjjz7C5s2b8cknn8BkMmHEiBE4dcrxh3Lx4sWIjo623HQ6nZRqSiIlMHDW52s0GfH67tfR7e1uovqFxTZhf3TgI6f3S10HRs4VaM3M59CX05uXlS9Dy/UWqxVgc4bnIDYyFueaziH3m1yMWjUKMz+fKaprwRci20dKKv9dzXdeDfAe6POAz87NkQtHLO+9mI4xoh5z9rL9buDM/pk4NusYlo9djplDZ2L52OU4Ouuo3dZCqQFA18iuouomtlxbwZ4qgMgTXp9lk5ycjClTpuCuu+7CfffdB71ej65du+LPf/6zw8csWLAADQ0Nllt1dbXX6ic2MMj9Jtdhn+/84vno/nZ3LCxZiPor9XbLtA1KxIz+j+0YC0Oz89Yh8zowUrS+iI/UjZT0WHvM59CXydCMghG/2fIbADdafuqv1CPv6zybXB/u/pL1hhEJI7B87HLcn3i/qPJXr1/1Sj06R3TGmKQx2P7Tdq/s3x6TYLLMzinIKhD1GEfvJ32FHkl/SrIa85L0pySrz5i5NXPDjxtEPZc5ABAbqLsb0HPtGyLHJAUksbGxUKvVOHPmjNX2M2fOIC4uTtQ+2rdvj8GDB+Po0aMOy0RERECj0VjdvMVVYADAZjCcmfCvf0vLljpc0dZeszAgboaO2JwGUgMS8/OnJqbivl73SX6sWdtBhGLOpZzy/y8f+gq9bDkuvG37ie2Y/cVsfF/3vajyh84d8ko9LjZfxBfHvkC1wXuBflvbj2+3tBj+fOVnt6fLixkQ2noQ8LvfvSuqfuYAwPwedkbK6tdtyZEqgChYSQpIwsPDMWTIEOzYscOyzWQyYceOHUhOTha1D6PRiIMHDyI+3j9+AZgDA2cXM1cprV1x1C/sqj/8ttjbPHpeMf6j93+49Th705qlpqaXw682/Qo7j+8MqFk9So9NkSIMYVD9619r7gadNYYaTCycaMnvImW6vJjxIM9+9uyNMVci3w9tAwDze9jRMaug8mhtGk9TBRAFM8ldNnPmzMGHH36IVatWoaKiAs899xwuX76MX/3qVwCAKVOmYMGCBZbyr7/+OrZt24affvoJ+/fvxxNPPIGTJ0/i6aeflu8oAoS9fuHW3SerM1dj19RdOJ59HJn9M0X/SvLk11RqYqrLpek7hXeCNsr6V6OjQYTp/dLxWupruKn9TW7XSQpDiwEPfvqgT54rFM0dMddh0Lxh4gYk3ZwkaX/mwGHtobVYl7VO0nR5MeNBHLVU2uMoAPD22jRc+4bIPsmp4ydNmoRz587h1VdfRV1dHe666y4UFRVZBrpWVVUhLOzfcc7PP/+MZ555BnV1dbj55psxZMgQlJWV4fbbb5fvKDzgbjp1dzjqF3aUclrKonnuUoep8Yuev8DmSseLzA3qPgjP3fMczjWdQ9fIrkjQJNid1mwv3bYvtAgtrguRZOn90i3ZWx2t05LZPxMNTQ0Yv3Y8Tvx8AteF64jvFI8DZw443K+5xbDrTV1xIvuE6Onycg/01Gq0yE3LtRsAeHttGq59Q2RLch4SJXgzD4nYfCCe6hrZFcvHLnd4MbdnzcE1eEz/mMtyqzNXY/JA91Kct1xvQcc/dBQ92yKmQwxmDZuFlJ4pOHv5rOWLVF+hx8RCcZk0yX3P3fMcVh9cLWtyNHuc5fVwxVvvW7k+qzOHzsSE2ycwACDyASnX75BfXM9X0+vMadcB14t0mbkzIl9qgrZ3v3tX0tTP+qv1WLR7kdW2mI4xuHjlouh9kPsOnz3s9WAEcLzwnxjemkliHhDqaWK/CbdP4CJ4RH4o5BfXi42M9flzik0RLXVEvr5Cj165vWzWHHH2PKUnPU/AVH+l3m9yfQS7PVV7fPZc9gZj20sO2HK9xWodnGE9hnllJomrAaEqqNClYxfOYCEKUCHfQnLw7EGfP6fYX5/mL+Csgiyb9OhtB+StP7zebpdJTWMNJhRMwIaJG+y2yERFRMl0VOSPOqg74KrRs3wm5lwe5y+fx+wvZltlDe4U3glNLU1WAem8bfPw4K0PosZQ4/J9K5V5QGjbsUrm8SAARH1eiMj/hPwYkllbZ4nOVeANu6buctl8rK/Q4/mtz6PmUo1lW0JUAv447o83vqAPF2JS4SSnrRRdOnbBmXlnrFY1La0qxbaj27D4q8WyHAtRa+n90rGvdp9V4KDT6BwOJJXCWdekvcHVcj0vEUnDMSQSJMVIm7YoNzFjWL4+9TVOXzptte1042l8feprAMAjhY+43Ic5o+v9fe5XbDYMhZYt/9yCxpca8c3pb2SfSeJoZhqg3AwWqeO3iMhayLeQtFxvQeSbkR4nP3PX71J+h/v73O/wy2t+8XwsLVvq8PFSVmP9XcrvMDh+sFdXjyVqbfnY5cgZnqN0NbzOXpAvdvA6UTDz2mq/wSi8XTjmJM9R7PnfKH3D4SJ8Lddb8E7ZO04fL2U11s+Pfo5fb/41gxHymSMXjihdBa8Tk86eiFwL+YAEAJY8sAQvjHjB7WXq5WDvy0vqlFxX9tXu88mUUSIzlco36xopRUw6+7brWBGRfQxI/mXJA0vQ8GIDhvYYqsjzmxfqa/3lteTLJYrUhUguwxKGKV0FrxKTzt7eOlZEZCvkB7WazS+ej2XlyxQbS2JWbajGayWvYdeJXTjTdMb1A4j8mC5ap3QVvEpsYkVfJWAkCmQMSOB64KivvVH6htJVIPKYr5OQKTHLxVtZaYlCUcgHJGIGjgaidqp2uC5cV7oaFMLujr/bZ9NelZrl4iqdvQoqaDVaZoclEiHkx5D86ds/BV3ac02EhsEIKe6zys/Qct37KzErOcvFVTp7gNlhicQK+YBk3eF1SldBdoZmg9JVIIIJJvzp2z959Tn8YZaLOZ19gibBartWo3VrtWSiUBXSXTb6Cj2+O/2d0tUgClp7Tu7B3BFzvbZ/KbNcvLnCr1LZYYmCScgGJEaTEc9+9qzS1SDyqraLzPlaTWON60Ie8KdZLs7S2RORayHbZVNyogQXrlxQuhpEXiU1GLkn/h5Znz+hU4LrQh7gLBei4BHSAQkRWXt55Muy7u++3vfJur+2zLNc2g4oNVNB5fPpx0TknpANSIjI1vv735dtX2EIw8yhM2Xbnz2c5UIUPEI2ILm3171KV4HI7/x85WfZ9jV3xFyEtwuXbX+OcJYLUXAIyUGt+go9Zm7x7i83okA0NGEo9tbu9WgfYQjD3BFzseQB363FxFkuRIFPJQiC369FbzAYEB0djYaGBmg0Go/2ZU6ipOTMAyJ/1fhiIxLzEnHhqrQB39ER0Xh84OPo26Uvpt8z3SctI0Tk/6Rcv0OqhcRZEiWltVO1g0kwBV3WWAosS8qWwMH4ULvM4zQ+Sv+IXSNE5JGQGkPiKomSPeFh1r/0EqIS8OkvP0VGvwzEdoyVpV4jdSNx9XdXceW3V7B87HKM6TNGlv0ShSEMncI7iS7/+9LfO5wO36l9J3Tp2MVqG8dpEJFcQqqFxJ3kSF06dEFtk/XjOrTvgI2PbsQrO1/xeGXeoseKMLbvWAA3ZgzkDM/BXXF3YdtP2zzaL4WGLh27IEIdgdOXTtu93wQTLrVcwm1dbsM/LvzDo+fq3KEzjj1/DGWnyjhOg4hkF1ItJO4kR2objJxuPG1ZsEuOrIz1V+tttplzK5C81Krgu3BeuHIB+Rn56BrZ1WEZFVSou1Tn8XOdajyFslNlSE1MxeSBk5GamMpghIhkE1IBiaskSq11aNfB7vbWC3al9EyxacKWyl6QZM6tIKaebaXfmo7oiGiP6hSMVFDhrw//VelqeMWek3twrumcw/sFCLjYfNGt91NbNQbvpoInotAVUgGJsyRKZmOTxmLr5K24ev2qw/2YF+wqO1WGvzz0F7fq4iqDpDm3gtSWks3/3IyG5ga36hTMBAg433Re6Wooanzf8R7vw1ngQ+IYTUaUnCjBmoNrUHKixKsrERMFkpAKSADHSZR0Gh02TNyAoieKcLH5oqh91TbWIrN/JjZM3ICEKNs1Ozq1sz+YUGwGycz+mTiRfQIjdSNF1Yecq79S71ddYQlRCXhhxAtuP94c1IrtOpw7Yi7S+6W7/XwAnHYNkWv6Cj0S8xIxatUoPKZ/DKNWjUJiXiL0FXqlq0akuJAa1GrmKomS1AW7nO1PX6FHdlG21ewerUaL3LRcUTMTMtdl4qvqr9w4Smqr8kIl8tLyMKFggluPH9pjKPad3ufR1OxJd0xCer90xEfFY4R2BJL+lOTWfloHtamJqdBqtKgx1Nid0q6CClqNFucun8P/Vv6v23UHYBPIk3iOciDVGGqQVZDF2UoU8kIuMZoYRpMRiXmJLr/gj2cfFzWoz2gy2gQrAFxmlVx7cC0m6yfLc1A+MqbPGES2j0RcpzhUnq/ErpO7lK6SlQ0TN6C0qhS5X+eKfoxapcaDtz6I/638X5c5bFRQoVN4JzS2NNpsnzdinlX20pITJRi1apTL538l5RWs/L+VVkGtTqOzCmrNFzvAeoVfc+BSkFWA2dtmS5723ppOoxP9nidr5u8UR+df6ncKUaBgYjQPmceaZBVkQQWV3S94KQt2qcPUVs3qjlpN8tLyrC4wgRaMAMCClAVWxzpp/SQU/FjgtedL75eOLf/cAqPguh9eBRVyinKwMn2lqIAko18G7ku8D7+5+ze4dcWtooIRAMjPyMeDfR/Ee3vfw7H6Y0iKSbKbvVTsNPT+XfvjRPYJpwGsuSvSUWtcTMcYt4MRLlLnOVc5kMzj0kqrSmWZvUcUiBiQOODqC97dplVXzbavpb6GpJuTkPNFjifVV0zbi+zqCaux/dh21DfbTm/21KLURXj1vlfRcr0Fv9nyG+T/X77T8uYvfQCiujgKJxZCHaZGyYkSURfz2MhYfPDgB5b3Rs7wHKflpXQNtg1q7XHWdbjm4BpRzwXcSKbWulvK0/c8iQ8+3cmVRBQsGJA4IfeCXc5S15u3LSxZ6FGd5WT+Zdzn5j449vMxUY95YdsLmDzw3y076jA1Pkz/0O1xG46EIQwvjXwJABDeLhwrM1aic8fOolo+zl4+K6kFTOxFYvnY5ZIu2uZp6K4CI0czsexxFLiIDX70WXo83P9hLlInM6nj0ohCUcjNspHK/AUvRyIod1LX+4oKKodpwY8+fxQXX7iICHWEy/3UXKrBLX+8xWpber90LEpdhJs73CxbfU0woexUmc3ziBEfFS9pyXqxFwmpAz6dTUOXu5vEVQ4e84ydh/s/LOt7nm4Qe/6lBJ9EwYYBiQ/5c3Psuqx1ODPvDHZN3YXVmauxa+ouHM8+brkwR0dGY/WE1aL2deznY2houpELxTzNcWHJQvx89WcAQEzHGEy6YxIAx/lgxGh7PqV+6ZunVTs6Znf3K4WUwMgTvgx+yBbPP5FrnGXjQ2JnVfiSNkqLvHF5oi98t717GyovVLosN1I3EnOS59gdL2P+Ap43Yh7WHFrjdqvRrqm7bLonXM02cfci7639mtmbieWNi5O9AdVtZ+yQ9/D8U6iRcv1mQOJDrqYTe5s2SovlY5cj9qZYty98PZf3tAwMdfVcUMHlNMejs46i7FQZxv5tLFpMLaLq4GqKpLe+9IPlYuKr4Ifs4/mnUMJpv37K2XRiT4ndX1hYmEfTCntGiwtINBEa/Hj+R4f3t06/n5qYips73owzl8+Iroez5m25ByN7e7++JmbGDnkPzz+RfRxD4mOOxgy4wzx2YX3WelH7q2mssaxU7K6/P/p3UeVONYjrhjGPA1l07yJR5TXtNaK6Rzgwk4gosLCFRAFtf2kfqT+ChSUL7U5BNf/tbHpqZv9M/LL/L1FaVYoaQw1yvsixu5CcAMGSHCy9X7pbF+noyGgk3Zzkchqw4ZpB1P6O1B8BAPTr1k9Uef2jetzf535RZeUmJqEdERG5hy0kCmn9C/7V+169sUCfnZkWGyZucHhf65YC8/4SNAlOV7VtnRHSXUefP4qkm91bg6WthSULoa/QW2ayOCNlITm5mQe1th0TY05ox8XRiIg8w0GtfsTZYDexA+HWHFyDx/SPuXyu1ZmrrRKYuWPzj5uRsT7Do320HqC6uXKz3Vk55nJKLT7GdUiIiNzDQa0BytlgN7ED4XyZEbLJ2OTxPlq32DhK16/0TBauQ0JE5H0MSIKMN9KROyJnmmvz4FZ/nMnCdUiIiLyPAUmQkXulYmfEBD+xkbE413TO5b5aBzf+Ni2S65AQEXkfB7UGIX9KR77iP1cE/BoeXIeEiMj72EISpHzV9eFo3EfrJevVYWqftNh4iy9bnYiIQhVn2ZAsXM0CCoa068FwDEREvsS1bMgvBcMaHsFwDEREvsJpv+SX/G2wqjuC4RiIiPwRB7USERGR4hiQEBERkeLcCkhWrFiBxMREdOjQAcOGDcO3337rtPz69etx2223oUOHDhg4cCC2bt3qVmWJiIgoOEkOSNatW4c5c+Zg4cKF2L9/PwYNGoSxY8fi7NmzdsuXlZVh8uTJeOqpp/D9998jIyMDGRkZOHTokMeVJyIiouAgeZbNsGHDMHToULz77rsAAJPJBJ1Oh1mzZuGll16yKT9p0iRcvnwZW7ZssWwbPnw47rrrLnzwwQeinpOzbIiIiAKPlOu3pBaSlpYW7Nu3D6NHj/73DsLCMHr0aJSXl9t9THl5uVV5ABg7dqzD8gDQ3NwMg8FgdSMiIqLgJSkgOX/+PIxGI7p37261vXv37qirq7P7mLq6OknlAWDx4sWIjo623HQ6nZRqEhERUYDxy1k2CxYsQENDg+VWXV2tdJWIiIjIiyQlRouNjYVarcaZM2estp85cwZxcXF2HxMXFyepPABEREQgIiJCStWIiIgogEkKSMLDwzFkyBDs2LEDGRkZAG4Mat2xYwdmzpxp9zHJycnYsWMHcnJyLNuKi4uRnJws+nnN4245loSIiChwmK/boubPCBKtXbtWiIiIEPLz84Uff/xRePbZZ4XOnTsLdXV1giAIwn/9138JL730kqX8V199JbRr1054++23hYqKCmHhwoVC+/bthYMHD4p+zurqagEAb7zxxhtvvPEWgLfq6mqX13rJa9lMmjQJ586dw6uvvoq6ujrcddddKCoqsgxcraqqQljYv4emjBgxAqtXr8bvfvc7vPzyy+jbty82bdqEAQMGiH7OHj16oLq6GlFRUVCpVFKr7LcMBgN0Oh2qq6tDZjpzKB4zEJrHzWPmMQezUDxud45ZEAQ0NjaiR48eLssGxGq/wSoU86uE4jEDoXncPGYeczALxeP29jH75SwbIiIiCi0MSIiIiEhxDEgUFBERgYULF4bUFOdQPGYgNI+bxxwaQvGYgdA8bm8fM8eQEBERkeLYQkJERESKY0BCREREimNAQkRERIpjQEJERESKY0DiZYsXL8bQoUMRFRWFbt26ISMjA5WVlVZlUlNToVKprG7Tpk1TqMbyeO2112yO6bbbbrPcf/XqVcyYMQNdunRBp06dMGHCBJtFGANNYmKizTGrVCrMmDEDQHC8znv27MFDDz2EHj16QKVSYdOmTVb3C4KAV199FfHx8ejYsSNGjx6NI0eOWJWpr6/H448/Do1Gg86dO+Opp57CpUuXfHgU0jk77mvXruHFF1/EwIEDcdNNN6FHjx6YMmUKTp8+bbUPe++Pt956y8dHIp6r1/rJJ5+0OZ60tDSrMoH2Wrs6Znufb5VKhaVLl1rKBNrrLOYaJeb7uqqqCuPHj0dkZCS6deuGF154AdevX5dUFwYkXrZ7927MmDEDX3/9NYqLi3Ht2jWMGTMGly9ftir3zDPPoLa21nJbsmSJQjWWzx133GF1TF9++aXlvtmzZ+Ozzz7D+vXrsXv3bpw+fRqZmZkK1tZz3333ndXxFhcXAwAeeeQRS5lAf50vX76MQYMGYcWKFXbvX7JkCf74xz/igw8+wDfffIObbroJY8eOxdWrVy1lHn/8cRw+fBjFxcXYsmUL9uzZg2effdZXh+AWZ8fd1NSE/fv345VXXsH+/fuh1+tRWVmJhx9+2Kbs66+/bvX6z5o1yxfVd4ur1xoA0tLSrI5nzZo1VvcH2mvt6phbH2ttbS0++ugjqFQqTJgwwapcIL3OYq5Rrr6vjUYjxo8fj5aWFpSVlWHVqlXIz8/Hq6++Kq0yUhbWI8+dPXtWACDs3r3bsu2+++4TsrOzlauUFyxcuFAYNGiQ3fsuXrwotG/fXli/fr1lW0VFhQBAKC8v91ENvS87O1tISkoSTCaTIAjB9zoDEDZu3Gj522QyCXFxccLSpUst2y5evChEREQIa9asEQRBEH788UcBgPDdd99Zynz++eeCSqUSampqfFZ3T7Q9bnu+/fZbAYBw8uRJy7ZevXoJy5cv927lvMTeMU+dOlVIT093+JhAf63FvM7p6enCf/zHf1htC+TXWRBsr1Fivq+3bt0qhIWFWRbZFQRBeP/99wWNRiM0NzeLfm62kPhYQ0MDACAmJsZq+6efforY2FgMGDAACxYsQFNTkxLVk9WRI0fQo0cP9OnTB48//jiqqqoAAPv27cO1a9cwevRoS9nbbrsNPXv2RHl5uVLVlVVLSws++eQT/PrXv7ZaEDIYX2ez48ePo66uzup1jY6OxrBhwyyva3l5OTp37ox77rnHUmb06NEICwvDN9984/M6e0tDQwNUKhU6d+5stf2tt95Cly5dMHjwYCxdulRyk7a/KSkpQbdu3dCvXz8899xzuHDhguW+YH+tz5w5g7///e946qmnbO4L5Ne57TVKzPd1eXk5Bg4caFlkFwDGjh0Lg8GAw4cPi35uyav9kvtMJhNycnIwcuRIq9WOH3vsMfTq1Qs9evTADz/8gBdffBGVlZXQ6/UK1tYzw4YNQ35+Pvr164fa2losWrQIKSkpOHToEOrq6hAeHm7zZd29e3fU1dUpU2GZbdq0CRcvXsSTTz5p2RaMr3Nr5teu9ZeS+W/zfXV1dejWrZvV/e3atUNMTEzQvPZXr17Fiy++iMmTJ1stQPb888/j7rvvRkxMDMrKyrBgwQLU1tZi2bJlCtbWfWlpacjMzETv3r1x7NgxvPzyyxg3bhzKy8uhVquD/rVetWoVoqKibLqaA/l1tneNEvN9XVdXZ/dzb75PLAYkPjRjxgwcOnTIaiwFAKs+1YEDByI+Ph73338/jh07hqSkJF9XUxbjxo2z/P/OO+/EsGHD0KtXLxQUFKBjx44K1sw3/vrXv2LcuHFWS24H4+tM1q5du4aJEydCEAS8//77VvfNmTPH8v8777wT4eHh+M1vfoPFixcHZPrxRx991PL/gQMH4s4770RSUhJKSkpw//33K1gz3/joo4/w+OOPo0OHDlbbA/l1dnSN8hV22fjIzJkzsWXLFuzatQtardZp2WHDhgEAjh496ouq+UTnzp1x66234ujRo4iLi0NLSwsuXrxoVebMmTOIi4tTpoIyOnnyJLZv346nn37aablge53Nr13b0fetX9e4uDicPXvW6v7r16+jvr4+4F97czBy8uRJFBcXu1yefdiwYbh+/TpOnDjhmwp6WZ8+fRAbG2t5Pwfza11aWorKykqXn3EgcF5nR9coMd/XcXFxdj/35vvEYkDiZYIgYObMmdi4cSN27tyJ3r17u3zMgQMHAADx8fFerp3vXLp0CceOHUN8fDyGDBmC9u3bY8eOHZb7KysrUVVVheTkZAVrKY+VK1eiW7duGD9+vNNywfY69+7dG3FxcVavq8FgwDfffGN5XZOTk3Hx4kXs27fPUmbnzp0wmUyWAC0QmYORI0eOYPv27ejSpYvLxxw4cABhYWE23RqB6tSpU7hw4YLl/RysrzVwowV0yJAhGDRokMuy/v46u7pGifm+Tk5OxsGDB60CUHNQfvvtt0uqDHnRc889J0RHRwslJSVCbW2t5dbU1CQIgiAcPXpUeP3114W9e/cKx48fFzZv3iz06dNHuPfeexWuuWfmzp0rlJSUCMePHxe++uorYfTo0UJsbKxw9uxZQRAEYdq0aULPnj2FnTt3Cnv37hWSk5OF5ORkhWvtOaPRKPTs2VN48cUXrbYHy+vc2NgofP/998L3338vABCWLVsmfP/995bZJG+99ZbQuXNnYfPmzcIPP/wgpKenC7179xauXLli2UdaWpowePBg4ZtvvhG+/PJLoW/fvsLkyZOVOiRRnB13S0uL8PDDDwtarVY4cOCA1efcPMOgrKxMWL58uXDgwAHh2LFjwieffCJ07dpVmDJlisJH5pizY25sbBTmzZsnlJeXC8ePHxe2b98u3H333ULfvn2Fq1evWvYRaK+1q/e3IAhCQ0ODEBkZKbz//vs2jw/E19nVNUoQXH9fX79+XRgwYIAwZswY4cCBA0JRUZHQtWtXYcGCBZLqwoDEywDYva1cuVIQBEGoqqoS7r33XiEmJkaIiIgQbrnlFuGFF14QGhoalK24hyZNmiTEx8cL4eHhQkJCgjBp0iTh6NGjlvuvXLkiTJ8+Xbj55puFyMhI4Ze//KVQW1urYI3l8cUXXwgAhMrKSqvtwfI679q1y+77eerUqYIg3Jj6+8orrwjdu3cXIiIihPvvv9/mXFy4cEGYPHmy0KlTJ0Gj0Qi/+tWvhMbGRgWORjxnx338+HGHn/Ndu3YJgiAI+/btE4YNGyZER0cLHTp0EPr37y+8+eabVhdvf+PsmJuamoQxY8YIXbt2Fdq3by/06tVLeOaZZ6ymfQpC4L3Wrt7fgiAIf/7zn4WOHTsKFy9etHl8IL7Orq5RgiDu+/rEiRPCuHHjhI4dOwqxsbHC3LlzhWvXrkmqi+pfFSIiIiJSDMeQEBERkeIYkBAREZHiGJAQERGR4hiQEBERkeIYkBAREZHiGJAQERGR4hiQEBERkeIYkBAREZHiGJAQERGR4hiQEBERkeIYkBAREZHiGJAQERGR4v4/XPIElfMagvQAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#! /usr/bin/env python3\n",
"# -*- coding: utf-8 -*-\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"import torch\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"\n",
"class LinearRegression(torch.nn.Module):\n",
" def __init__(self, input_size, output_size, hidden_size):\n",
" super().__init__()\n",
" self.linear = torch.nn.Linear(input_size, hidden_size)\n",
" self.linear2 = torch.nn.Linear(hidden_size, output_size)\n",
"\n",
" def forward(self, x):\n",
" x = self.linear(x)\n",
" y = self.linear2(x)\n",
" return y\n",
"\n",
"\n",
"data = pd.read_csv(\"data_flats.tsv\", sep=\"\\t\")\n",
"x = data[\"sqrMetres\"].to_numpy(dtype=np.float32).reshape(-1, 1)\n",
"y = data[\"price\"].to_numpy(dtype=np.float32).reshape(-1, 1)\n",
"\n",
"x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)\n",
"\n",
"input_dim = 1\n",
"output_dim = 1\n",
"hidden_dim = 10\n",
"learning_rate = 0.0000001\n",
"epochs = 100\n",
"\n",
"model = LinearRegression(input_dim, output_dim, hidden_dim)\n",
"\n",
"criterion = torch.nn.MSELoss()\n",
"optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)\n",
"\n",
"for epoch in range(epochs):\n",
" inputs = torch.autograd.Variable(torch.from_numpy(x_train))\n",
" labels = torch.autograd.Variable(torch.from_numpy(y_train))\n",
"\n",
" optimizer.zero_grad()\n",
"\n",
" outputs = model(inputs)\n",
"\n",
" loss = criterion(outputs, labels)\n",
" loss.backward()\n",
"\n",
" optimizer.step()\n",
"\n",
" print(f\"{epoch=}, {loss.item()=}\")\n",
"\n",
"with torch.no_grad():\n",
" predicted = model(torch.autograd.Variable(torch.from_numpy(x_test))).data.numpy()\n",
"\n",
"print(f\"{predicted=}\")\n",
"\n",
"plt.plot(x_train, y_train, \"go\")\n",
"plt.plot(x_test, predicted, \"--\")\n",
"\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ac50018c",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}