Skip to content

Instantly share code, notes, and snippets.

@siboehm
Created June 9, 2019 14:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save siboehm/dba29f2294d85ec7e10af4fda517539c to your computer and use it in GitHub Desktop.
Save siboehm/dba29f2294d85ec7e10af4fda517539c to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"WARNING: The TensorFlow contrib module will not be included in TensorFlow 2.0.\n",
"For more information, please see:\n",
" * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\n",
" * https://github.com/tensorflow/addons\n",
"If you depend on functionality not listed there, please file an issue.\n",
"\n"
]
}
],
"source": [
"import tensorflow as tf\n",
"import tensorflow_probability as tfp\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import scipy\n",
"import sklearn\n",
"import pandas as pd\n",
"from sklearn.model_selection import RandomizedSearchCV\n",
"tf.enable_v2_behavior()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.13.1\n"
]
}
],
"source": [
"print(tf.__version__)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# a cosine + some noise\n",
"def gen_data(num, noise_std=0.2, heterosced_noise=0.3):\n",
" np.random.seed(22)\n",
" x = np.linspace(-6, 6, num=num)\n",
" y_heterosced_noise = np.zeros(x.shape)\n",
" for i in range(int(num / 4)):\n",
" y_heterosced_noise[i] = abs(x[i])\n",
" y = (\n",
" 3 * np.sin(1*x)\n",
" + np.random.normal(0, noise_std, size=num)\n",
" + y_heterosced_noise * np.random.normal(0, heterosced_noise, size=num)\n",
" )\n",
" x = x.astype(np.float32).reshape((num, 1))\n",
" y = y.astype(np.float32).reshape((num, 1))\n",
" assert x.shape == y.shape\n",
" return x, y\n",
"\n",
"\n",
"def plot_dist(x_train, y_train, x_test, model, labels=True):\n",
" output_dist = model(x_test)\n",
" mean = output_dist.mean()\n",
" std = output_dist.stddev()\n",
" plt.figure(figsize=[12, 6])\n",
" plt.scatter(x_train, y_train, s=4, label='training data')\n",
" plt.plot(x_train, mean, \"r\", lw=2, label=r'mean')\n",
" plt.fill_between(np.squeeze(x_train), np.squeeze(mean + 2*std), np.squeeze(mean - 2 * std), alpha=0.1, label='2 stddev');\n",
" plt.legend()\n",
" plt.ylim(-6, 6)\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is the data we'll fit, a sinus with some heteroscedastic noise"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAsEAAAGbCAYAAAAlTE14AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3dfYydV30n8O/JxJCEpk3WE16EKU5imw2BJg1jXjLFSzFGWdpNKbXaILXatCqEiJJaqlpB0Za+qBLaoLo4bYPMS6ttI7EQuimtsi2Ou9mUGNiMg9niBMZJRMBNq9pW0kSLAWfm7B+2h9iZO/b13Hufe+/z+fzluffO85zRTe7zvef8zu8ptdYAAECbnNX0AAAAYNCEYAAAWkcIBgCgdYRgAABaRwgGAKB1zm7ipJOTk3X16tVNnBoAgBbZvXv3wVrrRSc/3kgIXr16dWZmZpo4NQAALVJKeXSxx5VDAADQOkIwAACtIwQDANA6jdQEAwCMqiNHjmT//v35zne+0/RQeIZzzjknq1atyooVK07r9UIwAEAX9u/fn/PPPz+rV69OKaXp4ZCk1ppDhw5l//79ufjii0/rd5RDAAB04Tvf+U5WrlwpAA+RUkpWrlzZ1ey8EAwA0CUBePh0+54IwQAAtI4QDABA6wjBAAAj5Iknnsif/MmfdP17b3nLW/LEE08s+Zrf+q3fyl133XWmQzul3/7t386HPvShJV9zxx135IEHHujbGI4TggEARkinEPz0008v+Xt33nlnLrjggiVf87u/+7t505vetKzxLZcQDAAwBubma7bumM3mW3dl647ZzM3XZR3vve99bx5++OFceeWVWb9+fV7/+tfn2muvzctf/vIkyVvf+ta86lWvyuWXX57t27cv/N7q1atz8ODBfOMb38hll12Wd7zjHbn88svz5je/OYcPH06SXH/99bn99tsXXv+BD3wgV111VV75ylfma1/7WpLkwIED2bRpUy6//PL88i//cl760pfm4MGDHcf7+7//+1m3bl1+7Md+LF//+tcXHv/oRz+a9evX54orrsjP/MzP5Nvf/nZ27dqVz372s/n1X//1XHnllXn44YcXfV0vCMEAAH20bee+bL/nkcw8+ni23/NIbtm5b1nH++AHP5hLL700e/bsyc0335z7778/H/7whzM7O5sk+cQnPpHdu3dnZmYm27Zty6FDh551jH379uXd73539u7dmwsuuCCf+cxnFj3X5ORk7r///tx4440LZQy/8zu/kze+8Y3Zu3dvNm/enG9+85sdx7p79+588pOfzJ49e3LnnXfmvvvuW3jubW97W+6777585StfyWWXXZaPf/zjufrqq3Pttdfm5ptvzp49e3LppZcu+rpeEIIBAPro3ocO5vCRuSTJ4SNzuffhzrOmZ+LVr371CTeI2LZtW6644oq89rWvzbe+9a3s2/fs0H3xxRfnyiuvTJK86lWvyje+8Y1Fj/22t73tWa/5/Oc/n+uuuy5Jcs011+TCCy/sOLZ/+Id/yE//9E/nvPPOyw/+4A/m2muvXXjuq1/9al7/+tfnla98ZW677bbs3bt30WOc7uu65Y5xI2Ruvmbbzn2596GDmV4zmZs2rs3EWfoUAsAwm14zmb2PPZnDR+Zy7oqJTF862dPjP+95z1v4991335277rorX/jCF3LeeeflDW94w6I3kHjuc5+78O+JiYmFcohOr5uYmDhlzXG3rr/++txxxx254oor8md/9me5++67l/W6bpkJHiG9Xk4BAPrvpo1rc8OGS7J+9YW5YcMlec/Gtcs63vnnn5+nnnpq0ef+7d/+LRdeeGHOO++8fO1rX8sXv/jFZZ1rMdPT0/nUpz6VJPnc5z6Xxx9/vONrN2zYkDvuuCOHDx/OU089lb/+679eeO6pp57Ki170ohw5ciS33XbbwuMn/32dXrdcZoJHyGLLKVs2rWt4VADAUibOKtmyaV3PrtkrV67M9PR0XvGKV+Tcc8/NC17wgoXnrrnmmnzkIx/JZZddlpe97GV57Wtf25NzPtMHPvCBvP3tb8+f//mf53Wve11e+MIX5vzzz1/0tVdddVV+7ud+LldccUWe//znZ/369QvP/d7v/V5e85rX5KKLLsprXvOaheB73XXX5R3veEe2bduW22+/vePrlqvUurwdimdiamqqzszMDPy8o27rjtlsv+eRheWUGzZcIgQDwIA9+OCDueyyy5oeRmO++93vZmJiImeffXa+8IUv5MYbb8yePXuaHlaSxd+bUsruWuvUya81EzxCbtq4NiXJvQ8fzPSlk8teTgEA6NY3v/nN/OzP/mzm5+fznOc8Jx/96EebHtIZEYJHSK+XUwAAurV27dp8+ctfPuGxQ4cO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\n",
"text/plain": [
"<Figure size 864x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"x_train, y_train = gen_data(100)\n",
"x_test, y_test = gen_data(100)\n",
"plt.figure(figsize=[12, 7])\n",
"plt.scatter(x_train, y_train, s=12, label='training_data')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Define the model. It a small dense neural network that outputs a Gaussian distribution"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"class DensityModel(tf.keras.Sequential):\n",
" def __init__(self, hidden_sizes=(32,32), learning_rate=0.003):\n",
" layers = [tf.keras.layers.Dense(size, activation='relu') for size in hidden_sizes]\n",
" # the output layer that parametrizes the distribution we're outputting\n",
" layers += [tf.keras.layers.Dense(2, activation='linear')]\n",
" # a distribution layer that transforms the output of the previous layer into a tf distribution\n",
" layers += [tfp.layers.DistributionLambda(lambda t: tfp.distributions.Normal(loc=t[..., 0:1], scale=tf.nn.softplus(t[..., 1:2])))]\n",
" super().__init__(layers)\n",
" # for the loss we use the negative log likelihood of the data\n",
" self.compile(optimizer=tf.keras.optimizers.Adam(learning_rate), loss=lambda y, p_y: -p_y.log_prob(y))\n",
" \n",
" @staticmethod\n",
" def build_fn(hidden_sizes=(10,10), learning_rate=0.03):\n",
" # this destroys the current tf graph and builds a new one, avoiding memory overflow issues\n",
" tf.keras.backend.clear_session()\n",
" return DensityModel(hidden_sizes, learning_rate)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<tensorflow.python.keras.callbacks.History at 0x7f4c80550d68>"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"initial_model = DensityModel(hidden_sizes=(16, 16), learning_rate=0.0003)\n",
"initial_model.fit(x_train, y_train, epochs=200, verbose=0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our inital model doesn't fit the data too well. The learning rate is probably too low. Let's see if we can improve on that"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAsEAAAFpCAYAAAB9FvVqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3deZxcZZ3v8e9Ta6eXEMxiMIFJ9IIJSzaahAgoEDSIDBpHBJmZO47XiejgVa+vyTUogjozOBlHxxmdq1zF8TXCVRCiiGgUFGQJgc4CKIko3hiSy5h966225/7xVHVXdVd1urqWc+qcz/v1qld1VZ065+lUuupXz/k9v5+x1goAAAAIk4jXAwAAAACajSAYAAAAoUMQDAAAgNAhCAYAAEDoEAQDAAAgdAiCAQAAEDp1CYKNMVOMMd81xuwwxmw3xiyvx34BAACARojVaT9flPRja+07jDEJSe112i8AAABQd6bWZhnGmJMkbZP0akvnDQAAALSAeqRDzJW0T9I3jDFbjTFfM8Z01GG/AAAAQEPUYya4W9KTki6w1m4yxnxR0lFr7U0jtlstabUkdXR0nDtv3ryajjshNivlcs0/blAZI5mouwYAABNk8/FJTgrqOfVo3LNDb968eb+1dvrI++sRBM+U9KS1dk7+9kWSPmatfUul53R3d9uenp6ajjshA0elVG/zjxt08TYpOVmKRL0eCQAArSOTklLHpcyg1yNpvK6Znk2aGWM2W2u7R95f88I4a+1/GmNeMsa81lr7a0krJD1f637RQtID7g840SklOpgZBgBgLOkBNymXTXk9klCrV3WID0q6I18Z4neS/rJO+0WrsFYaPCal+6W2yVIs6fWIAADwD2uldJ+U6pNyGa9HA9UpCLbWbpM0apoZIZTLSH0HSZEAAEByub7pXhf8WtYl+Um9ZoKBUsUpEslOr0cDAEDdpdNp7d69WwMDA6MftFaSzV9DkcMNP0RbW5tmz56teHx8i/AIgtE4hRSJzICbFY4lvB4RAAB1s3v3bnV1dWnOnDkyhfUwNjd8wbBIvKFrhqy1OnDggHbv3q25c+eOb0gNGw1QkE1LfQek/kOUqAMABMbAwICmTp3qAuBcTspmXFogAXDTGWM0derU8rPyFTATjOYppEgku1wVCQAAWpyxufwED2kPXjNVzjQTBKO5rHX1mtP9pEgAAFpTYbFbLusacaElEQTDG4UUifikfBUJMnMAAD6XzbjgN93PgrcAIPKAt9L9Uu9eOvkBAPwrk3LlP3v35Uud+ScA3rlzp+addY7e/Z736oz5Z+lP//wv9OCDD+mCiy7W6fPO1FNPPa3e3l69572rtfT8C7S4e6m+f999Q8+96A2Xasl5y7TkvGV64omNkqSHH35EF1/6Rr3jnddq3lnn6E///C9Ua4dhP2ImGN4jRQIA4EfVdHZrVJOocbRU/u1vX9Td3/4/uv1rt+m881+nO7/9HT32i5/rvh/8QH//2X/QmfPn69JLLtbtX7tNhw8f1tLlF+iyFSs0Y8YM/XTDA2pra9NvfvMbvevP/qt6NrlAeOu2bfrVs1v1qle9ShdcdLEef/wJXXjhBY35HT1CEAz/GEqRoNEGAMAjLdjZbe7cOTrnnLMlSWedeaZWXHqJjDE65+yztfP3v9fuPXt03/3363Of/4IkaWBgULt27dKrXvUq3fDfP6xtzzyjaDSqF174zdA+l57XrdmzZ0uSFi1aoJ2//z1BMNBwxY02Eh0NrSsIAICk2ju7jWPGtlGSyeFZ6EgkMnQ7Eokok8koGo3qnru+rde+9rUlz7vlU5/RK2fM0DNbepTL5dTWMbnsPqPRqDKZ1vhCUA1yguFPhUYbvftdLhYAAI2QzUj9h936lMHjgazxu/KNb9S/fvnfhvJ6t27dJkk6cuSITjllpiKRiP7jW3comw1XpQuCYPhbLlPUaCNcf5wAgAbKDA4vdgt4tYebPnGj0um0Fiw+V2ctWKSbbr5FkvSB979P3/yPb2nhkm7t2PFrdXSEq4a/8WK1X3d3t+3p6Wn6cTVwlCoErcwYUiQAABNnrQt4031uHUqNtr90QPPnnVGHgYVAg9smF2zfvl3z588vuc8Ys9la2z1yW3KC0ToKKRLpfqltcuNW4gIAgiWXc4Fvuo+zihhCEIzWk8u4U1ixpNR2ElUkAADl0dwCYyAIRuvKDLpcrkSHS5MgRQIAILkF1anjnlZsgP8RBKO1WetW8xYabcTbvB4RAMAL1kqZQnOL2vN9EXwEwQiGXNZVkEgnXTAc5b82AIQC+b6YICIFBEtmUMrul+LtUrKLFAkACKpc1qU8kO+LCaJOMILHWnc6rFD7EQAQHJmUWxx9fG++u1t4A+DDhw/r3/7XVyb03CuuvEqHDx8ec5tP3vwpPfjgQxPa/1j+/d//XTfccMOY2zz88MN64okn6n7sYgTBCK5cNt8F6AD5YQDQygr1fXv3uwZKLHiTlA+Cv/LVso+dqM3xA/ffpylTpoy5zac/dbMuu2zFhMdXC4JgoB6yKffGOXDE5Y4BAFpDLucWP/fuc5MaTGiU+NiNn9CLL/5Oi849T3+z5mN6+OFHdNEbLtVVb3u7zjxnoSTpbW9/h85der7OWrBIt/3vrw09d85rztD+/fu1c+dOzT97gf7qfe/XWQsW6U2XX6H+fncW9d3vea++e8+9Q9vffMunteS8ZTpn0RLt2LFDkrRv3z69ceWbddaCRXrv6uv1R68+Xfv37x811m984xs644wztHTpUj3++OND9//gBz/QsmXLtHjxYl122WX6wx/+oJ07d+orX/mKvvCFL2jRokV69NFHy25XK4JghEeqz72R0jUQAPwtm3ETF717XZMkFryV9dm//1u95jWv1rbNT+sf131WkrRl61Z98Qv/pBe2/0qSdPvXbtPmp55Uz6aN+pcvfVkHDhwYtZ/f/Oa3+uv3X69fPbtNU6ZM0T33ri97vGnTpmrL05v0/vet1uc+/8+SpE995m916SWX6FfPbtM73r5Ku3btGvW8l19+WTffcosef/xxPfbYY3r++eeHHrvwwgv15JNPauvWrbr22mu1bt06zZkzR9dff70+8pGPaNu2bbrooovKblcrFsYhXGzOtc8ulFSLJbweEQCgIDPoJioCnO5w033bdedTe3Td0ln6zFXzT/yEKi097zzNnTt36Pa//OuXtf7735ckvfTSbv3mN7/V1KlTS54zd+4cLVrkZo7PXbJEO3f+vuy+377qbUPb3Lv+e5Kkxx5/Quu/e5ck6fLLV+rkk08e9bxNTz2liy++WNOnT5ckXXPNNXrhhRckSbt379Y111yjl19+WalUqmTsxca7XTWYCUY4ZdMur6z/EDMMAOAla/Nn6va7BW8BDoAl6c6n9ihrre58ak9D9t/R0T7088MPP6IHH/qZNj72Cz2zpUeLFy3SwMDAqOckk8mhn6PRSMV84sJ20WhUmUx9Pjs/+MEP6oYbbtBzzz2nr371q2XHV8121SAIRrilB1yKxODxUK8wBoCmy+VcqsPxvS71IST5vtctnaWoMbpu6aya99XV1aVjx45XfPzI0SM6+eQpam9v144dO/Tkpk01H3OkC163XHfdfY8k6Sc/+akOHTo0aptlS5fqkUce0YEDB5ROp3X33XcPj/HIEc2a5f4tvvnNbw7d7363YyfcrhYEwYC17o24d78LigEAjZNN5yv37M1PQIRrwfJnrpqvF//2srqkQkydOlUXvG65zl64WH+z5mOjHr985UplMhnNP3uBPnbjJ3T+smU1H3Okm2/6hH7y05/q7IWLdfc992rmzJnq6uoq2eaUU07RLTffrOXLl+uCCy7Q/PnDv/stt9yiq6++Wueee66mTZs2dP8f//Efa/369UML4yptVwtjPZj96u7utj09PU0/rgaOsigKJxaj6xwA1F16wHV1C1C6w/aXDmj+vDO8HoanBgcHFY1GFYvFtHHjk3r/DR/Uts1Pj94wEm9KA6vt27eXBNmSZIzZbK3tHrktn/LASJlBKbNPSnRIiU4pwgkTAJgQa13gm+qTcmPXrUVr2rVrl975rj9VLpdTIpHQ//7K//J6SONGEAxUkurNV5HokhLtJ94eAODksvn30HB3dAuD008/XVt7nvJ6GBNCEAyMxebcgo10HyXVAOBEMikpdTxQKQ8ILoJgYDwKJdXibS4YjkS9HhEA+EOhpXG6LzQVHhAMBMFANdIDboajkC/chCR/APClXHY43zdkFR4QDATBQLWsdWV9CvnC8UlejwgAmiebdikPlJREi2PZe0it27BDy299SOs27PB6KK0rl83XujzAKUAAwVZIeeg9QE11H3nppZd0yYo36cxzFuqsBYv0xX/513E/d9u2Z/TAAz+q+Pic15yh/fv3j7r/lk99Rp/7p89PaLx+w0xwSK3fskdZ667XrJzn9XBaWzblPhTik/L5wny3BBAQuZyUzlfKocX8iR37z/rur2vmmA/HYjH90z/+g5YsWaxjx47p3KXn642XXaYzzzxxI45tzzyjns2bdcUVb67XaFsOn9YhtWrJLEWNux4PZo7HId1f1AGJkkAAWtjIrm4EwL50yimnaMmSxZJcm+H58+Zpz549o7a7+7v36OyFi7VwSbdef/EKpVIpffKWT+s7d31Xi849T9+5624dOHBAb7r8Cp21YJHeu/p6FTdT+7u//6zOmH+WLnz9Jfr1Cy8M3f/iiy/q8iuu1LlLz9dFb7hUO3bs0JEjR/RHrz5duZzLE+/t7dWpc16j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\n",
"text/plain": [
"<Figure size 864x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plot_dist(x_train, y_train, x_test, initial_model)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We take 20 different parameter settings at random an evaluate their goodness-of-fit via a 5-fold crossvalidation. By setting `n_jobs=-1`, scikit will spawn as many jobs as there a processors on your system and evaluate the parameter configurations in parallel"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"param_grid = {\n",
" 'learning_rate' : scipy.stats.uniform(loc=0.0001, scale=0.05),\n",
" 'hidden_sizes': [(x, x) for x in range(5, 30, 5)] + [(x, ) for x in range(5, 30, 5)],\n",
"}\n",
"cv = RandomizedSearchCV(estimator=tf.keras.wrappers.scikit_learn.KerasRegressor(build_fn=DensityModel.build_fn), param_distributions=param_grid, n_jobs=-1, n_iter=30, cv=4, iid=True)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"RandomizedSearchCV(cv=4, error_score='raise-deprecating',\n",
" estimator=<tensorflow.python.keras.wrappers.scikit_learn.KerasRegressor object at 0x7f4c80487cc0>,\n",
" iid=True, n_iter=30, n_jobs=-1,\n",
" param_distributions={'hidden_sizes': [(5, 5), (10, 10),\n",
" (15, 15), (20, 20),\n",
" (25, 25), (5,), (10,),\n",
" (15,), (20,), (25,)],\n",
" 'learning_rate': <scipy.stats._distn_infrastructure.rv_frozen object at 0x7f4c804876d8>},\n",
" pre_dispatch='2*n_jobs', random_state=None, refit=True,\n",
" return_train_score=False, scoring=None, verbose=0)"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cv.fit(x_train, y_train, verbose=0, epochs=200)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The best parameters we found have a significantly higher learning rate compared to our initial blind guess"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'hidden_sizes': (25, 25), 'learning_rate': 0.024464187877681353}"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cv.best_params_"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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UA0REZGQmjVrFp07d2bNmjXcdtttAKxatYq77rqLH374AYDHHnuMlStXkpWVxd1338327dsrHefHH3/k8ssv59tvv6Vp06a88MILVb5fy5YtWbVqFZdeeilz5swB4KabbuLoo4/m22+/5bTTTmPTpk2VXrdlyxamTJnCJ598wscff8x3331X8tigQYP47LPPWL16NWeccQazZ8+mY8eOXHLJJVxzzTWsWbOGww8/vMrn+Sve7yNI7CoeqpHSHOJ0PSUiIlKbSUu+YcGKTZzVvwM3n9zT8eP369ePTp06lXx99913s3jxYgB+/fVXfvzxR1q0aFHuNZ06daJXr14A9OnTh40bN1Z57FNOOaXkOS+++CIAH3/8ccnxhw4dSrNmzSq9bsWKFRx55JG0atUKgBEjRpQE6Zs3b2bEiBFs2bKFwsLCcmsvq67Pqw9FLuIfDdUQERGpswUrNuG1bRasqJwxdUJaWlrJ7ffff5+3336b5cuX8+WXX9K7d2/y8/MrvSYpKanktsvlqraeuPh5NT2nvq644gpGjx7N119/zYMPPljl+urzvPpQECz+01ANERGROjmrfwdclsVZ/Tv4faxGjRqxd+/eah/fvXs3zZo1IzU1lXXr1vHZZ5/5/Z4VDRw4kOeeew6AN998k507d1Z6Tv/+/fnggw/Yvn07brebRYsWlVtju3btAHjyySdL7q/4Z6vuef5QECzO0FANERGRWt18ck82zBzmSClEixYtGDhwID179mTs2LGVHh86dCgej4du3boxfvx4DjvsML/fs6IpU6bw5ptv0rNnTxYtWkSbNm1o1KhRuee0bduWqVOnMmDAAAYOHEi3bt1KHps6dSqnn346ffr0oWXLliX3n3DCCSxevLhkY1x1z/OHZYdgY1NmZqadlZUV9Pclf4/63AZDchNITA31KkRERAJq7dq15QK6WFRQUIDL5SI+Pp7ly5dz6aWXsmbNmpCtp6rviWVZK23bzqz4XG2ME+fl7zaZ4aT0UK9EREREAmjTpk38+9//xufzkZiYyMMPPxzqJdWZgmAJjIK9YHtNVlhERESiUpcuXVi9enWol9EgqgmWwCnMhdwd6iUsIiIiYUdBsASWp8AEwj5fqFciIiIiUkJBsASet9B0jvB5Q70SEREREUBBsASLegmLiIhIGFEQHKNmL1vHgJnvMHvZuuC9qc+rXsIiIiIO+fXXXznqqKPo3r07PXr04K677qrza9esWcPSpUurfbxjx45s27at0v1Tp05lzpw5DVpvuFF3iBi1eNVveG3z+7ghXYP3xrYNeTtN14iElOC9r4iISKDt2eLs8Rq3rfHh+Ph4br/9djIyMti7dy99+vTh2GOPpXv37rUees2aNWRlZTFs2DCnVhtxlAmOUcMz2uGyzO914Wjm2LYhbxcUZPt/LBERkRjVtm1bMjIyADNmuFu3bvz222+Vnrdo0SJ69uzJoYceyhFHHEFhYSGTJ09m4cKF9OrVi4ULF7J9+3aOO+44evTowYUXXkjZYWrTp0/noIMOYtCgQXz//fcl92/YsIGhQ4fSp08fDj/8cNatW8fu3bvZf//98RVtiM/JyWG//fbD7Q6/ckhlgmPUuCFd65UBDkjmWL2ERUREHLFx40ZWr15N//79Kz02bdo0li1bRrt27di1axeJiYlMmzaNrKws7r33XgCuvPJKBg0axOTJk3nttdd49NFHAVi5ciXPPvssa9aswePxkJGRQZ8+fQC4+OKLmTdvHl26dGHFihVcdtllvPvuu/Tq1YsPPviAo446ildffZUhQ4aQkJAQvL+MOlImWOqkvpnjOlMvYREREb9kZ2dz6qmncuedd9K4ceNKjw8cOJDzzjuPhx9+GK+36k5NH374ISNHjgTg+OOPp1mzZgB89NFHDB8+nNTUVBo3bsyJJ55Y8p6ffvopp59+Or169WLUqFFs2WLKQUaMGMHChQsBePbZZxkxYoTjf2YnKBMsdVLfzHG9FPcSTmkGcbouExERqSu3282pp57K2WefzSmnnFLlc+bNm8eKFSt47bXX6NOnDytXrvT7fX0+H02bNmXNmjWVHjvxxBOZOHEiO3bsYOXKlRx99NF+v18gKOKQ8FDSS1hDNUREROrCtm0uuOACunXrxrXXXlvt8zZs2ED//v2ZNm0arVq14tdff6VRo0bs3bu35DlHHHEECxYsAOD1119n586dJfcvWbKEvLw89u7dyyuvvAJA48aN6dSpE4sWLSpZy5dffglAeno6ffv25aqrruJf//oXLpcrIH9+fykIlvDh80DBnlCvQkREJCJ88sknPP300yV1uL169aqy7dnYsWM5+OCD6dmzJ3//+9859NBDOeqoo/juu+9KNsZNmTKFDz/8kB49evDiiy/SoUMH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\n",
"text/plain": [
"<Figure size 864x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"tuned_model = DensityModel(**cv.best_params_)\n",
"tuned_model.fit(x_train, y_train, epochs=100, verbose=0)\n",
"plot_dist(x_train, y_train, x_test, tuned_model)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And our loss went down"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"100/100 [==============================] - 0s 1ms/sample - loss: 2.2928\n",
"Initial model test loss: 2.2928287410736083\n",
"100/100 [==============================] - 0s 2ms/sample - loss: 1.2909\n",
"Tuned model test loss: 1.290901689529419\n"
]
}
],
"source": [
"print('Initial model test loss: ' + str(initial_model.evaluate(x_test, y_test)))\n",
"print('Tuned model test loss: ' + str(tuned_model.evaluate(x_test, y_test)))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "hyper",
"language": "python",
"name": "hyper"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment