Skip to content

Instantly share code, notes, and snippets.

@Hamptonjc
Created March 13, 2023 18:05
Show Gist options
  • Save Hamptonjc/bd8d605fe693e17b8d1b29dbde835b31 to your computer and use it in GitHub Desktop.
Save Hamptonjc/bd8d605fe693e17b8d1b29dbde835b31 to your computer and use it in GitHub Desktop.
MixtureDensityNetwork.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"authorship_tag": "ABX9TyOdqYXmmzh1c9OR1Qp/XlQG",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/Hamptonjc/bd8d605fe693e17b8d1b29dbde835b31/mixturedensitynetwork.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"source": [
"# Mixture Density Networks"
],
"metadata": {
"id": "Z1DplO_XHF6y"
}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "bdAE2srgb8qf"
},
"outputs": [],
"source": [
"# Imports\n",
"import torch\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from tqdm import tqdm"
]
},
{
"cell_type": "code",
"source": [
"def generate_data(n_samples):\n",
" epsilon = np.random.normal(size=(n_samples))\n",
" x_data = np.random.uniform(-10.5, 10.5, n_samples)\n",
" y_data = 7*np.sin(0.75*x_data) + 0.5*x_data + epsilon\n",
" return x_data, y_data"
],
"metadata": {
"id": "a5IbicvxcKMB"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## **Many-to-One** Function"
],
"metadata": {
"id": "G-X8ZlvZHksp"
}
},
{
"cell_type": "code",
"source": [
"# Generate data\n",
"N_SAMPLES = 1000\n",
"x_data, y_data = generate_data(N_SAMPLES)\n",
"plt.scatter(x_data, y_data)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
},
"id": "00IfHz8Mcg2B",
"outputId": "d64549a7-89fa-4ee6-d6d3-1b4e275e991f"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7fc2f779e700>"
]
},
"metadata": {},
"execution_count": 38
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"# define network\n",
"input_sz = 1\n",
"hidden_sz = 20\n",
"output_sz = 1\n",
"\n",
"net = torch.nn.Sequential(torch.nn.Linear(input_sz, hidden_sz),\n",
" torch.nn.Tanh(),\n",
" torch.nn.Linear(hidden_sz, output_sz))\n",
"# Train\n",
"N_EPOCHS = 3000\n",
"opt = torch.optim.RMSprop(net.parameters())\n",
"lossfunc = torch.nn.MSELoss()\n",
"\n",
"for e in tqdm(range(N_EPOCHS), unit='Epoch', total=N_EPOCHS, desc='Training'):\n",
" x = torch.tensor(x_data).float()\n",
" y = torch.tensor(y_data).float()\n",
" y_pred = net(x.view(-1,1))\n",
" opt.zero_grad()\n",
" loss = lossfunc(y_pred,y.view(-1,1))\n",
" loss.backward()\n",
" opt.step()\n",
"\n",
"# Test\n",
"with torch.no_grad():\n",
" x = np.linspace(-10, 10, N_SAMPLES)\n",
" x = torch.tensor(x).float()\n",
" y_pred = net(x.view(-1,1))\n",
"\n",
"plt.scatter(x_data, y_data)\n",
"plt.scatter(x.numpy(), y_pred.view(-1).numpy())"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 301
},
"id": "UCbDekGOhyvY",
"outputId": "c3490edc-3015-425a-ba1a-51b5ffb8e4c7"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"Training: 100%|██████████| 3000/3000 [00:02<00:00, 1138.86Epoch/s]\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7fc2f75c1af0>"
]
},
"metadata": {},
"execution_count": 51
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAD4CAYAAAAJmJb0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAAsTAAALEwEAmpwYAAA4B0lEQVR4nO2dfXQb9Znvv4+ksZEJrZKS7RK1IVkuTZYsJQZvm3sS9hY2kLIUY6CQ8hbuDafhknYXKLhNGoptSkqKKSH7Eg50cdtQoISWqqaUDVC4C06XdhOUNLhNWiD0Rem26RKzG+LEsvTcP+RRRqOZ34ysGUkzej7n+MSekTS/SKPvPPO8EjNDEARBCCeRei9AEARB8A8ReUEQhBAjIi8IghBiROQFQRBCjIi8IAhCiInVewFGjj/+eJ41a1a9lyEIghAotm/f/kdmnm61r6FEftasWdi2bVu9lyEIghAoiOhXdvvEXSMIghBiROQFQRBCjIi8IAhCiBGRFwRBCDGeiDwRDRDRH4joVcO2XiLKENGOiZ+/8eJYgiAIgnu8yq75OoB/BLDJtH09M9/t0TEEQRACTSqdQf+WPdg3MooZiTi6l8xBV3vS12N6IvLM/CIRzfLitQRBEMJIKp3B6id2YTSbAwBkRkax+oldAOCr0Pvtk/80Ef10wp0z1eoBRLSCiLYR0bb9+/f7vBxBEIT60L9lT1HgdUazOfRv2ePrcf0U+fsAnARgPoDfAfiK1YOY+QFm7mDmjunTLQu2BEEQAs++kdGKtnuFbyLPzL9n5hwz5wF8FcCH/DqWIAhCozMjEa9ou1f4JvJEdILhz4sAvGr3WEEQhLDTvWQO4lq0ZFtci6J7yRxfj+tJ4JWIHgXwEQDHE9FvAfQA+AgRzQfAAN4EcJ0XxxIEQQgienC11tk11EgzXjs6OlgalAmC0Ax4mU5JRNuZucNqX0N1oRQEQWgGaplOKW0NBEEQakwt0ynFkhcEQfAJO5dMLdMpReQFQRB84NbULjz88q+hRz2NLpkZiTgyFoLuRzqluGsEQRA8JpXOlAi8zmg2h97B4ZqmU4rIC4IgeEz/lj1lAq8zMprFjY/tQGssgqltGghAMhHHnRef6ks6pbhrBEEQPMaNb31kNIu4FsX6pfMD3aBMEASh6XDrWx/N5nDT5h2YveopLFz3PFLpjOdrEZEXBEHwGCufux3MhbYAemDWa6EXkRcEQfCYrvYk7rz4VCTiWkXP8yNXXkReEATBB7rak9jRcy6uWjCzoudZpVZWgwReBUEQPMKq+Om7r1TmfokSebomEXlBEAQPsOpHc+NjOyp+nZzHTSPFXSMIguABVv1oJkNc81aWReQFQRA8wKu+M6PZPG5N7fLktQAReUEQBE/wsu/Moz/+jWevJSIvCILgAbPe453Ie+mXF5EXBEGoklQ6gx+9/pZnr+dlho1k1wiCIFSJqiFZZ2QIPbFNmEYHAQAHMAW92WUYzC+yfb3LP/x+z9YmIi8IglAFqXTGtoCpLzaAZdHnYDTMp+Eg7tYeALKwFHoCcEfXqZ6tT9w1giAIk0TPjbeiMzJUJvA6LTSOz8Y2Wz7vygorZJ0QkRcEQZgkqtz4e7T7LAVeZwb9Z9m2qxbM9NSKB0TkBUEQJo1dbvzTLd2I2nrpJ57L7ynb1nHiNE/WZUREXhAEYZJY5cb3xQYwlzJKK54ZuGv8srLtXnegBETkBUEQJkUqncGhsfGy7XZ+eB1m4KX8PMugq1dVs0Yku0YQAohVt0M/R8gJpZibkels0tYqn8cM7OMElmXXWO73smpWxxORJ6IBAB8D8Adm/ouJbdMAPAZgFoA3AVzGzAe8OJ4gNCO6sGdGRkFA0eOrTxQCIEJfI6wCrp2RIZwZGVZa8TkGFo5ttNwX16LoXjLHy2UC8M5d83UAHzVtWwXgh8x8MoAfTvwtCIINqXQGC9c9bznvU7cc9Xxsc0jPj4lCgj1WefF3a/c7umk+M77Scl8yEcedF5/qy0XaE0uemV8kolmmzRcC+MjE798A8P8AfM6L4wlC2LDqRW60zt20sfXDnytYEyUq6S/TFxuABvvPx+iH1+/CkjVys/kZeH0vM/9u4vf/APBeqwcR0Qoi2kZE2/bv3+/jcgShcbES8dFsDn1PDgNwJ+B++HMFa8wNxJyCrVmmoh9eF/itq86uiXutJtk1zMwov8PU9z3AzB3M3DF9+vRaLEcQGg47ET9wKIv2259xyLj2z58rlJNKZ2DUczfB1lvGry/ZVsu7Lj9F/vdEdAIATPz7Bx+PJQiBRmWFHziUVT7XT3+uUE7v4HDxousUbLVLl6zlXZefIj8I4JqJ368B8D0fjyUIgWayVngtb/uFghU/Mnr0ovslbUAdbAXK0iVrfdflicgT0aMA/g3AHCL6LRFdC2AdgHOI6JcAFk/8LQiCBV3tSSTiWsXPy4yMlmThCP5izmA6FodtH8sMPJRbDKBwMSbU567Lq+yay212/bUXry8IzUBv5zx85rEdyFf4PMmRrx1GX7qTLz7LhJ7x5cW7rXohbQ0EoYGoVOCBQhbOzZt3WubXC96i+9Ld+OJvGb8eWoTqHhAXkReEBqGaYqYcMxhH8+tF6P2he8kcaFFCr7ZJ6Ys/zFEM5heh/9LT6n6HJb1rBKGOGHvQeDW6Wa9+rbe4hBH9PZ2aOmj7GGbgc+PXIUrUEJ+BiLwg+IRTEzG7JldeINWv3mLsG9QVHcKFCuXUrfirFng3p7UaROQFwQec2hSk0hncvHlnWeWkV+i+Y+lWWT3mz3Jd7KtKX/znxq/DwpOmeT7habKIyAuCD9i1KdD97quf2GUr8J2RIdwduw8ale/PIopbstdZ9iI30r1kjuOFRnCH8bPsjAyhFfbFaYzCcO7kfzbOnZQEXgXBB+zcJftGRpXNxp5u6cYGbSNaIgwilP20UA4btI3Y23oF+mIDlq+RiGu2Tc2kW2XlGD9LVfGTMS++kdxlIvKC4AN2ZeszEnFbAXil5VrHsXHAUcFfFn3OUuyJgCu/+m+W7XCBxhKgIGD8LJXFTwB6xpeXPafeiMgLgg90L5mDuBYt2aaXs1sJwNaWlZhKo44Cb8Qo9q+1XonOyBCAQq+bra+/Zfs8BiSfvgK6l8yBFiHbOyeg1IonTL5NhR+IyAuCD3S1J3HnxadalrObLwCbtLWYQSMVCbwRIiBGjA3aRqUQGZF8evd0tScx5ZgYrnZoJ6xb8YzGinlI4FUQfKKrPVmWMrlw3fPYNzKKRJuG0WzO1cg4t+hW/Wz6ne0MUSOST6/GmJl0QWQIpGgtdJBbi78nG8hVA4glLwg1wTi+j3G0ffBdmn06nk4lWZZEwJmRYTzd0u3q8eKft8b8eak+J2Zgzfi1ABqzr7+IvCDUgM8/8VPLwc+qdDygICC7OYk8uxd7ImAuZVwJfSMFCBuJ3sFh12mTevFTo/b1F3eNIPiEsUrSCjeDn2/IrizmxHdGhnBPbCOiEwFXFUTAXGSwSVurdN2cNVemsZkx94xX9anRi5/eXHd+jVZXOWLJhwTd3yudCBuDVDqD7m/vtBX4Tdpax8HPm3KLS4qeBvOL8D/GHsEN2ZXI5Z0te911owrGvrBb5iqbMdcRTIWiTw2Ap/hMn1dUHSLyIcDsP5TMifrT9+QwsjlrFe6LDTgGWw9ztJitYWYwvwgnjT2CfZxwJfTLos/ZCr345I+iG0rGC7OelmqFnjbpV2sKrxCRDwFS2dh42M1l7YsNYJlDKp7uAnBi4dhG7Oaka6G3EqxEW+XTqMKI0VAy4tRSuGd8OWji+Y2KiHwIUJXQC41DZ2TIlcBbDX6247yxfryUn+dK6O+O3Ve2/eDh8YYWqFph12pC5arRYVQ3C8BvRORDgKqEXqgPVvNa12v3OadLonzwsxPLsmtcCb1GXDayLpvnhhaoWmFlEKlcNQDwFk9RPr9REJEPAaoSeqG26H5dY3YGUOhLE3EYC2Isja+UZdk1jq4bPRBrFq9GFqhaYWUQOTUj6xtfpnx+oyAiHwJUJfRC7bDz6z7d0u3Yl0bPh7cKtiYTcdy7dH7x803ENWjR0hcjFFw3boT+y7H7S7Y1skDVCr0/jRFVM7KD3Fp0qTW6QSV58iHBXEIv1B4rv25nZMixs6Qu8OeN9Zft0wXEqkWCeRhI7+Awzhvtxy9ar0aLIj3zGCq0U9BFqpEFym+M76MRp6wavcI1GYBBLMQNlP7T0dHB27Ztq/cyAo9MA6oPs1c9VeaQ+UXr1WghdT78Pk5g4dhGTG3TcP4HT8ALu/dX9Nml0hn0Dg4XXUSdkSFs0DYqLyxjecIHxh4GEAyh8gPV+MVXW5djCllb8szAKfnHGupumYi2M3OH1T6x5EOGTAOqPfpF1SzwfbEBx4KnAxzHwrGNAIC2lljFI+OshGowvwhn5H6hzOTRiNEXG0DP+PKmPUfsMmo6I0NKV80ham0ogXdCfPIhwy5n/sbHdkglrA/Y+eEBOKZL5hk4fezB4t+ZkVHbz8euotlOqHrGl+MI7HPgiYCro88V/x7N5nDT5h1NdX7YBZydcuOPvfgfAyPwgIh86FBlSkglrPfYiaxTX3dm4KbxlWXbb3xsB9pvf6bkM1JVNKs+789mP6kOwprWyQx0f3tn05wfdgFnpzYG+OBl/izIJ3wXeSJ6k4h2EdEOIhKHu0/olp5ThEUqYb3FTmRVAyacCp4OHMqWXIxVFc2qzJjB/CJl/rzZmgeAbK558uatUo+deBvH+bQa/6iVJX8WM8+3CwwI1aFyGVghedHeYSWyfbEBqGqe3BQ8GS/GqopmJ6FyOo7Zmgfg+jwKOsbUYx2nrJqesatrsTRPEXdNCLBzGdghedHVY2xmZRZ0lS9eL3hyMwhKF3dVRbO5RiIR13BsS6nob8otrsiab/ReLF7S1Z7E1lVnF/9WFUABwLZ3nVODVXlLLUSeATxDRNuJaIV5JxGtIKJtRLRt/35pezoZVJa5VMJ6j/nOiYGiaDv54rNMeGDKp7B+6Xzcu3S+0grXxd2polkXqr3rzseOnnMxfPtHce/S+cXWCj3jy5GF/XEIpRZso/di8QunrJq3eEog++/XQuQXMfPpAM4D8Cki+ivjTmZ+gJk7mLlj+vTgvYG1IpXOoP32ZzBr1VOYteopzO87Gpxra7H+Ak9t08puR0ezOdy8eSduTe2qybrDiNWdk24oO/nid3Z8Gd1L5qB/yx7c9NgOtMYiaNPKv4ZmEZ9MRfOR8Xzx91uy1ymteXPzsmZz6U1t0xyHg/SNLwtk//2aFkMRUS+Ag8x8t9V+KYayRh9AYdef3A79fI1FgGy+fP9VC2ZWnJctWBc9Ac5thPMMnBF9HIez+ZKLRFyL4pIzkhUXQakw90UHgDdar0BEIWKbcouLbRWSiXiJGyOsGKd37W29Qinys488AgKwtwGnQKmKoXy15InoWCI6Tv8dwLkAXvXzmGGkf8ueigUeKFiXDGuBB4BHf/ybqtbVrNj5yJ2s+Idyi3HgUNYyU+aF3fuLLpetq86uOg/byhJ/yKVvvllceka3m9uOk0GMZ/ntrnkvgCEi2gngJwCeYuZ/8fmYgcNpdJ9f2Q6NPtGmUbHykTtl1GSZbCc9Ad67R6zEqGd8uTLFlgDcHvtaoKo5J0sqncHNm3cWL7huXDVAMPv8+CryzPwGM5828TOPmdc6P6u5cBrdl0pnXGViTIaoU3NzwRKr1Luroj9UisQt49cXs1+s8NpC7F4yp6xTJeBszV8VfbYpBL778Z0lRo6qAErvODm1TQvkeyO9a+qMqtClqz1Z1hOlMzKEL8fuxzGKpldGXsrPs82VvvzD75/sspsevSuk7vtW9Yo/zFEM5hfhqgUz0XHitLJeM364R7rakyVNy3R6xpfj8ugLtl0qCcDffX41Xmw9C72d8wIpak70Dg4jmz/6ebnpOBnXoui5YF4tluc5kidfZ5xG9+mumr7YAN5ovQIbtI2IR3IggqufMyPD2Nt6BZ5u6S47xgu79zdNPrRf2FnMOszA7ZFP4d6l83FH16k17f3/tkngdZwybdbGHsTIaBbdj4ezxYH5wufUq2b7u84JtAtLLPk6MyMRt/S5z0jEkUpn0BkZwj2xjYhOiHal6M+Ziwz2tl5RkkGRGRlF97d3Amiu7oNe0tWexNbvbrTdzwDu7P1i2XNq8X7bnVuD+UXYAPs1T6EjxX7zfU8Oh6pttVXqsMpVQ4TAZxmJJV9n7Iorzpo7HSd87xPYoG1ELDI5gTeiW/bLos+VWPXZHKPvyeHqXrwJMQbLV9PXq/58/EDV8uAAplhuBwrnSU9sU+Fxh7K28aIgYs4oc8qqGcFxgf7/AmLJ1xxjXm6UyDbD5ZYdS/Bufsdz8SAqWPVPt3QXJxEdOGR9Wy9YY+7hrrIE9/HxeF+tFmZCt7h1SzzRphU/697sMuVgkWlk/X8yxouCiPn75pRVc1v2ajwb8F77YsnXEHM5vJ3Av9pyjS8Cr0MEzKUMNmlHk51m2aRvCuW47RXEDNw1Xt+2tMaWB+nbzi1mBA3mF+EdHKN8rp2VG+RqWHMxmJusmqB3bhWRryFO4tAZGcLrLVfgWMq6Fnhm6x8n9KCs8YschtvxWmAUOWVmBoAXW8+qwYrcY3ThfD67XBmA1V02ZoJYEKTTGnMnecY5rkDAL2z1XkAzoTpROiNDuFfbiKhL/7su5i/l52H2kUdKfvQe4k5ib9WzJOhWSy1ItB3NdXfKzOjtnOdY7FZL9OweALb97HWsXDZBr4Y9bCj/dmomZ3x/gnxhE5GvIaoTZb12n21fESO6eG/KLcbsI49Y5sAvy67B7COPYB8nHIVeIy5x2wDBtlr8JJXOYN5t/1ISw3Dyx/c9OYzux3c2TPBSjwnpqAKwQKkQRolwyRm1yQzyg1Q6g4jhiqxqQ2Ek6Bc2EfkaYpft8ErLtcpiGh1mYDcnMfvII8oSeZ2FYxuVk4EAa7dNkK0Wv9CbxL0zdtTdZlV7oKP74w8cypYU3gD1u1uyGi7Tm13mutd8jhnf2Z4JlDtPv4uateop3PTYjmIcrDMypKwk13vV+FnHUCtE5GuIfqs81XC7/3RLN6bSqNKiYC50MLwhu7KYEeOWZdk1roRed9toUQq01eIXfU8OF5vE6YVpcymj/NxU7pB63C1ZxYScArDmXvOj2VxgUm6t+v7ruOlVo3fiDLLAAyLyNaerPYn0befiqgUzcXtswFEomIEDHMefHXnE0Ydqx7LsGuzmpFLoNWL0xQZwbEss8Ce116TSmaKLRm8nHJlkcZpOPe6W7C4slQZgDxzKBsKaVyU6qNxshzmKZ6P/KzTGjoh8HUilM4i9+m1Hn6Au8KePPVj1MZ3uAPRbc7tS+GbG6Fq5Mvq8K3HXb/etqJeP1+7CMpkAbBCC83YXNadeNV9u+dvAu2iMiMjXGP0WclX2n3wXePPLq2Z96o/vi30tEFZaLTGKRRQ2zfkNGFvTWlEvAbGKCennyNuFsQ+2mDNRghCcN2ZBGVFmRBEw//wV6N+ypyGyobxARL7G9A4O45zcv6IVaos5z1AKvBtPAaO0tW3P+HKl20ZvNSu58qVU4lrR01rtrONEvH7taq2ao61fOh9vrjsfiYvvsQ39Ww37DkJw3u48V7lqAChbfwcREfkakkpnMDKaxd3a/Y5W/E3jKy33TW3T8Oa687HeMKjZjmQijh0958I4QvS8sX7Hoc7n5P4VN23eYTlPthnRXStOfU50gV+WXYNEXINmyonVIoTezvq2qzVWwOpBxVQ6g4U/OB7vsPsAbBD81VauR6fP8G0cZ9v6O6iIyNeQ3sFhbNLWQrPp5Q2oLUFjT+uu9iR29JyLe5fOL8nWMT5W/yKOmywaN0OdjfvD3HbWDV3tSSTiGj4b26yc33pDdmWxbuHt0Sz6Lz2txGruv/S0hvPzGjNQnAKwa2NH7yz7t+xp+PPB6m7jS9qAfVYNgJ6xqy33BcE9ZYeIfI24NbULf3XkBZwZGVZa8Vkm2yEfVr5cPVvn3qXzbXuUm7+4g/lFyqx8PdOmZF15DrQ1M1n0POuR0SyS9EfLxzADN2ZXllyY41rE0mpuNIwZKIP5RTgC+7vDKXSk+HsQ3BhWMYhjcdj28Qfzrfg+n2m5LwjuKTtE5GtAKp3Bwy//GndpX3V009wyfr3tfpVIqATFasyf26HORvyaNduoGK3cV1qutX0cozxDZXTcOUDbCJgt1M9mP6kMzptz5hv5wm9s4QC4mwBl1TRQKl4FR/q37MEFkSFlsNUpYFfNPFarMX9uhjqbvxQENLTl5jW6lbtJW6ssWLPaHJQZ6WYLVZVOSQR8OXZ/ybZGdWPod2A3PrajuE3lqgFK/+9RIt8nd9UKEXmfuDW1Cyet/gFmrXoKmZFRRyte5aYBqpvH2nHiNMvtTta8uQiGEYz8aK/QBczJxWZFUIakW7k0VBWwx1Cu5OJvl6ZYT6zaN3RGhtSuGm4t+TvP3NButkoQkfeBW1O78M2Xf13SJ8PJile5aa5aMBN3dJ1qu99pLTcZrBkjTv1vrIpgGtVy8wO3flgrx0xQhqSb0yoTcQ1raYXri//Bw+MNd3dnVenq1MbA2FYYCLYP3oxMhvIB84gxJyv+MEdts2mquVXUYwEqz8EBTME0Rd5wX2yg5GLQiJabX3QvmYPVT5TPBDXCDHwzt7j4d5QIl3/4/ZO+KNeD8pmz5wK9/wDYnDnGi78ekG8Ea9c4dc2MU258adA82D54MyLyPmAM3rix4j83fl3Z9qltGnoumFfVl6d/yx7H3paqMXB6ANYo8kHxNXuB/t5nU4QWi3eSGaC/vBbXfOweXFPrxflNx3Lwtgdti+70Qd9A4e5OF9h6Dfw2j2Q04tQ33tiCIhHX0NtZ3feu0RB3jQ8Y/bHKvFxFsDV927lVn2huXCuVdiFstt42XdGtAJV/TfIM9Gk3Ah+7p/aLqgGp5M12hnxZADbRptW9SlTVjEzVI4oB3D7RcfLepfOxo6f6712jISLvA7o/1inYA8Ay2Jr0yB9o51fUfa86lRTBNJO7BgDww9vRYlG8NoIpmH/+ijosqDb0b9mDvKJ5hh6A1aIEZtS9StQuvdepbzxpx2LDl+4MRYDVDt9Fnog+SkR7iOg1Ilrl9/EagTu6TsVVC2Y6joYzR/QBb/2Bdg2prlwwE72d84r7nLoQTqEjRWu+EQNtvvL2byw3J/BOIKo+J8u+kVF8M/fXjgHYXI4xYnN3V8sgvV02k1OFKy64168lNQy+ijwRRQH8E4DzAJwC4HIiOsXPYzYKHSdOUwZ7rCL6Xufk2jWkuqPr1JJ9gHoMnNGab6rK1+9/xjamcQitgaj6nCwzEnHHWoppdBB52AtsLTNUrIqYnO6kCQA+eJl/i2oQ/LbkPwTgNWZ+g5nHAHwLwIU+H7PupNIZDH13o/IxB7m1xILWJzJ5fcuoqoTV9wHqMXBAqTXfNGmU2wZsb/XjE+LR6FWfk0W/m1TVUgAFIc0xl90x1jpDxcrF6XQnjbh1/UjY8FvkkwCM97u/ndhWhIhWENE2Itq2f/9+n5dTG/q37MEdZN9p0sqKz+bqZyFPbdOcA7CG/Ohm8cuzwo41fnHCeNHTm7KpaimMAVgyvFeJuFZyR6pXn/rZn93qguKUNonzvuz5OhqRugdemfkBZu5g5o7p06fXezme0PFfz6rTJmHtB6+XWPRcMA9alJQBWOBofnRY/fJmMVL5KnKGr06YCmeM9HbOAwGuArCHskdLwo4Y+vYYq0/9yrxJpTPoHSydO+vUUhjasU3hqgH8F/kMAGPp3/smtoWa3paHlFb8Q4biGSP1Eouu9iT6P34aXmw9S2nNA4UvTxj98lZiZKfxzMDDubOLf581NxzGiZmu9iSuXDATDzsEYPUh8Dqj2Rxu3ryzmDvvZ+aN/rmZg7+qAsRmCbjq+C3y/w7gZCKaTUQtAD4BYNDnY9adBP7bdh/Dup1AI1TZHRnPu06nDJuLwkqMrPzRzMBuTpZ8hi/sDoeb0Yo7uk7Fuy75e7DCt23VmjrHXNY/xkg154/xjuvmzTvLPjfHAkSgaax4wGeRZ+ZxAJ8GsAXAzwFsZuZh9bMCzk83297m21nxjdDpThc5p17zegA2rtXd0+cpVqLTM74cm3KLMc4RMAPjHMGm3OKyoehhu+BZ8Wj+nIpbU49mc55n3pjvuKyyapRWPAPfHLe+kw4rvn9TmfkHzPwBZj6Jmdf6fby68/TnlBF9owWoRQn3Lp3fEIUYRovLqTvl2tiDOJTN49aUuq9LkLASnc7IEP46sgMR5JHh4/GZ7P+1vAsLq09ep3/LHqwZ+z8Vt6YG4HnmjaqyFXBnxd8/5VOTOnZQCZc51giMvmW7q6xbYYP0gUmlMyWhNafulPqEIHMjtiBj9qt3RoawTvtnvC/yR0QIeF/kj1in/XOZkDWCm81v9DsVp4u/ude8ziVnJG2nljlhDoY7Da5xsuIfyi3GrPeE+6JsRkTeSxTFM+ZuhUBjFBal0hncvHln2bpVxVFAoemT1a1yUDH71T8b24w2GivZ1kZj+Gxsc6gGSrhBv1Nxuvibe83rvLB7/6TGIFoFw1Vp705WPFD4P/zo9bdCmR1mh4i8h+QVxTOA9Zeknv5c/UtkJdaq4ijdBxuUwRhu2Dcyir7YAN5ovQJ7W6+wnec6g/4TX7nstNAMlHCDsT2GU2W0lTU/2XPcyjWjMivu1uxrU4CjbUSabfiNiLxH/Pvg/SCFZWtsZ2qknv5clX/TaagzAbgt+qBvxS215s5jvoFl0ecQoYJY2YlFLhZvCmE3YmyB0ZddphRaK2t+sud4JReHvtgANItGcjrmAsRmCJbriMh7xMmvfFHpC+wbX1a2vd7+XKcTXTXUWbfmw9K/5VI842rEn5ZrHnEworfA2PClO0Gz/5ft48x584TJ1xG8O+6+snqZqp2wRUvvsAfLjYjIe8S72T433jz5qVH8uU4nuhtrvjMyFIr+LRGX8QVVq4Om4Rp1qYsxb54BfGd7ZlJGgFtv4NMt3cr9jNKW3vU2rmqNiHyVpNIZrO79gu1+8+SnZCLeMP5cu1bERpysed0Hm5mYDhREKkkFzclXpkDLsba7zHnzo9lcWdsBwLmnzcgh5wE1fbEBzKWMY0aNHj9qBOOq1sj4vyrQA5dbI/Y9q4HSPjWNZEHoJ7pxbJs5RW0wvwgbYN9RU/fBDuYXFeehBukLpA9dv721/AJnhhl4JHc2yh1vTcjH7gWe+KTtbkLBwtYLx0ZGs5i16ikkJ0YDAigZ16e7/YCj54/V+WhG5aYBACbgmju+E77xjBUgZkkV6IFLVbc7Y248ofEE0NyK2Kplq9uMiiC6bZxy/ZmP/mzKLW66QhpbPngZfv+eBcq7vLmUKWt3oIt57+CwZU+bGx/bUbTqz5o7XXnhdXTTNGF1qxUi8lWwb2RU2e3OnBsfBG+ulQvHqde8MaMiaFkLevroiM2FLMPHY/aRRzD7yCNYR59sqDuxenPxO59T7le1O7CbJgUULgTd396Jx37yG9vvzCZtrdJNAwBZJrkoQ0S+KhJtmnK8GFCaG+/V7FY/MU+MAgoum5fy81w1LqskI6IepNIZtN/+DGategqzVj0FQJ8gVH5xGuMY7hovNLI6tiXadL5cJzIjo9jkMFSEALzScq39A2zI5hjZvPUL98UGcGZkWO2mYeDz+JRclCEiP2lS6QwOHh5Xjhcz5sZrEQrMCae7cIzfIauB40b0xmWNXB+VSmfQ/e2dOGAK6H02thmtVJ5j/d98TDGeYqM3TYcxWAoUjJgsoraPJwKm0uikhN6KzsiQsx+egZ/QB7HoopVyUYaI/KTp37IH5+El2/3G3HgC0H/paYE74cwplk6To9bGHsSBQ9mGzbLp37IH2Vy5WttVt+pDUoBgxhu8xtxmQOeW7HVqa35C6Le2rKzq+J2RIWzQNjoaElkifLj3pcB93/xCRH6S7BsZdZwhOZhfhLgWxfql8wN5wpn9806To3RrfvUTu3BrapfvI98qxSpesEmzb4xqnogUtHiD19hVSDu584CC0M+gkUkL/SZtrSuBZwZ68LcNdd7VGxH5STIjEVdm1Rzk1sDn5Or+eR03c2DXxh7EaDaHb77865LGUt2P76z7F86q+Evl242Ywn7NVCVpheoityy7Bvs44UroX2+90nk8n4GtLSsdffBAIbFhiP8Cjx5e4NuowSAiIj9JbviTtO0+vU9G95I5gRV4HfP63VjzVmTzbFkQU0u6l8xBNHJUKSoRmmarkrTC6SK3cGwjDnDcUeijxNigbXRMgdQbxs2gEVcW/C/y78PVY58v2S5uNhH5SZFKZ7D4V+sdXTVhPLmcrHnA3gWiSpurFcYT3sndpgfOo0S45Ixk4C/Y1eKmQvr0sQeVg7+Lz5vIo9870fVTz6fvjAzh5y1XY2/rFSUN41QwA/s4gSVjd1nub3Y3m4j8JOgdHMZUxRxXXRzCcnIlTGmRTnNgz4wMV2Ql14r+LXtK0vJU7jZj4DzHPOn+K2HCmF6r91+6csFMaNFSFb4pe73SmtfRu30SFSpX97ZegQ3aRsQjOWUnUCPMwAGOY+GYfVV2s7vZROQrJJXO4K+OvGC73ygOYTm5ejvnQTO4ORwblxHQE9tUtn1qW31z6J1K5HX06lZjOwq57S9grpC+o+tU9H/8tJLP9sXWs/Dyey5yJfQ6RsF3i27Bnz72oPJxze5mk941FdK/ZQ+edJFVA4Tn5LLqcdN3+Hp8if/e9n0wph8ChXm2PRfM83upSqJExQpXpzuNRhvw0sh0tZe7shaui2FF7r8dc9onCzOwm5NlQ9XNJOJa07vZROQrZN/IKKa22t/m6yw8aVqoTi7zFzmVnoMjqftwjGLcWl9sAD3jy4tNqbrak0ilMyUXi1oGp40TsFT++LfpOMvtYbkzqwX7RkbRg+XYnv8A1sc2uvKtu0H/CDflFjuOIyQU7kKbHXHXVEAqncGF0a3Kx7zFU3BsSxSXdsys0arqQ1d7ErvOWGvbW8Q4IlBvq2w1s7OWKW56q4a+2ICtP54B/PL0L5QFGCW7pjL0C+JgfhFOGnukmEdfzVhg3T0z+8gjrgT+ygUzQ2VoTRYReZfoAnVb7BuOE6DeGcs1RX7uX3ZeB1JkUugjAnWsimlq5etOpTM4NDaOV1quVbsQGLjxZyfjkjOSJQHGINc71IPuJXNKArLLsmsw+0jlYq8/doyjuCG70jbAOrVNK/m81i+djzu6TrV8bLMh7hqXFNsKK1w1B7m16I/XxSvswvD6iUvxZ29+y1I0dWs+lc6gqz1p69P229dd7PtP/xtTadTRbZAZGcV3tmdE2Kugqz2J3sHhsrRZvQdSZ2QId8fug0ZqtXfjlgEKA0bSt507+QWHGBF5l2RctBU2DgoGwh+oS6UzWP3GRdgZeRwtNkOUCcALj/8jtv3qCrw7rlnmyvvdubJ/yx7cj9tdCbxOs1yk/eRtRV3EYH4RBscW2e6vFImX2CPuGhek0hkQ4NhW2JhyBxRaEYcZ/e5G1aCKCFgXux8Pv/xrZHN528f4yRn/9ayrsnigtHNo2C/SflMr4ZV4iRrfRJ6IeokoQ0Q7Jn7+xq9j+U3/lj1gwHVbYZ1qgkxBQBdB88XNzDGUwwWRIbwzZm3tu5nlOVlS6YxjZatO3lDjAIh1WC1WFbLV0KZFQCikRU5t0yRe4hK/3TXrmflun4/hO25cNUZx0FHdroYB4wzOA5iCaTYZK0TA3bH7bG/PvRTTW1O78OiPf4McM6JEiEaAPTF1yiszkEUUt2SvK16wxDqsHmN9hdtCNBXZHCPRpmHkUBYzEnH0XDBPxN0F4q5xQHfVKK1BsrZmw24JGi01pxGBGjG+1PK1kspZwNthKvpQbj0fPseMj7J9z3+gIPA3ZFfiA0ceKn6GU9s0sQ49Qq+QfXPd+WXtMSolm2ccOJSVDpMV4rcl/2kiWgZgG4CbmfmA+QFEtALACgCYObOxcstT6Qxu3rwTDHWfk3fQirgWLUkPDLslqBc1jWZziExc5D6e/1db3zcR8Ak8ix4qzZTIo9AL6KbHdmBGIo6z5k7HC7v3uyqWMhZWJdq0solPgPrirAu8Lu6JuIbeTrEO/cLrO1sJjrujKkueiJ4jolctfi4EcB+AkwDMB/A7AF+xeg1mfoCZO5i5Y/r06dUsx1P0tLscs3NWzdi1ZY2bwmwJGouagKOj8ZZl1yiHlROA80yWdS7PGBk9ap2Z+9DbWWvmwiorgQccmpDh6B1YhCAC7zN+3NlKcNyZqix5Zl7s5nFE9FUA36/mWLXGWLjjFLjb9q5zsMGif0dYsZsQBAAP5RbbFhs5+eatsLPWVGtwA3NhrTp5hliFPtO9ZA5WP7Gr5HMjFC62cS2C0ax19pWKsLtEvcDP7JoTDH9eBOBVv47lB0YLQWUNHsCUULtlrFBZT06FKxpxsXd4NcdzE8irtAmZWIX+YtWqeP3S+Xhz3fmYdmyr5XOiRMWMGnNL47C7RL3CT5/8XUQ0H4UL9ZsArvPxWJ6SSmcQmehY6OSqef2M25rO+jNm1RhJTvjUD6TVmTZXR59zVcVoPJ4RPRjulKGqugOzSnkVq9B/rDpWAvYX2Dwz9q47HwDq2twuyPgm8sx8tV+v7SdGXzzg7Kr5y87AXLs8w+q2W7equtqT+LufLFMOXSYUrGyn/Hrj6xrR6xacsG1CZpHyqkW9y/IRKsfOcDBeeO0uEIIaSaE0Yfb1qlw1lXsQw4HVbbcx0Lz9XecUG1FZofvmrYhGCIm4utDFC7dK2QUm5IVrjY5V4ZS4Y7xBeteYMAqIk6vmm7nFePdE861mQ2VVnTV3Opa9vAZ7W6+wfb5GjE3a2mLDKh092yapuB2364FjpFK/fzbPEnitI1aDacQd4w0i8iaMt41OvWp6xpcj/sQuAJCT0cALu/cDKHQQVGXa6LNgrdw2evokUP7eumlRcPUkJhJJ4LW+iDvGH8RdY8J42+imV43M/ixHv0j2jC9X580r3DZA6XubSmewcN3zmL3qKduceJ2+2ICiy7110BWQwKsQTkTkTXS1J3HJGUl0KSZAmQN3XvTlCBNRgwn9UG6xY7uDTdpa2/37RkbLCp9U9MUGlENB7PoMif9XCCvirjGRSmfwne0ZpGMPVNRW+NbUrqacRGOV1macpdozvhzLos/ZPt/JbTMjEXcsfOqMDOHLsftxDOWKr2nHYY6Wt4SWdgZCiGlqkTcL1Flzp+PRH/8G59NLaI3YuwQOcnnhxsMv/xodJ4ZreLcTuoWtC7DuR0+YAqMq3zxQEOV7Yhvx/eyiYosEoGBdz3pPHFtff8t2DU6WuxFm4Au4HslEXIJ7QtNA3EBNzzs6Onjbtm01OZZZoIy80roC08g+x9rY1MpIMhHH1lVne77WRmXhuuctXVVTJ9rBGs+sp1u6MZcySjfKAY7j9LEHi69xygnHKQX+9tjXcHX0WdcB1jwDg10/E1EXQgcRbWfmDqt9TeuTV7kA3Da1MtNs2Rl2/9+RQ1lcuaC0o+h5Y/3K1yICptIotrasBAAczubxozfsBb4zMlSRwDMDm2mJCLzQdDStyNsJlFNuvLGplZlmy86w+//OSMRxR9epuHfpfEw1jEDc5BCEJQJm0Ai2tqzEaDanfOxd2lcrEvh9nMDqw9e4e4IghIimFXk7gXKTG29FM2ZnOFUpdrUnkb7tXNy7dD6Awnu3m5OuhP711ittL7idkSG0wl1vcmZgNyexcGxj012EBQFoYpG3EqjOyJAyN95IIq41Tf94O5zaGxgfp3PeWD/2ccJR6KPE2KBttEyvvFu7X3khZi78jHEUN2RX4ryx/qa8CAsC0MTZNeb5k1EiRyteL6LRoiQpdxO4rVJs0yI4NNEvfOHYRrzeeiWiDlnvenrl3tYr8FJ+HpZl1+Dplm5osE+n1F0zC8c2FrdFCE15ERYEoIkteaAgULpFfz69pLTijUU0uXzjZCQFhS9d/EEYx7velL1eac3rEJWKvSpDBwCyTCUCDwD/88+aK7VVEIw0nSVvzo0/NDaO0WwOva3qlsIHubWYVSNThCpHf69ufGwHgEKG0hm5X7jOcXebB3/L+PVl23/0+ltINWkjOUFoKkveXB6fGRkt9kFRpk0ysGb82pJtzZYu6QVd7UkkDcHPnvHljhk3bmEGXsrPs0xvZUD6CwlNS1OJfN+Tw5a58U5j4oxWvI5kajhjbCq2cN3zSKUz6F4yp2SMW8/4ctyQXYlcHlWJfZaprG2xEbkoC81K07hrUumMbfdCVbaGlRUPQDI1HLBqedD97Z3QIoRsrlTNB/OLMDi2qFAVC7XP3Qo7N40RuSgLzUrTWPJ2t+t9sQF1tgbKK1wTcU38uw5YVRRnc1zMsLHivLF+3JBdibE8ubbqVW4aHUmfFJqZphF5u9t11XAJqwrXuBZFb+c8r5cXOibrHhnML8IHxh7GDdmVGM1HiznvVj95nmh+pnDTECR9UmhumsZdYzUouDMypBwuwSitcFWNpBNKsRvM7BbdhVMtkuwqNDuhtuSNgb9DY+PQIqWS7uSLN1rxeodJEXh3WFUU1wvJrBGamdBa8ubAnzno6uSLB45a8eLTrRzzYOZEm4aDh8eRNRWSEVWXVeMGyawRmpnQirzTNCGnIpy36TgQIIMlqsDc8sBqihQA277+XiGZNUIzE1qRV1lvqpmiQMGyfObEm7B3+fleL6upUfW50SthqyER1/DO2HhJiqbchQnNTlU+eSK6lIiGiShPRB2mfauJ6DUi2kNES6pbZuXYWW+dkSGcGRlW+uJfys/D6l/+uY+rE4yYK2Eny46ec9H/8dOavjuoIBip1pJ/FcDFAO43biSiUwB8AsA8ADMAPEdEH2Bm/+7JUeoOeHdcQ4QAcy+xe7T71G1qgYmUPMnLqCXdS+ZU5bbRLxJuu2IKQrNQlcgz888BgMpV80IA32LmIwD2EtFrAD4E4N+qOZ4Kc6DVOEha5+mWbmV7W2NGTbTSskuhKsyB2nfHNfz3kXFXHT/FJSMI9vjlk08CeNnw928ntvlG76B1XxqdvtiAqza1ekbN5R9+v9dLFBwwWuEL1z1veaE2I7ULgqDGUeSJ6DkAf2qxaw0zf6/aBRDRCgArAGDmzJkOj7Ymlc4oBaEzMuSYTaP3P4kS4fIPvx93dJ06qbUI3uAm7VGvXRAEwR5HkWdm+8nV9mQAGE3h901ss3r9BwA8AAAdHR2TcoQ7Fbusd/LDM7CV/wJnX/pp/L1YhA2Bm4pZyX8XBGf8qngdBPAJImolotkATgbwE5+Opfyyv9JyLSIOQdQcA1eNfR59Tw57vTRhkripmJX8d0FwpiqfPBFdBOAfAEwH8BQR7WDmJcw8TESbAfwMwDiAT/mZWWNn9W1tWYmpNOpoxX9mfCWAQlXsraldeGH3/pKCHfH31h7zDF5Cab6TBFsFwR3EfteUV0BHRwdv27at4uel0pmyYpq+2IArP7w+INqOuBaVXOsGwKpaVj4TQShARNuZucNyXxhEHgD+/AtPY9TQq/y11qsQI/ve5czAPk6UDX22QgJ8giA0MiqRD00Xyjsv/mDJ31GoBf4Ax10JPCABPkEQgktoRB4AjJ2Ec4r/Wp6B08cedP26EuATBCGohELkU+kMbt68s6SFwcO5sy1b2OYZuGki0GomGqGynvMS4BMEIcgEvgtlKp1B9+M7kTMpul65elX0ueKV7B0cg89nl5fMA40SIc9c0vpWAnyCIISFwAdeT/nC08rh0E5ctWCmVLcKghBoQht4TaUzVQk8ALywe79HqxEEQWg8Ai3yXszurGbYtCAIQqMTaJH3IrVRWgoLghBmAi3yXqQ2mgO2giAIYSLQIu9FaqMXY+cEQRAalUCLfFd7ElPbtEk/X3LgBUEIO4EWeQDouWCeY0taK6JE0nhMEITQE3iR72pP4pIzkhUHUL9y2Wki8IIghJ7Ai3wqncF3tmcqCqAm4poIvCAITUHgRb5/yx7lAG8zBKC3c55/CxIEQWggAi/ylebKMyBWvCAITUPgRb7SXPlqsnEEQRCCRuBFvtIUSKl9EgShmQi8yFfqenl7NOvTSgRBEBqPwIs8UFnVqkx5EgShmQiFyHcvmVNWEKVFZcqTIAhC4CdDAUddNuaJTlbbJLNGEIRmIvCToQRBEJqd0E6GEgRBENSIyAuCIIQYEXlBEIQQIyIvCIIQYkTkBUEQQkxDZdcQ0X4Av/LhpY8H8EcfXjdMyHukRt4fZ+Q9csav9+hEZp5utaOhRN4viGibXXqRUEDeIzXy/jgj75Ez9XiPxF0jCIIQYkTkBUEQQkyziPwD9V5AAJD3SI28P87Ie+RMzd+jpvDJC4IgNCvNYskLgiA0JSLygiAIISbUIk9ElxLRMBHliajDtG81Eb1GRHuIaEm91tgoEFEvEWWIaMfEz9/Ue02NAhF9dOI8eY2IVtV7PY0IEb1JRLsmzp2mbyVLRANE9AcietWwbRoRPUtEv5z4d2ot1hJqkQfwKoCLAbxo3EhEpwD4BIB5AD4KYCMRRcuf3nSsZ+b5Ez8/qPdiGoGJ8+KfAJwH4BQAl0+cP0I5Z02cO5IrD3wdBW0xsgrAD5n5ZAA/nPjbd0It8sz8c2beY7HrQgDfYuYjzLwXwGsAPlTb1QkB4UMAXmPmN5h5DMC3UDh/BMEWZn4RwFumzRcC+MbE798A0FWLtYRa5BUkAfzG8PdvJ7Y1O58mop9O3GrW5FYyAMi54g4G8AwRbSeiFfVeTIPyXmb+3cTv/wHgvbU4aODH/xHRcwD+1GLXGmb+Xq3X08io3isA9wH4Igpf1i8C+AqA5bVbnRBwFjFzhoj+BMCzRLR7wpoVLGBmJqKa5K8HXuSZefEknpYB8H7D3++b2BZq3L5XRPRVAN/3eTlBoSnPlUph5szEv38gou+i4OYSkS/l90R0AjP/johOAPCHWhy0Wd01gwA+QUStRDQbwMkAflLnNdWViZNO5yIUgtYC8O8ATiai2UTUgkLAfrDOa2ooiOhYIjpO/x3AuZDzx4pBANdM/H4NgJp4GgJvyasgoosA/AOA6QCeIqIdzLyEmYeJaDOAnwEYB/ApZs7Vc60NwF1ENB8Fd82bAK6r62oaBGYeJ6JPA9gCIApggJmH67ysRuO9AL5LREBBUx5h5n+p75LqCxE9CuAjAI4not8C6AGwDsBmIroWhZbql9VkLdLWQBAEIbw0q7tGEAShKRCRFwRBCDEi8oIgCCFGRF4QBCHEiMgLgiCEGBF5QRCEECMiLwiCEGL+PyahgdFmzP2lAAAAAElFTkSuQmCC\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"The neural network easily models a many-to-one function."
],
"metadata": {
"id": "DtjXzEegHx6z"
}
},
{
"cell_type": "markdown",
"source": [
"## **One-to-Many** Function"
],
"metadata": {
"id": "31Kw_AMHo71g"
}
},
{
"cell_type": "code",
"source": [
"plt.scatter(y_data,x_data)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
},
"id": "C4mDlh4ko64x",
"outputId": "86c48d60-b67a-43d4-e73a-cb70badf5228"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7fc2f7509e80>"
]
},
"metadata": {},
"execution_count": 52
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"# define network\n",
"input_sz = 1\n",
"hidden_sz = 20\n",
"output_sz = 1\n",
"\n",
"net = torch.nn.Sequential(torch.nn.Linear(input_sz, hidden_sz),\n",
" torch.nn.Tanh(),\n",
" torch.nn.Linear(hidden_sz, output_sz))\n",
"# Train\n",
"N_EPOCHS = 3000\n",
"opt = torch.optim.RMSprop(net.parameters())\n",
"lossfunc = torch.nn.MSELoss()\n",
"\n",
"for e in tqdm(range(N_EPOCHS), unit='Epoch', total=N_EPOCHS, desc='Training'):\n",
" x = torch.tensor(x_data).float()\n",
" y = torch.tensor(y_data).float()\n",
" x_pred = net(y.view(-1,1))\n",
" opt.zero_grad()\n",
" loss = lossfunc(x_pred,x.view(-1,1))\n",
" loss.backward()\n",
" opt.step()\n",
"\n",
"# Test\n",
"with torch.no_grad():\n",
" y = np.linspace(-10, 10, N_SAMPLES)\n",
" y = torch.tensor(y).float()\n",
" x_pred = net(y.view(-1,1))\n",
"\n",
"plt.scatter(y_data, x_data)\n",
"plt.scatter(y.numpy(), x_pred.view(-1).numpy())"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 301
},
"id": "MyTIcHAPpPuW",
"outputId": "312ffba0-d68d-40a7-e919-0f48b34d3a55"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"Training: 100%|██████████| 3000/3000 [00:02<00:00, 1092.44Epoch/s]\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7fc2f7488ee0>"
]
},
"metadata": {},
"execution_count": 53
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAD4CAYAAAAJmJb0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAAsTAAALEwEAmpwYAAAwsklEQVR4nO3dfZRb5X0n8O9P8h2jMTnWOKaJLWzssNTTOMZ2mGK6TpZAKE4KmGES7JDQsKcszjahrTGZ1t6wMCZQOzUEunXTFk7ZmPLmAYzql/KSQE6zsMXteGds49ScEl5shBMg9tDikT0azbN/SFe+urpvku6LpPl+zuFkRrojPfJkfnr0e37P7xGlFIiIqDXFoh4AEREFh0GeiKiFMcgTEbUwBnkiohbGIE9E1MImRT0Ao+nTp6s5c+ZEPQwioqayZ8+e95VSZ1jd11BBfs6cORgYGIh6GERETUVE3rK7j+kaIqIWxiBPRNTCGOSJiFoYgzwRUQtjkCciamENVV1DRBS2W9L78ejuw8grhbgIrlkyC3d0L4h6WL5hkCeiCeWW9H48svsQxi0a8OaVwkMvHwIAdJ01DX3bD2A4mwMAiABKAalkAr3L5qF7ccr2OdKDGWx69lW8M5zFTA/XB4lBnohaijHATk1oEAGGR3KYmUxgzkcTeOnnR10f45Hdh7D1nw8jZ3gn0LuyZ4azWLdtPwBYBu70YAbrtu1HNpf3dH3QmJMnopahB9jMcBYKwHA2h2MjOSgUgq2XAA8A4wplAd4sm8tj9dYhLN34AtKDmbL7Nj37ainAG6/f9Oyr1b4cX3AmT0QtY922fcjmxkN7PqtZ+jvDWctr7W4POrXjS5AXkQcAXA7gXaXUp4q3TQOwFcAcAG8CWKGUOubH8xHRxOMWDG9J7w81wOuyuTxu7t8LoBDoZyYTyFgE9JnJRMVtYaR2/ErX/BDAF0y3rQXwvFLqHADPF78nIqqaOQ2jB0NjquTR3YcjG19eKdy0dQhz1u7CyOgYtJiU3Z/Q4uhdNq/i58JI7fgS5JVSPwVgTnZdCWBL8estALr9eC4imnjsguH6HQdK3+cjPq9af/ZjIzlAgGRCg6BQjbOhZ4HlzLza1E4tgszJf0wpdaT49S8AfMzqIhFZBWAVAMyePTvA4RBRs7ILesdGcpi7bhciju8VcnmFKZMnYei2Sx2vqya1U6tQFl6VUkpELH8NSqn7ANwHAF1dXQ32qyKiKKQHM1i/40BhVoxCjTpsokPYAT6Z0PDvJ3KWdfZGXmbjvcvmleXkAfvUTq2CDPK/FJEZSqkjIjIDwLsBPhcRNTi7hVP9dqsZra4RZupaXLDpywtLYzYHZzMvs3E9hRNkdY0on/71RGQOgJ2G6ppNAH6llNooImsBTFNK/bHTY3R1dSkeGkLU/MwB/aLOM/DknkxZUIzHBHm36XCD6GjXcNsV88uCb3owg5v791quBQiAe1YuCm3zk4jsUUp1Wd3nVwnlowA+B2C6iLwN4DYAGwH0i8j1AN4CsMKP5yKixmZVFqi3CjBqhgCfTGi2eXU9gJtn9ALgaxfMjqyNgZkvQV4pdY3NXZ/34/GJKBpOtel2963fccAxjdGoYgCMVfZaTNC3fL7jz4SRbqmXb+kaPzBdQ9Q4rPLOCS2OL52Xws69R0qNu5qdPvPuOmtaQwdrJ4Gna4iodTgthGZzecvUSzNZevY0vPmrrGUwb5agXg0GeSIq8VI10ixSxQXfnxx8ryln535hkCdqIbXk0I2sdpaGQQC0t8VxfNT5ubWYAFLYbGQnocVtd5hORAzyRD6rp6tgLT9rTK8Y9wwZm10BqKh4Wb11CI8PHMLDN/xW6Ro/t9N7kUom8NLai0vfpwczuPnxvZaVN/phHQAqyjMn+mzdCRdeiXxkt1jpZWZZy8/6kV7RYoDevDEmcN3J6Re7WvJGOlWpWXDhlSgkTl0F3YLZyOiY5c+u6R8CULko6LQZpxrG7rx+Bnj9vNSus6ZVVUvevThlH9S3LAfe+EfDk0wGrtwMnMttOHYY5IlqZDXj9NpV0GrDkJ1xBazeOoSBt46WDphOD2bQ+0T9Ad5OXKTmxzanYHR1z87v6gQ+PFJ+W/4k8NQ3Cl8z0FtiuoaoSubmWbqEFsdpWqziduBUPlkPdLE6g+jwyKjrImU9BMAbGy/D4tufs3w9dgJb9Ny5Bhj4W/v7p84CbnrF3+dsIkzXEPnEKQeezeUxeVIMCS1edr8WFxwpLnTq6pmBO836AcChYaNnenOtYQ8BXn++VJD5c6cADwAfvO3/c7YIBnmiKriVGJp3gYpLuV8Q7lm5CADQ+8Temp5bi0upisWu33lcBONKhbMwusHDORNTzwzu+ZscgzyRi/RgBn3bD9S0jT+KXufGgGuVVnISE5Ta6QL2/c5Dq0Pfshw4+YH7dZ+/NfixNCkGeWoZQZTepQcz6H18L3JN0DHR3FDLXKVi/PeZmtBwfHSsbKZvFbwjbcC1r7+8ksZO1/VcdHXAhVdqCXa58iltcdx51YKywynsgpXV/bXO4KtVTzWL/vN3r1hYVfBt+Hr09R2AGne+ZnoncOPucMbTwJwWXhnkqSUs3fiC7YKkFhes/M1ZFYdWaDHB6adNwvBIDsl2DR+eGCubsWsxCXUGb16wrebnWm4bv1s1ja7PQypnAnAK8rGwB0NklB7MYOnGFzB37S4s3fgC0oOZmh7HqeIkl1d4dPfhigCaG1c4NpKDQuFAaHNADzPAp5IJbOhZgFQyAUEht67FpeK6KW1xAIWZu/HnWirAA94CfM/9wY+jBTAnT6Ex9ljR0xN2vVasgpbTGaFuZYNBbRryg35ws1MOvSHTKUH57sfdr5l7IfPwHjHIUyjMOXM96JpDr1MLAPMOUf0NYdOzr7rWhYs0xmHQZnER25m44/b+VrV5CZB3a5ImwHXbQxlOK2CQp1BU08JWbwFgnMla7RDN5vKeF0b92CDk9vjmTxdujcNaMpdej339wPsH3a/ruS/4sbQQBnkKRTUtbGcmE7YzfzOvlS9Bpde1mGDT1ZVVLValh2yJ60LvQeNkeifTNFVikCdfmfPIemCrJsYePX6yoQ+D9rrbc0KmW2q1Zbl7uWQ8wXLJGjDIkydeFgGt8ua1nAeazY0jm3P5g/eZAPjPZ0/DP71+1HHWzxRLALxuevqfvwh+LC2IQZ5cOS16GoNdVEfH1SOZ0NC3fL7tEXlMsYTAS5qm6/rgx9GiGOTJldeDMNy6IzaSey1OJAKYYgndzjXuaRoIcPn3QxlOK+JmKHJlt2hqDur6Bp1Gl0omGMgbhadNT6ymqQeDPLnSe4tb+cS6XbglXUjdNPKGI52+8YgaADc9hYLpGnLVu2webto6ZFkhM65QWlwN8xDoapnr2Cli3PQUGgZ5KmNXRWM81cjKo7sPhxbgUzYHWThdb3XmKEWEm55CxXQNlehVNJnhLBROVdGkBzNIOaRsgPBSNcmEht5l85DQ4hX3tWsxaLHydQGmZxrQtlXu13DTk28Y5KnEqYrGLrCGbTibw6ZnX8WXzkuVOjamkgncu3IRfvbdL2LT1QvLbmdNe4O5qxOuDSa46clXTNdQiV0VzTvD2VKgdEvbhCEznMWTezKWAZwlkA1s5xrgwyPu13HTk684k6cSuyoap+qaqOifMKiJeCmX5KYn3zHIU4lVSkbPaev5+kZSTdMzitiG2e7XnD6Dm54CwHQNlTgd2rx04wsN17Kglk8YE/YgjihtXgKc9HBM37c9VNxQ1RjkqYxdTrvRZs21VM147cFDPvJaLsk0TWCYriFP7GbNcRF0tGshjwYQKNy0daiqc2GdqocoINtucL+GaZpAcSZPnvQum1dx0pHedheor+qmo13DsRFvh3/oRoqtiM2zcatzZFPFtIxT9RAFwEvbAoBpmoAxyJMnTvl6AFi3bV/NPeBP1JnrN87Ge5/Yi1y+UIetb9DKDGcd34QasXqo6d3V6aFtAYCe+4MfywQnKuCdiiLyJoD/AJAHMKaU6rK7tqurSw0MDAQ6HgpGejCD3sf3ImfR2yBucT6rTouJ5c+EJR4T3G06vo+Ls3XastzbISBzL2RvGp+IyB672BpWTv4ipdQipwBPza17capit+m9KxfhzY2X4e4VCy1LM5MJLdIADwD5cYWBt46Wvndq7UAe7FzjLcBPnsoAHxKma8g3dpU5dqmemxpg9yxQ6KLZdda0whuVxwNSyMLONd42PIkGrKv+WEiqTRhBXgF4TkQUgL9RSpW1lhORVQBWAcDs2R42TFBTsnoD0BdIG4G+eOu0OMs0joN9/d4CPADc9n6wY6EyYeTkU0qpjIj8GoAfAfgDpdRPra5lTn5iSQ9mbPvUu9G7Yob1JiGobKuV0OL40nkpngELAH1TvV3XdT3LJQPglJMPfCavlMoU//ddEXkKwPkALIM8TSzdi1MYeOto6dARrwQobYQyVtMEyeoZsrl82djtNle1/CeAvg5v17EePhKBzuRFZAqAmFLqP4pf/wjA7UqpZ6yu50x+YpqzdpfnawXA1y6YjTu6C/X56cEM1u84UKqzT2gxnKbFMVz8Popl3Y52DYO3Xopb0vvx8O5DMP+JaTHB6adNwvBIzjboN80bg9cZ/OSpzMMHyGkmH3SQ/wSAp4rfTgLwiFLqTrvrGeQnpqUbX7BNu3S0a1AK+CBrHxDtLL79uao3WfklLoDXDxj6pjL9dZnbL1hdE7l9/d52swKF/vBsHxyoyNI1SqnXASwM8jmo+Tntpq0nqA1HFOAB7wEeKKR91u84UFaF1NAVPl7r4IFCJQ0DfKTYu4Yi1704hQ09C3w/0cluJ+uUtjjiIpb3ReXYSA6L1j+H9GDGtsInU6zwidRdndUFeFbSRC7w6ppqMF1DfvKS9rC6xorTrl0/JbQ4BKrUm8f6mhg29Jxr+yYYWD5//XRAef10FAP6jtX/nORJpNU1RFFx67djvMa4eGtmbMTm5Q2hHl4eO5sbR+/jewFUtki2a6c88NbR2ks9vW5yMmKAbxicyRMVOXWwNM78jW8aF3WeUXUJqJ/M46x2g5n59VX47se9NRor4Qw+CpFV11SLQZ6a0SfW7YJTC55kQkMuP47jo8GerFVrszerRe5f/sUy/NqvXgYU4Hn5gjn4yDBdQxQgp7j65sbLAHjP/dej1mZvxlbN+e1rcNX4M/g1FIO7xwCfk8n43OTH8M7aXY1d1z8BsbqGqE4pmyoe4+3di1P40nkprzEzdOf9+4+wPP1J9Iw/g5h4n70rAEfa5uLcsQfZubNBcSZPVCe7On/zGbQ/OfheJDtwnSyPvYjvT/oB4lUEdgClXbx/lPsmdpz4DBTsj1Vsip27LYxBnqhOXqp4gMY7ZvDptl50Sqaq4A4UAvxxpeFTo1scrzOfyMWD06PBIE/kA7te+kYzkwnbypdkQoNIYVOUXjGTTGg4PjrmewO25bEXce+kH0BqnL0/mL8Et439Xk3P3VA7dycIBnmikNTSvsFYspms4cBzswe1O/HZ2IGaZu/HVAKfHq2yXt5Co32iaXUM8kQh8ZrWMf+M8f5qm65NaYtjXBVm0LUEeD9m72Y8OD1crJOncOzrB7atgmXz3+mdwI27Qx9SM7IqxbQ60ES//Z6ViwAUSiN7xp/xXjUTQHAHAC0umNI2qdRV9KLOM3joig9YJ0/RctsW//7BQl8UbqRxZfVp4KLOM/DknkxF4P/aBbML1+/rB9Qznmre9eB+UKXwxdFNvo59Slsco2PjGM4WPolkhrOeDl2h+nAmT8Gqpu84D5aomWNTsr4kvByf4mfevR5xEdy9YqFjoG+aQ1VCwpk8RWfbKu/Xnvyg0Kv8uu3BjadF2Vb3bFkOtwCvz/MeGv9t3J7/Pdfrg5ZXynFGb9eEze76iY47Xik4m5eg6oDxxj8WZv/kD5fe73rN+38afRQf6flzbLp6oe0O3jBlc3ms3jqEOWt3YenGF0q7Z9ODGdzcv9f2UBWqxJk8BWNffyHXXosdq4FzV/g6nAlp8xIo2Kfi9fTMUvVD3L3iVBln9+IU5q7d1TC7czPDWfQ+vhcDbx3Fk3sytn39WZppjTN5Csbf31j7z+aO+zeOiar4JusU4I8rDVe0P2JZp99oZY65cYWHXz7k2OCt0cbcKBjkyX/7+oH8yfoeY+caf8YyUe1c7Xi3AnD67e/jpbUXW+axe5fNQ0KLBzO2Gjl9srDqFUQFDPLkP5cAAwCYe6Hz/dWeRETlRu0/DSkFPBX7guOP610zm0FcxJczgVsVc/LkP4cAAwDouh64/PtA31Tn6/b115eb37ykcl1Af+5W5vIpKA8gvtz53yA9mMGTexq/VbAWE2y62rnccqLjTJ785VoZEz8VZLuud740/a3ax7FhtvXC78Dftn4qaOAB27uUAraddatrUNz07KuBHnDim0Zt0N9AGOTJX26pmp6/PvW124x6fLS2csqdawo193YcgmBrsM9eKwDr/u03XA/0aJZKlVxesXTSBdM15C+3VI05/dI2xflnnv6T6lM2rvn8RikODIDDpxSlgL/LX1LabDTw1lHbvjFTE1qp/UBU9JbLbprlDSkqDPLkH7dZd2Ja5W2X3+vc9iB7tLoxbF5S3fUtwLjF//XT/tYxg6E3G8vm8rZ9YwDggxPRBviEFseXzktV9OSxwtJJZ0zXkH+e/hPn+7/4vcrbzl0BxCc7/5zXlI3nDVitk8jVt/hnhrO4Ivai44eUD5Xzv3M2l8f6HQewbtt+RNHSKl5skZlKJrChZwHu6F6ADT0LkEomICgcrKLFy393LJ10x5k8+cdt1m2Xdrlys/Ns3mvK5qlvuF8DoFHSNX402TIukP6p9oBtK2GlgO+MuSx0A3UfSlKLVDKBl9ZebHmfuScPG5NVj0Ge/FFLqkZ37or6UzZblgNq3P06AJDoN/n41WTLmI+eghO21ykA28c/U9tgA1TtTNzLMYtUjkGe/OFWVWOVqjFyW4B1qpnf1+/aiKuMCr80UJ+BZoaztguKtZx/qp8buzz2ouN1uz96FfBO1cOuiRTHZdXn3qijXcNtV8xn0A4Yc/Lkj2qraswuv9f5fqea+WraGQMAJNROl8a8OQDHipFqK0XmfLSw6OiWqrn2F+E0fEslE3hj42V4ae3FZTl1oHIl5ETO4ycvqguDPAXPbdMT4P4mYFczX0s7Yyjg+dsrb965prALt/Rf0peNU9VsLJqZTCA9mMHSjS9grqnNrlF6MIPFtz+Hl35eSGW5pWry49X9G3W0a1VdD1inXroXp/DS2ouRSiYqfktsDxwOpmuofm6B0GsbAbeUzbb/Xv5msGV57e2MP3i7/Pstyy1SPupUzX0drRC8zs4TWhxzPprATVuHSgExM5zF6q1DWL11qHTdlLY4srk89Li9fpLzDte/y19S9Zjb2yahvW1S6dOHG7fUi92/AWvcg8cgT/Xb87/9eRy3mnnkT+XmLYOyhfhk646YU8889bVbTn/gAdsgnx7MYP2OA6WqlGRCw+ULZ5RtMkpoMYx4SE1kc/nSzNzJ8dHyTwW/G/+x4wHdtRzE/c5wFvesXFRxaLiZfli4W15dXzuwup2CxXQN1c+pqsWpqsbMS838thuAuzo9LrQKsPha67vOudTwmG45fetUR3owg5sf31tWdjiczeGhlw8hM5yFQmEm7iXA12p57EXHqv9ai0VnJhPoXpzChp4FtqkbLS6eAjxg3bqYNe7hYJCn+rgtYLpV1Zhdudn9mg+PeHusnvuAf3vO+j799g2zUWsoXL/jQNW5br+5LbjqqZpYFfu/jMG3e3EKg7deintXLkIycSrYd7Rr2PRl790f9TcMfWOTvuGJlTXBExXF1jYbXV1damBgIOphUDW+N9e5jr3PoVGYnds/CoyP1T4moNCv/rrthcVTiyA+DsEbZ63E2W895uHBBOgbrrh1ztpd9Y3RB29M/qpjkJ978hGIAPesWFQq4TTraNfQ3jaJG4yamIjsUUp1Wd3HnDzVx3GjUo3tA7r/yiU37+L0GYUADwCJDssxHhufgk+8+ZjHISrLnZZRe7qt1/H+o+r0whfq1AYrc449ocVZq97iAk/XiMgXRORVEXlNRNYG/XwUIrdUTVf1C34ACrn5WI3zj8lTgW8XKm7SgxnbTopJ+dDzQ44kZpTq3PU8u7GZV9g62jX82a8fRGcs4ziLXz/2dQCnFjeZMpmYAp3Ji0gcwF8C+G0AbwP4FxHZrpT6WZDPSyFxa0hWzwlMtczmJ08F1hU6K6YHM+h9fC9e1f7DcrYeAxwrUoyePrGwosIkrAM1ElrcOhD3Oe8r0NsYmBc32RZg4gl6Jn8+gNeUUq8rpUYBPAbgyoCfk8JSZarG6yafpRtfwNxHpqBv0mp4qUtRCvhgytllAX711iHkxhWO6SkL8+iqyCQtyYezTpTQ4rj2gtnuM+27OuF2MMhD+Us4UycAwefkUwAOG75/G0BZw28RWQVgFQDMnj074OFQaEypGi8NuczX/PDD87FV24o9iT9A++i7hbBmim15CNbkfh+7jn4W42t3IdmulZU0VhPM7cyM/ar+B3GR8rrgeVena3WRQPD1O57E130cHzWvyBdelVL3AbgPKFTXRDwc8srpBCIAYkrVWG3tz+by6Nt+oLSgGbNo3JXN5fHJ3L0eBlT4OXOr3CS8597tnEh8HIl83HOK5t6ViyqakQms595aXLyXIq6fDigPrYB77vM0TpoYgg7yGQCzDN+fWbyNmp3TLldVmJUbA5fd9vXhbK60OOrlqLdqvaOm40x539O1SgE5TEKbGMo3tQTav3g7NuQXlFXXHD85ZrmomypuIjIHbasulJ5m7zvXeDjO0Che/XGJ1NKCDvL/AuAcEZmLQnD/CoCvBvycFAaHXa4fqskVLXPttrUH7c/GVuBe7Qeum4GUAg6qFLa2XY0/1raiPfuLQuuDz98KnLsC3Sjv825OLQHOOzg9LXh6SMW4Mh6UToSAg7xSakxEbgTwLIA4gAeUUgeCfE7yxu2EHbv704MZDO26D7cp63y3fgKReeZ+UecZZWeKhmX7+Gfw5/iB+4UC/Mb6n6EPAPbNL3Sp/ODtU90qTbNj/d/K0ylFVc/GazT3Qs7iqQJ3vE5AdrNQvRLjlvR+PPzyobIcshYTtE2K4fhoHgcnX4fTxDo3rO+y7GjXMHjrpRUNvKLgtCu0RN8hu68f2PGHQM7wJqUlgCv+l3sA3ddf7IMTwd/U9E7gxt3hPy81BO54pTJ92w/YLoLaBeTcuEJuNI/lsRcxGfYBW0/iqGJevveJvcjlgwt6cRFc8IkOvPmrbGlGfVHnGWVdIB1arZ+i75B9/vbyAA8Uvn/+dusgv3lJ7e2O/cIATw4Y5CcYp12gdrcb9WkPOu6yfKjYEGs4m8OmZ18NLMBXVZXS53J/z/2nvjb3mbe6Paz0ixdd19e36YxaHoP8BJIezODm/r11PUaHS0mi3rs8LuLrgRAihTcRoIazQedeaN+aeHpn+Qx96pnAB4crr5t6ZmMFd87eySMG+RZk10yr9/G9dZUpuh0W/aE61QteLxH0WlFjV0cOFN4wfr7hdzyO0sJ1260PGdHz8EafvxVIfxMYN36qiRUCfyMEeKsxEzlgkI+QW4WL+Tq7Gmvj/eZgmRnO4qatQ5gUA+o9u8Ktd/l3xk6d5aqPzy0nry/4AsB3ntpfceoRAFyzZFbFbVWrJjBWvMgIDpw+fUap0RpRPVhdExGrChc9QJsDuN0RbFpMkB9XoYUgL73LgfJ8uVV1TUyAcWW9lf+W9H48uvsw8kohLoJrlszCHd0LAn1dZe75lHW6xk/Mo5PPWF3TgKy2+RsPb9b7ulhdp8uFeCqR02HRwKlUjTlfXm3Xwzu6F4Qb1M38DPBMrVADYJCPiNuiZDaXx8399eXQ/fR1h8OiFYCPfHkz3jz3slDHFAyn1QEXTLFQA2KQj4iXbf6NEuDdZvECtNBOyxr+zZl+oQbGIB8y4yJp2BJaDNkaVl+dZvEACkFuImI6hpoAg3yInBZRw3CihgDvNosH0Fqz2MQ0l8NQAMQTwP/8RTjjIaoTg7zPjGWRUxMaRIDhkVypPW1UAR6oLdM84WbxX/ye87GD3IRETYZB3kfmmbqxTUAU6Zl6vdT2TfeLWmkWD5xaWzA3GpMYcNXftNDaA00UDPI+cip3bGQxKewqNZZkPqjdiZky7DyLn3th8IOLwrkrGMypZTDI+8jPXi1hEKCs7YGeZror8SA+qw5YHMVtwkVHoobHIO+jqE4/qpW5lUL34lSxCdcz7j/cqrN4ohYTi3oArcTu6LdGpe+sTQ8Wj93dstx7Ey7O4omaAoO8j7oXp9DRrlneFxdBQovmn3vp2dOQSiYs78vm8li9dQjH+86AsmvHa6CA8v7rRNTQGOR9dtsV85HQ4mW3JbQ47l6xsKY69Xpde8FsPHzDb+GltRdb5tgf1O7EG5O/inY16pqDVwo4OJ7ioiRRE2GQ91n34hQ29CxAKpmAoNBpUT87dabNbDpIPzn4XikdY3z+p9t68cbkr+KzsQMQsT6U20gp4LjS8N/aNwc5XCLyGVsNh8juAO2gyy71llvJhIZd+RswU4YLt7uWzxToAf5To1tw7QWzy7pEmnvim89XteuRT0T+cWo1zJl8iOxm+Xb5cr/0TXoAr0/+KgbHry7VvtcS4AHgyT2Z0icD/U0rM5yFQmEh96GXD5V9X7awS0ShYwllyKz6qw+8dRQPvXzI9+d6ULsTn40dAOA9qBspBRxTCXx69FTFTTaXx6ZnX0X34pSnzV/G64kofAzyDeAnB9/z9fGebutFpxRmz7UGdwB4MH9J6WBuI33Tl9fNX822SYyolTDINwAvQXBKW9zy/FOjeoM7YD17N0u2a0gPZhArnjfrxrzg7HZmLRH5hzn5BuCl6ibZ3oZ7Vy6qKM8EgOWxF/F621fRKZmq8u1GSgF5Jfij3DcdAzwAHBvJYfXWIU8BPqHFyzaJGfP4wKmDUZi/JwoGq2sagJc+8wLgjY2XlVWzJNs17BxbhZlyrK60TA5xfDv3DWwf/0xtL8A8Vjn12LopbXFo8VhZZ04rqWQCL6292JdxEE0UPMi7wekpCqcTo/TZfmnhdl8/sO0GqBjcG4mZ6AH4HZXE0tEf1Dps18c3KqSa3EtFm6n3D1EzYJBvEHrwtqulL+uLs3kJ8H7hwOhqArwefP/P+Hx8PfcdH0btPwFKKRtj/T3z9US1YbqmAZk3GJUFuA2zgZMfVPV4SgHjENyU+33blIwWAyCCXD76/z/om7cqbi+mgbhIS1TOKV3DIN9MvvtxIO89naEUkIdgjSG4pxx2pRqrXuwCbSOJCTDOoE/EnHxLWD8dUM6LljqlCgF6de6bZTN3ARwXNfWU0dKNLzRFblw/yEqvzAHAQE9kwiDfDKoI8ADwc5mFS058r+J2rw3S7Or2BcA9Kxdh3bZ9yDp01Ix7rJ/3k3lnbXowg/U7DuDYSOHfLZnQ0Ld8PgDm+mliYZBvdFUGePTcj1fyS5FwW7x1YHfC1cxkoqwtwy3p/Xj45UNlaZ2EFi913bRaW3CqIKqX/uaUHsyg94m9ZesLw9kc1mwdQjx+at3B+AkAYPCn1sScfCOrJgd/+gzg2wdL3zou3rqwq/DRg7f52mqex8uegFrFRTCulOeduDqrun799QJA3/YDpfr+jnYNl507o2xNg503KWpceG1Gd3UCHx7xdu3cC30/jq+eNwkvj71665AvjxWkjnYNH54YQ268ur8RAfA1U0tmoiAxyDebLcsBD0fxAQC6rgcu/36w4wlAsyzu1kpfv+CMnsLAfvLNZF9/ywd4oHDouVUfnlahAKzeOoSlG19gPx6KVGALryLSB+AGAHof3f+hlPqHoJ6vZWxb5e26nvub+qxVcysHvSKno12DUsAH2RymJjT8+4kcqsyWNBSv5Z1BpsdoYgu6uuYepdRdAT9H67irE562IDV5gNdZHaBiZg5+I6NjpbJIP4Rx/KJe3gmcquCZmtAgAgyP5HCaFisrSWXdP/mJJZSNYstybwutcy9siQDvlfmNwM/qHH2nbBiLwJnhLHof31taxDV247Tac8ATtcgvQQf5G0Xk6wAGANyslDpmvkBEVgFYBQCzZ88OeDgNymsefnqn71U0zcYuzeNEAEyKl/fl0fcN6McYhrEIXG2VTmY4i0XrnyvN+JnGoVrUVV0jIj8G8HGLu74D4GUA76OQf/gugBlKqcqz5AwmbHXN+g5A2e8gBQBMngqs8/8c2FbgVKljrHe3y3lbbZ5qVFb7FW5J78ejuw8jrxTiIrhmySyWb04wkZdQisgcADuVUp9yum5CBvmda4AB55OYAAB91XWenEjsUjh6KwMvM1+rNggnx/KO7Rsa2bWs059QImlQJiIzlFJ6kvkqAK8E9VxNzUuA77o++HE0MWMKp9bqFKtF4PRgpiyP3kwe3X24FORZuTOxBTaTF5G/A7AIhXTNmwC+YQj6libcTN7LrtbpncCNu8MZD1VYfPtzvlbzhOnN4nGR5k85Wkxw+mmTmOdvIZHM5JVSvxvUY7eEnWs8VNMIA3zEhps0wMeLh/5uevbVijRWblyV3rhYrtn6uOM1Kl7SND33BT8OcuTUnrmGs9NDM3mSID2YsW0bbWSs47eSHsxg6cYXMHftLu7gbUIM8lHYucb9mumdE6oevlH1LpsHLV4ZzrWY4GsXzEYqmYCgUHN/7QWz0dGuhT9ICyO5cdy0dcjz6V52bwZ6uicznIXCqZk/A33z4GaoKHiZxTNN0xD0FIbVASRW6Q19sbMRGrBVs9pm94nFKt3DjVrNhUE+bJuXuF/Tc3/w4yDPvLRfMPOSJolCMqHh+OiY5cYwK3avo1FfH1ViuiZM+/qB9w86X8M0TUvwetRimATA0G2XYtOXF5almawOg9HZvY5GfH1kjTP5MD31DfdrmKZpCb3L5gV2Alat9MBczScTq9dRzVGSFD0G+bDsXOPeumDuheGMhQJn7rETtVoDsx8bzShaPBkqLH1TPVzD1gWtKD2YqarSxQ8JLYZpUyYzME8QkWyGIgMvJZNcbG1pWlww6rEBWke7htGxcRwfrT3Vk82N46W1F9f889Q6GOTD4FoyGedia5NLD2bQt/1AqU98uxbDZC2OYyM5CKorZ1QKGKkjwBMZMcgHbcty92t6/jr4cVAgzN0rdSO5cYwUO1hWm6YZzuaQSibqyuU3yqYsih6DfNDcDgOJtXEW36T8PKXK7Ojxk56u0+KC/LgqOwdXiwtuu2K+72Oi5sQgHyQvs/juvwx+HFQXY6veqQkNuXx9+XIvvPSxFwArf3MWus6axuoXssUgHyS3WfwEO6+10Xjps26erRvPZq1HMqFh/syP4KWfH635MRSAnxx8D3d0229mImKQD8pdne7XTPDzWqNkDt7GlrvAqbrwmIczZGvRt3x+2fPViu0FyA2DfBC89IrnaU+RSQ9mcHP/3orgnc3lsX7HAXx4Yqx0GlQQAT6VTFg2/nJid2A52wuQG/auCcLAA+7XXP794McxQTn1P78lvR83bR2yDd7HRnKBH/fXu2xeVTPwhBbHNUtmIaHFK25newFyw5l8IFyCBGfxgbFLwwy8dRRP7nm7IQ7m7l6c8tzuIC5SaiDGBVaqBYN86ISzeB+ZF0+Pnxyz7H/+0MuHIhphuVQxveK1gdndKxaWAnktLY+JGOTDxiP9qnZLej8e3X0YeaUQF8E1Swplg8YdpgAaohGYE2N6xUsDs452jUGd6sYGZUHYuca6lcHcC1lR45E+Q7cLgDEA0Sde3OktDVIO6RWrTVUJLe7Y553IiA3KwqanY/b8EFB5QOLAef+15dI05lTJRZ1n4CcH3/OUM3b62WS7VlbhYqURA3xHu4bLzp3h+d9Ax3a+FCTO5KkmXrb0m2ej5iZeYbArPfSLAAzKFDnO5Ml3Xuq8jQc+pwcz6H18b+DliUaCwsJlLf1lkgkNIsBwsfGY1ag72jUM3npp/QMlChCDfIvysmW/Hl7rvN8ZztpuPgrazGTCdoEzLoILPtGB/3foA9dceHowg94n9pYdfs0mYNQsmK5pQXaplGRCw+ULq88ZW71heK3znjwphphI6GedanHBpi8vrOm12S2OMmdOjcopXcMg34KWbnzBczmhFhOcftokHBvJlfLXKcNCaGY4W3HoRUKL49Ozp+L//vxoqEfamWlxwcrfnIVd+46U9XPvaNdw2xXzGYRpwmCQbxFOs0njfWH8Rqs97ahWCS0GoPKTQLsWw5/2nMtATgQuvDY1u3rxzHAWvU/sLX0f1OEVdsII8FpMsKHnXAAsLySqFYN8gzEfUHF8dKxswc8ol1dY0z+EEAtWauI06xcAX7tgNu7oXuD4SYVBnag2DPJVCnIBrpYDKhopwCe0GE7kxivy9186L1W20Ukp4INszjKQM5gT+YtBvgpOB034EZyq7TFer2RCq3ljktVi7IaeBQCYWiFqJAzyVbAKwsYNP07Muz2tKkDCPOXn2mKKZM7aXVX/rHl2ztQKUeNikK+CXRDOFDf8OPVpMe/2PDaSw82PFxZO9Z+bmUyE0klRD/BAoXGW1XN2tGs4kRu3rLXvW87yRKJmwRLKKjjVnzt1G/Ratz6lLY7jo8Gma1LJBF5ae3Hpe6cOiABTL0TNgCWUPrmo8wzbwyf0t8rMcBa9phm619l5LQE+lUyUFjRP5PKOJx9ZHRfn1gGRQZ2ouU34mbyxDt2449Nqo1G1qRR95+jDLx8KpK7c3CDL6RMDd4EStS7O5A2c6tD1BlrGqhmg9o1GmeFsYMfOWTXIclq4ZbdEoomp6YO8Vd06UJl+AFDRy9ypfFCvmtG/biRxsW6+Zbdwq58rSkQTT13pGhG5GkAfgN8AcL5SasBw3zoA1wPIA/hDpdSzbo9XbbrGatFQiwkgKNslGo8J8o20a6hOAuCNjZdV3M5j5IgmpiDTNa8A6AHwN6Yn/CSArwCYD2AmgB+LyK8rpXydElvVrVsdStEsAb6jXQOAso6KVmbazMx5jBwRmdUV5JVS/woAImK+60oAjymlTgJ4Q0ReA3A+gH+q5/nMwtw8FCRjWaPbsXpWFTJGbA1AREaxgB43BeCw4fu3i7dVEJFVIjIgIgPvvfdeVU9iN6NtNsY3q+7FKWzoWYBUMgFBYfNRR7sGQeHNgKkXIqqG60xeRH4M4OMWd31HKfX39Q5AKXUfgPuAQk6+mp/tXTYv9HNDg2B+s+JsnIj84hrklVKX1PC4GQCzDN+fWbzNV92LU1i/44BrDruRJLR4xcKoU/qFiKgeQaVrtgP4iohMFpG5AM4B8M9BPNGwxwAfF4EU/zcqerpFT8Uw/UJEQatr4VVErgLwFwDOALBLRIaUUsuUUgdEpB/AzwCMAfiW35U1Oq9NvcaVwhsbL3Nd2HSid198ck+m6p/XZ+xMxRBRmOqaySulnlJKnamUmqyU+phSapnhvjuVUmcrpeYppZ6uf6jWepfNQ0KLu16n5731hc1kQqvqefRZ9x3dC8pm41PaKp9biwuuvWA2Z+xEFLmW6F1j3PXabtHJ0W5DUHow45jTNx5N5/X5WZtORGFz2gzVEkHerNqg66VJGRFRo5pwQZ6IaCJxCvJBVdcQEVEDYJAnImphDPJERC2MQZ6IqIUxyBMRtbCGqq4RkfcAvBX1OHw2HcD7UQ/CZ634mgC+rmbTiq+r1td0llLqDKs7GirItyIRGbArbWpWrfiaAL6uZtOKryuI18R0DRFRC2OQJyJqYQzywbsv6gEEoBVfE8DX1Wxa8XX5/pqYkyciamGcyRMRtTAGeSKiFsYgHwARuVpEDojIuIh0me5bJyKvicirIrLM7jEanYj0iUhGRIaK//1O1GOqh4h8ofg7eU1E1kY9Hj+IyJsisr/4+2na9q4i8oCIvCsirxhumyYiPxKRfyv+b0eUY6yFzevy/e+KQT4YrwDoAfBT440i8kkAXwEwH8AXAPxARNyPtWpc9yilFhX/+4eoB1Or4u/gLwF8EcAnAVxT/F21gouKv59mrif/IQp/L0ZrATyvlDoHwPPF75vND1H5ugCf/64Y5AOglPpXpdSrFnddCeAxpdRJpdQbAF4DcH64oyML5wN4TSn1ulJqFMBjKPyuqAEopX4K4Kjp5isBbCl+vQVAd5hj8oPN6/Idg3y4UgAOG75/u3hbs7pRRPYVP3Y23cdlg1b7vegUgOdEZI+IrIp6MD77mFLqSPHrXwD4WJSD8Zmvf1cM8jUSkR+LyCsW/7XMDNDlNf4VgLMBLAJwBMDdUY6VLH1GKfVpFNJQ3xKR/xL1gIKgCnXgrVIL7vvf1aR6H2CiUkpdUsOPZQDMMnx/ZvG2huT1NYrI/QB2BjycIDXV78UrpVSm+L/vishTKKSlfur8U03jlyIyQyl1RERmAHg36gH5QSn1S/1rv/6uOJMP13YAXxGRySIyF8A5AP454jHVpPiHpbsKhcXmZvUvAM4Rkbki0obC4vj2iMdUFxGZIiIf0b8GcCma+3dkth3AdcWvrwPw9xGOxTdB/F1xJh8AEbkKwF8AOAPALhEZUkotU0odEJF+AD8DMAbgW0qpfJRjrcOficgiFD4mvwngG5GOpg5KqTERuRHAswDiAB5QSh2IeFj1+hiAp0QEKPydP6KUeibaIdVGRB4F8DkA00XkbQC3AdgIoF9ErkehPfmK6EZYG5vX9Tm//67Y1oCIqIUxXUNE1MIY5ImIWhiDPBFRC2OQJyJqYQzyREQtjEGeiKiFMcgTEbWw/w+7dd8siXSILAAAAABJRU5ErkJggg==\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"The neural network is unable to model a one-to-many function."
],
"metadata": {
"id": "R-bOkQF5IHJa"
}
},
{
"cell_type": "markdown",
"source": [
"## Incomes **Mixture Density Networks**!"
],
"metadata": {
"id": "WhDoPfMHp1Sj"
}
},
{
"cell_type": "code",
"source": [
"class MDN(torch.nn.Module):\n",
" \n",
" def __init__(self, hidden_sz: int, n_gaussians: int) -> None:\n",
" super().__init__()\n",
" self.z = torch.nn.Linear(1, hidden_sz)\n",
" self.pi = torch.nn.Linear(hidden_sz, n_gaussians)\n",
" self.pi_softmax = torch.nn.Softmax(-1)\n",
" self.mu = torch.nn.Linear(hidden_sz, n_gaussians)\n",
" self.sigma = torch.nn.Linear(hidden_sz, n_gaussians)\n",
"\n",
" def forward(self, x: torch.Tensor) -> torch.Tensor:\n",
" z = self.z(x)\n",
" pi = self.pi(z)\n",
" pi = self.pi_softmax(pi)\n",
" pi = torch.distributions.Categorical(pi)\n",
" mu = self.mu(z)\n",
" sigma = torch.exp(self.sigma(z))\n",
" gaussians = torch.distributions.Normal(mu, sigma)\n",
" mixture = torch.distributions.MixtureSameFamily(pi, gaussians)\n",
" return mixture"
],
"metadata": {
"id": "UOYzGYkapz5q"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"HIDDEN_SZ = 20\n",
"N_GAUSSIANS = 5\n",
"\n",
"net = MDN(HIDDEN_SZ, N_GAUSSIANS)\n",
"\n",
"# Train\n",
"N_EPOCHS = 15000\n",
"opt = torch.optim.Adam(net.parameters(), lr=3e-4)\n",
"lossfunc = torch.nn.MSELoss()\n",
"losses = []\n",
"\n",
"for e in tqdm(range(N_EPOCHS), unit='Epoch', total=N_EPOCHS, desc='Training'):\n",
" x = torch.tensor(x_data).float()\n",
" y = torch.tensor(y_data).float()\n",
" mix = net(y.view(-1,1))\n",
" opt.zero_grad()\n",
" loss = -mix.log_prob(x).mean()\n",
" loss.backward()\n",
" opt.step()\n",
" losses.append(loss.item())\n",
"\n",
"\n",
"# Test\n",
"with torch.no_grad():\n",
" y = np.linspace(-10, 10, N_SAMPLES)\n",
" y = torch.tensor(y).float()\n",
" x_pred = net(y.view(-1,1)).sample()\n",
"\n",
"plt.scatter(y_data, x_data)\n",
"plt.scatter(y.numpy(), x_pred.view(-1).numpy())"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 301
},
"id": "aOkLgOOGkNUg",
"outputId": "20a99e01-738b-48a3-cc14-37e4caedaca5"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"Training: 100%|██████████| 15000/15000 [01:02<00:00, 240.49Epoch/s]\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7fc2f6d446d0>"
]
},
"metadata": {},
"execution_count": 96
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"By modeling the distribution, we are able to fit to a one-to-many function."
],
"metadata": {
"id": "CsdK069fIWQP"
}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment