{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "**Chapter 10 – Introduction to Artificial Neural Networks with Keras**\n", "\n", "_This notebook contains all the sample code and solutions to the exercises in chapter 10._" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", " \n", " \n", "
\n", " \"Open\n", " \n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Setup" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, let's import a few common modules, ensure MatplotLib plots figures inline and prepare a function to save the figures. We also check that Python 3.5 or later is installed (although Python 2.x may work, it is deprecated so we strongly recommend you use Python 3 instead), as well as Scikit-Learn ≥0.20 and TensorFlow ≥2.0." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Python ≥3.5 is required\n", "import sys\n", "assert sys.version_info >= (3, 5)\n", "\n", "# Scikit-Learn ≥0.20 is required\n", "import sklearn\n", "assert sklearn.__version__ >= \"0.20\"\n", "\n", "try:\n", " # %tensorflow_version only exists in Colab.\n", " %tensorflow_version 2.x\n", "except Exception:\n", " pass\n", "\n", "# TensorFlow ≥2.0 is required\n", "import tensorflow as tf\n", "assert tf.__version__ >= \"2.0\"\n", "\n", "# Common imports\n", "import numpy as np\n", "import os\n", "\n", "# to make this notebook's output stable across runs\n", "np.random.seed(42)\n", "\n", "# To plot pretty figures\n", "%matplotlib inline\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "mpl.rc('axes', labelsize=14)\n", "mpl.rc('xtick', labelsize=12)\n", "mpl.rc('ytick', labelsize=12)\n", "\n", "# Where to save the figures\n", "PROJECT_ROOT_DIR = \".\"\n", "CHAPTER_ID = \"ann\"\n", "IMAGES_PATH = os.path.join(PROJECT_ROOT_DIR, \"images\", CHAPTER_ID)\n", "os.makedirs(IMAGES_PATH, exist_ok=True)\n", "\n", "def save_fig(fig_id, tight_layout=True, fig_extension=\"png\", resolution=300):\n", " path = os.path.join(IMAGES_PATH, fig_id + \".\" + fig_extension)\n", " print(\"Saving figure\", fig_id)\n", " if tight_layout:\n", " plt.tight_layout()\n", " plt.savefig(path, format=fig_extension, dpi=resolution)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Perceptrons" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Note**: we set `max_iter` and `tol` explicitly to avoid warnings about the fact that their default value will change in future versions of Scikit-Learn." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from sklearn.datasets import load_iris\n", "from sklearn.linear_model import Perceptron\n", "\n", "iris = load_iris()\n", "X = iris.data[:, (2, 3)] # petal length, petal width\n", "y = (iris.target == 0).astype(np.int)\n", "\n", "per_clf = Perceptron(max_iter=1000, tol=1e-3, random_state=42)\n", "per_clf.fit(X, y)\n", "\n", "y_pred = per_clf.predict([[2, 0.5]])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Saving figure perceptron_iris_plot\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "a = -per_clf.coef_[0][0] / per_clf.coef_[0][1]\n", "b = -per_clf.intercept_ / per_clf.coef_[0][1]\n", "\n", "axes = [0, 5, 0, 2]\n", "\n", "x0, x1 = np.meshgrid(\n", " np.linspace(axes[0], axes[1], 500).reshape(-1, 1),\n", " np.linspace(axes[2], axes[3], 200).reshape(-1, 1),\n", " )\n", "X_new = np.c_[x0.ravel(), x1.ravel()]\n", "y_predict = per_clf.predict(X_new)\n", "zz = y_predict.reshape(x0.shape)\n", "\n", "plt.figure(figsize=(10, 4))\n", "plt.plot(X[y==0, 0], X[y==0, 1], \"bs\", label=\"Not Iris-Setosa\")\n", "plt.plot(X[y==1, 0], X[y==1, 1], \"yo\", label=\"Iris-Setosa\")\n", "\n", "plt.plot([axes[0], axes[1]], [a * axes[0] + b, a * axes[1] + b], \"k-\", linewidth=3)\n", "from matplotlib.colors import ListedColormap\n", "custom_cmap = ListedColormap(['#9898ff', '#fafab0'])\n", "\n", "plt.contourf(x0, x1, zz, cmap=custom_cmap)\n", "plt.xlabel(\"Petal length\", fontsize=14)\n", "plt.ylabel(\"Petal width\", fontsize=14)\n", "plt.legend(loc=\"lower right\", fontsize=14)\n", "plt.axis(axes)\n", "\n", "save_fig(\"perceptron_iris_plot\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Activation functions" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def sigmoid(z):\n", " return 1 / (1 + np.exp(-z))\n", "\n", "def relu(z):\n", " return np.maximum(0, z)\n", "\n", "def derivative(f, z, eps=0.000001):\n", " return (f(z + eps) - f(z - eps))/(2 * eps)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Saving figure activation_functions_plot\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "z = np.linspace(-5, 5, 200)\n", "\n", "plt.figure(figsize=(11,4))\n", "\n", "plt.subplot(121)\n", "plt.plot(z, np.sign(z), \"r-\", linewidth=1, label=\"Step\")\n", "plt.plot(z, sigmoid(z), \"g--\", linewidth=2, label=\"Sigmoid\")\n", "plt.plot(z, np.tanh(z), \"b-\", linewidth=2, label=\"Tanh\")\n", "plt.plot(z, relu(z), \"m-.\", linewidth=2, label=\"ReLU\")\n", "plt.grid(True)\n", "plt.legend(loc=\"center right\", fontsize=14)\n", "plt.title(\"Activation functions\", fontsize=14)\n", "plt.axis([-5, 5, -1.2, 1.2])\n", "\n", "plt.subplot(122)\n", "plt.plot(z, derivative(np.sign, z), \"r-\", linewidth=1, label=\"Step\")\n", "plt.plot(0, 0, \"ro\", markersize=5)\n", "plt.plot(0, 0, \"rx\", markersize=10)\n", "plt.plot(z, derivative(sigmoid, z), \"g--\", linewidth=2, label=\"Sigmoid\")\n", "plt.plot(z, derivative(np.tanh, z), \"b-\", linewidth=2, label=\"Tanh\")\n", "plt.plot(z, derivative(relu, z), \"m-.\", linewidth=2, label=\"ReLU\")\n", "plt.grid(True)\n", "#plt.legend(loc=\"center right\", fontsize=14)\n", "plt.title(\"Derivatives\", fontsize=14)\n", "plt.axis([-5, 5, -0.2, 1.2])\n", "\n", "save_fig(\"activation_functions_plot\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def heaviside(z):\n", " return (z >= 0).astype(z.dtype)\n", "\n", "def mlp_xor(x1, x2, activation=heaviside):\n", " return activation(-activation(x1 + x2 - 1.5) + activation(x1 + x2 - 0.5) - 0.5)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmkAAAEMCAYAAACfoCGmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA7kElEQVR4nO3dfZycdX3v/9dns9ncBwKJyQmwCfdRbAMCSqUooBy1rRpBz7FgKoim9aYClUd+9FepiFb55aCHelPOoUegRrAeFVBbpY1FTuFQK2JBwUYUSEJIAxGWJJub3ezu5/fHdQ1MJrO7M9d8r9t5Px+PeSQ7c811fXbmyjfv+V7XZy5zd0RERESkWHryLkBEREREDqSQJiIiIlJACmkiIiIiBaSQJiIiIlJACmkiIiIiBaSQJiIiIlJACmkZMLOlZuZmdkoG27rbzL6QwXYWmdk/mtkuM8v9e1zMbIOZXZ7Ddi80s8Gst9tMO6+BmV1lZg9PsswXzOzuIMVJ5WhcS19e49pkilRXK7WY2aCZXZhRSUH15l1AEZnZScCPgR+6++ltPvdu4GF3/1Dd3U8C/wn4dcAaLwS+4O6zGx46F9gXajsTuBxYDJwI7Mxge0AULoC3u/vLGx46FdiVVR0F1c5rcC3w+RRrkYLRuNYSjWutKVJdRaolOM2kNfc+4K+Al5vZSztdmbuPuvtWdx/pvLRJt/Wcu2cxuBwDPODuv3T3rRlsb0Luvs3dd+ddR57aeQ3cfdDdn027JikUjWuT07jWgiLVVaRaUuHuutXdgBnA88BvAl8Crm2yzGnAXUTpfTvwT0Sfvm4GvOG2NL45cApRMN4M/HHDOo+Llzkp/vlPgJ/G23gK+F/AwfFjZzbZzlXxY3cTfRKtrXce8DfAALAH+D5wQt3jFwKDwOuAh+Pt/QA4coLXaEPDtm+O73eiT4ONy15e97MDq4Cvx9t6HHhXw3MWA7cAzwK7gQeBs+JaG3/vC8fZTj9wO9Gn4Z3AbcDhdY9fFf++7wQei5e5A5jf5v7S0usHvBl4ANgLPAH8BdBX9/i7gPvjOp6JX5/D4sda3WcaX4M/BB6Nt7kN+Aegt/73r1t2CtHs2kB8uw64Hri7bhkDVsev1x7gZ43vnW7FvKFxTeNae/vLQcBaorFob/z7XDrB738c8H/iZX8B/E78+td+j9q+8s54uT3AvxHtjy8H7otft3sb3yOicexXwHD85/smeS+OifeXWi2/V19L2W65F1C0G7ASeCj++5nxTjq17vHl8Q52A9GU+Evjnag/3rHvA24EFsW3KXU76CnxOv4b0SGH+u1+HHik7udLgbPj576WaGBbGz/WB1wS79S17cyOH7ub/QezbwHrgdcAvwF8m+gwxYz48QuJDiN8H3hl/I/m34B/mOA1WgCsA74Wb/ug+P5WB7PNRKHkGODT8T++JfHjs4BfAv83rvlookMdZxH9R3Nt/PvUfu8ZjdshChM/id+LU4n+E/kh0aEei5e5Kv6He3v8O/8WsBH4n3W1nhnXe+YEr8Wkrx/wBmAHcFH8+5xFNHhcW7fMe4gGtqPi9fwA+Oe6x1vZZ+pfg1OAEeACYAnRfnsZ44e01UT/Mf8XYBnRodAd7B/S/iKu+43AkcD5RPvg7+b971a3iW9oXNO49mKtZzL5uPZ5ohD5yvi9OhN4R7PfnyigP0IU6k+Mt/mv8et/YbzM0nibtQC3jGiMezj+8yzghPh3+U7ddt4Wr+dDREHwj+Of3zxBLT8D/hk4CTg9XucLtZTtlnsBRbsRpfz6fxQbgPPqHr+FhoGo4fl3UzeYxPfVdtDaYPab8c/H1C3zS+BPJ1jvG4EhoCf++UJgcKLtA8fG23lN3eMHEf1n/N669ThwfN0yFxANMD0T1PN3xJ806+5rdTD7dN3PvUSfKt8V//w+ok9/TT/50RAumm0HOAcYBZbWPX4UMAa8vm49e4kH4vi+PwN+VffzK4kGzldO8DpM+vrFA8aVDc9bQTSY2jjrXRav9/BW95mG1+Dc+H2e08rrCGwB/qzu5x6iWbi7459nEf0nfkbDeq4DvpvFv03dkt/QuHbAv8tx6tG4Fi3zbeCmCR6vr+sNRB8ID6t7/NXsPyNY21f+sG6Z34vvO7fuvv3ef6JQe2PDtm8G7h2nlv8cv0b9dY//dn0tZbvpnLQ6ZnYMUfK+FcCjd/gW4L11i51E9IkhMXf/KVHaPz/e7quIPlndWlfL2Wa2zsw2m1ltWruP6FNWq15K9A/4X+q2vT3e9svqlhty91/U/bwFmAoc3Ma22vHTunpGiA7FvSS+6yTgp+7eycnILwW2uPuGuu08TvR71f/eG+PXo2ZLXR24+4/cfZm7/2iS7U32+p0M/FncYTQYd4PeShR8FgGY2SvM7FtmtjF+v38cP7c/rmXSfabBOqJP0E+Y2S1m9m4zm9NsQTM7iOgE8Pr9ZIzo03DNy4DpwJ0Nv8f74zqkoDSuvUDjGi2Pa9cD/8XMHjKza83stRMsuyyu66m6++4neo8a/bTu70/Hf/6s4b5ZZjYz/vmlREGt3r3s//vWeynwlLtvqrvvX8eppRQU0vb3XqJp/E1mNmJmI8AVwH82syPiZSzQtm4h+mRH/Oc97r4RwMyWAH8P/DvwDqL/5N8TL9vXxjYmqtXr/t544m/tsXb3D2+yzalNlmvs0vK6bYV4fY39f7/GbbVSRzsme/16iA77nFh3+02iGYFtZjaL6Hyx3USHpU4lmmGA/d/vcfeZRh6dZP0KosOXm4A/Bdab2eJ2f7mG3+XNDb/HCUSfXqW4NK7t/5jGtUm4+/eITpO4FpgP/L2Z3ZSgrkb1tfkE9/U0uY9J7qvVUikKaTEz6wXeTfSf2Yl1t+VE6f+ieNGfEJ1TMZ5hogFxMrcAx5jZacB/Bb5S99gpRIPWZe7+L+7+KNFJp+1u5+dE7/Fv1e4ws7lE53D8vIUa27WNaEamtq2F9T+36CfAb5rZ/HEeb/X3PszMltbVchTRa5jG7z2ZnwDL3P1XTW4jRJ9E5wP/r7v/s7uvp+6Tb52J9pkDuPuIu9/l7n9KFApnER1iaFxuO/AfRCeOA2BmRnRYpObnRIelljT5HZoGRcmfxrUgunJcc/dfu/tad78QuBh4t5lNa7Lov8d11b+XtWaSTv070eHKer/N+L9v7TU6ou6+VwaqJRelLTwFv0v0H+Vfu/vD9Tfgb4H3mFkP0cmxJ5nZDWa23MyON7P3mll/vJ4NwCvjL3qcHz/nAO6+mehcpf9BdD7F1+se/iXRe3OpmR1pZr9PdMJtvQ3AdDM7J97OzIbHcfdfEp1g+z/N7Awz+w2iQXMH4x8m68RdwAfN7JT4O5luJjo/oh23Ep3UfEdc85Fm9hYzOyt+fAOwJD48OH+cQeP7wEPALWZ2cvxlm7cQDZR3tVqImb3SzNab2SsnX3pCVwPnm9nVZvZyM1tmZm83szXx45uIAtCHzOwoM/td4BONK5lkn2ms/ffM7BIzOymewTgfmEM06DXzl8DquK7jic41e+E/onhm7lrgWjN7j5kdY2Ynmtkfmdmqtl4NyZLGtc513bgWj1UrzOxYi76u5VzgcXcfarL4OqKGgL+J953TgM8SzWS2OsM2nv8GrDSzD8a1/DHRDO2acZb/PtH5dl+Ox6ffAv47B86qloZC2osuBn7gzb876utEU7+vd/cHgdcTzX78kOh49zt5ccr2WqJPRT8n+gTW37iyOmuJPtH+vbs/X7szPrfjEqJ29Z8THa7Y7xuV3f0+ooHwq/F2Vo+zjYuAHxGdCPojYCbwRnffM0FdSX2EqFX7buAbRO31z7SzAnffRdT19RTwHaKuoY/z4j/2bwLfJTp/Zhvw+03W4UQn5m+La/kBsBVYET/WqpnA8fGfibn7PxD9Z3kW0XvwI6LDTZvix7cRzXasIHq/P0b03jfTdJ9p4vl4fbVB63Kik6rvGWf5zwA3Eb1n/0o0NtzSsMyVRCcmX070vqwDziP6ShEpJo1rnevGcW2IqJv7IaJzwuYQnerQ7HcbI+rCnEb0XvxN/Fyn/TDbuO47iDo6LyPaZy4BPuDu35mklh6iffjLwCfj36eUrL33VkRERGR8Zrac6Cs8TnH3B3Iup9QU0kRERCQxM3sb0ffb/ZLo6zY+S3QS/0ltzvJJg6CHO83sQ2b2YzMbMrObJ1ju3Wb2gJntsKgVe018gquISC40fokkNgf4AtEhyVuIzn19gwJa50Kfk7aF6PjvjZMsN5PohNH5wKuILt0x4VXsRURSpvFLJAF3/7K7H+fuM9x9sbuf7+5PT/5MmUzQT3/ufhtA3HVy+ATLXV/341NmdgvRSdUiIrnQ+CUiRVOUKfrXEHW7HCBu718FMH36tJMPP6LZ10flw72X6HshiyNUTaPew+jIFGy0sy9qntLbw+hIcb7sWfVMrmg1bXxyw6/dfUHedUxg3PELDhzDjujCMWykxYM2PT6FMRtNuZrJjXpUb68bI5bPETtv8k+w13oYafZAkA0m+x7YqT3GvrH2XqM0X9LeHmMkg/HLWjyS2+n4lXtIM7OLiL747r3NHnf3G4gu+suxx/X7N75fnEPcW9ZfxuJl431dSz7C1TTK2oFXcdv/eSXHr0n+XaXnXnoqt625P0A9YaieyRWtpo18vrBfljvZ+AX7j2HHHdfv3/mn4nyw27D+cpYuuyaTbX1jxysmXeboJ1fw2BF3pF9MixY8/k5unflgbtvfsHn//9svm72Ezwym+89h2qZ2Lv4AHz7mMD73q6cmX7DBnI3p/F9+8RmH8aV7onoOeizdb97oW7950mU28lcdvWG5fk+ama0ArgHe1OE1zSQFK+fdx+0rruMXq5ew5+WH5V2OSKFo/GrP2+f+JO8S2jZ3akdf89WxpYdvY+nh2zLd5lD/cCbb2bkk/Ss4bT+62XcChzO8bNyzIoLJLaSZ2RuBvwbe7O4/m2x5yc/tK67juQ/uUlATiWn8SqaMQe2cRevzLkFBrQNlD2qhv4Kj18ymE12DbIqZTW/Wmm5mZxO16Z7n7j8KWYOkY+3ymxTUpNI0fmVDQS0ZBbXkyhzUQs+kfRTYQ3TJm3fFf/+omfWb2WDddeCuJLqu23fj+wfN7HuBa5HAakFty3lH5l2KSBo0fmVEQS2ZaX3Zns+ooNa6tIJa6K/guIro2n7NzK5bTu3qJbV2+U2s7X816ziNxd/UJRulOjR+ZasW1FppKCiKcxatZ93WZbnWsPTwbQc0FKRpqH+47WaCJGpBLa2GAoiCWprNBLWg1kpDQat0gXVp28p593HOe37IL1YvybsUESm5ss2qnbNofe6zankc+qzKrNr2o6eValZNIU0SUeeniIRStqAG+R/+VOdnZ8oS1BTSpCPq/BSREBTUklFQS64MQU0hTTqmzk8RCWHelN15l9A2BbX0VCGodUohTYJQ56eIhKAZtWQU1JIrclBTSJNg1i6/iXPe80MFNRHpyNvn/qR0YU1BLT07l1gmDQVFpJAmQanzU0RCKWNQyzusZR3UxvrGKjOrlkXnZ7sU0iS4+s5PnzE173JEpMTKFtQg/1k1dX52pkhBTSFNUnP7iusYecmYGgpEpCMKaskoqCVXlKCmkCapOnLGs+r8FJGOKaglo6CWXBGCmkKapE6dnyISgoJaMgpqyeUd1BTSJBPq/BSRENT5mUyVg1qVOz8V0iQz6vwUkVDKGNTyDmu65mdyeXV+KqRJpnTNTxEJpWxBDfKfVVPnZ2eyDmq9mW6tQsZGRunr/UvGRkbp6Z2Sdzmlc/uK61h55EUc8sXDmPHwU3mX0xXuuuBLDM+c/LI7dw4A75t8fX27Z3L2LRd3XpjkYnRklKlTPsfoyChTSjyGvX3uT/jGjlfkXUZbzlm0nnVbl+Vaw9LDt7Fh84LMtjfUP8y0TX2Jn//Y2McYZeeky31gA3DE5OvrHZ3D8i1XJapl+9HTOOixoUTPbZdm0hLaM7CDHnucPQM78i6ltHTNz2y1EtDyXJ9ka3BgELPHGRwYzLuUjmlGLZkyzai1EtDaMTKls/VlNaOmkJbA2Mgow4O7MHOGB3cxNjKad0mlpc5PkeyNjoyye+duzJzdO3czWoExTEEtmTIFtaLJIqgppCWwZ2AHePyDo9m0DqnzUyRbgwOD+41hVZhNA3V+JqWgllzaQU0hrU21WbR6mk3rnDo/RbJRm0WrV5XZtJoyBrW8w1qVOz/Tlmbnp0Jam/abRavRbFoQ6vwUSd9+s2g1FZpNqylbUIP8Z9Wq3PmZhTSCmkJaG5rNotVoNi2c21dcp4YCkRQ0m0WrqdpsGiioJaWgllzooBY0pJnZh8zsx2Y2ZGY3T7LsZWa21cy2m9mNZpb/RbIm0XQWrUazaUGp81OyVvXxC8aZRaup4GwaKKglpaCWXMigFnombQvwSeDGiRYyszcAVwCvA5YCRwEfD1xLUBPNotVoNi0sdX5Kxio7fsHEs2g1VZxNAwW1pBTUkgsV1IKGNHe/zd3vAJ6dZNF3A19y90fcfQD4BHBhyFpCm3AWrUazacGp81OyUuXxCyaZRaup6GwaqPMzqSoHtTJc8zOvKw6cAHyr7ueHgIVmdqi77zdAmtkqYBXAggXz2bL+z7Or8gXbmT71aqyF93NoxzDbn/0jYG7qVTWzb+9Ctqxfncu2mwlRz+uAE984i+dPP51pWzv7Bzxv0SzOXX1qR+sIKct67hwIv84sar/zktQ30a6Wxy84cAzbsP7KbKrcz3b6ej/R0hi2a/s+Bp79AHmMYUN7F7Fh/RWpbuMUYGB0ZkvLThs+mKOfXJFqPZM5Ov5zx77pHDI2k/N3n5h9EYfA0HDzuLBwyjQ+MjtwV/7Loj96hl+cR/rQo2E3AfDhYw6DY6BneLJPL8k98KXOnp9XSJsNbK/7ufb3OTR8inX3G4AbAI49rt8XL1uTSYH1dm0bYHjnvpaWNdvHQYd+mlkL5qVcVXNb1q8mj9doPKHqWRz/+bY7LqX/uyOJLyV17upTuW3N/R3XE0qm9bRwqad2Fem1zFDL4xfsP4Ydd1y/L112TeoFNtq+bTu7d7Q+hs079NMctOCglKs60Ib1V5DF67MUWrqU1NFPruCxI+5Iu5zWPf5Obp35YD7bjnNt46WkPjJ7CZ8Z3JjaZju5lNRkPverF/8fmbMxvaDWiby6OwfZ/2Na7e9hr/sQQCvnojXSuWnpUeenFEBpxi9o7Vy0RlU9N61e2Q59AsydujfvEip7+DOLi7MnkVdIewRYXvfzcuDpZocK8tbSuWiNdG5aqtT5KTkrzfgFLZ6L1qjC56bVK2NQ03lq6SliUAv9FRy9ZjYdmAJMMbPpZtbskOqXgYvN7GVmNg/4KHBzyFpCSDKLVqPZtHSp81NCq9r4Bclm0Wq6YTYNFNSSyjqoZaVoQS30TNpHgT1E7enviv/+UTPrN7NBM+sHcPc7gTXAD4CN8e1jgWvpWKJZtBrNpqVOnZ8SWKXGL0g4i1bTJbNpoM7PpKoc1IoS1kJ/BcdV7m4Nt6vcfZO7z3b3TXXLftbdF7r7XHe/yN2HQtbSqU5m0Wo0m5Y+XfNTQqnS+AWdzaLVdMtsWk0Zg1reYW1a30iu209TEYKaLgs1jo5m0Wo0m5YJXfNT5EAdzaLVdNFsWk3ZghrkP6uWxzU/s5J3UFNIayLELFqNZtOyo85PkUiIWbSabptNAwW1pBTUwlNIayLILFqNZtMypc5PkUCzaDVdOJsGCmpJKaiFpZDWxOhQ2Hbf0OuTianzs7m+3a19y3pe65NwhveGHXNCr68s5k0JMxuZpaoGtZ6e2UHXN4U5bT8nj6CW1xUHCm3u4QtbWq5o3+4vL1q7/CbW9r+adZzG4m8+kXc5hXD2LRe3tFzRrsog7VtwxILJFyK7b/gvs9qMWitXKCiKcxatZ93WZbnWsPTwbQdcnaATR/R/dNJlpm3q48PHHLbflQRCqwW1rK5QoJk0qSx1fopIKGU7/FmEzs88vvR2rG8sk21lNaumkCaVps5PEQmlbEEN8j/8mUfnZ5WuUKCQJl2h1vnpM6bmXYqIlJiCWjIKaskopEnXWLv8JkZeMqYZNRHpiIJaMgpq7VNIk65y5Ixn1fkpIh1TUEtGQa09CmnSdXTNTxEJQdf8TKbKQS10WFNIk66kzk8RCaWMQS3vsJZHUCvjrJpCmnQtdX6KSChlC2qQ/6yaOj8np5AmXU/X/BSREBTUklFQG59Cmgi65qeIhKGglkxVg1qnFNJEYrrmp4iEoKCWjILagRTSROqo81PSNKIht2uo8zMZBbX9acQQaaDOT0lTmS7ULZ0rY1DLO6xVufOzXQppIk2o81PSpKDWXcoW1CD/WbUqd362QyFNZALq/JS0KKh1FwW1ZLo9qCmkiUxCnZ+SFgW17qKglkw3B7WgIc3MDjGz281sl5ltNLPzx1nOzOyTZvaUmW03s7vN7ISQtYiEpM7P6str/PrGjlcorHURBbVkujWohZ5J+yIwDCwELgCuH2fwegfwHuAM4BDgX4C1gWsRCUqdn5WX6/iloNY91PmZTDcGtWAhzcxmAecBV7r7oLvfC3wbWNlk8SOBe939cXcfBb4CvCxULSJpUednNRVl/FJQ6y5lDGp5h7Vu6/w0dw+zIrOTgPvcfUbdfZcDr3X3NzcsuwS4HXgn8ATwF8Bx7r6iyXpXAasAFiyYf/LffOXPg9Qbwr69C5k6/em8y9hP0Wqqcj2PPf8S+rY7tmdf4nXMWzSLga27gtQTStFqWnXJHzzg7qekuY20xq94+RfGsPkL5p/8+S9/etJ65k3ZnewXadPQ3kVMm741k221olvrGRid2dJy04YPZqjv+XSLadGOfdMBOGRsJs/1ZLO/Nhoa7j3gvoVTpvH06FAq2+sZbn9e60Pn/9eOxq8Df8PkZgPbG+7bDsxpsux/APcAvwBGgSeBs5ut1N1vAG4AOPa4fl+8bE2oeju2Zf1qilQPFK+mKtezGFj50EUc8sVZzHj4qUTrOHf1qdy25v4g9YRSxJoykMr4BfuPYUcdt9QfO+KOlgrKYpZlw/orWLrsmtS306purWcprc2iHv3kClrdf7Kwbusyzt99IrfOfDCfAmbChs0L9rvrI7OX8JnBjaltctqmvtTW3UzIc9IGgbkN980FdjZZ9mPAqcARwHTg48BdZtbaxwmRglDnZ2UUbvzSoc/uUrZDn6Dz1LIQMqQ9CvSa2bF19y0HHmmy7HLga+6+2d1H3P1mYB46L01KSJ2flVDI8Uudn92ljEFt7tS9eZdQ6aAWLKS5+y7gNuBqM5tlZqcDb6V519P9wDvMbKGZ9ZjZSmAq8KtQ9YhkSZ2f5Vb08UtBrXuo8zOZqga10F/B8QFgBvAM8FXg/e7+iJn1m9mgmfXHy/1/wEPAg8DzwGXAee7+fOB6RDKjzs/SK/T4paDWXcoY1PIOa1Xs/Awa0tz9OXdf4e6z3L3f3W+N79/k7rPdfVP88153/6C7/yd3n+vur3D3O0PWIpIHXfOzvMowfimodZeyBTXIf1ZtWt9IpWbVdFkokRTomp+SFgW17qKglkxVgppCmkhK1PkpaVFQ6y4KaslUIagppImkSJ2fkhZ1fnYXBbVkyh7UFNJEUqbOT0mTglr3mDdld+nCmoJaZxTSRDKgzk9Jk4JadyljUMs7rJW181MhTSQj6vyUNCmodZeyBTXIf1Zt6eHbMg9rnVJIE8mYOj8lLQpq3UVBLZkyBTWFNJEc1BoKfMbUvEuRilFQ6y4KasmUJagppInkZO3ymxh5yZgaCiQ4dX52FwW1ZMoQ1BTSRHJ05Ixn1fkpqVFQ6x665mcyRQ9qpQppQ6NTWTvw6rzLEAlKnZ+SJgW17lLGoJZ3WCtyUCtVSOvZN8a6G09TUJPKUeenpElBrbuULahB/rNqRe38LFVIA1j8zSdYd+NprHzoorxLEQlOnZ+SFgW17qKglkzRglrpQhpEQe2QL85SUJNK0jU/JS0Kat1FQS2ZIgW1UoY0gBkPP6WgJpWla35KWtT52V0U1JIpSlArbUiDKKgd9v7nedsdl+ZdikhwuuanpElBrXuo8zOZIgS1Uoe0muPXbORtd1yqhgKpHHV+SpoGRmfmXYJkqIxBLe+wlndQq0RIgyioqfNTqkidn5Imzah1l7IFNch/Vi3Pzs/KhDRQ56dUmzo/JS0Kat1FQS2ZPIJapUIaqPNTqk2dn5IWBbXuoqCWTNZBrXIhDdT5KdWmzk9Jizo/u4uCWjJZBrWgIc3MDjGz281sl5ltNLPzJ1j2KDP7OzPbaWa/NrM1IWtR56dUmTo/wyvS+JU3BbXuoc7PZLIKaqFn0r4IDAMLgQuA683shMaFzKwPWAfcBSwCDge+ErgWQJ2fUl3q/AyucONXnhTUuksZg1reYS2LoBYspJnZLOA84Ep3H3T3e4FvAyubLH4hsMXdP+vuu9x9r7v/NFQtjdT5KVWlzs8wijx+5UlBrbuULahB/rNqaXd+hpxJOw4YdfdH6+57CDjgkyhwGrDBzL4XHyq428x+I2AtB1Dnp1SZOj87lsn4Neo9rNu6LEC52VFQ6y4KasmkFdTM3cOsyOwM4OvuvqjuvvcBF7j7mQ3L/iNwFvAW4J+AS4D3A8vcfbhh2VXAKoD58+ef/KkrP9tRnT5jKiMvGePIGc92tB6AfXsXMnX60x2vJ6Si1aR6Jha6nif2HErvMz3Ynn2J1zFv0SwGtu4KVlOnVl3yBw+4+ylpbiOt8Ste/sUxbMH8k//iS/8dgLlT96byu7Rj2vDBDPU939Ky86bsTrcYYGjvIqZN35r6dlrVzfW0+kXH7exDaduxbzqHjM3kuZ7099XxDA337vfzh9/++x2NX72TL9KyQWBuw31zgZ1Nlt0D3Ovu3wMws2uBjwIvJfr0+gJ3vwG4AWBp/5F+25r7Oy50z8sP47kP7mLt8ps6Ws+W9atZvKxY5wsXrSbVM7HQ9SwGVj50Efb9eSz+5hOJ1nHu6lMJ8e+sZFIZv2D/MWzJsUf5rTMffOGxvGcAjn5yBY8dcUdbz0lzpmXD+itYuuya1Nbfrm6uZymtzaIm2YdS9fg7qf83lrmZsGHzgmCrC3m481Gg18yOrbtvOfBIk2V/CoSZwktAnZ9SZer8TCSX8atshz5Bhz+7SRk7P4swQx3y0GewkObuu4DbgKvNbJaZnQ68FVjbZPGvAKeZ2evNbApwKfBr4N9D1dMKdX5KVanzsz15jl8KalJ0ZQtqVer8DP0VHB8AZgDPAF8F3u/uj5hZv5kNmlk/gLv/AngX8D+AAaLB8C3NzudImzo/parU+dm23MYvBTUpurIFNcj/dIIQQS1oSHP359x9hbvPcvd+d781vn+Tu8929011y97m7se4+1x3P9Pdmx1WyIQ6P6XK1PnZmrzHr3Vbl5UurCmodRcFtexV8rJQSeian1JluuZneSioSZEpqGVLIa2OrvkpVaZrfpZHGYOawlr3UFDLjkJaA3V+SpWp87M8yhbUQLNq3aSMnZ9lDGoKaeNQ56dUlTo/y0NBTYouiy85DqkInZ/tUEibgDo/parU+VkeCmpSdGWbUYPyzKoppE1CnZ9SZer8LAd1fkrRKailQyGtBer8lCpT52d5KKhJkSmohaeQ1iJ1fkqVqfOzPMoY1BTWuoeCWlgKaW1Q56dUWa3zc9+8aXmXIpMoW1ADzap1E3V+hqOQlkCt8/PZ0Vl5lyIS1Mp59zF3/qA6P0tAQU2KroxBrWhhTSEtoePXbGTHr2er81Mq59Apu9T5WRIKalJ0ZQtqUKxZNYW0DkwdGFLnp1SWOj/LQZ2fUnQKaskppHVInZ9SZer8LA8FNSkyBbVkFNICUOenVJk6P8ujjEFNYa17KKi1TyEtEHV+SpXpmp/lUbagBppV6ybq/GyPQlpguuanVJWu+VkeCmpSdGUManmENYW0FOian1JVuuZneZQxqA2Mzsy7BMlQ2YIaZD+rppCWEl3zU6pMnZ/loM5PKToFtYkppKVInZ9SZer8LA8FNSkyBbXxKaSlTJ2fUmXq/CyPMgY1hbXuoaDWnEJaBtT5KVWmzs/yKFtQA82qdRN1fh4oaEgzs0PM7HYz22VmG83s/Baec5eZuZn1hqyliNT5KVVVhc7PLMYvH+u8zk4pqEnRlTGopRXWQs+kfREYBhYCFwDXm9kJ4y1sZhcAlQ9n9dT5KVVVgc7PTMavDZsXsGHzgsRFhqCgJkVXtqAG6cyqBQtpZjYLOA+40t0H3f1e4NvAynGWPwj4GLA6VA1loc5PqbIydn7mMX4VIajt2Dc91xrapaDWXRTUws6kHQeMuvujdfc9BIz3SfRTwPXA1oA1lIY6P6XKStj5mcv4lXdQg/LNqimodZduD2rm7mFWZHYG8HV3X1R33/uAC9z9zIZlTwH+F3AKcDjwBDDV3UearHcVsApg/vz5J3/qys8GqTeEeYtmMbB1V0fr8BlTGXnJGEfOeDZITfv2LmTq9KeDrCsE1TOxotUDYWt6Ys+hsKOXqQNDidex6pI/eMDdTwlS0DjSGr/i5V8cwxbMP/nPr//8ActM62v61NQdMjaT53p2AzB36t5caqg3bfhghvqeb3n5eVN2p1cMMLR3EdOmF2ceoWj1QHY1tfpFx+3uQ2nasW86f/iWlR2NXyHPBxsE5jbcNxfYWX+HmfUAfwVc4u4jZjbhSt39BuAGgKX9R/pta+4PVnCnzl19KqHq+cXqJdy+4rqO17Nl/WoWL1vTeUGBqJ6JFa0eCFvTYmDtwKtZd+NpLP7mE0HWmZJUxi/YfwzrP/oo/8zgxqbLLT18W/tVd+j83Sdy68wHX/g574tJH/3kCh474o62npPmTMuG9VewdNk1qa2/XUWrB7KraWn852QzqUn2oSILebjzUaDXzI6tu2858EjDcnOJPoF+zcy2ArWUszn+NNuV1PkpVVWSzs/cxy8d+kxGhz+7SxkPf3YiWEhz913AbcDVZjbLzE4H3gqsbVh0O9EH7BPj2+/E958M/GuoespInZ9SVUXv/CzK+KXOz2QU1LpLNwW10F/B8QFgBvAM8FXg/e7+iJn1m9mgmfV7ZGvtBtTm+J929+HA9ZSOOj+lygre+VmY8asIQa1sYU1Brbt0S1ALGtLc/Tl3X+Hus9y9391vje/f5O6z3X1Tk+dscHcb76TbbqTOT6myonZ+Fm38yjuoQflm1RTUuks3BDVdFqqgdM1PqTJd87M1Cmrt0zU/u0vVg5pCWoHpmp9SZbrmZ2sU1JJRUOseZbzmZ6sU0kpAnZ9SVSXp/MydgloyCmrdpYpBTSGtJNT5KVVV9M7PolDnZzIKat0l7S84zppCWomo81OqrOCdn4VRhKBWtrCmoNZdqjSjppBWMur8lCoraudn0eQd1KB8s2oKat2lKkFNIa2E1PkpVabOz9YoqLVPnZ/dpQpBTSGtpGpBTZ2fUkXq/GyNgloyCmrdo+ydnwppJTbj4afU+SmVVev8lIkpqCWjoNZdyhrUFNIqQJ2fUlUr592XdwmloM7PZBTUuksZg5pCWkXUOj+f2HNo3qWISE6KENTKFtYU1LpL2YKaQlqFLP7mE/Q+06OGApEulndQg/LNqimodZcyBTWFtIqxPfvU+SnS5RTU2qfOz+5SlqCmkFZB6vwUEQW1ZBTUukcZOj8V0ipKnZ8iBeSW6eYU1JJRUOsuRQ5qCmkVp85PkWKZtqkv0+2p8zMZBbXuUtSgppDWBXTNT5FiyTqoQf6zamXs/BwYnZl3CZKhIgY1hbQuoWt+ihTLtE19ucyq5a1sQU0zat2laEFNIa2L6JqfIsWjoFZ86vzsLkUKagppXUadnyLFo6BWDgpq3aMonZ8KaV1InZ8ixaOgVg4Kat0l76CmkNbF1PkpUixZB7Wh4d7cw5qCmhRdnkEtaEgzs0PM7HYz22VmG83s/HGWe7eZPWBmO8xss5mtMbPekLVIa9T5KRIpyvilzs9yUFDrLnkFtdAzaV8EhoGFwAXA9WZ2QpPlZgKXAvOBVwGvAy4PXIu0SJ2fIkCBxq9u7fzcsW963iW0RUGtu+QR1IKFNDObBZwHXOnug+5+L/BtYGXjsu5+vbvf4+7D7v4UcAtweqhapH3q/JRuVtTxqxuDWhln1BTWukfWQc3cPcyKzE4C7nP3GXX3XQ681t3fPMlz7wDWu/sVTR5bBawCmD9//smfuvKzQeoNYd6iWQxs3ZV3GfvptCafMZXhg4yjD34mSD379i5k6vSng6wrBNUzuaLV9Dtv+PAD7n5KmttIa/yKH68bwxacfNXnvtB2fWN9Y20/pxULp0zj6dGhA+6f1jeSyvYmc8jYTJ7r2Q3A3Kl7c6mh3rThgxnqe77l5edN2Z1eMcDQ3kVMm7411W20q2g1ZVlPK192/Ptvel9H41fI88BmA9sb7tsOzJnoSWZ2EXAK8N5mj7v7DcANAEv7j/Tb1tzfeaWBnLv6VIpUD4Sr6Rerl3Dua3/Eynn3dbSeLetXs3jZmo7rCUX1TK6INWUglfEL9h/D+o862j/3q6cSFTjUP5zoeRP5yOwlfGZwY9PHlh6+Lfj2JnP+7hO5deaDL/x8zqL1mddQ7+gnV/DYEXe09Zw0Z1o2rL+CpcuuSW39SRStpizrWUr6h7xDnpM2CMxtuG8usHO8J5jZCuAa4E3u/uuAtUiH1PkpXabw45eu+VkOOvTZXdI+/BkypD0K9JrZsXX3LQceabawmb0R+Gvgze7+s4B1SCDq/JQuUorxS52f5aCg1l3SDGrBQpq77wJuA642s1lmdjrwVmBt47JmdjbRybbnufuPQtUg4anzU7pBmcavbu38VFCTIksrqIX+Co4PADOAZ4CvAu9390fMrN/MBs2sP17uSuAg4Lvx/YNm9r3AtUgg6vyULlGq8UtBrfjU+dld0ghqQUOauz/n7ivcfZa797v7rfH9m9x9trtvin8+y9174/tqtzeFrEXC0jU/perKOH4pqJWDglr3CH3NT10WSlqma36KFI+CWjkoqHWXUEFNIU3aps5PkWJR52c5KKh1lxBBTSFNElHnp0ixqPOzHBTUpB0KaZKYOj9FikWdn+WgoCatUkiTjqjzU6R1FuYqfJNSUCs+dX5KKxTSpGPq/BRp3ZyN2SQ1BbVyUFCTiSikSRDq/BRpnYJaehTUpEoU0iQodX6KtKbKQS3vsKagJlWhkCbBqfNTpDVVDWqQ/6yaOj+lChTSJBW1zs8n9hyadykihTZno2cS1tT5WQ4KalJPIU1SM+Php+h9pkczaiItqOqsmoJa+9T5KTUKaZIq27NPnZ8iLVJQS0/ZghpoVk0U0iQD6vwUaZ2CWnoU1KRsFNIkM+r8FGlNVkGtZzjb/wLU+ZmMglr36s27gCK664IvMTxz96TL3TkAvG/y9fXtnsnZt1zceWEVsPibT7CO0/jH1x/P2uU35V2ONBgbGaWv9y8ZGxmlp3dK3uV0tTkbnZ1LLNFzHxv7GKPsnHS5Dz3a2vp6emZzRP9HE9XSzIbNC1h6+LZg62tXLaids2h9bjW06xs7XsEpeRdRcKMjo0yd8jlGR0aZUpHxSzNpTbQS0PJcX9npmp/FtWdgBz32OHsGduRdipC887OVgNaOsbHBoOsDHf5MYmB0Zt4lFNrgwCBmjzM4EH5/zYtCmuRC1/wsnrGRUYYHd2HmDA/uYmxkNO+SJJbV4c+sKai1T52fzY2OjLJ7527MnN07dzNakfFLIU1yo2t+FsuegR1QywKOZtMKRkEtPWULaqDz1BoNDgzuN35VZTZNIU1ypc7PYqjNotXTbFrxKKilR0GtvGqzaPWqMpumkCaFoM7PfO03i1aj2bRCqnJQGxrOt5dNQa2c9ptFq6nIbJpCmhSGrvmZj2azaDWaTSumqgY1yH9WTdf8LJdms2g1VZhNCxrSzOwQM7vdzHaZ2UYzO3+CZS8zs61mtt3MbjSzaSFrkXJS52f2ms6i1XTRbFrZxq+srvmZh7yDGpRvVq1bg1rTWbSaCsymhZ5J+yIwDCwELgCuN7MTGhcyszcAVwCvA5YCRwEfD1yLlJQ6P7Mz0SxaTRfNppVy/NIVCtKzY9/0vEtoS7d1fk40i1ZT9tm0YCHNzGYB5wFXuvugu98LfBtY2WTxdwNfcvdH3H0A+ARwYahapPzU+ZmNCWfRarpgNq3s45eCWnrKNqMG3TOrNuEsWk3JZ9NCnqV5HDDq7vXfYf0Q8Nomy54AfKthuYVmdqi7P1u/oJmtAlYBzJ8/n3OvPDVgyc3dORB+neeuTr9ugHmLZmW2rVaEqOeeH17LwXN2ceiUiWd8WrFv70K2rF/d8XpCybee7UyfejXWwpfaD+0YZvuzfwTMTb2qA304i42kMn7BgWPYxWccFq7qBmN90ZvZ6pUE2vHhY16se6xvLPwGgIVTpvGR2Uv2v/P5JUzrG0lle5M5ZGwm5+8+ER4/kblT9+ZSQ71pwwdz9JMrWlr231jBvCnpf5H60N5FbFh/RerbOdB2+no/0dL4tWv7Pgae/QD5jF+XdPTskCFtNrC94b7twJwWlq39fQ6w3yDn7jcANwAs7T/Sb1tzf5BiJ9TCpZ7alUndRGEwq221IlQ9W847knPe80NWzruvs/WsX83iZWs6rieUPOvZtW2A4Z37WlrWbB8HHfppZi2Yl3JVuUll/IL9x7AlRx7tX7rnqY6LnUjSS0lN5nO/2r/uof7h4Nv4yOwlfGZw47iPZ30pqfN3n8itMx984ee8LyN19JMreOyIO9p6ztvn/iSdYmIb1l/B0mXXpLqNZrZv287uHa2PX/MO/TQHLTgo5arCC3lO2iAHxtS50PT6JI3L1v4e9lomUhnq/AyrlXPRGlX83LRsxq8x56DHhpLU17KqHvqE/A9/qvOzGFo5F61RWc9NCxnSHgV6zezYuvuWA480WfaR+LH65Z5udqhApEadn+G0dC5ao2qfm5bp+JV2UMvKtE19Ok+tBKoW1Fo6F61RSc9NCxbS3H0XcBtwtZnNMrPTgbcCa5ss/mXgYjN7mZnNAz4K3ByqFqkudX52LsksWk1VZ9PyGL+qEtRADQVlUJXOzySzaDVlnE0L/RUcHwBmAM8AXwXe7+6PmFm/mQ2aWT+Au98JrAF+AGyMbx8LXItUlDo/O5NoFq2m2rNpmY9fCmrJKaglU/aglmgWraaEs2lBQ5q7P+fuK9x9lrv3u/ut8f2b3H22u2+qW/az7r7Q3ee6+0XuXp3RSlKna34m08ksWk2FZ9NyGb8U1JJTUEumrEGtk1m0mrLNpumyUFJquuZnezqaRaup9mxaLhTUktuweUHuYU1BLRsdzaLVlGw2TSFNSk+dn60JMYtWU9XZtDwd9NhQZcKaOj/LoUxBLcQsWk2ZZtMU0qQS1Pk5uSCzaDWaTUtNlYKaDn8WX1mCWpBZtJoSzaYppDXRt3tmodcnzanzc2KjQ2G/fDT0+uRFnQa13tFm38Gb3JSm3+nbGgW14itD5+fw3rDjTej1pSXkFQcq4+xbLm5puaJ9u7/UgtphvO13LuX2FdflXU6hzD18YUvLFe2qDN3qoMeG2H70tETPXb7lqpaWu/iMw7hu05ZE22jHtE19qVyhYDwbNi/I/OoEjdZtXZb7FQra9Y0dr0j9CgVJLTiitfCd1xUQ0qKZNKkcdX5KVWRx6LOqVyjQjFoyRZ9R6zYKaVJZ6vyUKlBQS06dn8koqBWHQppUmjo/pQqy6PysalCD/GfV1PkpSSmkSeWp81OqIouglkVYU+dnOSio5U8hTbpCrfPziT2H5l2KSEd0+DM5BbX2laHzs8oU0qRrzHj4KXqf6dE1P6X0FNSSU1BLRkEtHwpp0lVszz51fkolKKglp6CWjIJa9hTSpCup81OqQEEtOXV+JqOgli2FNOla6vyUKqhS52fPcPb/JRUhqJUtrCmoZUchTbqaOj+lKtT5mVzeQQ3KN6umoJYNhTTperrmp2TFPN2Qo8OfySmote8bO17BwKiuTZ0mhTQRXgxq6vyUtPWt35zq+hXUklNQS0azaulRSBOJ6ZqfkhUFtdYpqJWDglo6FNJEGqjzU7KgoNY6dX6Wg4JaeAppIk2o81OykEVQq0rnZx7X/Bwa7s18m/XU+SkKaSLjUOenZCHtoAbq/OxE3jNqUL5ZNQW1cIKENDM7xMxuN7NdZrbRzM6fYNl3m9kDZrbDzDab2Rozy/fjisg41PnZHfIew/rWb9bhzzYoqBWfrvkZRqiZtC8Cw8BC4ALgejM7YZxlZwKXAvOBVwGvAy4PVIdIcOr87AqFGMMU1FrXjUFtx77peZfQNgW1znQc0sxsFnAecKW7D7r7vcC3gZXNlnf36939HncfdvengFuA0zutQyRN6vysrqKNYQpqrevGoFa2GTVQUOuEeYdfrmhmJwH3ufuMuvsuB17r7m9u4fl3AOvd/YpxHl8FrIp/fDnwcEcFhzUf+HXeRTQoWk2qZ2JFqweKV9Px7j4nrZVrDCvUe616Jla0eqB4NRWtno7GrxDngs0Gtjfctx2YtCgzuwg4BXjveMu4+w3ADfHyP3b3U5KXGlbR6oHi1aR6Jla0eqB4NZnZj1PehMawglA9EytaPVC8mopYTyfPn/Rwp5ndbWY+zu1eYBCY2/C0ucDOSda7ArgGeJO7Fyn1ikiFaAwTkbKadCbN3c+c6PH4fI5eMzvW3X8Z370ceGSC57wR+Gvgd939Z62XKyLSHo1hIlJWHTcOuPsu4DbgajObZWanA28F1jZb3szOJjrR9jx3/1Gbm7uho2LDK1o9ULyaVM/EilYPFK+mVOvRGFYoqmdiRasHildTperpuHEAou8YAm4EzgGeBa5w91vjx/qBnwMvc/dNZvYD4Axgb90q7nH3N3VciIhIAhrDRKSIgoQ0EREREQlLl4USERERKSCFNBEREZECKnRIy/t6eglquMzMtprZdjO70cymdbr9pPVkdY3Udl6fuufcFX/9Qa71mNlRZvZ3ZrbTzH5tZmtC19NOTRb5pJk9Fe9Dd9v4lyZKWsuHzOzHZjZkZjdPsmzq+3M7NWW1T4ei8St5PVm+1xrDwtSTxfgVb6dQY1ja41ehQxrFuJ5eSzWY2RuAK+LtLgWOAj4eYPuJ6iG7a6S28x5hZhcQ5kuUO6rHzPqAdcBdwCLgcOAredYEvAN4D9FJ6YcA/8I4HYYd2AJ8kugk+XFluD+3XBPlu+6vxq+E9ZDte60xLEA9ZDN+QfHGsHTHL3cv5A2YRbRjHFd331rgmhaf/yfAd7KqAbgV+FTdz68DthblNQnxenRaD3AQ8ChwGuBAb171EF2m556Q2w9Q0/8D/O+6n08A9qZU1yeBmyd4PPX9ud2amiwffJ/O431P63fT+BW+pm4bw4o6fsXrL9QYltb4VeSZtOOAUXd/tO6+h4je+Fa8hgm+jDKFGk6IH6tfbqGZHdphDUnraRTi9ei0nk8B1wNbA9eRpJ7TgA1m9r34MMHdZvYbOdf0t8AxZnacmU0F3g3cmUJNrchif+5UGvt0KBq/OqunUVrvtcawcPUUafyC4o9hLe3ThT2fg5Svp5dCDY3L1v4+h+h7l0JI9JoEfD0S12NmpwCnA5cQTcunoZ3X53DgLOAtwD/FdX3LzJa5+3BONf0HcA/wC2AUeBI4O2At7chif04sxX06FI1fndXzgpTfa41h4eop0vgFBR7D2tmnc5tJs3JcT6+dGhqXrf19wnpTrAdI/fqCLdVjZj3AXwGXuPtI4Brarie2B7jX3b8XD2jXAocCL82xpo8BpwJHANOJzp+4y8xmBq6pFVnsz4mkvE+3WoPGr3TrATJ5rzWGhaunSOMXFHQMa3efzi2kufuZ7m7j3H6b6Lh/r5kdW/e0Vq+n92YPcz29dmp4JH6sfrmn3T1kYm/rNUnh9Uhaz1yiTw1fM7OtwP3x/ZvN7Iwc6gH4KdE5JWlrp6blwNfcfbO7j7j7zcA84GXpl3mALPbntmWwT7dE41fq9WT1XmsMC1dPkcYvKOAYlmifTuskukAn4v0t8FWikxdPJ5quPGGcZc8mmsJ8TR41AG8kOk/hZUQ75l20eJJwSvWk8nokqQcwou6j2u1UosHlMKAvp9fneGA38HpgCnAZ8Fjoetqs6WPAvURdVD3ASmAXcHDAWnqJPuV+mugE4Ok0Ofk5q/25zZoy2aezft/T/N00foWpqZvHsCKNX/F2CjWGpT1+pbrzB/jlDwHuiN/oTcD5dY/1E01n9sc//wAYie+r3b6XVg2N24/v+xPgaWAHcBMwLavXJKvXo5PXp+45S0mhMyrB+3Uu8Kv4/bq72cCT8Xs2najd/T/imn4CvDFwLVfFr3397aq89ud2aspqn077fR/nvdf4ldN73c5rVPecpXTJGNbGe5b6+BVvp6XxIsN9uqV6ku7TunaniIiISAEV+Ss4RERERLqWQpqIiIhIASmkiYiIiBSQQpqIiIhIASmkiYiIiBSQQpqIiIhIASmkiYiIiBSQQpqIiIhIAf3/hi9NHcYfow0AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x1s = np.linspace(-0.2, 1.2, 100)\n", "x2s = np.linspace(-0.2, 1.2, 100)\n", "x1, x2 = np.meshgrid(x1s, x2s)\n", "\n", "z1 = mlp_xor(x1, x2, activation=heaviside)\n", "z2 = mlp_xor(x1, x2, activation=sigmoid)\n", "\n", "plt.figure(figsize=(10,4))\n", "\n", "plt.subplot(121)\n", "plt.contourf(x1, x2, z1)\n", "plt.plot([0, 1], [0, 1], \"gs\", markersize=20)\n", "plt.plot([0, 1], [1, 0], \"y^\", markersize=20)\n", "plt.title(\"Activation function: heaviside\", fontsize=14)\n", "plt.grid(True)\n", "\n", "plt.subplot(122)\n", "plt.contourf(x1, x2, z2)\n", "plt.plot([0, 1], [0, 1], \"gs\", markersize=20)\n", "plt.plot([0, 1], [1, 0], \"y^\", markersize=20)\n", "plt.title(\"Activation function: sigmoid\", fontsize=14)\n", "plt.grid(True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Building an Image Classifier" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First let's import TensorFlow and Keras." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "from tensorflow import keras" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2.4.1'" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tf.__version__" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2.4.0'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "keras.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's start by loading the fashion MNIST dataset. Keras has a number of functions to load popular datasets in `keras.datasets`. The dataset is already split for you between a training set and a test set, but it can be useful to split the training set further to have a validation set:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "fashion_mnist = keras.datasets.fashion_mnist\n", "(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The training set contains 60,000 grayscale images, each 28x28 pixels:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(60000, 28, 28)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train_full.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each pixel intensity is represented as a byte (0 to 255):" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dtype('uint8')" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train_full.dtype" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's split the full training set into a validation set and a (smaller) training set. We also scale the pixel intensities down to the 0-1 range and convert them to floats, by dividing by 255." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "X_valid, X_train = X_train_full[:5000] / 255., X_train_full[5000:] / 255.\n", "y_valid, y_train = y_train_full[:5000], y_train_full[5000:]\n", "X_test = X_test / 255." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can plot an image using Matplotlib's `imshow()` function, with a `'binary'`\n", " color map:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.imshow(X_train[0], cmap=\"binary\")\n", "plt.axis('off')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The labels are the class IDs (represented as uint8), from 0 to 9:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([4, 0, 7, ..., 3, 0, 5], dtype=uint8)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_train" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are the corresponding class names:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "class_names = [\"T-shirt/top\", \"Trouser\", \"Pullover\", \"Dress\", \"Coat\",\n", " \"Sandal\", \"Shirt\", \"Sneaker\", \"Bag\", \"Ankle boot\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So the first image in the training set is a coat:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Coat'" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class_names[y_train[0]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The validation set contains 5,000 images, and the test set contains 10,000 images:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(5000, 28, 28)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_valid.shape" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(10000, 28, 28)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_test.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's take a look at a sample of the images in the dataset:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Saving figure fashion_mnist_plot\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "n_rows = 4\n", "n_cols = 10\n", "plt.figure(figsize=(n_cols * 1.2, n_rows * 1.2))\n", "for row in range(n_rows):\n", " for col in range(n_cols):\n", " index = n_cols * row + col\n", " plt.subplot(n_rows, n_cols, index + 1)\n", " plt.imshow(X_train[index], cmap=\"binary\", interpolation=\"nearest\")\n", " plt.axis('off')\n", " plt.title(class_names[y_train[index]], fontsize=12)\n", "plt.subplots_adjust(wspace=0.2, hspace=0.5)\n", "save_fig('fashion_mnist_plot', tight_layout=False)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "model = keras.models.Sequential()\n", "model.add(keras.layers.Flatten(input_shape=[28, 28]))\n", "model.add(keras.layers.Dense(300, activation=\"relu\"))\n", "model.add(keras.layers.Dense(100, activation=\"relu\"))\n", "model.add(keras.layers.Dense(10, activation=\"softmax\"))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "keras.backend.clear_session()\n", "np.random.seed(42)\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "model = keras.models.Sequential([\n", " keras.layers.Flatten(input_shape=[28, 28]),\n", " keras.layers.Dense(300, activation=\"relu\"),\n", " keras.layers.Dense(100, activation=\"relu\"),\n", " keras.layers.Dense(10, activation=\"softmax\")\n", "])" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[,\n", " ,\n", " ,\n", " ]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.layers" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: \"sequential\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "flatten (Flatten) (None, 784) 0 \n", "_________________________________________________________________\n", "dense (Dense) (None, 300) 235500 \n", "_________________________________________________________________\n", "dense_1 (Dense) (None, 100) 30100 \n", "_________________________________________________________________\n", "dense_2 (Dense) (None, 10) 1010 \n", "=================================================================\n", "Total params: 266,610\n", "Trainable params: 266,610\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "model.summary()" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "keras.utils.plot_model(model, \"my_fashion_mnist_model.png\", show_shapes=True)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'dense'" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hidden1 = model.layers[1]\n", "hidden1.name" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.get_layer(hidden1.name) is hidden1" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "weights, biases = hidden1.get_weights()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0.02448617, -0.00877795, -0.02189048, ..., -0.02766046,\n", " 0.03859074, -0.06889391],\n", " [ 0.00476504, -0.03105379, -0.0586676 , ..., 0.00602964,\n", " -0.02763776, -0.04165364],\n", " [-0.06189284, -0.06901957, 0.07102345, ..., -0.04238207,\n", " 0.07121518, -0.07331658],\n", " ...,\n", " [-0.03048757, 0.02155137, -0.05400612, ..., -0.00113463,\n", " 0.00228987, 0.05581069],\n", " [ 0.07061854, -0.06960931, 0.07038955, ..., -0.00384101,\n", " 0.00034875, 0.02878492],\n", " [-0.06022581, 0.01577859, -0.02585464, ..., -0.00527829,\n", " 0.00272203, -0.06793761]], dtype=float32)" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "weights" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(784, 300)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "weights.shape" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "biases" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(300,)" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "biases.shape" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "model.compile(loss=\"sparse_categorical_crossentropy\",\n", " optimizer=\"sgd\",\n", " metrics=[\"accuracy\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is equivalent to:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "model.compile(loss=keras.losses.sparse_categorical_crossentropy,\n", " optimizer=keras.optimizers.SGD(),\n", " metrics=[keras.metrics.sparse_categorical_accuracy])\n", "```" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 1.0187 - accuracy: 0.6807 - val_loss: 0.5207 - val_accuracy: 0.8234\n", "Epoch 2/30\n", "1719/1719 [==============================] - 2s 921us/step - loss: 0.5028 - accuracy: 0.8260 - val_loss: 0.4345 - val_accuracy: 0.8538\n", "Epoch 3/30\n", "1719/1719 [==============================] - 2s 881us/step - loss: 0.4485 - accuracy: 0.8423 - val_loss: 0.5334 - val_accuracy: 0.7982\n", "Epoch 4/30\n", "1719/1719 [==============================] - 2s 902us/step - loss: 0.4209 - accuracy: 0.8535 - val_loss: 0.3916 - val_accuracy: 0.8652\n", "Epoch 5/30\n", "1719/1719 [==============================] - 2s 908us/step - loss: 0.4061 - accuracy: 0.8580 - val_loss: 0.3750 - val_accuracy: 0.8686\n", "Epoch 6/30\n", "1719/1719 [==============================] - 2s 916us/step - loss: 0.3755 - accuracy: 0.8669 - val_loss: 0.3709 - val_accuracy: 0.8718\n", "Epoch 7/30\n", "1719/1719 [==============================] - 2s 879us/step - loss: 0.3655 - accuracy: 0.8711 - val_loss: 0.3618 - val_accuracy: 0.8722\n", "Epoch 8/30\n", "1719/1719 [==============================] - 2s 894us/step - loss: 0.3483 - accuracy: 0.8760 - val_loss: 0.3862 - val_accuracy: 0.8618\n", "Epoch 9/30\n", "1719/1719 [==============================] - 2s 906us/step - loss: 0.3486 - accuracy: 0.8756 - val_loss: 0.3604 - val_accuracy: 0.8696\n", "Epoch 10/30\n", "1719/1719 [==============================] - 2s 905us/step - loss: 0.3299 - accuracy: 0.8835 - val_loss: 0.3430 - val_accuracy: 0.8772\n", "Epoch 11/30\n", "1719/1719 [==============================] - 2s 926us/step - loss: 0.3219 - accuracy: 0.8831 - val_loss: 0.3439 - val_accuracy: 0.8772\n", "Epoch 12/30\n", "1719/1719 [==============================] - 2s 883us/step - loss: 0.3123 - accuracy: 0.8873 - val_loss: 0.3310 - val_accuracy: 0.8832\n", "Epoch 13/30\n", "1719/1719 [==============================] - 2s 914us/step - loss: 0.3055 - accuracy: 0.8893 - val_loss: 0.3263 - val_accuracy: 0.8878\n", "Epoch 14/30\n", "1719/1719 [==============================] - 2s 924us/step - loss: 0.2992 - accuracy: 0.8914 - val_loss: 0.3412 - val_accuracy: 0.8782\n", "Epoch 15/30\n", "1719/1719 [==============================] - 2s 885us/step - loss: 0.2936 - accuracy: 0.8939 - val_loss: 0.3218 - val_accuracy: 0.8848\n", "Epoch 16/30\n", "1719/1719 [==============================] - 2s 916us/step - loss: 0.2863 - accuracy: 0.8975 - val_loss: 0.3095 - val_accuracy: 0.8898\n", "Epoch 17/30\n", "1719/1719 [==============================] - 2s 905us/step - loss: 0.2781 - accuracy: 0.9004 - val_loss: 0.3572 - val_accuracy: 0.8736\n", "Epoch 18/30\n", "1719/1719 [==============================] - 2s 904us/step - loss: 0.2782 - accuracy: 0.8997 - val_loss: 0.3138 - val_accuracy: 0.8898\n", "Epoch 19/30\n", "1719/1719 [==============================] - 2s 921us/step - loss: 0.2742 - accuracy: 0.9026 - val_loss: 0.3130 - val_accuracy: 0.8894\n", "Epoch 20/30\n", "1719/1719 [==============================] - 2s 910us/step - loss: 0.2700 - accuracy: 0.9037 - val_loss: 0.3252 - val_accuracy: 0.8824\n", "Epoch 21/30\n", "1719/1719 [==============================] - 2s 891us/step - loss: 0.2671 - accuracy: 0.9050 - val_loss: 0.3049 - val_accuracy: 0.8930\n", "Epoch 22/30\n", "1719/1719 [==============================] - 2s 942us/step - loss: 0.2615 - accuracy: 0.9052 - val_loss: 0.2976 - val_accuracy: 0.8976\n", "Epoch 23/30\n", "1719/1719 [==============================] - 2s 928us/step - loss: 0.2548 - accuracy: 0.9084 - val_loss: 0.2983 - val_accuracy: 0.8930\n", "Epoch 24/30\n", "1719/1719 [==============================] - 2s 901us/step - loss: 0.2454 - accuracy: 0.9118 - val_loss: 0.3079 - val_accuracy: 0.8892\n", "Epoch 25/30\n", "1719/1719 [==============================] - 2s 922us/step - loss: 0.2496 - accuracy: 0.9109 - val_loss: 0.2975 - val_accuracy: 0.8956\n", "Epoch 26/30\n", "1719/1719 [==============================] - 2s 891us/step - loss: 0.2431 - accuracy: 0.9136 - val_loss: 0.3068 - val_accuracy: 0.8888\n", "Epoch 27/30\n", "1719/1719 [==============================] - 2s 883us/step - loss: 0.2374 - accuracy: 0.9163 - val_loss: 0.3023 - val_accuracy: 0.8938\n", "Epoch 28/30\n", "1719/1719 [==============================] - 2s 935us/step - loss: 0.2314 - accuracy: 0.9176 - val_loss: 0.2992 - val_accuracy: 0.8930\n", "Epoch 29/30\n", "1719/1719 [==============================] - 2s 917us/step - loss: 0.2284 - accuracy: 0.9177 - val_loss: 0.3053 - val_accuracy: 0.8896\n", "Epoch 30/30\n", "1719/1719 [==============================] - 2s 916us/step - loss: 0.2252 - accuracy: 0.9211 - val_loss: 0.3004 - val_accuracy: 0.8920\n" ] } ], "source": [ "history = model.fit(X_train, y_train, epochs=30,\n", " validation_data=(X_valid, y_valid))" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'verbose': 1, 'epochs': 30, 'steps': 1719}" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "history.params" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]\n" ] } ], "source": [ "print(history.epoch)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "history.history.keys()" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Saving figure keras_learning_curves_plot\n" ] }, { "data": { "image/png": "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REQGlJ7OQXM98DiwB6gAvmVZ1ipjTCGwGhhnWdZ24E4gBXi1VQfedy3LOju2xT68LrzwQj744AMmT56MMYZ7772X3Nxc5s2bx3333YfT6cTj8fDkk0+yY8cOrrrqKkKh8G3lf/nLX/Zx6UVERAaWHoUby7IqgQs6WL+dcIfjltf9ati31xseoWWM4b777uO+++5rs/2KK67giiuu2O84tdaIiIj0nSP69gsiIiIivaVwIyIiIv2Kwo2IiIj0Kwo3IiIi0q8o3IiIiEi/onAjIiIi/YrCjYiIiPQrCjdHgEAg0NdFEBER6Td6OkNx3/rPD6HswG9TFR8MgL3dR82dCGf/qttjL7jgAkpKSvD5fHznO9/huuuu47XXXuP2228nGAySmZnJW2+9hdfr5cYbb2TJkiUYY/jJT37CRRddhMfjiU4G+Pzzz/PKK6/wxBNPcOWVV5Kens6yZcuYNm0aX/7yl7n55ptpbGwkPj6ev/71r4wePZpgMMitt97K66+/jjGGa6+9lnHjxvHHP/6R+fPnA/DGG2/w8MMP8+KLLx5wHYmIiPQXR0e46UOPP/446enpNDY2cswxxzB37lyuvfZa3nnnHYYOHUplZSUAd999NykpKaxYEQ5hVVVV3Z57/fr1vPnmm9jtdmpra3nnnXdwOBy8+eab3H777bzwwgs8+uijbNmyhWXLluFwOKisrCQtLY0bbriBvXv3kpWVxV//+leuuuqqQ1oPIiIiR4ujI9z0oIWlK411dSQlJR3Qsb///e+jLSQlJSU8+uijnHzyyQwdOhSA9PR0AN58802eeeaZ6HFpaWndnvuLX/widrsdgJqaGq644go2bNiAMYbm5uboeb/5zW/icDjavN/ll1/OU089xVVXXcUHH3zAk08+eUCfT0REpL85OsJNHykuLubNN9/kgw8+ICEhgVmzZjF58mTWrVu3376WZdHqZqFRrdf5fL422xITE6PLd955J6eeeirz589n69atzJo1q8vzXnXVVZx//vm43W6++MUvRsOPiIjIQKcOxV2oqakhLS2NhIQE1q5dy//+9z+ampp4++232bJlC0D0stQZZ5zBH//4x+ixLZelcnJyWLNmDaFQKNoC1Nl75efnA/DEE09E159xxhk88sgj0U7HLe83aNAgBg0axD333MOVV14Zs88sIiJytFO46cJZZ51FIBBg0qRJ3HnnnRx33HFkZWXx6KOP8oUvfIHJkyfz5S9/GYA77riDqqoqJkyYwOTJk1m0aBEAv/rVrzjvvPM47bTTyMvL6/S9fvCDH3DbbbdxwgknEAwGo+uvueYaCgsLmTRpEpMnT+bvf/97dNtll13G4MGDGTdu3CGqARERkaOPrmV0IS4ujv/85z8dbjv77LPbvPZ4PMybN2+//S6++GIuvvji/da3bp0BOP7441m/fn309d133w2Aw+Hg/vvv5/7779/vHIsXL+baa6/t9nOIiIgMJAo3R6np06eTmJjIb3/7274uioiIyBFF4eYo9cknn/R1EURERI5I6nMjIiIi/YrCjYiIiPQrCjciIiLSryjciIiISL+icCMiIiL9isJNjHg8nk63bd26lQkTJhzG0oiIiAxcR8VQ8F9/9GvWVq494OODwWD0BpUtxqSP4dZjbz3YoomIiMgRRi03nbj11lt56KGHoq/vuusufvrTnzJ79mymTZvGxIkTeemll3p9Xp/Px1VXXcXEiROZOnVq9DYNq1at4thjj2XKlClMmjSJDRs2UF9fz7nnnsvkyZOZMGECzz77bMw+n4iISH91VLTcHGwLS11dHUlJSb065pJLLuHmm2/m+uuvB+C5557jtdde45ZbbiE5OZny8nKOO+445syZ0+Fduzvz4IMPArBixQrWrl3LGWecwfr163nkkUf4zne+w2WXXYbf7ycYDPLqq68yaNAg/v3vfwPhm2uKiIhI19Ry04mpU6eyZ88edu7cyaeffkpaWhp5eXncfvvtTJo0idNPP50dO3awe/fuXp138eLFXH755QCMGTOGoqIi1q9fz/HHH88vfvELfv3rX7Nt2zbi4+OZOHEib775JrfeeivvvvsuKSkph+KjioiI9CsKN124+OKLef7553n22We55JJLePrpp9m7dy+ffPIJy5cvJycnB5/P16tzWpbV4fpLL72UBQsWEB8fz5lnnsnChQsZNWoUn3zyCRMnTuS2227jZz/7WSw+loiISL92VFyW6iuXXHIJ1157LeXl5bz99ts899xzZGdn43Q6WbRoEdu2bev1OU8++WSefvppTjvtNNavX8/27dsZPXo0mzdvZtiwYdx0001s3ryZzz77jDFjxpCens5Xv/pVPB7PfncSFxERkf0p3HRh/Pjx1NXVkZ+fT15eHpdddhnnn38+M2bMYMqUKYwZM6bX57z++uv55je/ycSJE3E4HDzxxBPExcXx7LPP8tRTT+F0OsnNzeXHP/4xH3/8Md///vex2Ww4nU4efvjhQ/ApRURE+heFm26sWLEiupyZmckHH3zQ4X5er7fTcwwZMoSVK1cC4Ha7O2yBue2227jtttvarDvzzDM588wzD6DUIiIiA5f63IiIiEi/opabGFqxYkV0JFSLuLg4Pvzwwz4qkYiIyMCjcBNDEydOZPny5X1dDBERkQFNl6VERESkX1G4ERERkX5F4UZERET6FYUbERER6VcUbmLE4/H0dRFERESEo2S0VNkvfkHTmrUHfHwgGKTSbm+zLm7sGHJvv/1gi3bECQQCOBxHxT+riIjIIaGWm07ceuutPPTQQ9HXd911Fz/96U+ZPXs206ZNY+LEibz00ks9OpfX6+30uCeffJJJkyYxefLk6Bw5u3fv5sILL2Ty5MlMnjyZ999/n61btzJhwoTocb/5zW+46667AJg1axa33347p5xyCr/73e94+eWXmTlzJlOnTuX000+P3rnc6/Vy1VVXMXHiRCZNmsQLL7zAX/7yF2655ZboeR977DG++93vHnC9iYiI9LWj4r/4B9vCUldXR1JSUq+OueSSS7j55pu5/vrrAXjuued47bXXuOWWW0hOTqa8vJzjjjuOOXPmYIzp8lxut5v58+fvd9zq1av5+c9/znvvvUdmZiaVlZUA3HTTTZxyyinMnz+fYDCI1+ulqqqqy/eorq7m7bffBqCqqor//e9/GGP485//zL333stvf/tb7r77blJSUqK3lKiqqsLlcjFp0iTuvfdenE4nf/3rX/nTn/7Uq7oSERE5khwV4aYvTJ06lT179rBz50727t1LWloaeXl53HLLLbzzzjvYbDZ27NjB7t27yc3N7fJclmVx++2373fcwoULufjii8nMzAQgPT0dgIULF/Lkk08CYLfbSUlJ6TbcfPnLX44ul5aW8uUvf5ldu3bh9/sZOnQoAG+++SbPPPNMdL+0tDQATjvtNF555RXGjh1Lc3MzEydO7GVtiYiIHDkUbrpw8cUX8/zzz1NWVsYll1zC008/zd69e/nkk09wOp0MGTIEn8/X7Xk6O86yrG5bfVo4HA5CoVD0dfv3TUxMjC7feOONfPe732XOnDkUFxdHL1919n7XXHMNv/jFLxgzZgxX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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "\n", "pd.DataFrame(history.history).plot(figsize=(8, 5))\n", "plt.grid(True)\n", "plt.gca().set_ylim(0, 1)\n", "save_fig(\"keras_learning_curves_plot\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "313/313 [==============================] - 0s 639us/step - loss: 0.3357 - accuracy: 0.8837\n" ] }, { "data": { "text/plain": [ "[0.3357059359550476, 0.8837000131607056]" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.evaluate(X_test, y_test)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0. , 0. , 0. , 0. , 0. , 0.01, 0. , 0.03, 0. , 0.96],\n", " [0. , 0. , 0.99, 0. , 0.01, 0. , 0. , 0. , 0. , 0. ],\n", " [0. , 1. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ]],\n", " dtype=float32)" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_new = X_test[:3]\n", "y_proba = model.predict(X_new)\n", "y_proba.round(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Warning**: `model.predict_classes(X_new)` is deprecated. It is replaced with `np.argmax(model.predict(X_new), axis=-1)`." ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([9, 2, 1])" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#y_pred = model.predict_classes(X_new) # deprecated\n", "y_pred = np.argmax(model.predict(X_new), axis=-1)\n", "y_pred" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['Ankle boot', 'Pullover', 'Trouser'], dtype='" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(7.2, 2.4))\n", "for index, image in enumerate(X_new):\n", " plt.subplot(1, 3, index + 1)\n", " plt.imshow(image, cmap=\"binary\", interpolation=\"nearest\")\n", " plt.axis('off')\n", " plt.title(class_names[y_test[index]], fontsize=12)\n", "plt.subplots_adjust(wspace=0.2, hspace=0.5)\n", "save_fig('fashion_mnist_images_plot', tight_layout=False)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Regression MLP" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's load, split and scale the California housing dataset (the original one, not the modified one as in chapter 2):" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import fetch_california_housing\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import StandardScaler\n", "\n", "housing = fetch_california_housing()\n", "\n", "X_train_full, X_test, y_train_full, y_test = train_test_split(housing.data, housing.target, random_state=42)\n", "X_train, X_valid, y_train, y_valid = train_test_split(X_train_full, y_train_full, random_state=42)\n", "\n", "scaler = StandardScaler()\n", "X_train = scaler.fit_transform(X_train)\n", "X_valid = scaler.transform(X_valid)\n", "X_test = scaler.transform(X_test)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "np.random.seed(42)\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/20\n", "363/363 [==============================] - 0s 893us/step - loss: 2.2656 - val_loss: 0.8560\n", "Epoch 2/20\n", "363/363 [==============================] - 0s 670us/step - loss: 0.7413 - val_loss: 0.6531\n", "Epoch 3/20\n", "363/363 [==============================] - 0s 661us/step - loss: 0.6604 - val_loss: 0.6099\n", "Epoch 4/20\n", "363/363 [==============================] - 0s 640us/step - loss: 0.6245 - val_loss: 0.5658\n", "Epoch 5/20\n", "363/363 [==============================] - 0s 688us/step - loss: 0.5770 - val_loss: 0.5355\n", "Epoch 6/20\n", "363/363 [==============================] - 0s 668us/step - loss: 0.5609 - val_loss: 0.5173\n", "Epoch 7/20\n", "363/363 [==============================] - 0s 667us/step - loss: 0.5500 - val_loss: 0.5081\n", "Epoch 8/20\n", "363/363 [==============================] - 0s 647us/step - loss: 0.5200 - val_loss: 0.4799\n", "Epoch 9/20\n", "363/363 [==============================] - 0s 683us/step - loss: 0.5051 - val_loss: 0.4690\n", "Epoch 10/20\n", "363/363 [==============================] - 0s 679us/step - loss: 0.4910 - val_loss: 0.4656\n", "Epoch 11/20\n", "363/363 [==============================] - 0s 643us/step - loss: 0.4794 - val_loss: 0.4482\n", "Epoch 12/20\n", "363/363 [==============================] - 0s 644us/step - loss: 0.4656 - val_loss: 0.4479\n", "Epoch 13/20\n", "363/363 [==============================] - 0s 666us/step - loss: 0.4693 - val_loss: 0.4296\n", "Epoch 14/20\n", "363/363 [==============================] - 0s 655us/step - loss: 0.4537 - val_loss: 0.4233\n", "Epoch 15/20\n", "363/363 [==============================] - 0s 636us/step - loss: 0.4586 - val_loss: 0.4176\n", "Epoch 16/20\n", "363/363 [==============================] - 0s 646us/step - loss: 0.4612 - val_loss: 0.4123\n", "Epoch 17/20\n", "363/363 [==============================] - 0s 620us/step - loss: 0.4449 - val_loss: 0.4071\n", "Epoch 18/20\n", "363/363 [==============================] - 0s 675us/step - loss: 0.4407 - val_loss: 0.4037\n", "Epoch 19/20\n", "363/363 [==============================] - 0s 650us/step - loss: 0.4184 - val_loss: 0.4000\n", "Epoch 20/20\n", "363/363 [==============================] - 0s 646us/step - loss: 0.4128 - val_loss: 0.3969\n", "162/162 [==============================] - 0s 428us/step - loss: 0.4212\n" ] } ], "source": [ "model = keras.models.Sequential([\n", " keras.layers.Dense(30, activation=\"relu\", input_shape=X_train.shape[1:]),\n", " keras.layers.Dense(1)\n", "])\n", "model.compile(loss=\"mean_squared_error\", optimizer=keras.optimizers.SGD(learning_rate=1e-3))\n", "history = model.fit(X_train, y_train, epochs=20, validation_data=(X_valid, y_valid))\n", "mse_test = model.evaluate(X_test, y_test)\n", "X_new = X_test[:3]\n", "y_pred = model.predict(X_new)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(pd.DataFrame(history.history))\n", "plt.grid(True)\n", "plt.gca().set_ylim(0, 1)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.3885664],\n", " [1.6792021],\n", " [3.1022797]], dtype=float32)" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Functional API" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Not all neural network models are simply sequential. Some may have complex topologies. Some may have multiple inputs and/or multiple outputs. For example, a Wide & Deep neural network (see [paper](https://ai.google/research/pubs/pub45413)) connects all or part of the inputs directly to the output layer." ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "np.random.seed(42)\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "input_ = keras.layers.Input(shape=X_train.shape[1:])\n", "hidden1 = keras.layers.Dense(30, activation=\"relu\")(input_)\n", "hidden2 = keras.layers.Dense(30, activation=\"relu\")(hidden1)\n", "concat = keras.layers.concatenate([input_, hidden2])\n", "output = keras.layers.Dense(1)(concat)\n", "model = keras.models.Model(inputs=[input_], outputs=[output])" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: \"model\"\n", "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", "input_1 (InputLayer) [(None, 8)] 0 \n", "__________________________________________________________________________________________________\n", "dense_5 (Dense) (None, 30) 270 input_1[0][0] \n", "__________________________________________________________________________________________________\n", "dense_6 (Dense) (None, 30) 930 dense_5[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate (Concatenate) (None, 38) 0 input_1[0][0] \n", " dense_6[0][0] \n", "__________________________________________________________________________________________________\n", "dense_7 (Dense) (None, 1) 39 concatenate[0][0] \n", "==================================================================================================\n", "Total params: 1,239\n", "Trainable params: 1,239\n", "Non-trainable params: 0\n", "__________________________________________________________________________________________________\n" ] } ], "source": [ "model.summary()" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/20\n", "363/363 [==============================] - 1s 887us/step - loss: 1.9731 - val_loss: 3.3940\n", "Epoch 2/20\n", "363/363 [==============================] - 0s 683us/step - loss: 0.7638 - val_loss: 0.9360\n", "Epoch 3/20\n", "363/363 [==============================] - 0s 687us/step - loss: 0.6045 - val_loss: 0.5649\n", "Epoch 4/20\n", "363/363 [==============================] - 0s 709us/step - loss: 0.5862 - val_loss: 0.5712\n", "Epoch 5/20\n", "363/363 [==============================] - 0s 707us/step - loss: 0.5452 - val_loss: 0.5045\n", "Epoch 6/20\n", "363/363 [==============================] - 0s 672us/step - loss: 0.5243 - val_loss: 0.4831\n", "Epoch 7/20\n", "363/363 [==============================] - 0s 681us/step - loss: 0.5185 - val_loss: 0.4639\n", "Epoch 8/20\n", "363/363 [==============================] - 0s 700us/step - loss: 0.4947 - val_loss: 0.4638\n", "Epoch 9/20\n", "363/363 [==============================] - 0s 675us/step - loss: 0.4782 - val_loss: 0.4421\n", "Epoch 10/20\n", "363/363 [==============================] - 0s 693us/step - loss: 0.4708 - val_loss: 0.4313\n", "Epoch 11/20\n", "363/363 [==============================] - 0s 668us/step - loss: 0.4585 - val_loss: 0.4345\n", "Epoch 12/20\n", "363/363 [==============================] - 0s 686us/step - loss: 0.4481 - val_loss: 0.4168\n", "Epoch 13/20\n", "363/363 [==============================] - 0s 675us/step - loss: 0.4476 - val_loss: 0.4230\n", "Epoch 14/20\n", "363/363 [==============================] - 0s 681us/step - loss: 0.4361 - val_loss: 0.4047\n", "Epoch 15/20\n", "363/363 [==============================] - 0s 698us/step - loss: 0.4392 - val_loss: 0.4078\n", "Epoch 16/20\n", "363/363 [==============================] - 0s 682us/step - loss: 0.4420 - val_loss: 0.3938\n", "Epoch 17/20\n", "363/363 [==============================] - 0s 680us/step - loss: 0.4277 - val_loss: 0.3952\n", "Epoch 18/20\n", "363/363 [==============================] - 0s 671us/step - loss: 0.4216 - val_loss: 0.3860\n", "Epoch 19/20\n", "363/363 [==============================] - 0s 660us/step - loss: 0.4033 - val_loss: 0.3827\n", "Epoch 20/20\n", "363/363 [==============================] - 0s 662us/step - loss: 0.3939 - val_loss: 0.4054\n", "162/162 [==============================] - 0s 423us/step - loss: 0.4032\n" ] } ], "source": [ "model.compile(loss=\"mean_squared_error\", optimizer=keras.optimizers.SGD(learning_rate=1e-3))\n", "history = model.fit(X_train, y_train, epochs=20,\n", " validation_data=(X_valid, y_valid))\n", "mse_test = model.evaluate(X_test, y_test)\n", "y_pred = model.predict(X_new)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What if you want to send different subsets of input features through the wide or deep paths? We will send 5 features (features 0 to 4), and 6 through the deep path (features 2 to 7). Note that 3 features will go through both (features 2, 3 and 4)." ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "np.random.seed(42)\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "input_A = keras.layers.Input(shape=[5], name=\"wide_input\")\n", "input_B = keras.layers.Input(shape=[6], name=\"deep_input\")\n", "hidden1 = keras.layers.Dense(30, activation=\"relu\")(input_B)\n", "hidden2 = keras.layers.Dense(30, activation=\"relu\")(hidden1)\n", "concat = keras.layers.concatenate([input_A, hidden2])\n", "output = keras.layers.Dense(1, name=\"output\")(concat)\n", "model = keras.models.Model(inputs=[input_A, input_B], outputs=[output])" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/20\n", "363/363 [==============================] - 1s 934us/step - loss: 3.1941 - val_loss: 0.8072\n", "Epoch 2/20\n", "363/363 [==============================] - 0s 734us/step - loss: 0.7247 - val_loss: 0.6658\n", "Epoch 3/20\n", "363/363 [==============================] - 0s 719us/step - loss: 0.6176 - val_loss: 0.5687\n", "Epoch 4/20\n", "363/363 [==============================] - 0s 718us/step - loss: 0.5799 - val_loss: 0.5296\n", "Epoch 5/20\n", "363/363 [==============================] - 0s 689us/step - loss: 0.5409 - val_loss: 0.4993\n", "Epoch 6/20\n", "363/363 [==============================] - 0s 717us/step - loss: 0.5173 - val_loss: 0.4811\n", "Epoch 7/20\n", "363/363 [==============================] - 0s 708us/step - loss: 0.5186 - val_loss: 0.4696\n", "Epoch 8/20\n", "363/363 [==============================] - 0s 697us/step - loss: 0.4977 - val_loss: 0.4496\n", "Epoch 9/20\n", "363/363 [==============================] - 0s 713us/step - loss: 0.4765 - val_loss: 0.4404\n", "Epoch 10/20\n", "363/363 [==============================] - 0s 723us/step - loss: 0.4676 - val_loss: 0.4315\n", "Epoch 11/20\n", "363/363 [==============================] - 0s 713us/step - loss: 0.4574 - val_loss: 0.4268\n", "Epoch 12/20\n", "363/363 [==============================] - 0s 697us/step - loss: 0.4479 - val_loss: 0.4166\n", "Epoch 13/20\n", "363/363 [==============================] - 0s 710us/step - loss: 0.4487 - val_loss: 0.4125\n", "Epoch 14/20\n", "363/363 [==============================] - 0s 684us/step - loss: 0.4469 - val_loss: 0.4074\n", "Epoch 15/20\n", "363/363 [==============================] - 0s 738us/step - loss: 0.4460 - val_loss: 0.4044\n", "Epoch 16/20\n", "363/363 [==============================] - 0s 734us/step - loss: 0.4495 - val_loss: 0.4007\n", "Epoch 17/20\n", "363/363 [==============================] - 0s 698us/step - loss: 0.4378 - val_loss: 0.4013\n", "Epoch 18/20\n", "363/363 [==============================] - 0s 715us/step - loss: 0.4375 - val_loss: 0.3987\n", "Epoch 19/20\n", "363/363 [==============================] - 0s 733us/step - loss: 0.4151 - val_loss: 0.3934\n", "Epoch 20/20\n", "363/363 [==============================] - 0s 701us/step - loss: 0.4078 - val_loss: 0.4204\n", "162/162 [==============================] - 0s 447us/step - loss: 0.4219\n" ] } ], "source": [ "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(learning_rate=1e-3))\n", "\n", "X_train_A, X_train_B = X_train[:, :5], X_train[:, 2:]\n", "X_valid_A, X_valid_B = X_valid[:, :5], X_valid[:, 2:]\n", "X_test_A, X_test_B = X_test[:, :5], X_test[:, 2:]\n", "X_new_A, X_new_B = X_test_A[:3], X_test_B[:3]\n", "\n", "history = model.fit((X_train_A, X_train_B), y_train, epochs=20,\n", " validation_data=((X_valid_A, X_valid_B), y_valid))\n", "mse_test = model.evaluate((X_test_A, X_test_B), y_test)\n", "y_pred = model.predict((X_new_A, X_new_B))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Adding an auxiliary output for regularization:" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [], "source": [ "np.random.seed(42)\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "input_A = keras.layers.Input(shape=[5], name=\"wide_input\")\n", "input_B = keras.layers.Input(shape=[6], name=\"deep_input\")\n", "hidden1 = keras.layers.Dense(30, activation=\"relu\")(input_B)\n", "hidden2 = keras.layers.Dense(30, activation=\"relu\")(hidden1)\n", "concat = keras.layers.concatenate([input_A, hidden2])\n", "output = keras.layers.Dense(1, name=\"main_output\")(concat)\n", "aux_output = keras.layers.Dense(1, name=\"aux_output\")(hidden2)\n", "model = keras.models.Model(inputs=[input_A, input_B],\n", " outputs=[output, aux_output])" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "model.compile(loss=[\"mse\", \"mse\"], loss_weights=[0.9, 0.1], optimizer=keras.optimizers.SGD(learning_rate=1e-3))" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/20\n", "363/363 [==============================] - 1s 1ms/step - loss: 3.4633 - main_output_loss: 3.3289 - aux_output_loss: 4.6732 - val_loss: 1.6233 - val_main_output_loss: 0.8468 - val_aux_output_loss: 8.6117\n", "Epoch 2/20\n", "363/363 [==============================] - 0s 879us/step - loss: 0.9807 - main_output_loss: 0.7503 - aux_output_loss: 3.0537 - val_loss: 1.5163 - val_main_output_loss: 0.6836 - val_aux_output_loss: 9.0109\n", "Epoch 3/20\n", "363/363 [==============================] - 0s 890us/step - loss: 0.7742 - main_output_loss: 0.6290 - aux_output_loss: 2.0810 - val_loss: 1.4639 - val_main_output_loss: 0.6229 - val_aux_output_loss: 9.0326\n", "Epoch 4/20\n", "363/363 [==============================] - 0s 847us/step - loss: 0.6952 - main_output_loss: 0.5897 - aux_output_loss: 1.6449 - val_loss: 1.3388 - val_main_output_loss: 0.5481 - val_aux_output_loss: 8.4552\n", "Epoch 5/20\n", "363/363 [==============================] - 0s 902us/step - loss: 0.6469 - main_output_loss: 0.5508 - aux_output_loss: 1.5118 - val_loss: 1.2177 - val_main_output_loss: 0.5194 - val_aux_output_loss: 7.5030\n", "Epoch 6/20\n", "363/363 [==============================] - 0s 867us/step - loss: 0.6120 - main_output_loss: 0.5251 - aux_output_loss: 1.3943 - val_loss: 1.0935 - val_main_output_loss: 0.5106 - val_aux_output_loss: 6.3396\n", "Epoch 7/20\n", "363/363 [==============================] - 0s 864us/step - loss: 0.6114 - main_output_loss: 0.5256 - aux_output_loss: 1.3833 - val_loss: 0.9918 - val_main_output_loss: 0.5115 - val_aux_output_loss: 5.3151\n", "Epoch 8/20\n", "363/363 [==============================] - 0s 850us/step - loss: 0.5765 - main_output_loss: 0.5024 - aux_output_loss: 1.2439 - val_loss: 0.8733 - val_main_output_loss: 0.4733 - val_aux_output_loss: 4.4740\n", "Epoch 9/20\n", "363/363 [==============================] - 0s 882us/step - loss: 0.5535 - main_output_loss: 0.4811 - aux_output_loss: 1.2057 - val_loss: 0.7832 - val_main_output_loss: 0.4555 - val_aux_output_loss: 3.7323\n", "Epoch 10/20\n", "363/363 [==============================] - 0s 846us/step - loss: 0.5456 - main_output_loss: 0.4708 - aux_output_loss: 1.2189 - val_loss: 0.7170 - val_main_output_loss: 0.4604 - val_aux_output_loss: 3.0262\n", "Epoch 11/20\n", "363/363 [==============================] - 0s 875us/step - loss: 0.5297 - main_output_loss: 0.4587 - aux_output_loss: 1.1684 - val_loss: 0.6510 - val_main_output_loss: 0.4293 - val_aux_output_loss: 2.6468\n", "Epoch 12/20\n", "363/363 [==============================] - 0s 879us/step - loss: 0.5181 - main_output_loss: 0.4501 - aux_output_loss: 1.1305 - val_loss: 0.6051 - val_main_output_loss: 0.4310 - val_aux_output_loss: 2.1722\n", "Epoch 13/20\n", "363/363 [==============================] - 0s 879us/step - loss: 0.5100 - main_output_loss: 0.4487 - aux_output_loss: 1.0620 - val_loss: 0.5644 - val_main_output_loss: 0.4161 - val_aux_output_loss: 1.8992\n", "Epoch 14/20\n", "363/363 [==============================] - 0s 884us/step - loss: 0.5064 - main_output_loss: 0.4459 - aux_output_loss: 1.0503 - val_loss: 0.5354 - val_main_output_loss: 0.4119 - val_aux_output_loss: 1.6466\n", "Epoch 15/20\n", "363/363 [==============================] - 0s 878us/step - loss: 0.5027 - main_output_loss: 0.4452 - aux_output_loss: 1.0207 - val_loss: 0.5124 - val_main_output_loss: 0.4047 - val_aux_output_loss: 1.4812\n", "Epoch 16/20\n", "363/363 [==============================] - 0s 864us/step - loss: 0.5057 - main_output_loss: 0.4480 - aux_output_loss: 1.0249 - val_loss: 0.4934 - val_main_output_loss: 0.4034 - val_aux_output_loss: 1.3035\n", "Epoch 17/20\n", "363/363 [==============================] - 0s 855us/step - loss: 0.4931 - main_output_loss: 0.4360 - aux_output_loss: 1.0075 - val_loss: 0.4801 - val_main_output_loss: 0.3984 - val_aux_output_loss: 1.2150\n", "Epoch 18/20\n", "363/363 [==============================] - 0s 863us/step - loss: 0.4922 - main_output_loss: 0.4352 - aux_output_loss: 1.0053 - val_loss: 0.4694 - val_main_output_loss: 0.3962 - val_aux_output_loss: 1.1279\n", "Epoch 19/20\n", "363/363 [==============================] - 0s 895us/step - loss: 0.4658 - main_output_loss: 0.4139 - aux_output_loss: 0.9323 - val_loss: 0.4580 - val_main_output_loss: 0.3936 - val_aux_output_loss: 1.0372\n", "Epoch 20/20\n", "363/363 [==============================] - 0s 870us/step - loss: 0.4589 - main_output_loss: 0.4072 - aux_output_loss: 0.9243 - val_loss: 0.4655 - val_main_output_loss: 0.4048 - val_aux_output_loss: 1.0118\n" ] } ], "source": [ "history = model.fit([X_train_A, X_train_B], [y_train, y_train], epochs=20,\n", " validation_data=([X_valid_A, X_valid_B], [y_valid, y_valid]))" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "162/162 [==============================] - 0s 546us/step - loss: 0.4668 - main_output_loss: 0.4178 - aux_output_loss: 0.9082\n", "WARNING:tensorflow:5 out of the last 6 calls to .predict_function at 0x7fd97a1a24d0> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n" ] } ], "source": [ "total_loss, main_loss, aux_loss = model.evaluate(\n", " [X_test_A, X_test_B], [y_test, y_test])\n", "y_pred_main, y_pred_aux = model.predict([X_new_A, X_new_B])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# The subclassing API" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [], "source": [ "class WideAndDeepModel(keras.models.Model):\n", " def __init__(self, units=30, activation=\"relu\", **kwargs):\n", " super().__init__(**kwargs)\n", " self.hidden1 = keras.layers.Dense(units, activation=activation)\n", " self.hidden2 = keras.layers.Dense(units, activation=activation)\n", " self.main_output = keras.layers.Dense(1)\n", " self.aux_output = keras.layers.Dense(1)\n", " \n", " def call(self, inputs):\n", " input_A, input_B = inputs\n", " hidden1 = self.hidden1(input_B)\n", " hidden2 = self.hidden2(hidden1)\n", " concat = keras.layers.concatenate([input_A, hidden2])\n", " main_output = self.main_output(concat)\n", " aux_output = self.aux_output(hidden2)\n", " return main_output, aux_output\n", "\n", "model = WideAndDeepModel(30, activation=\"relu\")" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/10\n", "363/363 [==============================] - 1s 1ms/step - loss: 3.3855 - output_1_loss: 3.3304 - output_2_loss: 3.8821 - val_loss: 2.1435 - val_output_1_loss: 1.1581 - val_output_2_loss: 11.0117\n", "Epoch 2/10\n", "363/363 [==============================] - 0s 852us/step - loss: 1.0790 - output_1_loss: 0.9329 - output_2_loss: 2.3942 - val_loss: 1.7567 - val_output_1_loss: 0.8205 - val_output_2_loss: 10.1825\n", "Epoch 3/10\n", "363/363 [==============================] - 0s 885us/step - loss: 0.8644 - output_1_loss: 0.7583 - output_2_loss: 1.8194 - val_loss: 1.5664 - val_output_1_loss: 0.7913 - val_output_2_loss: 8.5419\n", "Epoch 4/10\n", "363/363 [==============================] - 0s 863us/step - loss: 0.7850 - output_1_loss: 0.6979 - output_2_loss: 1.5689 - val_loss: 1.3088 - val_output_1_loss: 0.6549 - val_output_2_loss: 7.1933\n", "Epoch 5/10\n", "363/363 [==============================] - 0s 843us/step - loss: 0.7294 - output_1_loss: 0.6499 - output_2_loss: 1.4452 - val_loss: 1.1357 - val_output_1_loss: 0.5964 - val_output_2_loss: 5.9898\n", "Epoch 6/10\n", "363/363 [==============================] - 0s 837us/step - loss: 0.6880 - output_1_loss: 0.6092 - output_2_loss: 1.3974 - val_loss: 1.0036 - val_output_1_loss: 0.5937 - val_output_2_loss: 4.6933\n", "Epoch 7/10\n", "363/363 [==============================] - 0s 866us/step - loss: 0.6918 - output_1_loss: 0.6143 - output_2_loss: 1.3899 - val_loss: 0.8904 - val_output_1_loss: 0.5591 - val_output_2_loss: 3.8714\n", "Epoch 8/10\n", "363/363 [==============================] - 0s 840us/step - loss: 0.6504 - output_1_loss: 0.5805 - output_2_loss: 1.2797 - val_loss: 0.8009 - val_output_1_loss: 0.5243 - val_output_2_loss: 3.2903\n", "Epoch 9/10\n", "363/363 [==============================] - 0s 842us/step - loss: 0.6270 - output_1_loss: 0.5574 - output_2_loss: 1.2533 - val_loss: 0.7357 - val_output_1_loss: 0.5144 - val_output_2_loss: 2.7275\n", "Epoch 10/10\n", "363/363 [==============================] - 0s 863us/step - loss: 0.6160 - output_1_loss: 0.5456 - output_2_loss: 1.2495 - val_loss: 0.6849 - val_output_1_loss: 0.5014 - val_output_2_loss: 2.3370\n", "162/162 [==============================] - 0s 546us/step - loss: 0.5841 - output_1_loss: 0.5188 - output_2_loss: 1.1722\n", "WARNING:tensorflow:6 out of the last 7 calls to .predict_function at 0x7fd9725c2320> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n" ] } ], "source": [ "model.compile(loss=\"mse\", loss_weights=[0.9, 0.1], optimizer=keras.optimizers.SGD(learning_rate=1e-3))\n", "history = model.fit((X_train_A, X_train_B), (y_train, y_train), epochs=10,\n", " validation_data=((X_valid_A, X_valid_B), (y_valid, y_valid)))\n", "total_loss, main_loss, aux_loss = model.evaluate((X_test_A, X_test_B), (y_test, y_test))\n", "y_pred_main, y_pred_aux = model.predict((X_new_A, X_new_B))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Saving and Restoring" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [], "source": [ "np.random.seed(42)\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [], "source": [ "model = keras.models.Sequential([\n", " keras.layers.Dense(30, activation=\"relu\", input_shape=[8]),\n", " keras.layers.Dense(30, activation=\"relu\"),\n", " keras.layers.Dense(1)\n", "]) " ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/10\n", "363/363 [==============================] - 0s 882us/step - loss: 3.3697 - val_loss: 0.7126\n", "Epoch 2/10\n", "363/363 [==============================] - 0s 646us/step - loss: 0.6964 - val_loss: 0.6880\n", "Epoch 3/10\n", "363/363 [==============================] - 0s 658us/step - loss: 0.6167 - val_loss: 0.5803\n", "Epoch 4/10\n", "363/363 [==============================] - 0s 653us/step - loss: 0.5846 - val_loss: 0.5166\n", "Epoch 5/10\n", "363/363 [==============================] - 0s 649us/step - loss: 0.5321 - val_loss: 0.4895\n", "Epoch 6/10\n", "363/363 [==============================] - 0s 664us/step - loss: 0.5083 - val_loss: 0.4951\n", "Epoch 7/10\n", "363/363 [==============================] - 0s 677us/step - loss: 0.5044 - val_loss: 0.4861\n", "Epoch 8/10\n", "363/363 [==============================] - 0s 649us/step - loss: 0.4813 - val_loss: 0.4554\n", "Epoch 9/10\n", "363/363 [==============================] - 0s 676us/step - loss: 0.4627 - val_loss: 0.4413\n", "Epoch 10/10\n", "363/363 [==============================] - 0s 688us/step - loss: 0.4549 - val_loss: 0.4379\n", "162/162 [==============================] - 0s 497us/step - loss: 0.4382\n" ] } ], "source": [ "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(learning_rate=1e-3))\n", "history = model.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid))\n", "mse_test = model.evaluate(X_test, y_test)" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [], "source": [ "model.save(\"my_keras_model.h5\")" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [], "source": [ "model = keras.models.load_model(\"my_keras_model.h5\")" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:7 out of the last 8 calls to .predict_function at 0x7fd9725c28c0> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n" ] }, { "data": { "text/plain": [ "array([[0.5400236],\n", " [1.6505969],\n", " [3.0098243]], dtype=float32)" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.predict(X_new)" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [], "source": [ "model.save_weights(\"my_keras_weights.ckpt\")" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.load_weights(\"my_keras_weights.ckpt\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Using Callbacks during Training" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [], "source": [ "keras.backend.clear_session()\n", "np.random.seed(42)\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [], "source": [ "model = keras.models.Sequential([\n", " keras.layers.Dense(30, activation=\"relu\", input_shape=[8]),\n", " keras.layers.Dense(30, activation=\"relu\"),\n", " keras.layers.Dense(1)\n", "]) " ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/10\n", "363/363 [==============================] - 0s 846us/step - loss: 3.3697 - val_loss: 0.7126\n", "Epoch 2/10\n", "363/363 [==============================] - 0s 672us/step - loss: 0.6964 - val_loss: 0.6880\n", "Epoch 3/10\n", "363/363 [==============================] - 0s 658us/step - loss: 0.6167 - val_loss: 0.5803\n", "Epoch 4/10\n", "363/363 [==============================] - 0s 651us/step - loss: 0.5846 - val_loss: 0.5166\n", "Epoch 5/10\n", "363/363 [==============================] - 0s 670us/step - loss: 0.5321 - val_loss: 0.4895\n", "Epoch 6/10\n", "363/363 [==============================] - 0s 658us/step - loss: 0.5083 - val_loss: 0.4951\n", "Epoch 7/10\n", "363/363 [==============================] - 0s 682us/step - loss: 0.5044 - val_loss: 0.4861\n", "Epoch 8/10\n", "363/363 [==============================] - 0s 657us/step - loss: 0.4813 - val_loss: 0.4554\n", "Epoch 9/10\n", "363/363 [==============================] - 0s 672us/step - loss: 0.4627 - val_loss: 0.4413\n", "Epoch 10/10\n", "363/363 [==============================] - 0s 655us/step - loss: 0.4549 - val_loss: 0.4379\n", "162/162 [==============================] - 0s 460us/step - loss: 0.4382\n" ] } ], "source": [ "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(learning_rate=1e-3))\n", "checkpoint_cb = keras.callbacks.ModelCheckpoint(\"my_keras_model.h5\", save_best_only=True)\n", "history = model.fit(X_train, y_train, epochs=10,\n", " validation_data=(X_valid, y_valid),\n", " callbacks=[checkpoint_cb])\n", "model = keras.models.load_model(\"my_keras_model.h5\") # rollback to best model\n", "mse_test = model.evaluate(X_test, y_test)" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/100\n", "363/363 [==============================] - 0s 878us/step - loss: 0.4578 - val_loss: 0.4110\n", "Epoch 2/100\n", "363/363 [==============================] - 0s 702us/step - loss: 0.4430 - val_loss: 0.4266\n", "Epoch 3/100\n", "363/363 [==============================] - 0s 676us/step - loss: 0.4376 - val_loss: 0.3996\n", "Epoch 4/100\n", "363/363 [==============================] - 0s 671us/step - loss: 0.4361 - val_loss: 0.3939\n", "Epoch 5/100\n", "363/363 [==============================] - 0s 674us/step - loss: 0.4204 - val_loss: 0.3889\n", "Epoch 6/100\n", "363/363 [==============================] - 0s 672us/step - loss: 0.4112 - val_loss: 0.3866\n", "Epoch 7/100\n", "363/363 [==============================] - 0s 671us/step - loss: 0.4226 - val_loss: 0.3860\n", "Epoch 8/100\n", "363/363 [==============================] - 0s 659us/step - loss: 0.4135 - val_loss: 0.3793\n", "Epoch 9/100\n", "363/363 [==============================] - 0s 661us/step - loss: 0.4039 - val_loss: 0.3746\n", "Epoch 10/100\n", "363/363 [==============================] - 0s 655us/step - loss: 0.4023 - val_loss: 0.3723\n", "Epoch 11/100\n", "363/363 [==============================] - 0s 674us/step - loss: 0.3950 - val_loss: 0.3697\n", "Epoch 12/100\n", "363/363 [==============================] - 0s 652us/step - loss: 0.3912 - val_loss: 0.3669\n", "Epoch 13/100\n", "363/363 [==============================] - 0s 660us/step - loss: 0.3939 - val_loss: 0.3661\n", "Epoch 14/100\n", "363/363 [==============================] - 0s 648us/step - loss: 0.3868 - val_loss: 0.3631\n", "Epoch 15/100\n", "363/363 [==============================] - 0s 677us/step - loss: 0.3878 - val_loss: 0.3660\n", "Epoch 16/100\n", "363/363 [==============================] - 0s 651us/step - loss: 0.3935 - val_loss: 0.3625\n", "Epoch 17/100\n", "363/363 [==============================] - 0s 653us/step - loss: 0.3817 - val_loss: 0.3592\n", "Epoch 18/100\n", "<<123 more lines>>\n", "Epoch 80/100\n", "363/363 [==============================] - 0s 677us/step - loss: 0.3323 - val_loss: 0.3354\n", "Epoch 81/100\n", "363/363 [==============================] - 0s 677us/step - loss: 0.3297 - val_loss: 0.3274\n", "Epoch 82/100\n", "363/363 [==============================] - 0s 643us/step - loss: 0.3441 - val_loss: 0.3167\n", "Epoch 83/100\n", "363/363 [==============================] - 0s 699us/step - loss: 0.3369 - val_loss: 0.3280\n", "Epoch 84/100\n", "363/363 [==============================] - 0s 646us/step - loss: 0.3182 - val_loss: 0.3634\n", "Epoch 85/100\n", "363/363 [==============================] - 0s 682us/step - loss: 0.3235 - val_loss: 0.3176\n", "Epoch 86/100\n", "363/363 [==============================] - 0s 590us/step - loss: 0.3184 - val_loss: 0.3156\n", "Epoch 87/100\n", "363/363 [==============================] - 0s 677us/step - loss: 0.3395 - val_loss: 0.3529\n", "Epoch 88/100\n", "363/363 [==============================] - 0s 701us/step - loss: 0.3264 - val_loss: 0.3258\n", "Epoch 89/100\n", "363/363 [==============================] - 0s 710us/step - loss: 0.3210 - val_loss: 0.3630\n", "Epoch 90/100\n", "363/363 [==============================] - 0s 692us/step - loss: 0.3192 - val_loss: 0.3376\n", "Epoch 91/100\n", "363/363 [==============================] - 0s 704us/step - loss: 0.3237 - val_loss: 0.3211\n", "Epoch 92/100\n", "363/363 [==============================] - 0s 696us/step - loss: 0.3281 - val_loss: 0.3456\n", "Epoch 93/100\n", "363/363 [==============================] - 0s 696us/step - loss: 0.3424 - val_loss: 0.3158\n", "Epoch 94/100\n", "363/363 [==============================] - 0s 684us/step - loss: 0.3209 - val_loss: 0.3409\n", "Epoch 95/100\n", "363/363 [==============================] - 0s 676us/step - loss: 0.3230 - val_loss: 0.3379\n", "Epoch 96/100\n", "363/363 [==============================] - 0s 676us/step - loss: 0.3341 - val_loss: 0.3213\n", "162/162 [==============================] - 0s 440us/step - loss: 0.3310\n" ] } ], "source": [ "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(learning_rate=1e-3))\n", "early_stopping_cb = keras.callbacks.EarlyStopping(patience=10,\n", " restore_best_weights=True)\n", "history = model.fit(X_train, y_train, epochs=100,\n", " validation_data=(X_valid, y_valid),\n", " callbacks=[checkpoint_cb, early_stopping_cb])\n", "mse_test = model.evaluate(X_test, y_test)" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [], "source": [ "class PrintValTrainRatioCallback(keras.callbacks.Callback):\n", " def on_epoch_end(self, epoch, logs):\n", " print(\"\\nval/train: {:.2f}\".format(logs[\"val_loss\"] / logs[\"loss\"]))" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "363/363 [==============================] - 0s 799us/step - loss: 0.3302 - val_loss: 0.3556\n", "\n", "val/train: 1.08\n" ] } ], "source": [ "val_train_ratio_cb = PrintValTrainRatioCallback()\n", "history = model.fit(X_train, y_train, epochs=1,\n", " validation_data=(X_valid, y_valid),\n", " callbacks=[val_train_ratio_cb])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# TensorBoard" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [], "source": [ "root_logdir = os.path.join(os.curdir, \"my_logs\")" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'./my_logs/run_2021_02_13-18_39_20'" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def get_run_logdir():\n", " import time\n", " run_id = time.strftime(\"run_%Y_%m_%d-%H_%M_%S\")\n", " return os.path.join(root_logdir, run_id)\n", "\n", "run_logdir = get_run_logdir()\n", "run_logdir" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [], "source": [ "keras.backend.clear_session()\n", "np.random.seed(42)\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [], "source": [ "model = keras.models.Sequential([\n", " keras.layers.Dense(30, activation=\"relu\", input_shape=[8]),\n", " keras.layers.Dense(30, activation=\"relu\"),\n", " keras.layers.Dense(1)\n", "]) \n", "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(learning_rate=1e-3))" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/30\n", "363/363 [==============================] - 1s 927us/step - loss: 3.3697 - val_loss: 0.7126\n", "Epoch 2/30\n", "363/363 [==============================] - 0s 695us/step - loss: 0.6964 - val_loss: 0.6880\n", "Epoch 3/30\n", "363/363 [==============================] - 0s 668us/step - loss: 0.6167 - val_loss: 0.5803\n", "Epoch 4/30\n", "363/363 [==============================] - 0s 672us/step - loss: 0.5846 - val_loss: 0.5166\n", "Epoch 5/30\n", "363/363 [==============================] - 0s 692us/step - loss: 0.5321 - val_loss: 0.4895\n", "Epoch 6/30\n", "363/363 [==============================] - 0s 755us/step - loss: 0.5083 - val_loss: 0.4951\n", "Epoch 7/30\n", "363/363 [==============================] - 0s 697us/step - loss: 0.5044 - val_loss: 0.4861\n", "Epoch 8/30\n", "363/363 [==============================] - 0s 668us/step - loss: 0.4813 - val_loss: 0.4554\n", "Epoch 9/30\n", "363/363 [==============================] - 0s 681us/step - loss: 0.4627 - val_loss: 0.4413\n", "Epoch 10/30\n", "363/363 [==============================] - 0s 701us/step - loss: 0.4549 - val_loss: 0.4379\n", "Epoch 11/30\n", "363/363 [==============================] - 0s 696us/step - loss: 0.4416 - val_loss: 0.4396\n", "Epoch 12/30\n", "363/363 [==============================] - 0s 692us/step - loss: 0.4295 - val_loss: 0.4507\n", "Epoch 13/30\n", "363/363 [==============================] - 0s 703us/step - loss: 0.4326 - val_loss: 0.3997\n", "Epoch 14/30\n", "363/363 [==============================] - 0s 703us/step - loss: 0.4207 - val_loss: 0.3956\n", "Epoch 15/30\n", "363/363 [==============================] - 0s 698us/step - loss: 0.4198 - val_loss: 0.3916\n", "Epoch 16/30\n", "363/363 [==============================] - 0s 695us/step - loss: 0.4248 - val_loss: 0.3937\n", "Epoch 17/30\n", "363/363 [==============================] - 0s 699us/step - loss: 0.4105 - val_loss: 0.3809\n", "Epoch 18/30\n", "363/363 [==============================] - 0s 697us/step - loss: 0.4070 - val_loss: 0.3793\n", "Epoch 19/30\n", "363/363 [==============================] - 0s 674us/step - loss: 0.3902 - val_loss: 0.3850\n", "Epoch 20/30\n", "363/363 [==============================] - 0s 680us/step - loss: 0.3864 - val_loss: 0.3809\n", "Epoch 21/30\n", "363/363 [==============================] - 0s 693us/step - loss: 0.3978 - val_loss: 0.3701\n", "Epoch 22/30\n", "363/363 [==============================] - 0s 694us/step - loss: 0.3816 - val_loss: 0.3781\n", "Epoch 23/30\n", "363/363 [==============================] - 0s 680us/step - loss: 0.4042 - val_loss: 0.3650\n", "Epoch 24/30\n", "363/363 [==============================] - 0s 630us/step - loss: 0.3823 - val_loss: 0.3655\n", "Epoch 25/30\n", "363/363 [==============================] - 0s 699us/step - loss: 0.3792 - val_loss: 0.3611\n", "Epoch 26/30\n", "363/363 [==============================] - 0s 684us/step - loss: 0.3800 - val_loss: 0.3626\n", "Epoch 27/30\n", "363/363 [==============================] - 0s 686us/step - loss: 0.3858 - val_loss: 0.3564\n", "Epoch 28/30\n", "363/363 [==============================] - 0s 690us/step - loss: 0.3839 - val_loss: 0.3579\n", "Epoch 29/30\n", "363/363 [==============================] - 0s 695us/step - loss: 0.3736 - val_loss: 0.3561\n", "Epoch 30/30\n", "363/363 [==============================] - 0s 684us/step - loss: 0.3843 - val_loss: 0.3548\n" ] } ], "source": [ "tensorboard_cb = keras.callbacks.TensorBoard(run_logdir)\n", "history = model.fit(X_train, y_train, epochs=30,\n", " validation_data=(X_valid, y_valid),\n", " callbacks=[checkpoint_cb, tensorboard_cb])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To start the TensorBoard server, one option is to open a terminal, if needed activate the virtualenv where you installed TensorBoard, go to this notebook's directory, then type:\n", "\n", "```bash\n", "$ tensorboard --logdir=./my_logs --port=6006\n", "```\n", "\n", "You can then open your web browser to [localhost:6006](http://localhost:6006) and use TensorBoard. Once you are done, press Ctrl-C in the terminal window, this will shutdown the TensorBoard server.\n", "\n", "Alternatively, you can load TensorBoard's Jupyter extension and run it like this:" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%load_ext tensorboard\n", "%tensorboard --logdir=./my_logs --port=6006" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'./my_logs/run_2021_02_13-18_39_31'" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "run_logdir2 = get_run_logdir()\n", "run_logdir2" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [], "source": [ "keras.backend.clear_session()\n", "np.random.seed(42)\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [], "source": [ "model = keras.models.Sequential([\n", " keras.layers.Dense(30, activation=\"relu\", input_shape=[8]),\n", " keras.layers.Dense(30, activation=\"relu\"),\n", " keras.layers.Dense(1)\n", "]) \n", "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(learning_rate=0.05))" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/30\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.7645 - val_loss: 302.8536\n", "Epoch 2/30\n", "363/363 [==============================] - 0s 713us/step - loss: 8159520618.2209 - val_loss: 1.3230\n", "Epoch 3/30\n", "363/363 [==============================] - 0s 735us/step - loss: 1.3439 - val_loss: 1.3176\n", "Epoch 4/30\n", "363/363 [==============================] - 0s 738us/step - loss: 1.3546 - val_loss: 1.3261\n", "Epoch 5/30\n", "363/363 [==============================] - 0s 712us/step - loss: 1.3513 - val_loss: 1.3154\n", "Epoch 6/30\n", "363/363 [==============================] - 0s 724us/step - loss: 1.3274 - val_loss: 1.3203\n", "Epoch 7/30\n", "363/363 [==============================] - 0s 693us/step - loss: 1.3639 - val_loss: 1.3149\n", "Epoch 8/30\n", "363/363 [==============================] - 0s 709us/step - loss: 1.3487 - val_loss: 1.3157\n", "Epoch 9/30\n", "363/363 [==============================] - 0s 681us/step - loss: 1.3445 - val_loss: 1.3150\n", "Epoch 10/30\n", "363/363 [==============================] - 0s 681us/step - loss: 1.3697 - val_loss: 1.3172\n", "Epoch 11/30\n", "363/363 [==============================] - 0s 687us/step - loss: 1.3622 - val_loss: 1.3174\n", "Epoch 12/30\n", "363/363 [==============================] - 0s 693us/step - loss: 1.3389 - val_loss: 1.3150\n", "Epoch 13/30\n", "363/363 [==============================] - 0s 668us/step - loss: 1.3336 - val_loss: 1.3270\n", "Epoch 14/30\n", "363/363 [==============================] - 0s 673us/step - loss: 1.3429 - val_loss: 1.3195\n", "Epoch 15/30\n", "363/363 [==============================] - 0s 679us/step - loss: 1.3275 - val_loss: 1.3157\n", "Epoch 16/30\n", "363/363 [==============================] - 0s 701us/step - loss: 1.3669 - val_loss: 1.3182\n", "Epoch 17/30\n", "363/363 [==============================] - 0s 692us/step - loss: 1.3645 - val_loss: 1.3223\n", "Epoch 18/30\n", "363/363 [==============================] - 0s 691us/step - loss: 1.3839 - val_loss: 1.3154\n", "Epoch 19/30\n", "363/363 [==============================] - 0s 680us/step - loss: 1.3078 - val_loss: 1.3168\n", "Epoch 20/30\n", "363/363 [==============================] - 0s 663us/step - loss: 1.3215 - val_loss: 1.3151\n", "Epoch 21/30\n", "363/363 [==============================] - 0s 723us/step - loss: 1.3344 - val_loss: 1.3174\n", "Epoch 22/30\n", "363/363 [==============================] - 0s 674us/step - loss: 1.3269 - val_loss: 1.3204\n", "Epoch 23/30\n", "363/363 [==============================] - 0s 700us/step - loss: 1.3590 - val_loss: 1.3164\n", "Epoch 24/30\n", "363/363 [==============================] - 0s 687us/step - loss: 1.3381 - val_loss: 1.3157\n", "Epoch 25/30\n", "363/363 [==============================] - 0s 687us/step - loss: 1.3265 - val_loss: 1.3180\n", "Epoch 26/30\n", "363/363 [==============================] - 0s 704us/step - loss: 1.3532 - val_loss: 1.3195\n", "Epoch 27/30\n", "363/363 [==============================] - 0s 715us/step - loss: 1.3552 - val_loss: 1.3157\n", "Epoch 28/30\n", "363/363 [==============================] - 0s 698us/step - loss: 1.3447 - val_loss: 1.3222\n", "Epoch 29/30\n", "363/363 [==============================] - 0s 713us/step - loss: 1.3379 - val_loss: 1.3267\n", "Epoch 30/30\n", "363/363 [==============================] - 0s 698us/step - loss: 1.3583 - val_loss: 1.3174\n" ] } ], "source": [ "tensorboard_cb = keras.callbacks.TensorBoard(run_logdir2)\n", "history = model.fit(X_train, y_train, epochs=30,\n", " validation_data=(X_valid, y_valid),\n", " callbacks=[checkpoint_cb, tensorboard_cb])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice how TensorBoard now sees two runs, and you can compare the learning curves." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check out the other available logging options:" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on function __init__ in module tensorflow.python.keras.callbacks:\n", "\n", "__init__(self, log_dir='logs', histogram_freq=0, write_graph=True, write_images=False, update_freq='epoch', profile_batch=2, embeddings_freq=0, embeddings_metadata=None, **kwargs)\n", " Initialize self. See help(type(self)) for accurate signature.\n", "\n" ] } ], "source": [ "help(keras.callbacks.TensorBoard.__init__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Hyperparameter Tuning" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [], "source": [ "keras.backend.clear_session()\n", "np.random.seed(42)\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [], "source": [ "def build_model(n_hidden=1, n_neurons=30, learning_rate=3e-3, input_shape=[8]):\n", " model = keras.models.Sequential()\n", " model.add(keras.layers.InputLayer(input_shape=input_shape))\n", " for layer in range(n_hidden):\n", " model.add(keras.layers.Dense(n_neurons, activation=\"relu\"))\n", " model.add(keras.layers.Dense(1))\n", " optimizer = keras.optimizers.SGD(learning_rate=learning_rate)\n", " model.compile(loss=\"mse\", optimizer=optimizer)\n", " return model" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [], "source": [ "keras_reg = keras.wrappers.scikit_learn.KerasRegressor(build_model)" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/100\n", "363/363 [==============================] - 0s 905us/step - loss: 1.5673 - val_loss: 20.7721\n", "Epoch 2/100\n", "363/363 [==============================] - 0s 665us/step - loss: 1.3216 - val_loss: 5.0266\n", "Epoch 3/100\n", "363/363 [==============================] - 0s 671us/step - loss: 0.5972 - val_loss: 0.5490\n", "Epoch 4/100\n", "363/363 [==============================] - 0s 661us/step - loss: 0.4985 - val_loss: 0.4529\n", "Epoch 5/100\n", "363/363 [==============================] - 0s 687us/step - loss: 0.4608 - val_loss: 0.4188\n", "Epoch 6/100\n", "363/363 [==============================] - 0s 678us/step - loss: 0.4410 - val_loss: 0.4129\n", "Epoch 7/100\n", "363/363 [==============================] - 0s 676us/step - loss: 0.4463 - val_loss: 0.4004\n", "Epoch 8/100\n", "363/363 [==============================] - 0s 686us/step - loss: 0.4283 - val_loss: 0.3944\n", "Epoch 9/100\n", "363/363 [==============================] - 0s 660us/step - loss: 0.4139 - val_loss: 0.3961\n", "Epoch 10/100\n", "363/363 [==============================] - 0s 681us/step - loss: 0.4107 - val_loss: 0.4071\n", "Epoch 11/100\n", "363/363 [==============================] - 0s 655us/step - loss: 0.3992 - val_loss: 0.3855\n", "Epoch 12/100\n", "363/363 [==============================] - 0s 627us/step - loss: 0.3982 - val_loss: 0.4136\n", "Epoch 13/100\n", "363/363 [==============================] - 0s 692us/step - loss: 0.3983 - val_loss: 0.3997\n", "Epoch 14/100\n", "363/363 [==============================] - 0s 675us/step - loss: 0.3910 - val_loss: 0.3818\n", "Epoch 15/100\n", "363/363 [==============================] - 0s 592us/step - loss: 0.3948 - val_loss: 0.3829\n", "Epoch 16/100\n", "363/363 [==============================] - 0s 686us/step - loss: 0.3981 - val_loss: 0.3739\n", "Epoch 17/100\n", "363/363 [==============================] - 0s 674us/step - loss: 0.3821 - val_loss: 0.4022\n", "Epoch 18/100\n", "<<130 more lines>>\n", "363/363 [==============================] - 0s 627us/step - loss: 0.3441 - val_loss: 0.3342\n", "Epoch 84/100\n", "363/363 [==============================] - 0s 640us/step - loss: 0.3240 - val_loss: 0.4136\n", "Epoch 85/100\n", "363/363 [==============================] - 0s 656us/step - loss: 0.3303 - val_loss: 0.3285\n", "Epoch 86/100\n", "363/363 [==============================] - 0s 671us/step - loss: 0.3263 - val_loss: 0.3440\n", "Epoch 87/100\n", "363/363 [==============================] - 0s 672us/step - loss: 0.3483 - val_loss: 0.3733\n", "Epoch 88/100\n", "363/363 [==============================] - 0s 649us/step - loss: 0.3305 - val_loss: 0.3188\n", "Epoch 89/100\n", "363/363 [==============================] - 0s 578us/step - loss: 0.3283 - val_loss: 0.3492\n", "Epoch 90/100\n", "363/363 [==============================] - 0s 665us/step - loss: 0.3243 - val_loss: 0.3175\n", "Epoch 91/100\n", "363/363 [==============================] - 0s 664us/step - loss: 0.3288 - val_loss: 0.3594\n", "Epoch 92/100\n", "363/363 [==============================] - 0s 675us/step - loss: 0.3343 - val_loss: 0.3169\n", "Epoch 93/100\n", "363/363 [==============================] - 0s 666us/step - loss: 0.3485 - val_loss: 0.3607\n", "Epoch 94/100\n", "363/363 [==============================] - 0s 659us/step - loss: 0.3262 - val_loss: 0.5184\n", "Epoch 95/100\n", "363/363 [==============================] - 0s 677us/step - loss: 0.3284 - val_loss: 0.7536\n", "Epoch 96/100\n", "363/363 [==============================] - 0s 674us/step - loss: 0.3494 - val_loss: 0.5075\n", "Epoch 97/100\n", "363/363 [==============================] - 0s 628us/step - loss: 0.3290 - val_loss: 0.8087\n", "Epoch 98/100\n", "363/363 [==============================] - 0s 624us/step - loss: 0.3277 - val_loss: 1.0447\n", "Epoch 99/100\n", "363/363 [==============================] - 0s 683us/step - loss: 0.3199 - val_loss: 1.6881\n", "Epoch 100/100\n", "363/363 [==============================] - 0s 671us/step - loss: 0.3706 - val_loss: 1.9265\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "keras_reg.fit(X_train, y_train, epochs=100,\n", " validation_data=(X_valid, y_valid),\n", " callbacks=[keras.callbacks.EarlyStopping(patience=10)])" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "162/162 [==============================] - 0s 417us/step - loss: 0.3409\n" ] } ], "source": [ "mse_test = keras_reg.score(X_test, y_test)" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:8 out of the last 9 calls to .predict_function at 0x7fd98963b7a0> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n" ] } ], "source": [ "y_pred = keras_reg.predict(X_new)" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [], "source": [ "np.random.seed(42)\n", "tf.random.set_seed(42)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Warning**: the following cell crashes at the end of training. This seems to be caused by [Keras issue #13586](https://github.com/keras-team/keras/issues/13586), which was triggered by a recent change in Scikit-Learn. [Pull Request #13598](https://github.com/keras-team/keras/pull/13598) seems to fix the issue, so this problem should be resolved soon. In the meantime, I've added `.tolist()` and `.rvs(1000).tolist()` as workarounds." ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fitting 3 folds for each of 10 candidates, totalling 30 fits\n", "Epoch 1/100\n", "242/242 [==============================] - 0s 1ms/step - loss: 1.3827 - val_loss: 0.4703\n", "Epoch 2/100\n", "242/242 [==============================] - 0s 757us/step - loss: 0.4880 - val_loss: 0.4247\n", "Epoch 3/100\n", "242/242 [==============================] - 0s 765us/step - loss: 0.4541 - val_loss: 0.4052\n", "Epoch 4/100\n", "242/242 [==============================] - 0s 745us/step - loss: 0.4518 - val_loss: 0.3975\n", "Epoch 5/100\n", "242/242 [==============================] - 0s 765us/step - loss: 0.4337 - val_loss: 0.3991\n", "Epoch 6/100\n", "242/242 [==============================] - 0s 751us/step - loss: 0.4263 - val_loss: 0.4031\n", "Epoch 7/100\n", "242/242 [==============================] - 0s 743us/step - loss: 0.4385 - val_loss: 0.4043\n", "Epoch 8/100\n", "242/242 [==============================] - 0s 780us/step - loss: 0.4301 - val_loss: 0.3929\n", "Epoch 9/100\n", "242/242 [==============================] - 0s 792us/step - loss: 0.4108 - val_loss: 0.4040\n", "Epoch 10/100\n", "242/242 [==============================] - 0s 764us/step - loss: 0.4200 - val_loss: 0.3886\n", "Epoch 11/100\n", "242/242 [==============================] - 0s 745us/step - loss: 0.4099 - val_loss: 0.3999\n", "Epoch 12/100\n", "242/242 [==============================] - 0s 740us/step - loss: 0.3897 - val_loss: 0.4085\n", "Epoch 13/100\n", "242/242 [==============================] - 0s 765us/step - loss: 0.4265 - val_loss: 0.3922\n", "Epoch 14/100\n", "242/242 [==============================] - 0s 752us/step - loss: 0.4108 - val_loss: 0.3918\n", "Epoch 15/100\n", "242/242 [==============================] - 0s 731us/step - loss: 0.4070 - val_loss: 0.3886\n", "Epoch 16/100\n", "242/242 [==============================] - 0s 737us/step - loss: 0.4032 - val_loss: 0.3933\n", "Epoch 17/100\n", "242/242 [==============================] - 0s 774us/step - loss: 0.4212 - val_loss: 0.3907\n", "<<2367 more lines>>\n", "363/363 [==============================] - 0s 622us/step - loss: 0.3312 - val_loss: 0.5455\n", "Epoch 12/100\n", "363/363 [==============================] - 0s 727us/step - loss: 0.3456 - val_loss: 0.6470\n", "Epoch 13/100\n", "363/363 [==============================] - 0s 742us/step - loss: 0.3320 - val_loss: 0.3109\n", "Epoch 14/100\n", "363/363 [==============================] - 0s 697us/step - loss: 0.3259 - val_loss: 0.3198\n", "Epoch 15/100\n", "363/363 [==============================] - 0s 662us/step - loss: 0.3222 - val_loss: 0.3065\n", "Epoch 16/100\n", "363/363 [==============================] - 0s 748us/step - loss: 0.3277 - val_loss: 0.3252\n", "Epoch 17/100\n", "363/363 [==============================] - 0s 724us/step - loss: 0.3095 - val_loss: 0.3965\n", "Epoch 18/100\n", "363/363 [==============================] - 0s 703us/step - loss: 0.3107 - val_loss: 0.2997\n", "Epoch 19/100\n", "363/363 [==============================] - 0s 706us/step - loss: 0.3060 - val_loss: 0.3079\n", "Epoch 20/100\n", "363/363 [==============================] - 0s 704us/step - loss: 0.3003 - val_loss: 0.4544\n", "Epoch 21/100\n", "363/363 [==============================] - 0s 698us/step - loss: 0.3090 - val_loss: 0.3274\n", "Epoch 22/100\n", "363/363 [==============================] - 0s 709us/step - loss: 0.2949 - val_loss: 0.5018\n", "Epoch 23/100\n", "363/363 [==============================] - 0s 715us/step - loss: 0.3126 - val_loss: 0.5565\n", "Epoch 24/100\n", "363/363 [==============================] - 0s 702us/step - loss: 0.3031 - val_loss: 0.5390\n", "Epoch 25/100\n", "363/363 [==============================] - 0s 698us/step - loss: 0.2992 - val_loss: 0.3339\n", "Epoch 26/100\n", "363/363 [==============================] - 0s 719us/step - loss: 0.2988 - val_loss: 0.5095\n", "Epoch 27/100\n", "363/363 [==============================] - 0s 716us/step - loss: 0.3001 - val_loss: 0.6597\n", "Epoch 28/100\n", "363/363 [==============================] - 0s 721us/step - loss: 0.3058 - val_loss: 0.5106\n" ] }, { "data": { "text/plain": [ "RandomizedSearchCV(cv=3,\n", " estimator=,\n", " param_distributions={'learning_rate': [0.001683454924600351,\n", " 0.02390836445593178,\n", " 0.008731907739399206,\n", " 0.004725396149933917,\n", " 0.0006154014789262348,\n", " 0.0006153331256530192,\n", " 0.0003920021771415983,\n", " 0.01619845322936229,\n", " 0.004779156784872302,\n", " 0.0...\n", " 0.005021425736625637,\n", " 0.0005703073595961105,\n", " 0.001151888789941251,\n", " 0.001621231156394198,\n", " 0.0024505367684280487,\n", " 0.011155092541719619,\n", " 0.0007524347058135697,\n", " 0.0032032448128444043,\n", " 0.004591455636549438,\n", " 0.0003715541189658278, ...],\n", " 'n_hidden': [0, 1, 2, 3],\n", " 'n_neurons': [1, 2, 3, 4, 5, 6, 7, 8, 9,\n", " 10, 11, 12, 13, 14, 15,\n", " 16, 17, 18, 19, 20, 21,\n", " 22, 23, 24, 25, 26, 27,\n", " 28, 29, 30, ...]},\n", " verbose=2)" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.stats import reciprocal\n", "from sklearn.model_selection import RandomizedSearchCV\n", "\n", "param_distribs = {\n", " \"n_hidden\": [0, 1, 2, 3],\n", " \"n_neurons\": np.arange(1, 100) .tolist(),\n", " \"learning_rate\": reciprocal(3e-4, 3e-2) .rvs(1000).tolist(),\n", "}\n", "\n", "rnd_search_cv = RandomizedSearchCV(keras_reg, param_distribs, n_iter=10, cv=3, verbose=2)\n", "rnd_search_cv.fit(X_train, y_train, epochs=100,\n", " validation_data=(X_valid, y_valid),\n", " callbacks=[keras.callbacks.EarlyStopping(patience=10)])" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'n_neurons': 74, 'n_hidden': 3, 'learning_rate': 0.005803602934201024}" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rnd_search_cv.best_params_" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-0.32039451599121094" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rnd_search_cv.best_score_" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rnd_search_cv.best_estimator_" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "162/162 [==============================] - 0s 436us/step - loss: 0.3029\n" ] }, { "data": { "text/plain": [ "-0.3028871417045593" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rnd_search_cv.score(X_test, y_test)" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = rnd_search_cv.best_estimator_.model\n", "model" ] }, { "cell_type": "code", "execution_count": 106, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "162/162 [==============================] - 0s 446us/step - loss: 0.3029\n" ] }, { "data": { "text/plain": [ "0.3028871417045593" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.evaluate(X_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercise solutions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. to 9." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "See appendix A." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 10." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Exercise: Train a deep MLP on the MNIST dataset (you can load it using `keras.datasets.mnist.load_data()`. See if you can get over 98% precision. Try searching for the optimal learning rate by using the approach presented in this chapter (i.e., by growing the learning rate exponentially, plotting the loss, and finding the point where the loss shoots up). Try adding all the bells and whistles—save checkpoints, use early stopping, and plot learning curves using TensorBoard.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's load the dataset:" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [], "source": [ "(X_train_full, y_train_full), (X_test, y_test) = keras.datasets.mnist.load_data()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Just like for the Fashion MNIST dataset, the MNIST training set contains 60,000 grayscale images, each 28x28 pixels:" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(60000, 28, 28)" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train_full.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each pixel intensity is also represented as a byte (0 to 255):" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dtype('uint8')" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train_full.dtype" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's split the full training set into a validation set and a (smaller) training set. We also scale the pixel intensities down to the 0-1 range and convert them to floats, by dividing by 255, just like we did for Fashion MNIST:" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [], "source": [ "X_valid, X_train = X_train_full[:5000] / 255., X_train_full[5000:] / 255.\n", "y_valid, y_train = y_train_full[:5000], y_train_full[5000:]\n", "X_test = X_test / 255." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's plot an image using Matplotlib's `imshow()` function, with a `'binary'`\n", " color map:" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.imshow(X_train[0], cmap=\"binary\")\n", "plt.axis('off')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The labels are the class IDs (represented as uint8), from 0 to 9. Conveniently, the class IDs correspond to the digits represented in the images, so we don't need a `class_names` array:" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([7, 3, 4, ..., 5, 6, 8], dtype=uint8)" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_train" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The validation set contains 5,000 images, and the test set contains 10,000 images:" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(5000, 28, 28)" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_valid.shape" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(10000, 28, 28)" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_test.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's take a look at a sample of the images in the dataset:" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [ { "data": { "image/png": "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AAgiamEn4wuZfZTFno0bN2bkyJEAtG3bFvBziFevXg0E11rJl0y3kniTJk2K+v9JJ53ECy+8kOPzu3TpAkC1atWAYD1HJFncVlj5PvPISe3RRx8FgsTVwpADROzatcuGemUqRaYBJk2alBZTrpKGsHTpUiC4KFStWtUOOuViMmDAAO68886o50nqgkzjQ7B6+uqrr0508+Pqu+++s0nwQqYDH3nkkXxdEOfPnw/4K/p+//33+DfSkc8++wyAxx9/3D4m9f7kvbfffjqRITfCb731FuAPpDp06OCySUkng8jIgcGRRx4J+DfyTZs2zfF7s6YxHH744fbCmw5+++23qI/pbu/evfY4kHqpkSSd67XXXgOw6XGRzjrrLMCvSTxhwgT7ugBbt26lcePG8W94guzevZsrr7wSCIId8n4YN25ctsoatWvXttcg+T2lUs3777+flDYni7wnJAiW379r/fr1AT8FrkmTJlFfK8p4EHRqXimllFJKOZLviOgrr7wCBCNfmULP6S763//+NxAsPMnNBx98YEPDP/30EwAff/wx4E+3SZJxKk/Ty92VRPIkCho5BS8RzmeeecZGOSUiOnXqVCC6tFOq1hMdPnw4O3fuBKBEiRIAvPHGGwD5nh6UKevffvvNRnfyc6yFnaQXSJT3nHPOsVNLGgkNyKyKfNxvv/3SKqKXH7J4wPM8mjVrBsDMmTOB2Av3/vzzT8BftCFT13L+kfNLOqtRowbgR7/Szfz58xkwYEDMr5144om8+eabQO4L0SRKOHbsWLuYTXZsSxW7d+8G/NQmiYTKWEXKWclxkJWMcdauXQsEswY7duygbNmyiWt0kkmqjqQJvvzyy7acVSySknHbbbcBsH37dltSUCLtRb026ZVNKaWUUko5ke+I6Icffghg9x+VJN94lPpo2bKlLZkgeSqSS/nxxx/baGnfvn2L/LNca9CgQY5fk+jEkUceaXN4JKk6MvohkeFULWj/5Zdf2s/bt28PQOvWre1jkpeUNZcY/GLEQFT5mc6dOwNQt27deDc16b799tuo/1911VXUqlXLUWvCS3LdlD9LIueHyEiozF4tXLgQgEsuuQTwz62Say7n23Qj581IEhk7/vjjk92chJFcTolQRTrxxBMB/9qddW/wdCWR3xEjRtjZRJklyCkSKiIXVEOwoUo6RUMBG/1cvnw54G+WI6W+pHzTnDlz7DEl19wdO3bY15AZ6//+978AdoazsDQiqpRSSimlnMh3RPSII46I+hhvsu+vrKaWAqsQRAPTISIq5syZA/jRCYlsSh7psmXL7N7hGzZsAIIVbtWqVeOdd95JdnMTRnJ6xBdffGFznfKzWrFGjRq2wkAqmzFjBgC//PILEOT/nn322c7aFGbr16933YRQkdIqkSQSGqv8jMxExFphnQ5ibfaRDjnkQqJUcu6TvEYI8vYkOljQaOiKFSuiol8ABxxwgL1Gh9HmzZsBuPXWWwF/i0opUH/QQQfl+f3r16/n1VdfTVwDQ0QixVIisGvXrra0lXzMbUOM//u//6Ndu3ZAsJK+Z8+eRRqfpU/huBQj9VifeeaZbDsreZ5nB6DyNZmO7927d7bSE6nm9ttvp0ePHkAQ4j/11FMBf8q9IKUgrrrqqmylJFJR1sUi559/PhB7n/Dc/PPPP7qoKUPI1CEEg4+jjz4a8C8QWS+sMiDp3bs39913H5C/Wr3pIp3SECQdKXIAKqSebmHT5p5++ml7/RG1atWyx1gYSb1TWezcvHlzzjjjjByfL+lf48aNA/x913/44YeEtjEsJAiW33rUrVq1ArC7+R122GFxT/XQK5ZSSimllHIiNBHRp556CghKBUSSRFhZ5NKiRYvkNSzBIiNesT6Xu1C5e0n1aCjAzz//bD+X3UAkMgrBYgIpM7F27Voee+yxmK+VLrteZC28HavgdCyffvopgJ2GWrNmjS1DUrly5Ti2MDz++uuvbGVlclsEmK6ee+45AJo0aWKnUmXxwCeffJItmi7voauuuiqJrUy+CRMm2AiZKFeuHMWKFXPUoviaMmWKXcwrypYtywknnAAUPvIraUFSRjBSUfcST7bVq1fb82DWsm5vvPGG3blRjpO6dety++23A/5CJ8h7cVOqmT59OhCUCJSF57F4nmfPF7KjX24iN9opDI2IKqWUUkopJ5IWEZXFBRMnToxZWiO3xQdyty95hFnvdlPRRRddBMCqVavYtGkTEJSs2r59u32e5HKlQyRUXH755dm2GBRdu3a1+yFLBGPYsGHZnif7JJ955pkJamXy/P7777Y8Wn7s2LHDzgpIZDCy1JVsxyv5T+lmx44d2fYQP+200xy1JvmkGL3kmecUjZDHZZFOukdCpfzOc889l20R5E033ZQ2ZdB++umnbKXtmjRpwnvvvVek13322WeB6DI9kgso0cKwqlevHhAswLn33nvtHumxyDVGFkdfc801dq95iYhK+at0sGHDBm688UYA+3vKjEnJkiXt9shS9P+PP/6gTJky+X79gq5lyCphA9EPPvgACKbTR48eDRRtp4bLL7+86A0LCZlyj0wAl4Fo//79bRhdVqLJSvlUrR0aqXbt2txxxx35fn6sOm433HADkP+dmMJsz549UTcfOZk0aRLgr2xctmxZjs9Lhxu13MS6aZVV4Onqhx9+sOc/qaErJ//Ii8D//d//AX5dXtmL/qOPPgKCKhRSAzrdyEA0ssawDKQOO+wwF01Kmo4dOxb6e+WGRRbwRJI0qTZt2hT69ZNB3gP33HMPAI0aNbLXUCFT7V26dIlZS1aqAsguZVKrOKcdq1KBDDqPPvpoe12QRWzye11++eU2FaxXr16An+olVRcuu+wyIPfdk6699toitVOn5pVSSimllBNxDSetWLEC8MPcchceyyGHHAJApUqV7GMSIpdyIpIgGxn5SZWE6Y0bNwJByaX8kgUXr732mi09IbtCyL65ffr0iVMrU0fknZh8fvjhh7tqTtyVKVOGI488EiBbpHPr1q28/PLLAFx99dX5er1033NdzhUQ1FlNp9SVSLLgolu3btmmm8Vxxx1nF6hIRKNy5cp2alIW9MnUXKwam+kg1u4uco2RnfvS1b///e9Cf+9bb70FBGlgkSQdLtV06dIl16n5WLZt2wYEC0fzu2A0zAYPHgz4s2SSmiKLkGLV1ZVF4z/++CNvvPEGEKQAyc5ssch5p7A0IqqUUkoppZyIS0RUFh9JwdMffviBcuXKAf6ODBDsYVqzZk2bBCyR0Vjk+yDIaUiFXWbmzJlj8zolwin7AReE7JghycO55QSmu8hyIqeffjrgFyxOF2XLlrXHivydBw4cCPhJ5lKkOT+aNWtm9xJOV5ELuyTilS6leYS877t16wb4O5BJAXvZM132hz7llFNiLv6TXDcp1zJ06FDA371McknTiUR8I8kOMOnurrvuiiqBl5dNmzbZ8l+ywCeS5NReeuml8WlgCpCZTCkvKOUDU9nrr79uP5fIpiz0zU3Hjh3t4jfZcz63iGhRaURUKaWUUko5EZeIqBTVli2yOnToYKOCBd0WTPZHXrVqlX1MVj7KXuxhJHdTPXv2pHr16kDhIqHgl8/o2bMnUPRCsalMVvlt3brVPpauObLy95aVil988UW+vk9Wi0ppnkGDBsXcdzwd/Prrr0CwCUI6W7RoEYDNCz3kkEPsqvf85kdLiZ/PP/8c8KszRH5MF3Lu/f333+1jktsos3Tpbv369Xa7z1hlqiTKJ5UURo0axZo1a3J8PanQUbdu3Ti3NLxmzZoV9f90qFAj4wfP8wq0wUmXLl3sTLds9yrX4QoVKsS5lXEaiMquLjJlVJRyBytXrgSCiw6kRo3AadOmAf7UauvWrQv1GkuWLAH8fYRlilYGGpm4c4wMxlatWmWnHtN1tyBZnCaDSNnlJCeyn7TUo02FtJWiksVaUqYHgt8/XcmF5Pzzzy/QAr2tW7dy/vnnA0HZpnQlU9KRu/JJDUQp77Znz560KPUG/nS5LGD8+uuvAVi+fLkdfMc6R27evBkIrq+xSKpc165dadKkSVzbnAqy7m6XDiTFYtOmTTz00ENAkNKT2/mkWLFi9por51uZqpfzSqR33323SGkwOjWvlFJKKaWciMstotyBxaPwq0zzi4oVK9ri5WHWsmVLwI9gSEFlKbnUsGFDuxOOkNSDuXPnMnXqVCDYC9bzPBsJlanoWIn46a537972c1n89q9//ctVc5zo0aOHXXRyxRVXAH4Jq3Qv0RRJphBlcwwIZknSdTHK0UcfDQTl7CKnmPv37w9gFy9BEPGSmZSLLrrITsfKuaRRo0ZAei30y8mMGTOAoJTZwIEDY5YnSkUHHXSQvdbKjMDu3btt+cT8KlGiBBCkvEmUVUrJqdQnGx18/vnndqc9KQknUe9Y59BHH33UpsZJisI555yT48+55ZZbNCKqlFJKKaVST2iSZpo2bQoE21yK008/nRNOOMFFkwpE7irPO+88G9mU0ivGmGwFtyVasWnTJpsHFrlVn9zxpkI0OFEiC3hLhChTSNHhXr16pV1pooKSZHlZjAFBgfKi7nEcVhJdeOCBBwD/PCA5XmPHjgWiF4LKxhfynomcVTnuuOOAYC/xdIumy4yclPyL3OJWon7pss+8kNJCMtO2ePHiqNzpvDRq1MiWbbrgggvi3r50IGteUpksgn3kkUfseVS2k5ZFjPIxUuT5Q947smg8lqLOVIZmICq1EmVFp5xUUm2V9NNPP20HmZHJ8/K5/HEjB5+SWC+D2X79+nHeeeclrc2pIFMGY7H2UVfRWrZsSYcOHVw3IynknNCgQQM70JBjJLJGYFYNGjTg4osvBuC2224DiFlrNB1ImoakL1x66aU2nUWqtySyBqJL8+bNA2DdunW2TqTskS4DjGHDhmU7f15wwQW51vFWUL9+fddNKDJJ35k/f769EZVA2XfffZfj97Vq1cpO68t5JDdyc1xYOjWvlFJKKaWcMHnUqUxKEctJkybZO9ayZcsCMGbMGIAC7xebRbzn7fLVH5s2bQKC3XEARo8eDfilmSC6RpksREpCiSYn/VFY9erVA/xouURzZKGG7BZTRCnVH0mQiHlu7ZNohe4PKWmXdVHoBx98YGsXy0yKREETIDT9ERLaH9FStj8efPBBAG699VbAT3eAItcvT9n+SJCY/aERUaWUUkop5YTTHFHZIeX++++3ES8pllrESKhTEu0cNWqUfSzyc5U/Ur5p0KBBNj9uv/303kllJol6Sq6XUir+ZOeg8uXLO25J5tCrulJKKaWUcsJpjqiskB85cqRd5di2bdt4/gjNz4im/RFN+yOa5ohmp8dINO2PaNof0bQ/oml/RIvZH6FYrJRAehBE0/6Ipv0RTQei2ekxEk37I5r2RzTtj2jaH9F0sZJSSimllAqPvCKiSimllFJKJYRGRJVSSimllBM6EFVKKaWUUk7oQFQppZRSSjmhA1GllFJKKeWEDkSVUkoppZQTOhBVSimllFJO6EBUKaWUUko5oQNRpZRSSinlhJOBqDGmsjFmmjFmhzFmlTHmIhftCAtjzERjzHpjzFZjzHJjzJWu2+SSMeZ6Y8wCY8xuY8w41+1xyRhT0hjz3L73yTZjzNfGmDNct8sVY8z2LP/2GmMed90ul/R8Gk3fM9kZYxoaYz4yxvxhjFlpjOnkuk2uGWO6GmOW7Hvf/M8Y09J1m1xxfQ4pnswfFuFJ4C+gOtAMeMsYs8jzvO8dtce1YcAVnuftNsY0AGYZY772PO9L1w1zZB0wGGgHlHbcFteKA6uBVsDPwJnAFGNMU8/zfnLZMBc8zysnnxtjygK/Aq+4a1Eo6Pk0mr5nIhhjigOvA08DbfH75U1jTHPP85Y7bZwjxpi2wAjgP8AXwEFuW+Sc03NI0rf43Hfx+B1oIm8CY8wEYK3neXcktTEhZIw5EpgF3Oh53hTHzXHKGDMYqO153mWu2xImxphvgHs9z3vNdVtcMsZ0B+4GDvMydK9iPZ/mTya/Z4wxTYDPgPLyPjHGvAd87nneQKeNc8QY81/gOc/znnPdFtfCcA5xMTV/BLA3y53YIqCxg7aEhjHmKWPMn8BSYD3wtuMmqRAyxlTHfw9larQrUnfghUwdhO6j59M86HsGk8NjTZLdkDAwxhQDjgWq7ktTWGOMecIYk6mzb87PIS4GouWAP7I89gdQ3kFbQsPzvF74fdASmArsdtsiFTbGmBLAi8B4z/OWum6PS8aYOvhTjONdt8UxPZ/mQt8zgB/c2ADcaowpYYw5Hf+9U8Zts5ypDpQAzse/3jYDmgMDHLbJJefnEBcD0e1AhSyPVQC2OWhLqHiet9fzvHlAbeBa1+1R4WGM2Q+YgJ/Hc73j5oRBN2Ce53k/um6IY3o+zYG+Z3ye5/0NnAucBfwC9AWmAGscNsulnfs+Pu553nrP8zYBD+PnEmci5+cQFwPR5UBxY0z9iMeOJnOnTWIpDhzmuhEqHIwxBngO/06+874LS6brhkZDQc+nMel7Jprned94ntfK87wDPc9rBxyKv0gn43ie9zv+IDyTU3oiOT+HJH0g6nneDvyp5/uMMWWNMf8GOuLfuWYcY0y1fWUkyhljihlj2gEXAh+5bpsrxpjixphSQDGgmDGm1L6Vn5lqFNAQOMfzvJ15PTndGWNOBGqhq+X1fJozfc9EMMYcte88WsYYcwv+KvFxjpvl0vNA733X30pAH2CG2ya5EYZziKuC9r3wy/JsACYB12ZwqREPfxp+Df7KtQeBPp7nve60VW4NwJ8+uQO4ZN/nGZm/Y4w5BOiJn8f0S0T9zIvdtsyp7sBUz/Myfvp5Hz2fRtD3TEyX4i+C3QC0Adp6npfJ6xAGAfPxo4FLgK+BIU5b5JbTc0jSyzcppZRSSikFusWnUkoppZRyRAeiSimllFLKCR2IKqWUUkopJ3QgqpRSSimlnNCBqFJKKaWUciKv2oypvqQ+1h67RaH9EU37I5r2R3baJ9G0P6Jpf0TT/oim/REtLftDI6JKKaWUUsoJHYgqpZRSSikndCCqlFJKKaWcyOT9u5VSSqWZf/75h59++inqsXHjxtGsWTMATjjhBAAOOuigJLdMpYIBA/zdpDdt2gRAjx49OO6441w2Ke1pRFQppZRSSjmhEdEkW7BgAQBLliwB4Ndff2XZsmUAzJkzB4Dly5dTu3ZtAO666y4ArrrqqmQ31ZnevXsD8OSTTwLw0Ucf0bp1a4ctUio1SCTwzTffZOrUqQDMmjULAGOyL1j9+OOPAWjVqlVS2pdI8+fPB+D+++/ntddey/Z1z/MXHFerVg3APuekk05KUgtVWC1atMheY7/55hsAdu/ebT9KNL1kyZJO2pcsDz/8MACtW7e2MwbJmDnQiKhSSimllHIi4RFRuQudPHkyAPfee6+NAMZy5JFHAvDhhx8CUL16dYoXT/3A7YwZMwDo1KkTAHv27AGioxTSV8YY1q5dC8D1118f9fxrr702OQ12SPpEPr733ntpHxH95ZdfAHjnnXeAIGK+ePFi3n77bQD69u0LwJlnnknDhg0BKF26NAAHHHAAAHv37uWFF14AYMeOHQD07NmTEiVKJOPXUI7IcXPnnXcCQVQHsr+fIp177rmAHxGqU6dOglsZXzt37gTgkksuAeDdd98F4M8//7TPOeusswA/qrNt2zYAXn75ZQA6duwIwJo1a+z7SGWWfv36Af74JGtesRg3bpx93hFHHJGspiWcjLEeffRRFi1aBMDq1asBqFixoo3+HnLIIQB89tlnCWtLwkZ4//zzDxBMr95www32a/vt5wdiy5YtC/iDLDmpyCBVpqabNGnCBx98APiD0lQl00B79+4FgotC+fLlOfbYY6Oee9RRR7F9+3YAJk6cCMCkSZMAuPLKKzNuUPHdd9/x999/A6Tl7z5+/Hh69OgBxB4syGMPPfQQEEyfABx66KEAdvA5d+5ce9IUrVq1omnTpvFvuHLqr7/+AvzjQQagsY6f3Pzxxx8APPHEE9x///3xbWCCyUBy9uzZQHCTfvbZZ3PiiScCwVRqsWLF7DVJzsGvvvoq4P/ut956a/IaniRyzly9ejX33nsvEJwncnPDDTdw9913A1CpUiWg4MdVmG3fvt2mrTz11FMAbN26NcfnN27cmAoVKiSlbcmwefNmAG6++WbAv75mJecFgC1btgDY99RLL71E3bp149omnZpXSimllFJOGJkOzkGht5N65plnAH9aMFLx4sXt3ZaUSfj555/t3fjo0aOBYCoa/KgowCeffAJQkLuT0GyvJRHOM888EwiiuyNHjrTR31huu+02AB588EHAv3vv1atXYZsRmv7IjUTPJZrueZ69Qytfvnw8f5TT/li3bh0ATZs25ffff/cbFCPy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jDHmFvyVnuMcN8spfc9ko+fUfYwxFY0x7eS8YYy5GL+KwLuu2+aC9ke0fTMGPwLX7uuPivi55ouS1QYXEdEB+FMndwCX7Ps8k3N3AAYB84HlwBLga2CI0xa51R2Y6nneNtcNCQl9z0S7FFiPnyvaBmjred5ut01yTt8z0fScGiiBX/5tI7AJ6A2c63leptbO1P7I7jygPX6frAT2ADcl64ebDF5cqZRSSimlHNIcUaWUUkop5YQORJVSSimllBM6EFVKKaWUUk7oQFQppZRSSjmRVwmYVF/JFO+6YNof0bQ/oml/ZKd9Ek37I5r2RzTtj2jaH9HSsj80IqqUUkoppZzQgahSSimllHJCB6IhtHjxYipXrkzlypXp1asXvXr1wvM8tOarUkoppdKJDkSVUkoppZQTee2slOohuJRKFN65cycA1113Hc8//3zU1/766y8ASpQoUZQfkVL9kQTaH9F0sVJ2eoxES6n++PzzzwGYMGECc+bMAWDXrl0AnH766fZju3btAChZsmRBf0RK9UcSaH9E0/6IpouVlFJKKaVUeCQ9Irp9+3aGDh0KwKWXXgpAw4YN4/1jRErdjcybNw+Ali1b2sdq1KgBwOrVqwEoXjyvilu5Sqn+SIKU7I9XXnmF//znPwBMmTIFgPPPPz8eL60R0exS8hhJoJTojwULFgBw9tlnA7Bx40abY29M9l/hsssuA+C5554r6I9Kif5IIu2PaNof0TQiqpRSSimlwqNI4bXC+PLLL3nooYcAbGQ0023fvh2Axx57LNvXLrzwQqDIkVCVRgYNGhQzqqOU8nNAzzvvPMCPhAL83//9HxdddBEAXbt2BbB5+K+++irjxo0DghzRp556KplNViqjORndyMKb8ePHA9C9e3cXzQiNmTNnAv6Uq6hXrx4A1157rZM2JdKzzz5rf2f5/U477bRcv2fNmjUAfPjhh0BmHjOTJk0CYMWKFY5bklxPPPEEAL179wagQYMGHHjggUCQzpJJPv30UwD+/e9/A9CiRQtef/11AGrWrOmsXa7t2LED8KfZ165dC0DFihUBGDJkCKeeemrU82+77TYAevToQYcOHQB45513ANiyZYv9XuVbsmRJ1P8TmFIXF9u2bQOCgNehhx4KwLfffmuf89577wFQqlQpFi1alONr9ezZE4BHH30UKNSittD68ssv7edDhgwB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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "n_rows = 4\n", "n_cols = 10\n", "plt.figure(figsize=(n_cols * 1.2, n_rows * 1.2))\n", "for row in range(n_rows):\n", " for col in range(n_cols):\n", " index = n_cols * row + col\n", " plt.subplot(n_rows, n_cols, index + 1)\n", " plt.imshow(X_train[index], cmap=\"binary\", interpolation=\"nearest\")\n", " plt.axis('off')\n", " plt.title(y_train[index], fontsize=12)\n", "plt.subplots_adjust(wspace=0.2, hspace=0.5)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's build a simple dense network and find the optimal learning rate. We will need a callback to grow the learning rate at each iteration. It will also record the learning rate and the loss at each iteration:" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [], "source": [ "K = keras.backend\n", "\n", "class ExponentialLearningRate(keras.callbacks.Callback):\n", " def __init__(self, factor):\n", " self.factor = factor\n", " self.rates = []\n", " self.losses = []\n", " def on_batch_end(self, batch, logs):\n", " self.rates.append(K.get_value(self.model.optimizer.learning_rate))\n", " self.losses.append(logs[\"loss\"])\n", " K.set_value(self.model.optimizer.learning_rate, self.model.optimizer.learning_rate * self.factor)" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [], "source": [ "keras.backend.clear_session()\n", "np.random.seed(42)\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [], "source": [ "model = keras.models.Sequential([\n", " keras.layers.Flatten(input_shape=[28, 28]),\n", " keras.layers.Dense(300, activation=\"relu\"),\n", " keras.layers.Dense(100, activation=\"relu\"),\n", " keras.layers.Dense(10, activation=\"softmax\")\n", "])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will start with a small learning rate of 1e-3, and grow it by 0.5% at each iteration:" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [], "source": [ "model.compile(loss=\"sparse_categorical_crossentropy\",\n", " optimizer=keras.optimizers.SGD(learning_rate=1e-3),\n", " metrics=[\"accuracy\"])\n", "expon_lr = ExponentialLearningRate(factor=1.005)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's train the model for just 1 epoch:" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1719/1719 [==============================] - 2s 1ms/step - loss: 4.6604 - accuracy: 0.4887 - val_loss: 2.3911 - val_accuracy: 0.1126\n" ] } ], "source": [ "history = model.fit(X_train, y_train, epochs=1,\n", " validation_data=(X_valid, y_valid),\n", " callbacks=[expon_lr])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now plot the loss as a function of the learning rate:" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Loss')" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(expon_lr.rates, expon_lr.losses)\n", "plt.gca().set_xscale('log')\n", "plt.hlines(min(expon_lr.losses), min(expon_lr.rates), max(expon_lr.rates))\n", "plt.axis([min(expon_lr.rates), max(expon_lr.rates), 0, expon_lr.losses[0]])\n", "plt.grid()\n", "plt.xlabel(\"Learning rate\")\n", "plt.ylabel(\"Loss\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The loss starts shooting back up violently when the learning rate goes over 6e-1, so let's try using half of that, at 3e-1:" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [], "source": [ "keras.backend.clear_session()\n", "np.random.seed(42)\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [], "source": [ "model = keras.models.Sequential([\n", " keras.layers.Flatten(input_shape=[28, 28]),\n", " keras.layers.Dense(300, activation=\"relu\"),\n", " keras.layers.Dense(100, activation=\"relu\"),\n", " keras.layers.Dense(10, activation=\"softmax\")\n", "])" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [], "source": [ "model.compile(loss=\"sparse_categorical_crossentropy\",\n", " optimizer=keras.optimizers.SGD(learning_rate=3e-1),\n", " metrics=[\"accuracy\"])" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'./my_mnist_logs/run_001'" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "run_index = 1 # increment this at every run\n", "run_logdir = os.path.join(os.curdir, \"my_mnist_logs\", \"run_{:03d}\".format(run_index))\n", "run_logdir" ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/100\n", "1719/1719 [==============================] - 3s 2ms/step - loss: 0.4195 - accuracy: 0.8677 - val_loss: 0.0995 - val_accuracy: 0.9724\n", "Epoch 2/100\n", "1719/1719 [==============================] - 2s 882us/step - loss: 0.0941 - accuracy: 0.9698 - val_loss: 0.0913 - val_accuracy: 0.9746\n", "Epoch 3/100\n", "1719/1719 [==============================] - 1s 845us/step - loss: 0.0650 - accuracy: 0.9792 - val_loss: 0.0785 - val_accuracy: 0.9772\n", "Epoch 4/100\n", "1719/1719 [==============================] - 2s 932us/step - loss: 0.0438 - accuracy: 0.9855 - val_loss: 0.0793 - val_accuracy: 0.9784\n", "Epoch 5/100\n", "1719/1719 [==============================] - 1s 832us/step - loss: 0.0348 - accuracy: 0.9888 - val_loss: 0.0724 - val_accuracy: 0.9812\n", "Epoch 6/100\n", "1719/1719 [==============================] - 1s 835us/step - loss: 0.0289 - accuracy: 0.9905 - val_loss: 0.0814 - val_accuracy: 0.9792\n", "Epoch 7/100\n", "1719/1719 [==============================] - 1s 868us/step - loss: 0.0230 - accuracy: 0.9926 - val_loss: 0.0794 - val_accuracy: 0.9808\n", "Epoch 8/100\n", "1719/1719 [==============================] - 1s 847us/step - loss: 0.0180 - accuracy: 0.9943 - val_loss: 0.0718 - val_accuracy: 0.9826\n", "Epoch 9/100\n", "1719/1719 [==============================] - 1s 848us/step - loss: 0.0158 - accuracy: 0.9949 - val_loss: 0.0874 - val_accuracy: 0.9798\n", "Epoch 10/100\n", "1719/1719 [==============================] - 1s 844us/step - loss: 0.0155 - accuracy: 0.9944 - val_loss: 0.0782 - val_accuracy: 0.9824\n", "Epoch 11/100\n", "1719/1719 [==============================] - 1s 834us/step - loss: 0.0089 - accuracy: 0.9971 - val_loss: 0.0902 - val_accuracy: 0.9832\n", "Epoch 12/100\n", "1719/1719 [==============================] - 1s 844us/step - loss: 0.0064 - accuracy: 0.9979 - val_loss: 0.0832 - val_accuracy: 0.9832\n", "Epoch 13/100\n", "1719/1719 [==============================] - 1s 859us/step - loss: 0.0059 - accuracy: 0.9981 - val_loss: 0.0888 - val_accuracy: 0.9814\n", "Epoch 14/100\n", "1719/1719 [==============================] - 2s 919us/step - loss: 0.0110 - accuracy: 0.9963 - val_loss: 0.1080 - val_accuracy: 0.9792\n", "Epoch 15/100\n", "1719/1719 [==============================] - 2s 921us/step - loss: 0.0075 - accuracy: 0.9973 - val_loss: 0.0828 - val_accuracy: 0.9840\n", "Epoch 16/100\n", "1719/1719 [==============================] - 2s 945us/step - loss: 0.0039 - accuracy: 0.9991 - val_loss: 0.0869 - val_accuracy: 0.9848\n", "Epoch 17/100\n", "1719/1719 [==============================] - 2s 962us/step - loss: 0.0064 - accuracy: 0.9982 - val_loss: 0.0997 - val_accuracy: 0.9816\n", "Epoch 18/100\n", "1719/1719 [==============================] - 2s 976us/step - loss: 0.0071 - accuracy: 0.9979 - val_loss: 0.1001 - val_accuracy: 0.9840\n", "Epoch 19/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0086 - accuracy: 0.9972 - val_loss: 0.1239 - val_accuracy: 0.9796\n", "Epoch 20/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0095 - accuracy: 0.9973 - val_loss: 0.1107 - val_accuracy: 0.9808\n", "Epoch 21/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0055 - accuracy: 0.9981 - val_loss: 0.0891 - val_accuracy: 0.9840\n", "Epoch 22/100\n", "1719/1719 [==============================] - 2s 967us/step - loss: 0.0041 - accuracy: 0.9988 - val_loss: 0.0893 - val_accuracy: 0.9844\n", "Epoch 23/100\n", "1719/1719 [==============================] - 2s 963us/step - loss: 6.1009e-04 - accuracy: 0.9999 - val_loss: 0.0899 - val_accuracy: 0.9848\n", "Epoch 24/100\n", "1719/1719 [==============================] - 2s 972us/step - loss: 8.4212e-05 - accuracy: 1.0000 - val_loss: 0.0894 - val_accuracy: 0.9862\n", "Epoch 25/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 6.0306e-05 - accuracy: 1.0000 - val_loss: 0.0899 - val_accuracy: 0.9858\n", "Epoch 26/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 4.9564e-05 - accuracy: 1.0000 - val_loss: 0.0903 - val_accuracy: 0.9860\n", "Epoch 27/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 4.3609e-05 - accuracy: 1.0000 - val_loss: 0.0906 - val_accuracy: 0.9862\n", "Epoch 28/100\n", "1719/1719 [==============================] - 2s 973us/step - loss: 4.2216e-05 - accuracy: 1.0000 - val_loss: 0.0911 - val_accuracy: 0.9862\n" ] } ], "source": [ "early_stopping_cb = keras.callbacks.EarlyStopping(patience=20)\n", "checkpoint_cb = keras.callbacks.ModelCheckpoint(\"my_mnist_model.h5\", save_best_only=True)\n", "tensorboard_cb = keras.callbacks.TensorBoard(run_logdir)\n", "\n", "history = model.fit(X_train, y_train, epochs=100,\n", " validation_data=(X_valid, y_valid),\n", " callbacks=[checkpoint_cb, early_stopping_cb, tensorboard_cb])" ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "313/313 [==============================] - 0s 701us/step - loss: 0.0804 - accuracy: 0.9806\n" ] }, { "data": { "text/plain": [ "[0.08043695986270905, 0.9805999994277954]" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = keras.models.load_model(\"my_mnist_model.h5\") # rollback to best model\n", "model.evaluate(X_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We got over 98% accuracy. Finally, let's look at the learning curves using TensorBoard:" ] }, { "cell_type": "code", "execution_count": 128, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%tensorboard --logdir=./my_mnist_logs --port=6006" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.10" }, "nav_menu": { "height": "264px", "width": "369px" }, "toc": { "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 6, "toc_cell": false, "toc_section_display": "block", "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }