{ "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", " Run in Google Colab\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", "\n", "# Ignore useless warnings (see SciPy issue #5998)\n", "import warnings\n", "warnings.filterwarnings(action=\"ignore\", message=\"^internal gelsd\")" ] }, { "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": "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\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.0.0-dev20190606'" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tf.__version__" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2.2.4-tf'" ] }, "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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BQUF3r4II3d6l7nqmufqC5mLPHVdmGaqiFJJSUnO411uwxbfISIiIiIiIiIiIiKPkXcMb1j4Wt7BHnvsAbi96LWrj/JitIjAGOPZ35DNzSxLphys+vp6n8+mDQ0qKyu9t57PDG+4sC9zNzV5Q21tbVmsYEtLS1ZelXJx6uvrvdzCjS2EXB58RERExECDciw11oUb02TOI0VFRf4zjandwUT1BXKN7ZMnT06bYyHFXoZscBhR1ByUuciooKAg6zvyvVzbqaeeCqQ2i2hsbPRsrMqMiaWtra315QFlW1RUVPh8Xi0m1UYVIRRxOe+883jwwQd7oildht5ZuIlGaFuEfaGjazcFoQ6pzzU3N/v1F1p3sCWIDG9ERERERERERMSARt4xvPKOw1I58+bNA+C2227zK6W1MltMbGNjo6/wIK9iypQp3msIPS5wHsSBBx6Y9t3Nzc3emw33Vs83TJs2DXArwzO3kpXHHDLkYoRbWlp8/pA2BBDWrFnjc7U2dUV2RERExECA5p3i4mI+//nPA/DAAw8AqfzKwsLCnJsqKM9T5fHC6hi5WK98RZhvKbZ63bp1nsFTVRhFAMvLy7MqOIQsbiZ729DQ4Odt5YDme76zqrUoF3evvfbiqaeeAsiq1tDa2sr9998PpKo0tLa2ct555wH4YypJWFtbyxFHHAHAxRdfDKRKQOYTVEklrFCi6i3QfSx9yBqrxOSkSZO8PoWVIboK00cK1+GXKnRw1VVX+RqohxxyCODqgPYkLrvsMi90pVF0UCaku+P6XX4JCqGo/JJKd9TX13tDV4NXW1ubT9+Q4a/FP6NGjfIDdhfQE3kO+T0Sbhx5oyN5giiPdER5pKNP5ZErZUtz0TPPPAO4esovv/wykCqLuf/++3vjV4slRSq0trZuicHb6/IIUzaEiy++2NdKDndXBGegyNCV8dfa2pozFQTcIq1bb7017f65Fsp1gLzoL4sXL87aifKWW24BnKOTueDsnHPO8WkRqhn/pS99yR9XrXgZkJthPOaFPCBv0h036ctjSkNERERERERERMSARl8xvBERERERERERERG9gsjwRkREREREREREDGhEgzciIiIiIiIiImJAIxq8ERERERERERERAxrR4I2IiIiIiIiIiBjQiAZvRERERERERETEgEY0eCMiIiIiIiIiIgY0osEbEREREREREREx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WZkTGOLwww9v1zmqq53AFMuXO1G8hg8fjpwcZwo2cODAjlwOkEH1g/e1evVqAMArr7wCALj44oux777xwTtmzZqFjz/+GABw+eWXAwD22WcfdALtKg9VeBVFURRFUZSsJl02vLrajEfLIxEtk3g6VB4bN24EANx5550oLXUymZoqLuH/rdZESLZty/+p8Obm5gJwFMDrrnMSMPXp06ej169tJp60lMfdd98NAIhGnVjugwYNQjAYBAA888wzAICDD3YSc40fP14U24KCAgDA5MmT8etf/xoAcNJJJwEAPv30Uzn/fvvtB8BRezuI1o94tDziSXl51NXVYf369QAgbaRXr15obm4G4LYXKr3HHHMMHn/8cQBAKORkSx41ahQGDXIyAVPRXLVqFQBgwIAB2LzZSYzW2NgIwGmPffu2laVZyIj6cf311+PLL78E4I4527Ztk1cqvN27O0k9bdtGZaWTKO7II51s9VR8FyxYgFGjRgFwdyHNsWo3tKs80mXSoChpgQs8y0psHx999BEAoLa2FoBjAtCjh5Mxc/BgJ4Njv3792jy333nTATufvn37yrXTpIGTndzcXOloObkFIB06J7X8e/v27di6dWvcZ0rmwufMwXrVqlUyuIwbNw4AsNdee6GlpQUAcO211wJwzGAAYPHixdh///0BAE899RQAZ5C+9FInFwHbCye50WgUVVVVACCvAwbEZaxWlC7D5s2bUVjoJJDs2dPJfhyNRqXvu+giJ+fCvffeC8BZ+K1duxaAY/rA42k+9N133wGAjCmhUAglJSUAgB07dgAAKioq2jvhTSscN6ZPn47iYifZHSepbPO5ubk47zwnseCCBQsAAOvXrxcBpqKiIu6cV199Nd5++20AHZrodgg1aVAURVEURVGyGlV4lR8M0WhU1C4yf/58/PvfTibRnTt3AnC3b4cOHSqOPFyBFxUVYfTo0QCACy5wUtRT1c0UdRdwzRAKCgrk/1S3zTKg04TXtAFwlV0ek5OTI+r3D5m2dgkAYOXKlQCA1157DQAwZcqU1FyYB29dX7hwoTjHfPXVVwCAfffdV+r4XnvtBcB1RluzZo046xx66KEAgKuuukq2ZHn+SCQCwGlfbDt0zOnbt68c51WcFSUTYV/f0NAgai7reCAQECcttpenn34aALB27Vr5Lhk5ciSKiooAuPWfSm8sFpM+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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_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": "stderr", "output_type": "stream", "text": [ "WARNING: Logging before flag parsing goes to stderr.\n", "W0611 09:32:55.423388 140735810999168 deprecation.py:323] From /Users/ageron/miniconda3/envs/tf2/lib/python3.6/site-packages/tensorflow/python/ops/math_grad.py:1251: add_dispatch_support..wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Use tf.where in 2.0, which has the same broadcast rule as np.where\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Train on 55000 samples, validate on 5000 samples\n", "Epoch 1/30\n", "55000/55000 [==============================] - 3s 62us/sample - loss: 0.7217 - accuracy: 0.7661 - val_loss: 0.4972 - val_accuracy: 0.8366\n", "Epoch 2/30\n", "55000/55000 [==============================] - 3s 51us/sample - loss: 0.4839 - accuracy: 0.8323 - val_loss: 0.4459 - val_accuracy: 0.8482\n", "Epoch 3/30\n", "55000/55000 [==============================] - 3s 55us/sample - loss: 0.4392 - accuracy: 0.8471 - val_loss: 0.4035 - val_accuracy: 0.8648\n", "Epoch 4/30\n", "55000/55000 [==============================] - 3s 52us/sample - loss: 0.4131 - accuracy: 0.8546 - val_loss: 0.3964 - val_accuracy: 0.8638\n", "Epoch 5/30\n", "55000/55000 [==============================] - 3s 51us/sample - loss: 0.3923 - accuracy: 0.8632 - val_loss: 0.3740 - val_accuracy: 0.8700\n", "Epoch 6/30\n", "55000/55000 [==============================] - 3s 50us/sample - loss: 0.3768 - accuracy: 0.8668 - val_loss: 0.3709 - val_accuracy: 0.8702\n", "Epoch 7/30\n", "55000/55000 [==============================] - 3s 51us/sample - loss: 0.3625 - accuracy: 0.8717 - val_loss: 0.3698 - val_accuracy: 0.8704\n", "Epoch 8/30\n", "55000/55000 [==============================] - 3s 51us/sample - loss: 0.3520 - accuracy: 0.8751 - val_loss: 0.3695 - val_accuracy: 0.8712\n", "Epoch 9/30\n", "55000/55000 [==============================] - 3s 50us/sample - loss: 0.3412 - accuracy: 0.8783 - val_loss: 0.3391 - val_accuracy: 0.8806\n", "Epoch 10/30\n", "55000/55000 [==============================] - 3s 50us/sample - loss: 0.3325 - accuracy: 0.8813 - val_loss: 0.3658 - val_accuracy: 0.8726\n", "Epoch 11/30\n", "55000/55000 [==============================] - 3s 50us/sample - loss: 0.3242 - accuracy: 0.8840 - val_loss: 0.3331 - val_accuracy: 0.8812\n", "Epoch 12/30\n", "55000/55000 [==============================] - 3s 52us/sample - loss: 0.3163 - accuracy: 0.8871 - val_loss: 0.3396 - val_accuracy: 0.8766\n", "Epoch 13/30\n", "55000/55000 [==============================] - 3s 50us/sample - loss: 0.3082 - accuracy: 0.8896 - val_loss: 0.3428 - val_accuracy: 0.8788\n", "Epoch 14/30\n", "55000/55000 [==============================] - 3s 51us/sample - loss: 0.3027 - accuracy: 0.8917 - val_loss: 0.3188 - val_accuracy: 0.8854\n", "Epoch 15/30\n", "55000/55000 [==============================] - 3s 54us/sample - loss: 0.2948 - accuracy: 0.8953 - val_loss: 0.3157 - val_accuracy: 0.8882\n", "Epoch 16/30\n", "55000/55000 [==============================] - 3s 62us/sample - loss: 0.2893 - accuracy: 0.8955 - val_loss: 0.3304 - val_accuracy: 0.8804\n", "Epoch 17/30\n", "55000/55000 [==============================] - 3s 63us/sample - loss: 0.2837 - accuracy: 0.8975 - val_loss: 0.3163 - val_accuracy: 0.8874\n", "Epoch 18/30\n", "55000/55000 [==============================] - 3s 52us/sample - loss: 0.2792 - accuracy: 0.8993 - val_loss: 0.3301 - val_accuracy: 0.8804\n", "Epoch 19/30\n", "55000/55000 [==============================] - 3s 51us/sample - loss: 0.2731 - accuracy: 0.9014 - val_loss: 0.3051 - val_accuracy: 0.8890\n", "Epoch 20/30\n", "55000/55000 [==============================] - 3s 57us/sample - loss: 0.2679 - accuracy: 0.9044 - val_loss: 0.3031 - val_accuracy: 0.8934\n", "Epoch 21/30\n", "55000/55000 [==============================] - 4s 67us/sample - loss: 0.2638 - accuracy: 0.9047 - val_loss: 0.3181 - val_accuracy: 0.8882\n", "Epoch 22/30\n", "55000/55000 [==============================] - 3s 61us/sample - loss: 0.2573 - accuracy: 0.9078 - val_loss: 0.3165 - val_accuracy: 0.8858\n", "Epoch 23/30\n", "55000/55000 [==============================] - 3s 52us/sample - loss: 0.2543 - accuracy: 0.9077 - val_loss: 0.3124 - val_accuracy: 0.8848\n", "Epoch 24/30\n", "55000/55000 [==============================] - 3s 50us/sample - loss: 0.2494 - accuracy: 0.9105 - val_loss: 0.3005 - val_accuracy: 0.8938\n", "Epoch 25/30\n", "55000/55000 [==============================] - 3s 51us/sample - loss: 0.2454 - accuracy: 0.9121 - val_loss: 0.2932 - val_accuracy: 0.8940\n", "Epoch 26/30\n", "55000/55000 [==============================] - 3s 51us/sample - loss: 0.2408 - accuracy: 0.9126 - val_loss: 0.3149 - val_accuracy: 0.8872\n", "Epoch 27/30\n", "55000/55000 [==============================] - 3s 52us/sample - loss: 0.2377 - accuracy: 0.9138 - val_loss: 0.2985 - val_accuracy: 0.8908\n", "Epoch 28/30\n", "55000/55000 [==============================] - 3s 57us/sample - loss: 0.2331 - accuracy: 0.9165 - val_loss: 0.2981 - val_accuracy: 0.8920\n", "Epoch 29/30\n", "55000/55000 [==============================] - 3s 56us/sample - loss: 0.2289 - accuracy: 0.9176 - val_loss: 0.2959 - val_accuracy: 0.8930\n", "Epoch 30/30\n", "55000/55000 [==============================] - 3s 51us/sample - loss: 0.2255 - accuracy: 0.9183 - val_loss: 0.3004 - val_accuracy: 0.8926\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": [ "{'batch_size': 32,\n", " 'epochs': 30,\n", " 'steps': None,\n", " 'samples': 55000,\n", " 'verbose': 0,\n", " 'do_validation': True,\n", " 'metrics': ['loss', 'accuracy', 'val_loss', 'val_accuracy']}" ] }, "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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\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": [ "10000/10000 [==============================] - 0s 31us/sample - loss: 0.3343 - accuracy: 0.8857\n" ] }, { "data": { "text/plain": [ "[0.33426858170032503, 0.8857]" ] }, "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.02, 0. , 0.02, 0. , 0.96],\n", " [0. , 0. , 0.98, 0. , 0.02, 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": "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)\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": [ "Train on 11610 samples, validate on 3870 samples\n", "Epoch 1/20\n", "11610/11610 [==============================] - 0s 39us/sample - loss: 1.6343 - val_loss: 0.9361\n", "Epoch 2/20\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.7053 - val_loss: 0.6556\n", "Epoch 3/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.6343 - val_loss: 0.6028\n", "Epoch 4/20\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.5974 - val_loss: 0.5631\n", "Epoch 5/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.5701 - val_loss: 0.5375\n", "Epoch 6/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.5474 - val_loss: 0.5165\n", "Epoch 7/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.5283 - val_loss: 0.5072\n", "Epoch 8/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.5130 - val_loss: 0.4806\n", "Epoch 9/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4989 - val_loss: 0.4712\n", "Epoch 10/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4874 - val_loss: 0.4651\n", "Epoch 11/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4780 - val_loss: 0.4457\n", "Epoch 12/20\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4690 - val_loss: 0.4364\n", "Epoch 13/20\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4614 - val_loss: 0.4299\n", "Epoch 14/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4550 - val_loss: 0.4245\n", "Epoch 15/20\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4490 - val_loss: 0.4175\n", "Epoch 16/20\n", "11610/11610 [==============================] - 0s 35us/sample - loss: 0.4437 - val_loss: 0.4121\n", "Epoch 17/20\n", "11610/11610 [==============================] - 0s 35us/sample - loss: 0.4390 - val_loss: 0.4099\n", "Epoch 18/20\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4347 - val_loss: 0.4037\n", "Epoch 19/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4309 - val_loss: 0.3997\n", "Epoch 20/20\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4275 - val_loss: 0.3971\n", "5160/5160 [==============================] - 0s 18us/sample - loss: 0.4213\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(lr=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.3874537],\n", " [1.6820507],\n", " [3.0960474]], 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_5\"\n", "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", "input_3 (InputLayer) [(None, 8)] 0 \n", "__________________________________________________________________________________________________\n", "dense_25 (Dense) (None, 30) 270 input_3[0][0] \n", "__________________________________________________________________________________________________\n", "dense_26 (Dense) (None, 30) 930 dense_25[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_5 (Concatenate) (None, 38) 0 input_3[0][0] \n", " dense_26[0][0] \n", "__________________________________________________________________________________________________\n", "dense_27 (Dense) (None, 1) 39 concatenate_5[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": [ "Train on 11610 samples, validate on 3870 samples\n", "Epoch 1/20\n", "11610/11610 [==============================] - 0s 43us/sample - loss: 1.2544 - val_loss: 2.9415\n", "Epoch 2/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.6531 - val_loss: 0.8754\n", "Epoch 3/20\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.5873 - val_loss: 0.5529\n", "Epoch 4/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.5574 - val_loss: 0.5205\n", "Epoch 5/20\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.5343 - val_loss: 0.5399\n", "Epoch 6/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.5160 - val_loss: 0.4793\n", "Epoch 7/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.5004 - val_loss: 0.4655\n", "Epoch 8/20\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4873 - val_loss: 0.4820\n", "Epoch 9/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4761 - val_loss: 0.4421\n", "Epoch 10/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4658 - val_loss: 0.4321\n", "Epoch 11/20\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4577 - val_loss: 0.4526\n", "Epoch 12/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4499 - val_loss: 0.4178\n", "Epoch 13/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4428 - val_loss: 0.4162\n", "Epoch 14/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4367 - val_loss: 0.4185\n", "Epoch 15/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4311 - val_loss: 0.3991\n", "Epoch 16/20\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4259 - val_loss: 0.3998\n", "Epoch 17/20\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.4210 - val_loss: 0.3896\n", "Epoch 18/20\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4165 - val_loss: 0.3864\n", "Epoch 19/20\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4123 - val_loss: 0.3819\n", "Epoch 20/20\n", "11610/11610 [==============================] - 0s 35us/sample - loss: 0.4087 - val_loss: 0.3878\n", "5160/5160 [==============================] - 0s 18us/sample - loss: 0.4029\n" ] } ], "source": [ "model.compile(loss=\"mean_squared_error\", optimizer=keras.optimizers.SGD(lr=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": [ "Train on 11610 samples, validate on 3870 samples\n", "Epoch 1/20\n", "11610/11610 [==============================] - 1s 45us/sample - loss: 1.8070 - val_loss: 0.8422\n", "Epoch 2/20\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.6752 - val_loss: 0.6426\n", "Epoch 3/20\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.5969 - val_loss: 0.5829\n", "Epoch 4/20\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.5580 - val_loss: 0.5259\n", "Epoch 5/20\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.5317 - val_loss: 0.5005\n", "Epoch 6/20\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.5125 - val_loss: 0.4792\n", "Epoch 7/20\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.4963 - val_loss: 0.4786\n", "Epoch 8/20\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.4840 - val_loss: 0.4562\n", "Epoch 9/20\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.4733 - val_loss: 0.4407\n", "Epoch 10/20\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.4640 - val_loss: 0.4320\n", "Epoch 11/20\n", "11610/11610 [==============================] - 0s 37us/sample - loss: 0.4576 - val_loss: 0.4286\n", "Epoch 12/20\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4516 - val_loss: 0.4226\n", "Epoch 13/20\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4463 - val_loss: 0.4263\n", "Epoch 14/20\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4428 - val_loss: 0.4102\n", "Epoch 15/20\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4392 - val_loss: 0.4039\n", "Epoch 16/20\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4352 - val_loss: 0.4021\n", "Epoch 17/20\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.4329 - val_loss: 0.4035\n", "Epoch 18/20\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.4307 - val_loss: 0.3951\n", "Epoch 19/20\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4275 - val_loss: 0.3932\n", "Epoch 20/20\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.4264 - val_loss: 0.4000\n", "5160/5160 [==============================] - 0s 19us/sample - loss: 0.4204\n" ] } ], "source": [ "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(lr=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(lr=1e-3))" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 11610 samples, validate on 3870 samples\n", "Epoch 1/20\n", "11610/11610 [==============================] - 1s 57us/sample - loss: 2.1325 - main_output_loss: 1.9139 - aux_output_loss: 4.0950 - val_loss: 1.6650 - val_main_output_loss: 0.8892 - val_aux_output_loss: 8.6440\n", "Epoch 2/20\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.8870 - main_output_loss: 0.6930 - aux_output_loss: 2.6303 - val_loss: 1.4991 - val_main_output_loss: 0.6627 - val_aux_output_loss: 9.0235\n", "Epoch 3/20\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.7421 - main_output_loss: 0.6079 - aux_output_loss: 1.9515 - val_loss: 1.4340 - val_main_output_loss: 0.5748 - val_aux_output_loss: 9.1628\n", "Epoch 4/20\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.6766 - main_output_loss: 0.5683 - aux_output_loss: 1.6515 - val_loss: 1.3260 - val_main_output_loss: 0.5579 - val_aux_output_loss: 8.2343\n", "Epoch 5/20\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.6366 - main_output_loss: 0.5422 - aux_output_loss: 1.4873 - val_loss: 1.2081 - val_main_output_loss: 0.5184 - val_aux_output_loss: 7.4115\n", "Epoch 6/20\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.6082 - main_output_loss: 0.5209 - aux_output_loss: 1.3933 - val_loss: 1.0861 - val_main_output_loss: 0.5113 - val_aux_output_loss: 6.2558\n", "Epoch 7/20\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.5849 - main_output_loss: 0.5034 - aux_output_loss: 1.3185 - val_loss: 0.9914 - val_main_output_loss: 0.5227 - val_aux_output_loss: 5.2070\n", "Epoch 8/20\n", "11610/11610 [==============================] - 0s 39us/sample - loss: 0.5664 - main_output_loss: 0.4897 - aux_output_loss: 1.2556 - val_loss: 0.8656 - val_main_output_loss: 0.4650 - val_aux_output_loss: 4.4682\n", "Epoch 9/20\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.5506 - main_output_loss: 0.4770 - aux_output_loss: 1.2125 - val_loss: 0.7778 - val_main_output_loss: 0.4563 - val_aux_output_loss: 3.6704\n", "Epoch 10/20\n", "11610/11610 [==============================] - 0s 41us/sample - loss: 0.5371 - main_output_loss: 0.4668 - aux_output_loss: 1.1711 - val_loss: 0.7089 - val_main_output_loss: 0.4513 - val_aux_output_loss: 3.0250\n", "Epoch 11/20\n", "11610/11610 [==============================] - 1s 46us/sample - loss: 0.5268 - main_output_loss: 0.4593 - aux_output_loss: 1.1340 - val_loss: 0.6476 - val_main_output_loss: 0.4292 - val_aux_output_loss: 2.6140\n", "Epoch 12/20\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.5176 - main_output_loss: 0.4524 - aux_output_loss: 1.1035 - val_loss: 0.6025 - val_main_output_loss: 0.4200 - val_aux_output_loss: 2.2451\n", "Epoch 13/20\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.5095 - main_output_loss: 0.4463 - aux_output_loss: 1.0766 - val_loss: 0.5692 - val_main_output_loss: 0.4158 - val_aux_output_loss: 1.9492\n", "Epoch 14/20\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.5031 - main_output_loss: 0.4420 - aux_output_loss: 1.0529 - val_loss: 0.5362 - val_main_output_loss: 0.4092 - val_aux_output_loss: 1.6791\n", "Epoch 15/20\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.4972 - main_output_loss: 0.4381 - aux_output_loss: 1.0284 - val_loss: 0.5120 - val_main_output_loss: 0.4053 - val_aux_output_loss: 1.4733\n", "Epoch 16/20\n", "11610/11610 [==============================] - 0s 39us/sample - loss: 0.4915 - main_output_loss: 0.4341 - aux_output_loss: 1.0078 - val_loss: 0.4935 - val_main_output_loss: 0.4013 - val_aux_output_loss: 1.3245\n", "Epoch 17/20\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.4871 - main_output_loss: 0.4314 - aux_output_loss: 0.9878 - val_loss: 0.4797 - val_main_output_loss: 0.3979 - val_aux_output_loss: 1.2147\n", "Epoch 18/20\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.4830 - main_output_loss: 0.4290 - aux_output_loss: 0.9694 - val_loss: 0.4669 - val_main_output_loss: 0.3954 - val_aux_output_loss: 1.1119\n", "Epoch 19/20\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.4787 - main_output_loss: 0.4262 - aux_output_loss: 0.9513 - val_loss: 0.4577 - val_main_output_loss: 0.3930 - val_aux_output_loss: 1.0410\n", "Epoch 20/20\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.4758 - main_output_loss: 0.4249 - aux_output_loss: 0.9342 - val_loss: 0.4558 - val_main_output_loss: 0.3952 - val_aux_output_loss: 1.0002\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": [ "5160/5160 [==============================] - 0s 26us/sample - loss: 0.4661 - main_output_loss: 0.4167 - aux_output_loss: 0.9138\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": [ "Train on 11610 samples, validate on 3870 samples\n", "Epoch 1/10\n", "11610/11610 [==============================] - 1s 61us/sample - loss: 2.2914 - output_1_loss: 2.1790 - output_2_loss: 3.2954 - val_loss: 2.7823 - val_output_1_loss: 2.0246 - val_output_2_loss: 9.5935\n", "Epoch 2/10\n", "11610/11610 [==============================] - 0s 40us/sample - loss: 0.9834 - output_1_loss: 0.8678 - output_2_loss: 2.0207 - val_loss: 1.6646 - val_output_1_loss: 0.7720 - val_output_2_loss: 9.6933\n", "Epoch 3/10\n", "11610/11610 [==============================] - 0s 36us/sample - loss: 0.8264 - output_1_loss: 0.7295 - output_2_loss: 1.6967 - val_loss: 1.4471 - val_output_1_loss: 0.6947 - val_output_2_loss: 8.2170\n", "Epoch 4/10\n", "11610/11610 [==============================] - 0s 40us/sample - loss: 0.7616 - output_1_loss: 0.6750 - output_2_loss: 1.5418 - val_loss: 1.2658 - val_output_1_loss: 0.6379 - val_output_2_loss: 6.9130\n", "Epoch 5/10\n", "11610/11610 [==============================] - 0s 40us/sample - loss: 0.7203 - output_1_loss: 0.6400 - output_2_loss: 1.4425 - val_loss: 1.1078 - val_output_1_loss: 0.6015 - val_output_2_loss: 5.6652\n", "Epoch 6/10\n", "11610/11610 [==============================] - 0s 36us/sample - loss: 0.6889 - output_1_loss: 0.6124 - output_2_loss: 1.3768 - val_loss: 0.9780 - val_output_1_loss: 0.5691 - val_output_2_loss: 4.8158\n", "Epoch 7/10\n", "11610/11610 [==============================] - 0s 37us/sample - loss: 0.6620 - output_1_loss: 0.5885 - output_2_loss: 1.3240 - val_loss: 0.8896 - val_output_1_loss: 0.5852 - val_output_2_loss: 3.6278\n", "Epoch 8/10\n", "11610/11610 [==============================] - 0s 37us/sample - loss: 0.6402 - output_1_loss: 0.5697 - output_2_loss: 1.2749 - val_loss: 0.7913 - val_output_1_loss: 0.5294 - val_output_2_loss: 3.1492\n", "Epoch 9/10\n", "11610/11610 [==============================] - 0s 39us/sample - loss: 0.6200 - output_1_loss: 0.5513 - output_2_loss: 1.2377 - val_loss: 0.7284 - val_output_1_loss: 0.5119 - val_output_2_loss: 2.6768\n", "Epoch 10/10\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.6020 - output_1_loss: 0.5353 - output_2_loss: 1.2002 - val_loss: 0.6832 - val_output_1_loss: 0.4927 - val_output_2_loss: 2.3969\n", "5160/5160 [==============================] - 0s 23us/sample - loss: 0.5847 - output_1_loss: 0.5204 - output_2_loss: 1.1756\n" ] } ], "source": [ "model.compile(loss=\"mse\", loss_weights=[0.9, 0.1], optimizer=keras.optimizers.SGD(lr=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": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "model = WideAndDeepModel(30, activation=\"relu\")" ] }, { "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": [ "Train on 11610 samples, validate on 3870 samples\n", "Epoch 1/10\n", "11610/11610 [==============================] - 0s 41us/sample - loss: 1.8807 - val_loss: 0.7701\n", "Epoch 2/10\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.6570 - val_loss: 0.7268\n", "Epoch 3/10\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.5932 - val_loss: 0.6569\n", "Epoch 4/10\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.5547 - val_loss: 0.5244\n", "Epoch 5/10\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.5269 - val_loss: 0.5068\n", "Epoch 6/10\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.5035 - val_loss: 0.5028\n", "Epoch 7/10\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4852 - val_loss: 0.4924\n", "Epoch 8/10\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4709 - val_loss: 0.4534\n", "Epoch 9/10\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4578 - val_loss: 0.4403\n", "Epoch 10/10\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4473 - val_loss: 0.4496\n", "5160/5160 [==============================] - 0s 17us/sample - loss: 0.4379\n" ] } ], "source": [ "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(lr=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": [ { "data": { "text/plain": [ "array([[0.5492519],\n", " [1.674789 ],\n", " [3.0483952]], 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": [ "Train on 11610 samples, validate on 3870 samples\n", "Epoch 1/10\n", "11610/11610 [==============================] - 1s 49us/sample - loss: 1.8807 - val_loss: 0.7701\n", "Epoch 2/10\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.6570 - val_loss: 0.7268\n", "Epoch 3/10\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.5932 - val_loss: 0.6569\n", "Epoch 4/10\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.5547 - val_loss: 0.5244\n", "Epoch 5/10\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.5269 - val_loss: 0.5068\n", "Epoch 6/10\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.5035 - val_loss: 0.5028\n", "Epoch 7/10\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4852 - val_loss: 0.4924\n", "Epoch 8/10\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4709 - val_loss: 0.4534\n", "Epoch 9/10\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4578 - val_loss: 0.4403\n", "Epoch 10/10\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4473 - val_loss: 0.4496\n", "5160/5160 [==============================] - 0s 20us/sample - loss: 0.4468\n" ] } ], "source": [ "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(lr=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": [ "Train on 11610 samples, validate on 3870 samples\n", "Epoch 1/100\n", "11610/11610 [==============================] - 0s 43us/sample - loss: 0.4483 - val_loss: 0.4280\n", "Epoch 2/100\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4393 - val_loss: 0.4106\n", "Epoch 3/100\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4319 - val_loss: 0.4078\n", "Epoch 4/100\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4262 - val_loss: 0.4037\n", "Epoch 5/100\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4205 - val_loss: 0.3956\n", "Epoch 6/100\n", "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4160 - val_loss: 0.3894\n", "Epoch 7/100\n", "11610/11610 [==============================] - 0s 35us/sample - loss: 0.4116 - val_loss: 0.3891\n", "Epoch 8/100\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.4077 - val_loss: 0.3817\n", "Epoch 9/100\n", "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4041 - val_loss: 0.3783\n", "Epoch 10/100\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4010 - val_loss: 0.3757\n", "Epoch 11/100\n", "11610/11610 [==============================] - 0s 35us/sample - loss: 0.3980 - val_loss: 0.3731\n", "Epoch 12/100\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3951 - val_loss: 0.3743\n", "Epoch 13/100\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.3924 - val_loss: 0.3686\n", "Epoch 14/100\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.3898 - val_loss: 0.3678\n", "Epoch 15/100\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.3873 - val_loss: 0.3626\n", "Epoch 16/100\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.3850 - val_loss: 0.3612\n", "Epoch 17/100\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.3831 - val_loss: 0.3583\n", "<<48 more lines>>\n", "Epoch 42/100\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.3513 - val_loss: 0.3832\n", "Epoch 43/100\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3509 - val_loss: 0.3367\n", "Epoch 44/100\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3499 - val_loss: 0.3488\n", "Epoch 45/100\n", "11610/11610 [==============================] - 0s 35us/sample - loss: 0.3493 - val_loss: 0.3410\n", "Epoch 46/100\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3486 - val_loss: 0.3290\n", "Epoch 47/100\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.3480 - val_loss: 0.3921\n", "Epoch 48/100\n", "11610/11610 [==============================] - 0s 36us/sample - loss: 0.3474 - val_loss: 0.3278\n", "Epoch 49/100\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.3467 - val_loss: 0.3841\n", "Epoch 50/100\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3464 - val_loss: 0.3370\n", "Epoch 51/100\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.3458 - val_loss: 0.3441\n", "Epoch 52/100\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3451 - val_loss: 0.3427\n", "Epoch 53/100\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3445 - val_loss: 0.3459\n", "Epoch 54/100\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3441 - val_loss: 0.3380\n", "Epoch 55/100\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3436 - val_loss: 0.3432\n", "Epoch 56/100\n", "11610/11610 [==============================] - 0s 35us/sample - loss: 0.3432 - val_loss: 0.3415\n", "Epoch 57/100\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3426 - val_loss: 0.3346\n", "Epoch 58/100\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3421 - val_loss: 0.3486\n", "5160/5160 [==============================] - 0s 17us/sample - loss: 0.3466\n" ] } ], "source": [ "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(lr=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": [ "Train on 11610 samples, validate on 3870 samples\n", "10144/11610 [=========================>....] - ETA: 0s - loss: 0.3427\n", "val/train: 0.98\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3467 - val_loss: 0.3384\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_2019_06_08-11_37_24'" ] }, "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(lr=1e-3))" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 11610 samples, validate on 3870 samples\n", "Epoch 1/30\n", "11610/11610 [==============================] - 1s 45us/sample - loss: 1.8807 - val_loss: 0.7701\n", "Epoch 2/30\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.6570 - val_loss: 0.7268\n", "Epoch 3/30\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.5932 - val_loss: 0.6569\n", "Epoch 4/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.5547 - val_loss: 0.5244\n", "Epoch 5/30\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.5269 - val_loss: 0.5068\n", "Epoch 6/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.5035 - val_loss: 0.5028\n", "Epoch 7/30\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4852 - val_loss: 0.4924\n", "Epoch 8/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4709 - val_loss: 0.4534\n", "Epoch 9/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4578 - val_loss: 0.4403\n", "Epoch 10/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4473 - val_loss: 0.4496\n", "Epoch 11/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4399 - val_loss: 0.4261\n", "Epoch 12/30\n", "11610/11610 [==============================] - 0s 37us/sample - loss: 0.4320 - val_loss: 0.4039\n", "Epoch 13/30\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.4258 - val_loss: 0.4002\n", "Epoch 14/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4207 - val_loss: 0.3980\n", "Epoch 15/30\n", "11610/11610 [==============================] - 0s 35us/sample - loss: 0.4158 - val_loss: 0.3915\n", "Epoch 16/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4118 - val_loss: 0.3851\n", "Epoch 17/30\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4077 - val_loss: 0.3845\n", "Epoch 18/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4042 - val_loss: 0.3784\n", "Epoch 19/30\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4008 - val_loss: 0.3749\n", "Epoch 20/30\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.3979 - val_loss: 0.3728\n", "Epoch 21/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3952 - val_loss: 0.3700\n", "Epoch 22/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3924 - val_loss: 0.3739\n", "Epoch 23/30\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.3899 - val_loss: 0.3665\n", "Epoch 24/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3874 - val_loss: 0.3659\n", "Epoch 25/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3850 - val_loss: 0.3605\n", "Epoch 26/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3828 - val_loss: 0.3594\n", "Epoch 27/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3809 - val_loss: 0.3562\n", "Epoch 28/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3786 - val_loss: 0.3586\n", "Epoch 29/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3765 - val_loss: 0.3689\n", "Epoch 30/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3749 - val_loss: 0.3510\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", " " ], "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_2019_06_08-11_38_07'" ] }, "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(lr=0.05))" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 11610 samples, validate on 3870 samples\n", "Epoch 1/30\n", "11610/11610 [==============================] - 1s 43us/sample - loss: 0.5259 - val_loss: 0.4834\n", "Epoch 2/30\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4069 - val_loss: 0.3912\n", "Epoch 3/30\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.3744 - val_loss: 7.5517\n", "Epoch 4/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3656 - val_loss: 1.1554\n", "Epoch 5/30\n", "11610/11610 [==============================] - 0s 38us/sample - loss: 0.3524 - val_loss: 0.4531\n", "Epoch 6/30\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.3455 - val_loss: 0.3197\n", "Epoch 7/30\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.3355 - val_loss: 0.3217\n", "Epoch 8/30\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.3326 - val_loss: 0.3118\n", "Epoch 9/30\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.3219 - val_loss: 0.3636\n", "Epoch 10/30\n", "11610/11610 [==============================] - 0s 35us/sample - loss: 0.3210 - val_loss: 0.3265\n", "Epoch 11/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3148 - val_loss: 0.3178\n", "Epoch 12/30\n", "11610/11610 [==============================] - 0s 35us/sample - loss: 0.3121 - val_loss: 0.3077\n", "Epoch 13/30\n", "11610/11610 [==============================] - 0s 35us/sample - loss: 0.3098 - val_loss: 0.3166\n", "Epoch 14/30\n", "11610/11610 [==============================] - 0s 36us/sample - loss: 0.3054 - val_loss: 0.3673\n", "Epoch 15/30\n", "11610/11610 [==============================] - 0s 37us/sample - loss: 0.3110 - val_loss: 0.5225\n", "Epoch 16/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3086 - val_loss: 0.2886\n", "Epoch 17/30\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.3044 - val_loss: 0.3345\n", "Epoch 18/30\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3019 - val_loss: 0.2997\n", "Epoch 19/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.2979 - val_loss: 0.2767\n", "Epoch 20/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.2977 - val_loss: 0.3261\n", "Epoch 21/30\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.2967 - val_loss: 0.2839\n", "Epoch 22/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.2948 - val_loss: 0.2765\n", "Epoch 23/30\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.2918 - val_loss: 0.3468\n", "Epoch 24/30\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.2928 - val_loss: 0.2745\n", "Epoch 25/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.2894 - val_loss: 0.3026\n", "Epoch 26/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.2905 - val_loss: 0.2874\n", "Epoch 27/30\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.2860 - val_loss: 0.2851\n", "Epoch 28/30\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.2877 - val_loss: 0.5629\n", "Epoch 29/30\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.2861 - val_loss: 0.2808\n", "Epoch 30/30\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.2841 - val_loss: 0.2780\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(lr=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": [ "Train on 11610 samples, validate on 3870 samples\n", "Epoch 1/100\n", "11610/11610 [==============================] - 0s 41us/sample - loss: 1.0910 - val_loss: 21.1892\n", "Epoch 2/100\n", "11610/11610 [==============================] - 0s 35us/sample - loss: 0.7607 - val_loss: 4.8909\n", "Epoch 3/100\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.5401 - val_loss: 0.5721\n", "Epoch 4/100\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4752 - val_loss: 0.4433\n", "Epoch 5/100\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.4499 - val_loss: 0.4270\n", "Epoch 6/100\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4348 - val_loss: 0.4165\n", "Epoch 7/100\n", "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4240 - val_loss: 0.4060\n", "Epoch 8/100\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4166 - val_loss: 0.4030\n", "Epoch 9/100\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.4109 - val_loss: 0.4069\n", "Epoch 10/100\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.4055 - val_loss: 0.4220\n", "Epoch 11/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.4021 - val_loss: 0.4191\n", "Epoch 12/100\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.3982 - val_loss: 0.3941\n", "Epoch 13/100\n", "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3950 - val_loss: 0.4145\n", "Epoch 14/100\n", "11610/11610 [==============================] - 0s 34us/sample - loss: 0.3923 - val_loss: 0.4155\n", "Epoch 15/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3897 - val_loss: 0.3774\n", "Epoch 16/100\n", "11610/11610 [==============================] - 0s 33us/sample - loss: 0.3873 - val_loss: 0.3828\n", "Epoch 17/100\n", "11610/11610 [==============================] - 0s 35us/sample - loss: 0.3847 - val_loss: 0.4104\n", "<<49 more lines>>\n", "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3553 - val_loss: 0.3677\n", "Epoch 43/100\n", "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3553 - val_loss: 0.3358\n", "Epoch 44/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3544 - val_loss: 0.3434\n", "Epoch 45/100\n", "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3539 - val_loss: 0.4161\n", "Epoch 46/100\n", "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3540 - val_loss: 0.3337\n", "Epoch 47/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3526 - val_loss: 0.3837\n", "Epoch 48/100\n", "11610/11610 [==============================] - 1s 44us/sample - loss: 0.3526 - val_loss: 0.3353\n", "Epoch 49/100\n", "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3519 - val_loss: 0.3319\n", "Epoch 50/100\n", "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3510 - val_loss: 0.3782\n", "Epoch 51/100\n", "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3512 - val_loss: 0.3412\n", "Epoch 52/100\n", "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3502 - val_loss: 0.4134\n", "Epoch 53/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3501 - val_loss: 0.3335\n", "Epoch 54/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3490 - val_loss: 0.3411\n", "Epoch 55/100\n", "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3485 - val_loss: 0.3700\n", "Epoch 56/100\n", "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3483 - val_loss: 0.3793\n", "Epoch 57/100\n", "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3479 - val_loss: 0.4734\n", "Epoch 58/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3480 - val_loss: 0.4231\n", "Epoch 59/100\n", "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3470 - val_loss: 0.6592\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": [ "5160/5160 [==============================] - 0s 15us/sample - loss: 0.3504\n" ] } ], "source": [ "mse_test = keras_reg.score(X_test, y_test)" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [], "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": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fitting 3 folds for each of 10 candidates, totalling 30 fits\n", "[CV] learning_rate=0.001683454924600351, n_hidden=0, n_neurons=15 ....\n", "Train on 7740 samples, validate on 3870 samples\n", "Epoch 1/100\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "7740/7740 [==============================] - 0s 43us/sample - loss: 3.5539 - val_loss: 1.8522\n", "Epoch 2/100\n", "7740/7740 [==============================] - 0s 32us/sample - loss: 1.3322 - val_loss: 1.0094\n", "Epoch 3/100\n", "7740/7740 [==============================] - 0s 36us/sample - loss: 0.8593 - val_loss: 0.7356\n", "Epoch 4/100\n", "7740/7740 [==============================] - 0s 37us/sample - loss: 0.7338 - val_loss: 0.6880\n", "Epoch 5/100\n", "7740/7740 [==============================] - 0s 36us/sample - loss: 0.6915 - val_loss: 0.8475\n", "Epoch 6/100\n", "7740/7740 [==============================] - 0s 38us/sample - loss: 0.6710 - val_loss: 0.6480\n", "Epoch 7/100\n", "7740/7740 [==============================] - 0s 41us/sample - loss: 0.6507 - val_loss: 0.8315\n", "Epoch 8/100\n", "7740/7740 [==============================] - 0s 36us/sample - loss: 0.6384 - val_loss: 0.8030\n", "Epoch 9/100\n", "7740/7740 [==============================] - 0s 32us/sample - loss: 0.6268 - val_loss: 0.6048\n", "Epoch 10/100\n", "7740/7740 [==============================] - 0s 34us/sample - loss: 0.6152 - val_loss: 0.6129\n", "Epoch 11/100\n", "7740/7740 [==============================] - 0s 32us/sample - loss: 0.6038 - val_loss: 0.8304\n", "Epoch 12/100\n", "7740/7740 [==============================] - 0s 38us/sample - loss: 0.5992 - val_loss: 0.5584\n", "Epoch 13/100\n", "7740/7740 [==============================] - 0s 36us/sample - loss: 0.5896 - val_loss: 0.6129\n", "Epoch 14/100\n", "7740/7740 [==============================] - 0s 33us/sample - loss: 0.5826 - val_loss: 0.6516\n", "Epoch 15/100\n", "7740/7740 [==============================] - 0s 35us/sample - loss: 0.5775 - val_loss: 0.5914\n", "Epoch 16/100\n", "<<2526 more lines>>\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3198 - val_loss: 0.3301\n", "Epoch 41/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3174 - val_loss: 0.3968\n", "Epoch 42/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3183 - val_loss: 0.3138\n", "Epoch 43/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3170 - val_loss: 0.3072\n", "Epoch 44/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3149 - val_loss: 0.4054\n", "Epoch 45/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3155 - val_loss: 0.3363\n", "Epoch 46/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3160 - val_loss: 0.3647\n", "Epoch 47/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3133 - val_loss: 0.3037\n", "Epoch 48/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3127 - val_loss: 0.3388\n", "Epoch 49/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3111 - val_loss: 0.3484\n", "Epoch 50/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3108 - val_loss: 0.3157\n", "Epoch 51/100\n", "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3090 - val_loss: 0.3249\n", "Epoch 52/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3098 - val_loss: 0.3220\n", "Epoch 53/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3085 - val_loss: 0.3526\n", "Epoch 54/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3081 - val_loss: 0.3781\n", "Epoch 55/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3078 - val_loss: 0.4874\n", "Epoch 56/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3074 - val_loss: 0.3224\n", "Epoch 57/100\n", "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3067 - val_loss: 0.3171\n" ] }, { "data": { "text/plain": [ "RandomizedSearchCV(cv=3, error_score='raise-deprecating',\n", " estimator=,\n", " fit_params=None, iid='warn', n_iter=10, n_jobs=None,\n", " param_distributions={'n_hidden': [0, 1, 2, 3], 'n_neurons': array([ 1, 2, ..., 98, 99]), 'learning_rate': },\n", " pre_dispatch='2*n_jobs', random_state=None, refit=True,\n", " return_train_score='warn', scoring=None, 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),\n", " \"learning_rate\": reciprocal(3e-4, 3e-2),\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": [ "{'learning_rate': 0.0033625641252688094, 'n_hidden': 2, 'n_neurons': 42}" ] }, "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.3500674913429577" ] }, "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": [ "5160/5160 [==============================] - 0s 17us/sample - loss: 0.3159\n" ] }, { "data": { "text/plain": [ "-0.31594527869723565" ] }, "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": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5160/5160==============================] - 0s 22us/sample - loss: 0.3252\n" ] }, { "data": { "text/plain": [ "0.3251738954422086" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.evaluate(X_test, y_test)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "# Exercise solutions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. to 9." ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "See appendix A." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 10." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "TODO" ] }, { "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.3" }, "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": 1 }