{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "**Chapter 10 – Introduction to Artificial Neural Networks with Keras**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "_This notebook contains all the sample code and solutions to the exercises in chapter 10._" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", " \n", " \n", "
\n", " \"Open\n", " \n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "# Setup" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This project requires Python 3.7 or above:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "\n", "assert sys.version_info >= (3, 7)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It also requires Scikit-Learn ≥ 1.0.1:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from packaging import version\n", "import sklearn\n", "\n", "assert version.parse(sklearn.__version__) >= version.parse(\"1.0.1\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And TensorFlow ≥ 2.8:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "\n", "assert version.parse(tf.__version__) >= version.parse(\"2.8.0\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we did in previous chapters, let's define the default font sizes to make the figures prettier:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", "plt.rc('font', size=14)\n", "plt.rc('axes', labelsize=14, titlesize=14)\n", "plt.rc('legend', fontsize=14)\n", "plt.rc('xtick', labelsize=10)\n", "plt.rc('ytick', labelsize=10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And let's create the `images/ann` folder (if it doesn't already exist), and define the `save_fig()` function which is used through this notebook to save the figures in high-res for the book:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from pathlib import Path\n", "\n", "IMAGES_PATH = Path() / \"images\" / \"ann\"\n", "IMAGES_PATH.mkdir(parents=True, exist_ok=True)\n", "\n", "def save_fig(fig_id, tight_layout=True, fig_extension=\"png\", resolution=300):\n", " path = IMAGES_PATH / f\"{fig_id}.{fig_extension}\"\n", " if tight_layout:\n", " plt.tight_layout()\n", " plt.savefig(path, format=fig_extension, dpi=resolution)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# From Biological to Artificial Neurons\n", "## The Perceptron" ] }, { "cell_type": "code", "execution_count": 6, "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(as_frame=True)\n", "X = iris.data[[\"petal length (cm)\", \"petal width (cm)\"]].values\n", "y = (iris.target == 0) # Iris setosa\n", "\n", "per_clf = Perceptron(random_state=42)\n", "per_clf.fit(X, y)\n", "\n", "X_new = [[2, 0.5], [3, 1]]\n", "y_pred = per_clf.predict(X_new) # predicts True and False for these 2 flowers" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ True, False])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `Perceptron` is equivalent to a `SGDClassifier` with `loss=\"perceptron\"`, no regularization, and a constant learning rate equal to 1:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# extra code – shows how to build and train a Perceptron\n", "\n", "from sklearn.linear_model import SGDClassifier\n", "\n", "sgd_clf = SGDClassifier(loss=\"perceptron\", penalty=None,\n", " learning_rate=\"constant\", eta0=1, random_state=42)\n", "sgd_clf.fit(X, y)\n", "assert (sgd_clf.coef_ == per_clf.coef_).all()\n", "assert (sgd_clf.intercept_ == per_clf.intercept_).all()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When the Perceptron finds a decision boundary that properly separates the classes, it stops learning. This means that the decision boundary is often quite close to one class:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# extra code – plots the decision boundary of a Perceptron on the iris dataset\n", "\n", "import matplotlib.pyplot as plt\n", "from matplotlib.colors import ListedColormap\n", "\n", "a = -per_clf.coef_[0, 0] / per_clf.coef_[0, 1]\n", "b = -per_clf.intercept_ / per_clf.coef_[0, 1]\n", "axes = [0, 5, 0, 2]\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", "custom_cmap = ListedColormap(['#9898ff', '#fafab0'])\n", "\n", "plt.figure(figsize=(7, 3))\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", "plt.plot([axes[0], axes[1]], [a * axes[0] + b, a * axes[1] + b], \"k-\",\n", " linewidth=3)\n", "plt.contourf(x0, x1, zz, cmap=custom_cmap)\n", "plt.xlabel(\"Petal length\")\n", "plt.ylabel(\"Petal width\")\n", "plt.legend(loc=\"lower right\")\n", "plt.axis(axes)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Activation functions**" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# extra code – this cell generates and saves Figure 10–8\n", "\n", "from scipy.special import expit as sigmoid\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)\n", "\n", "max_z = 4.5\n", "z = np.linspace(-max_z, max_z, 200)\n", "\n", "plt.figure(figsize=(11, 3.1))\n", "\n", "plt.subplot(121)\n", "plt.plot([-max_z, 0], [0, 0], \"r-\", linewidth=2, label=\"Heaviside\")\n", "plt.plot(z, relu(z), \"m-.\", linewidth=2, label=\"ReLU\")\n", "plt.plot([0, 0], [0, 1], \"r-\", linewidth=0.5)\n", "plt.plot([0, max_z], [1, 1], \"r-\", linewidth=2)\n", "plt.plot(z, sigmoid(z), \"g--\", linewidth=2, label=\"Sigmoid\")\n", "plt.plot(z, np.tanh(z), \"b-\", linewidth=1, label=\"Tanh\")\n", "plt.grid(True)\n", "plt.title(\"Activation functions\")\n", "plt.axis([-max_z, max_z, -1.65, 2.4])\n", "plt.gca().set_yticks([-1, 0, 1, 2])\n", "plt.legend(loc=\"lower right\", fontsize=13)\n", "\n", "plt.subplot(122)\n", "plt.plot(z, derivative(np.sign, z), \"r-\", linewidth=2, label=\"Heaviside\")\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=1, label=\"Tanh\")\n", "plt.plot([-max_z, 0], [0, 0], \"m-.\", linewidth=2)\n", "plt.plot([0, max_z], [1, 1], \"m-.\", linewidth=2)\n", "plt.plot([0, 0], [0, 1], \"m-.\", linewidth=1.2)\n", "plt.plot(0, 1, \"mo\", markersize=5)\n", "plt.plot(0, 1, \"mx\", markersize=10)\n", "plt.grid(True)\n", "plt.title(\"Derivatives\")\n", "plt.axis([-max_z, max_z, -0.2, 1.2])\n", "\n", "save_fig(\"activation_functions_plot\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Regression MLPs" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import fetch_california_housing\n", "from sklearn.metrics import mean_squared_error\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.neural_network import MLPRegressor\n", "from sklearn.pipeline import make_pipeline\n", "from sklearn.preprocessing import StandardScaler\n", "\n", "housing = fetch_california_housing()\n", "X_train_full, X_test, y_train_full, y_test = train_test_split(\n", " housing.data, housing.target, random_state=42)\n", "X_train, X_valid, y_train, y_valid = train_test_split(\n", " X_train_full, y_train_full, random_state=42)\n", "\n", "mlp_reg = MLPRegressor(hidden_layer_sizes=[50, 50, 50], random_state=42)\n", "pipeline = make_pipeline(StandardScaler(), mlp_reg)\n", "pipeline.fit(X_train, y_train)\n", "y_pred = pipeline.predict(X_valid)\n", "rmse = mean_squared_error(y_valid, y_pred, squared=False)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5053326657968465" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rmse" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Classification MLPs" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# extra code – this was left as an exercise for the reader\n", "\n", "from sklearn.datasets import load_iris\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.neural_network import MLPClassifier\n", "\n", "iris = load_iris()\n", "X_train_full, X_test, y_train_full, y_test = train_test_split(\n", " iris.data, iris.target, test_size=0.1, random_state=42)\n", "X_train, X_valid, y_train, y_valid = train_test_split(\n", " X_train_full, y_train_full, test_size=0.1, random_state=42)\n", "\n", "mlp_clf = MLPClassifier(hidden_layer_sizes=[5], max_iter=10_000,\n", " random_state=42)\n", "pipeline = make_pipeline(StandardScaler(), mlp_clf)\n", "pipeline.fit(X_train, y_train)\n", "accuracy = pipeline.score(X_valid, y_valid)\n", "accuracy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Implementing MLPs with Keras\n", "## Building an Image Classifier Using the Sequential API\n", "### Using Keras to load the dataset" ] }, { "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 `tf.keras.datasets`. The dataset is already split for you between a training set (60,000 images) and a test set (10,000 images), but it can be useful to split the training set further to have a validation set. We'll use 55,000 images for training, and 5,000 for validation." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "\n", "fashion_mnist = tf.keras.datasets.fashion_mnist.load_data()\n", "(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist\n", "X_train, y_train = X_train_full[:-5000], y_train_full[:-5000]\n", "X_valid, y_valid = X_train_full[-5000:], y_train_full[-5000:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The training set contains 60,000 grayscale images, each 28x28 pixels:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(55000, 28, 28)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each pixel intensity is represented as a byte (0 to 255):" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dtype('uint8')" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train.dtype" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's scale the pixel intensities down to the 0-1 range and convert them to floats, by dividing by 255:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "X_train, X_valid, X_test = X_train / 255., X_valid / 255., 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": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# extra code\n", "\n", "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": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([9, 0, 0, ..., 9, 0, 2], dtype=uint8)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_train" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are the corresponding class names:" ] }, { "cell_type": "code", "execution_count": 20, "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 an ankle boot:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Ankle boot'" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class_names[y_train[0]]" ] }, { "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": [ { "data": { "image/png": "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DjrooFbvlXMxY8YMTjvtNAAuu+yyVscplVwgeU1kGX/++ee9tVCx5XqVN0aLQc6cOdM/94rl1VoVOt4XvvAF78VUvpHyrvRe3omddtrJtwuy/Mr6rPukal7z5s3znip5QEoFeSjCNTvWWWednOdbyBvZ1NTkvyfdkmdN+8jqO3jwYG+xD63I5czMmTP9//lyVCB9PrP5KdommcmSma1mls1fLRfk0ZWXVbkr8mprcd6ddtopR44iX/XLbL4epDKXRXjx4sV+nRXldchSrzHE4YcfDpSmB0jtm/oa5U6qz95www29LJTPI1npeldbbTW/fpBkruNssMEGrb47ZMgQL2O1scol0po35YCuP1xvKotko/xK5bfcd999vo9R5UGNm9RPScez3iLJVesFlgO6JvW18vIo/+61117L6as0llfbUFVV5ftkLSC96aabAqmssu2n7pXG+aoK94Mf/AAwD5BhGIZhGIZhGEab9KkHKIz3vfnmm70VWDNsxVhmLUGaUYbVs4QqUSxatMjPwiuNBQsWeOtRNq4d0hk55F/dHFLLk+IuFRdbKcj6KyZPnpyTYyJrsaq9vPXWW/5/eSVlEVaeiyymq666qve2yeImL5H0OjyHYkMrsEsOH374ob9+VcXR86wqRMrFmz17tq+yI+uxrEDZOGpZi2Rh0rOt35RVCdK4bOUm6b3OSZbM5557zntLst8vBfQchvH6q622mtdLWcrCnJXm5mavW5KrvDt6rypwr7/+ureESkbK85BltByRnkLaJspDEXrPmpqa/P9hNThZ8CdNmgTAP//5T/9MlBNq11T9Stcty7i8CPfee6/fJvJ50sK+XcfJejEhHhccffTRANx4441AGq2gz7P5V6WGqlSKsCprXV2dv171G3o+lY+x+eab+330DOtV0QxZL3mYpypvR3YNxlInu44UpHpWU1PTalwEqRdC8pgwYUJOrrQ88NI1HaO6utrrt8Zf5eQBVv6Z9FReR1UKnDt3rm83Qzmq762pqcnxskvXdF+knwMHDvTHk9dSY1O1QcqHVV/WEfpkAhQmmGeVRhcjBQuTTFtaWnwjEBZKCBdRq9TJT4hchhqMi4aGBt+hhO7asDx2Ntm6nCkUflZXV9cqARfSAbsG2h988IHv5PV9DVj1IEvn6+rqvExVRGD33XcHSmcCpI5X7v+xY8f6QZ6uIbsN0onRbbfd5hdJ1SBcLu2HH34YiCeLcomrU9eiclqcT5PSF198MacUsSZfaqTV+Q8fPjyncyoVwjA36dDs2bN926kOIOzQBw4c6J/nsFyzXiWj+vp6r8NqPzTpLOcJkAaRkA6WwnYzW4AibCfCpRh23nlnIJ4A5Qu3KXXuuusuIG0D1W9Lv26++WYgNnzI4CHjmnQuW+o+XLhcSJ46/pNPPukNMNJPLRqqwej//vc/APbbb7+euNQVikKlVXBH16T2Khu+rjZA90B9zosvvuj7KIUaadCoCZUMS3V1db5tlhFEfZnOpRyQHPVsS6823HBD37ZKRmFJ9jlz5njdVWh3uBBy9v6ovZQcw8lXKaO+NTQgykBZU1PjdUztpyaA6rMHDx7MrFmzgFR3dX+yhZAg7vckY31fEyFNsGS86szi6xYCZxiGYRiGYRhGxdAnHqDQupN9Hy5mqBm1ZoYDBgzIKTka7psvqbJUEst7iuXLl3vLheQha5AsZsOHD/dhLkpel6VIctIxit0b0VOE3hd5D5YuXerLL8qyo4Q/eSecc94aIc+FvBsKJ5AV+PXXX/deEZVylgeoVHQ0XHhwl1128eWvZRmaOHEikOqVQrZOP/107+mRtUfJy1qsc5dddvGy3n///QF8Uq+KH3zxi18E4kIKskrJkyQ3fRjCsdFGG/kFa2V5KhVk9VYZ8GyYj9q40FqcfZZDT670MfT8OudyQoulpwrrKkeyBR/kUQsX8pOMsp4htbFhP5O1+mYTessFPUeSkcLR/v73vwOpN+G+++5rtQg0pN7MbJK09FM6LP2Ut0jli4cNG+a9Twpxvf3221vtIyt9KbLKKqsAqRzCRZ0HDx7sPQvSU/U98tC+9dZb3ksfhglJL3WMDTbYwI8LJHPd09ADWspI96RP2cWJsyWxIe3DVESquro6p9iJ5Cj5ZvU2jKJRH1gOqB/XtSmMXbq3wQYbeG+Q5Kjxju5BQ0ODL5Kifl3eHbW1iiBZbbXV/JhK0R+hB7kr7at5gAzDMAzDMAzDqBiKogx21uKtmbVmd5phZq0QsmJkF6QDy/3Jsnjx4pxksNAiUVtb62UmS5Bm4OGidaG3rVwJrd5azGv06NHeWyZ9k7VHyaNz5871MeryOkgXFQ8rq+eSJUu8RShMjsznwSxGZAWSd+ull17y1h3pj5JEdY2y9Oyxxx5+H3k1Lr30UiCV2XXXXec9QCpXLe+DFgrMJuqrLK5KnSrnQJZNxRsvW7bM37NCpaOLDemT9EslyLPJt7JG6nqlX3rf3Nzsn+cwH0XWXrWtVVVVOfHtSpwuZ6TTAN/5zncA+OlPfwrkWhj79euXs3ixXtX2ZheWDheZLnWWLVvmnx95LKRfKv//2muvAfCHP/zBe4tksZWnRp6hIUOG+P/VBki/ZWFWe5LNS/nGN74BpJbhvfbaCyjNnAtdp55PyUP9ctZDJhnI8y0LuaIWBg0a5D3cahP1nCsaRNb5xsZGr5/yLod5LeWA9FXtp65x6dKl3mMYLjKdfcbDNkDjBXmAsjmW8ngowiHMIS5lVMxJ+qNr1DXPmDHDP+/qu1QyOytzeYmkcxoTyAun7w4fPtxHIOhZ0G9qXNuVIhPmATIMwzAMwzAMo2LoU1NzW3k5suzK4iOLUFNTU071t7D6UynH/vYU9fX1OQt1hh6glVde2VtCRGjt0THCEqblSqiLsqZFUeQtjJLn2muvDaTWtdmzZ3uLXWit0HFl0VhppZV8zLEsb7J2hnlwxYrid2+77TYg9rjIqvvYY48BaQzv6aefDqQW9p///Of+Oi+55BIgtR5pYdj58+d7S/pTTz0FpJblb33rW0Bq9Z09e7bP/VHboXLYyutQrsDy5cu9J2qHHXbolgxWFIpVDz0OorGx0VvP9JyHnsSqqqqcSpnZbVn69euX4w3VOZQzWU/3nnvuCcDFF18MpJ40eXOrqqpyFi8OqwuqyhaUXsn19nj11Ve911VtgfRK7aAqMv3gBz/wVdrU3oXeyEWLFvltkp+Op1xCfZ7VTVmazzvvPCBtY//73/8CcMwxx3gvdbGjZyyMIJB1W562rBdblnVdr9rVgQMH5lTTUp8TVkF7++23ffuh74d9vsZipTi+0rMrL0y4iHe/fv1yqgmHC/dmPUDhQqphWztgwADvzVN7oQiEckDPYXj9qna7cOFCr8PSJ+VSSeeccznLhYQRR/KsLViwwHvv5L3UfZIn1DxAhmEYhmEYhmEYbdCn6wC1Ve1Ks71wMb/+/fv7WaOsTOFaNppFfvLJJ37WWYlV4EI0y87KUvJRffvOHK8cCavdKYZ9q6228pYMWdzkndBaDc4574WQlULIEixrRX19fc4iYFqDRJ6KYkfWxHvuuQeAjTfe2Fdlk/VLr7r+G264AYgtce+//z6QemG06PGxxx4LwC233OItbltttRWQxh7LWyaLk3PO/5YszXqvfbQeyF//+ldvEQy9HMWKPGd6hsOFi51zOZUbZUULLZvZ74drhKk9mD17ditLHXRugblSJesB0vOuvijMLQ29ZtnPJNesxbiUF+bMx8CBAznhhBOA9HlUTL9Q3/zDH/7Qe2ZFaDV3zuWsAyQ5Sq758nq22GILIM0j0Osee+wBxF7oUvEAhYvlSh7qN9SONjQ0eFmH1cV0LxoaGnx0glCbrT5Lz3RdXV1ORE3oJZYHoxQ9QHqGw3GM3n/66af+ec/KD1q3CeE6auE6idk2Vh4zeUvkUevKgp3FhnRBOpIvVz9cKym8/ubmZr+P+ppwwd9sTQDls0mu4W92pVphUZTBlhCrqqr485//DKQKphAiCSgbdqAGVAoWuovPOeccrrzySv+9SqK5uTmnww1LadbU1OSsHh82gmEZ8kpBg2ZNZObMmePD2jTJUcjWtGnTgLjx00Ouh1UhdBq4ZxcKfPPNN4FUN1VOu1QmQCpeoMlJVVWV75R32WUXINUfhWdsttlmQNxpq5T1WmutBcD111/f6rgHHXRQq4UPIW3kNOjRxH306NH++f/Pf/4DpKtTn3HGGUA6cW1ubvbPQqks8ic9KrSYZk1Njb+m8BkOQzmyqA3VdyTD+vr6HKOROp5yJjuAkW4pbEaJuW19Lyzio2PU1taWzGS7ozzxxBM5RQrC8F0NwDfddFPfTkjXNBjXd/r375+TeC99zy4gDWnpfUgn7Zoc6LgTJkwA4rZbIXTFThiCrvGPjEXZ/XSdGkTK8KN2rqamxstPrwr9kswVxj1r1izfxqjNVduge1IqBWPyERokhPRz2bJlXp5CuqbvLl682I8HsoN4yA1fb2xs9J+FBSj0eSlPgBSKrlB3hbup36+qqvKfSWYaG2WXsQkNRpqYh5PGrIE+nHyqn1PBpM5QWbMCwzAMwzAMwzAqmqKot5u1TGoxxLCwgaivr/cz5zBRUq+ayVdC2dZCNDc3e3mESX2yQIwYMcJ7MbJeoex3RDmVwuwIkoesQHvvvbdP6Jf8ZK2QlW7OnDlMnToVSC0aSkKVpS0bVqQkVllPu5LE15do0bPsQmcKc7nuuuuAtES4LLAXXXQRADvuuKO/3rvvvhtIvRwqWrB48WLvEtfCiocccgiQykpJw8OGDfMLAR588MFAep9uvfVWALbffnsgTthW4QZ5iYodeST1vApZv8eOHVswrC+7uG+hRai1j2S23XbbeQuenoUwnKYcycpHcgy9EPnCqcOQRLWXCtmqrq4umeImHeXpp5/2beIrr7wCtC4jDmn7ueuuu/piBdIxyVP6lU26lxzDfkkyzGftlZdZocTyCE2dOrVkFu+VvsirE0auZMP9NTZSJIE8NvKOjRgxghdffBFI2195d3S/xPTp0713SO1wdgHQ7LmVInoes0sCQBouOWjQIK9z2agCaB12HLYF8m7ovcamy5cvz1kKQu+l50rhKEXC6AJdo7yPEydO9PoTehSzRczUFkiO0j0dX173hQsXtgrXhFSOOoeuLDNgHiDDMAzDMAzDMCqGovMAyYIUxrNr9hhFkbcKyRqkfcMEynxJUdl8o3InTJgOZ8qrr766XywyuwAi5Fp7CuUelCs333wzQKuYX8nkmWeeAdLkf33+4Ycfcs455wDwz3/+E0itSfJGylKy5557+phqWTPlJSoVZFVT3G99fb1foPT5558H0phzeXIUl688H0j1c/fddwdSC8+8efP8M65F/rbbbjsg9TrJgjR//nzfVsjyK0uwPECyLh122GHeS6TPip3weiUzWYpHjx7tZao8ntADHEVRTj5QWCJfv7PeeuvlxMBXQhuQjTUPPWphXiTk5lWFcel675wruee7Pa699lrv8Q7zI4U8Db///e+9F0J6JRllFz8NdVbvw3zfMPEf0lL7ekZUmlu5R6WAPL2SjdpNXb+8sCNHjvQFEyRXbVN/NG/ePC/bcIFZ/Y76oyFDhvhoBbWjahv0TJSyB0jPYaHyzcuWLWuV7wvp8y8519TU+HHSSy+9BKSFe9SXS87Zgh6SsTxK5VAOX+XvpU+6fslswYIF3mMTFpPI5qWFBRJ0vDAXsH///v6Zl16G+UHS6c5Q/rMAwzAMwzAMwzCMhKJbCFVx/JqZa0apvJ5sBacwJjusflRXV1dRHp8sDQ0NXk6SpWbk2YowWlhN1p1wMUW9r7QcIFkXZBV67bXX/CKf//vf/4BUb2W1GDBggI97ldxk7QlLEU+dOtVXipN3Qx6LUkHPatYyo3woXZO2XXvttUBqXRs5cqS33Ch2XzqnXJ3111/fy++b3/wmkHrSwpLX8+bNY/r06QA8/PDDQFr2WhZgWUhbWlq8l6hUKnPJEhxa0ZRXMWrUKO/ZlVdI+2bzfNQOhq+hxW3VVVf1VQnD42ifrpQdLXay7VxY9a5QmXHILZ+vNkH5GYsXL87ZpxxQBIFeQ1TR8sorr/TPXFgyWLodRVGOlzHMuZDOyQKf5ac//WmXr6PYCHMs9F7P9rx583wOpjw3iiTIlhfX+EdVSOWFUPsp63xTU1NOWxBG1JRyJVg9q9IfjXd0zdkS98o7UXuqcurPP/+8l22YvxsuOj906FDffsg7Ig9wKctRhHnQyjXL5u7k07Hsq3POyy1cfFfjCH13+fLlOd5L3VONuboi18qaFRiGYRiGYRiGUdEUnQcorIIS5gBlvyf0/TAee+nSpX4WrllipdDQ0NAq9h9SWUomQ4cO9R4gWT7De6LZerZCTyUQLtpVX1/vrbnh4ryiX79+ObHrhRbgnT9/vreIKia+K1VM+hJ5d7SWzuzZs9lmm22ANPdH8dN6P27cOCCuOiSrz2677QakspZXY8GCBd4aJ8+R9tHChlofY+TIkd6jJk+PPEuqTLf//vsDcaUaWU0POOCA7glhBRF6X/ReljLnXE6+ROj9DitqZrfpO2p/R40albMQqCz1WgSv3HJaIM1DW3/99XMsimF72tjYWFDW0kG1rz/5yU9KZn2vjpJt/8L2TnJRTuD3v/997xWWjoVrsjQ0NLRaODYfsuBPnz7d5x7uvPPO3b+YIiFcHFZ9teSqhaavvPJK/zzKS64xk6Jlhg8fzssvvwyk67RIfmorpZ/V1dW8/vrrQOFomVLxlucjjOhQXyt969+/f46XSNuya1CGi25K5morpdv9+/fPqb6re1sOYymNgXRNeq/qrBMnTvTyU5+t8YI+//jjj/19CHPdJKMwzz/7fclVxzUPkGEYhmEYhmEYRhsURRW4LKuvvjqQWh3D1YijKMpZnyFcgyFrLZXlo9I8QFEU5VQ8EZp1yxoP6SxaOVdhJal81uNyRlbunXbaCYgtPqp0JLmGugm5VuJwjapsJSnFyCqvRdYjvYYrUxcb4bpSTz31lM9j0vXKEn7YYYcBqc5NnjzZW4T1quNcddVVQCzzlVdeGUh1dt999wXwnqaf//znALz++ut89atfBdJKVD/72c+ANFdJbcqMGTN8/Ly8b8VOvjUUAJ+Xlq2oE1bMyuaehNaz8FXWzhEjRvjqUqp2GFbbKUcP0CmnnOL/nzx5MpC7Jk02pypcRynMmZQH81vf+lZvn/oKJ9vuFcpvUjs6adKknD5G35Fe1dTUFPQyhBXJFixY4D3PIYW87qVAeO5qE/X5Zz/7WQAuvfRSb20P1wzSWixLly5ls802A9JqfNOmTQNSi7uiEIYMGeL1W4TjqlKuXqY+VR5z9QXyhNXW1uashaY2Vl6IpqYm37aG++j4kqtzLscjIf0v5Wp6IryGMIenuro6J+cn/O7gwYO9zNUmqL1U+5mNeND3wvGX2oSu6GdRhMCJ5ubmVgtFQu4kJ7sYVUhYBCGKIj/4UbnCSiJMmNYDKcVRSWLITfxTQ1FpKORAcpCOvvvuuz5sqi3CCZAIB0h1dXVe1/fcc08A7r///la/XewTIHUeaoAmTpzodUwTH4Wd7brrrkBaQGLHHXf0+qdGU9/VJGnOnDleFtqmstWvvfYaABtvvDEQh2wpTE4Jv3rmJXtNdpxzPhRCoXTFjgqYhAMjGYzeeecdv0+hUtfZTjlcKiAMk3PO+fugDidc9K4cyZbH1YBQxrMwlLixsdEPeEIZSa9k5Mh+rxyLIRSadGih1K233tob1cJJtwhD4rKEg6nq6mq/VMFRRx3VoXMpBWRcCAuMqL1Sv1xXV5czidGznQ0j1LOqfXQPNBGSwWrzzTdniy22ANLFpYX6IY2lShE9yxrnhCW/+/fv7+Un2as9zRYwCkORwxQNDeRramr85F/o3oUTzVIkNPBqAqQ++OOPP84xEIeTmiVLlnh9zJYPz+4jdtxxRx566CEg1XPdn+5MgCwEzjAMwzAMwzCMiqFPPUChhaa+vr5gCFE+13j4WZh01tLSUtJu2+5QU1PjrWVhMrNm5lkPg6wTsrhnrZxQOWXE5WGQZV2LSzY1NflwIxVDUOiBcM7lWN3DV7lxZ8+e7Y+j0qSybLzxxhtA6mEpViSbG2+8EYgLHciSo9C1G264AUiLISjc7b333vMhLHvvvTeQeodkNZfVE1LLqBZelIVdibuDBw/2n6lErsI+wtCDfv36ecvn008/DVD0CeqhNU1WRFl2X3rpJW8JayuRPEyyDhN/dQy1FdnjiY54QkuVrMxknQw9P/kWlg1llK94Tyl6JLqKPLR33303EJfJlqdX/ZJkpNdsmfawDLTQszxw4EBvAS4n1N+qLZMHR94ZjWeWL1/uPZN6HmV9X3/99YE4/FAeD/VdagO11IDakfnz5/vlAtSvqa3NFp4oVUKvoNo59TW1tbXee6N+WLLOeoT0Wfj9MDRutdVW822odFjjsHJKJwiLFmgsM3z4cB+JEUYZ6B40Nzf70u1jx44F0j5fbYTGYXPmzPFjCo1bw/FtWx7kQlTGqNYwDMMwDMMwDIMiK4LQr1+/VrNDyC05nPX6hPlBoeWzqqrKx8lWGoMGDfKy0uxccpGVPhuLHno3ZCkKy5qWO7LofPjhh0CaJ7Xeeutx6623ArmWnKxlN2vNzG5TTozyUtZbbz1/H7JJwFA65UZ1/vLg1NfXe8uvZCRLY5gkWVdX569XRSBCL2T2N5Tro2c+jEefM2eOt1DqHqy11lpAek9lMR43bpzPb1GJ7GInTKgNE3Sbm5tznlE935JZFEU5ixuGuiZdzO4bWtpKrVx7VwkLT4T9TEtLi5dRIQ9QOS4Wm4/Qu6V8u9NOOw2A8ePHt8rfgVyrfLaoROjxDHPUGhoa/EK98uaqsEkpE+qa2q4DDzwQaK1PilaQTLR8gLw648aN81Z4yV4Wdnk7sh5fWda1ZIHyhPR5KXvcpD/qf6R7KiTR0NDgt4WlnfPlBUp+Ya5KdsylbfIkZyMQSp0wskX9kxZEHjp0qO8nwvw1edGqq6u9LCRjyVf9vryaM2bM8IWP5BV95plngFzPfKeuo9PfMAzDMAzDMAzDKFGKaipaW1ubU02jrbjpQtuyM0HFDOfbVu6MHz8eSK0Umnlnq78JxVoqpyK0xFWKJ01WNVkrZIFYtmyZt5aFFeJEvhjU0EJ8wgknALFFb6+99gJST4UoVOWw2JCVV3G/jY2NPPjggwBsueWWAGy33XZAmhP0xBNPAHGcuSxuyu9RqWx5hD744ANvYZJVUpYheejklWhsbMwpcSrvjmLaVc55jz328JYmeY20qGKxIuuhLMDZXDLIXzEwn9c8XDQ63EfH/+STT7zuSsayAKttLney3jDILWnf1NSUk6OqZzesjlRp/OY3vwHS3L+GhoYcncu3eGroQQ/J9kvSeeXvlYMHKN/SCpCWnFcO5ejRo32eUGiFz0bPyNOtvl+y1rOclb2WfJgyZQoAjz/+OJA+76W8gKfaNbVpuhb1DePHj/d9gsY6enazHhu1CWHUhu6FjjthwgTvDdFitIXubSkSLqcgL5e8kIMGDcqRleQrGY0aNSpnnCl9lDzVfiiCBtKxQHYRW2idt9pRzANkGIZhGIZhGEbFUFQeIEhn3Yrza6v6mGaLmtWHVWWqqqq85VmUw+y7I7z33ns+fliVYDSLlqUni7wQkp2sPppVl3IFmM4gi5DkITksXLjQyyK0oktHV1llFV/7P8xnkR7++te/BuD73/++X7BTliJ5T0plnZWNNtoIaB3b/LnPfQ5I9UgV7ZRjptfNN9+cu+66C0g9SPK2yWu7ySabeEuQvJi6H/JY6nhz5szx7YBkLy/RKqusAuAX9pwxY4aPjf/CF77QTSmsGNTWyQOmtTok58GDB/tY67CSlshW2Qp1WEhWdXV1Xl6F1iAqd0Kvdz5PULgwbVgxrlLXU1Ouo66/tra24AKQ2VzK0KsunZMOylI8dOhQ35+FuSml3Mfr+tV3q9Kb2jkxb948/1m43p+e8eXLl+csICsrfDavBeJ8nzXWWANI+3o952qfZXkvRaQT6lvkEdP6dI8//rjPeQoXRN166639dyRH9VWqNCqyeabqo1TdVPc2zBsqRcKKwtIneRwXLlzo+x/JROOabG6VtsmDJO+QInGke4MHD/YRJ6oYp747W8mws5gHyDAMwzAMwzCMiqHoPEDh6rnhWgxZClmLZPXo16+f/36h75QrG2ywgc8B0oxZFg6tKZBls802A1KLkzwhsi7ts88+vXq+xYIsQ7I2KD/l008/9V4hWd9lgZSMli9fzoIFC4DUgqfvy1Iii8cGG2zgZaz1dFTpJ18+RzGieHS9dpbjjjuuJ0+nIpAHSFZKWdrvv/9+b2GTFz1cbwUKW8fDikfTpk3z1tFClXrKHXltw6pN2f5FXqKwgpT6GVlEs5+VE2ElNxG2ezU1NXlzT7P7RFGUc7wwh1K6l7Uwq18ThSrJlgLyGqgPUH8kT7h4/fXXvX6Gsm9Lz8J9Jft58+b59YPksQi9xDvssEMnr6Z40DhQeiQvjCqYnnfeeb7Pluzl7dH4qbm5Oee+6DvKBVLEx4cffsivfvUrAB5++GEgd3xaymiNQnmCJBfp0Ny5c3nooYdafUdtpKI4li1b5r1sakfDqrnqy+bPn++jE3bbbTcATj75ZCDNAVRf2BmKaiFUSB90JfcKKdbixYu90PQadlBS3HwLTpWye7wzHHjggX5A3RE02Hn00UeB0uo0ehI9cErEV/jgGmus4Rf1FEpu1KT9448/9uWaDzroICDVwbCc87rrruu3HX744a2OI5e7YQh1sO+//z6QduQycuyzzz6+wES4IGo22bzQApN6r0nUTjvt5JPK1WFpcl/OC6Fm5aJnVmEYWrRP8ly2bJkfAGnfcPkAPe/hscsFySKcQN90000AvnTtlClTfH8dTnKyZdrDwbv69lB2NTU1frD1/PPPA3DBBRf01GX1GZrUaLCogfqOO+7Yaj+FH/cUMnxCOhY499xzgXSQr4lAKSJdU/smvdU13XbbbV067llnnVVwm8awejbC3y5l3n77bSANzZSe6vOf/vSnPpRSk5uwEEVLS0vO8622QKGKCuseNGgQJ554IgDHHnsskBuKrd/uDOXXIhuGYRiGYRiGYRSg6DxAcgHLtSbXpSzx/fv3zykJK6uRZpFyn9XX1+eUwa4Uli9f3u7CZfX19X4GHi7+JbIJlpVQ0lXWL5VxlY5dcsklOfuqiIFes6gMdFtI1tJ56bjKYxuGkDdXhTJkRVRYwNe+9jW+9rWv9cpvH3zwwUDaFhxxxBG98jvFQL4+SaEWCuk45JBDgPgZv/HGG4HchSblmdP9KVdCz4z6kcceewxILcRLly7NKcARRmg45wpGaGTDDiHW/zASpL1zKwW22morIF0SQH1uWEyjqanJX1+hMMTO0Nzc7Ps6eX6PPvpoIA1vyhc6XyrMnTsXSL3ZKjwkb3lvoLZAJczlASqHxZF/8YtfAHDnnXcCqUdSbSXAH/7wh175bXmAJEe9ytvcGUqvhTAMwzAMwzAMw+girhwTMw3DMAzDMAzDMPJhHiDDMAzDMAzDMCoGmwAZhmEYhmEYhlEx2ATIMAzDMAzDMIyKwSZAhmEYhmEYhmFUDDYBMgzDMAzDMAyjYrAJkGEYhmEYhmEYFYNNgAzDMAzDMAzDqBhsAmQYhmEYhmEYRsVgEyDDMAzDMAzDMCoGmwAZhmEYhmEYhlEx2ATIMAzDMAzDMIyKwSZAhmEYhmEYhmFUDDYBMgzDMAzDMAyjYrAJkGEYhmEYhmEYFYNNgAzDMAzDMAzDqBjKcgLknDvSORd18juPOud+11vnZJQXzrnpzrnvdHcfI8bk2XGcc+Occ5Fzbpvu7GMYpYb17THOuROcc4sLvTeMYqJY+/denQA550Y75/6QXFiDc26Oc+4h59xevfm7lYBz7ppkgBM55xqdc3Odc484577hnKvp6/MrdXpId7cF/tDO70xK7uHK3Tvj4qaS5Zl5Tgv9XdMLP/shsCrwUjvndqFz7rU2tr/pnDukGOXaGwTtauScm++cu8s5t2Ffn1sxYX1798jTf09zzl3qnBvc1+dWqvRRO2tQuv17v544SBvcDAwCvgJMBVYBdgVG9fLvVgoPAscC1cBoYHfgh8Cxzrk9oihaEn7BOdc/iqLlK/Y0S5Ju624URfPa2u6c69+dEywxKlmeq2b+PxC4KvhsWU//YBRFzcDstvZpz1DinNsAWAt4ANiu586u6FG7CrAacAlwKzCxz86o+LC+vftIz2qAXYCrgcHA1/rypLqDc64miqLGPvr5TrWzfXyubVLM51aA0uzfoyjqlT9gOBABe7axzzHAc8AiYC5wE7B6Zvuk5Bh7AM8AS4Hnga2C4xwHvJ9svwv4Rnxpfvs6wO3EA4IlwIvAgcExHgV+11vy6AX5XgPclefzTYDlwA+T99OBC4G/AAuBm5LPdwIeS2Q2E7gCGJY5zmeBp4HFwKeJ/DdJtq0EXJfcs3pgGnB6X8tkBevudOA84I9AHTADOCvPPt/JvI8S3bwl0cN/J59l/67p6+s3efaqLI7Mtk1t7Ldm0mYtSJ7RN4Gjkm3jkms7gnhyshR4A9gr833ts03yflLyfn/g2aSNODWPvE7IHOPs5BzG5dnvmmSfWuA3wJykLXga2DlzDP3ugcTeqHrgBWDrvr4XBeR+DUG7mpx7BAxM3l8MvEU8oJoO/AIYEHznnEQmi4FrgR8A0/v6+npIRh15nq1v77yeXQV8RNxfvxZsOwFY3NH3yWenEA9GlyevX81s+wdwc7B/FbHn+IzkvUvagHcTXX8VOCaz/7jkHn4ReDjZ59S+lm1ybq3a2ULnmlzz+cl1NyTXeEie720THD8Cjsy8vyDR04ZEF6/NbCtZOXZQ1sMp0f69N4XSj7jxu5ygc8jscyJxhzyB2ML4CPB4Zvuk5CKfBXYDNgTuA6YALtlne6AF+D6wfvLQfxwo/+bA/wGbAusm+y4HNszs8yhF1ki2I99ryDMBSrbdQdKAJkpVlzyA6wLrJXJYDHw7eb898BTw78y9+wS4lLiD2RA4GpiYbP8t8WBmu+ThnQR8rq9lsoJ1d3qiZ6cmcv1moqs7Bvv8f3tnHiZXVef9z+3O0ktCEkJIwIR9S4KAyC6bMuyyCQy8uLDII6ODow7vvAiKMw+CIMg+DA4iyA6jIItsgsAEZEcWCYkkgARCIAuB7nQn6e2+f5z6nnv63Kqkk3TTXbd/n+fpp7qq7r1V91dn/a1xh54PnFxq85sCXym9PgWYAIzq7/s3efapLHq6AboXt7nZFtgYOAA4oPTeRqV7nAkcUurD15fkNyI6Jt4A/RXYrySvSaU+PrMkqwmUFvmlc57CjdG1leQKXIZbtB2Ms5D8Cje2rBd97kxgf5yC5re4RUJDf/8eZeT+G4JxFRiJU/a8Grx2FvCFkowPAuYAPw3ePxa30TsZNyedgVMi/b2/76+XZGRzey+3s9JrlwML6YUNEHAE0I4bT7fAjaftwCGl9w8utdHRwTlfBDqACaXn5+I2+gfgxqDjcAvRg0vvb1T6Df+OG9c2Bib2t2xL363SBqjbdwV+gFsfHVeS09lAJ7BddF7FDRBOEdVUkukGwA4EG5hqlmMPZV2183tfC+ZInAZzGW6B/Qtg5xUcv1Xp5iaWnu9der5/cMwXomNuAR6OrnMNK1lk4DSVPw6eP84AGyRX8v1/Q+UN0PlAa9Co7o3evwH4dfTadiW5rgusXfp/rwrXvwe4rr9l0MfyXWHbLcn11uicWVGbKtehr4jOURtfp7/v2eT5qcihpxugV4F/r/DeRqV7PCV47TOl13aPjok3QEdG1/oPosVW6fXxuAXTuEpyxbnrtAHfCF6rxWk6z4nO+2pwzAicNfrk/v49ytz3b3CLwCWlvxS3wdl6Bef8EzA7eP408MvomD9SkA1Q6X5sbl/zdhZutHfCbX5uL9cnWfUN0J+Ba8t85pOl/4fgFpffjGT7UOn/RpwlYo/oGpcC95f+36j0e53W3/IsI99KG6DTouPmAj+JXnscuCk6b0UboH/FbXCGlvkeVS3HVZB3Vc7vfZoEIU3TO3A+1IcAD+Dcrp5JkuRMgCRJtk+S5O4kSd5JkqQZZwIHt4sOeTX4//3S47qlx8k4gYd0e54kSWOSJBckSfJ6kiSLS9lSdijzOUUhwTUS8UL0/ueBryVJskR/uAETYNM0TT/CDZYPJUlyX5Ik/5okyaTg/KuAf0yS5JVS4OZefXQf/cbK2m6JV6PT3idrl5WIf4tBgcmzMmE/TJLkl6WXLwN+nCTJ00mSnJMkyefLnLqicbESPZXXIcAz6Yr9sjfFxS9o7CB1sUdP4zR0IU8HxyzBWaLiYwYK03AKoe1wVohHgT9qDExcJrInkyT5oDR2XkL3uWQrnGUj5Nm+/tKfJja39woHlPq8Fo3TcJrx3mAyQb8s8SSlPpemaQdus/VVgCRJhuMWsTeVjp0C1AEPRuuEb+P6fUg1jcH+uyZJshauDVeUUw/5LU5WbydJ8uskSY4uyROKK8duVOv83udpsNM0XZam6cNpmp6dpuluwK+B/0iSZBTO5N2KCwTcEWciBIiDncJgMC3s9d2THnyNXwBH41wX9sJNbM+V+ZyiMAUXlyPiZAg1OG3PdsHftjhXmpcB0jQ9ETf5TwMOBd5IkmT/0nsPABvi5LoOcF+SJNf1xY30Jytou2o3cZBiysr7VC4xxWDB5FmR7YK/nwCkafprnCvEdTjXjKeSJPmP6Dwvr7SkHqP35HU4LrZiRWjsTcu8V+61aqE1TdPZpb/ncIG9awHfSpJkF+A23Nx1CPA5nG97nFCimu+/R9jcvsZoo70lznXoK2mazse5/cX3vjqZXVfWL28C9kqS5DM4961huGQfkP0Gh9B9fJqKc6ENqaYxuNx3XZGcukqP/veIk8ekafou7jc8BecKdxHwYimjX1HlmKMa5/f+qAP0Os78uh1u8XxmmqbT0jSdycp3g5Wut0v0Wvx8d1xQ2h1pmr6KC8CKd9+FIEmSrXGTze9WcNhfgKnBJB/++UwpaZq+kqbpz9M03RtnFj4+eG9hmqY3pml6Am6BcHyg9Sgqart1vXhNZeSr7cVrVgsmTyDqf/OD199L0/TqNE3/Ebcx+lYffHwbkaxKE/c+wF3RcUTHKsB69+DcWmBX3G8bsktwTCMuFmjGmn31T40UtxBqwLlpzU3T9Kdpmj6fpuksnDIoZCb5rHmDIYueze2rhjba76TdM34tAMYnSRJugrZbxWvPIOiXJXYn6Jdpmj6Lc1f9PzhL0F0l6yyl45YDG5ZZI7yzit9lQJKmaRPOCrEiOckCHmaT267MtZalaXpfmqY/wG34p+LGisLLcQUM+Pm9z9JgJ0kyFmcavBZn+mrGmab/H/AnsoZxapIkV+JMtj9djY+6HKcdPQO36N8bFwAY8gZwRJIkd+N2of9O7/4o/cXwJEkm4Day43CLljNxWZZ+sYLzfo4zT/4Sl5WjGee2cUiapqckSbIxTptxD85HdhNgG5zrG0mSnI3bRE3HtaGvAG+labq81++wH1hZ203TtKn73LRGvINbYB2cJMm9wNJgEioEJs9VJ0mSy3CuBG/grA8HkN9U9AZ/BzZMkmR7XKxLMy5ZwVtpms4Ojisr1yRJrgLOT5JkIfA2Lqh4PPl6Dj9OkmQBbsHxE9xEdksf3E9voHEVYAwucHcELjHFSOAzSZJ8Fee2tD9uARlyGXBdkiTPA0/g5qOdcYllqh6b2/ucx3FxuGcmSXIb7r6PWsVrXAj8NkmSF3HxZwfgNjlfiY67GRdkvhGBbNM0bU6S5BfAL0obsWm4PrAL0JWm6dWr+H0GKhcCZydJMgu3bvoaLiX55wHSNF2aJMkzwOlJkryJy4B7XniBJElOwK2DnsXFDR6Da4uzBoMcq3p+741AonJ/uPSoP8OlwlyMM4fPAi4G1i4dcwxOA7EMZ7bev3Rze6cVAp4oE5QGnIibvJfiFg2n0j0AbkNczv0WnIbo/+JSav4mOOZxBlig5Erk+xuyVIAduADKx3E+xMOC4/5OEFgWvL4D8CDOZNuC88k/u/TeeFzqwbm4iWwOLtXr0NL7P8JtflpxgW/3U8oQV4S/HrbdnFzjNhQfQ5Q6M3j9LFwmrS4GWNpmk2evy6KnSRCuKMloGU4LeRulNML0LDC32zFUCB4t/Ta/K/0uKS6Y+gbgZz2RK93TYC+nchrsQ3GT43Kc8mTH/v4tKsj9N3RPs9qEm5uODI45r/SbLMGNk9+Of1OcImo+WRrs84EZ/X1/vSQjm9t7p52VTWJUev8U3GKvpdT3v8eqp8H+J5yVtp0oDXZwzKYlmX8IDIneS3DrCW1oF+AyU+5b6fcaKH9UToIQj5lhGuw23Dro8OgYxVO1lt7fg+5j7eE4ZcjHpd/reYJU7NUsxx7Kumrnd6WbNAzDMAY5JRe2+cCBqYt/WdPr7Y1LgTwuTdOFa3q9aiVJkt/jFpiH9Pd3MQzDMPrQBc4wDMOoOsbispo9399fpFpJkqQBZxV6EGedPxI4rPRoGIZhDABsA2QYhmEAkLokDOf09/eoclLgQJwbXD3OHeTraZr+foVnGYZhGJ8a5gJnGIZhGIZhGMagoT/SYBuGYRiGYRiGYfQLfeECVySTUq/l7ltNVlmWsuiFaQe/853vAPDd77oi05MnT654/ksvvQTAr371KwD+67/ibLarTX/LEnogT8lPjzU1lXUETz31FABz5swBoKmpiQkTXPbc+fNdOZf33nsPgE022QSAb3zjGyv9kl1dXSv9bKpEnis8OWqry5YtA2CLLbYAYOLEiXR2dgLw+usuA7Ta8M9+9rPctdYw1WbVy1MyeuSRR4BMVj2Ryze/+U0Azj//fADGjRu3Jl8FCiDPmI6ODgCGDHHT5qxZs3x//t///V8Ahg3rs/qbhZPnmvD888/7uWr69OkAzJs3D4B11lkHgH/7t38DYOONNy53iQEnz9AbR3223Hwe89Zbrub5E088AcDxxx9f8dgXXngBgI8++giA/faLa3Fm848+s4ffZcDJc1Vpbm4G4MwzzwTc/AP4OaimpsaPAR988AEAQ4e6mqh1dXXdXr/88ssZOXLkmnydqpSn2k6aptTWdi/VI9nsuuuugJOnjh89ejQAF1xwAQD77rtvt3M7Ozt9u1vJuqgSZeVpFiDDMAzDMAzDMAYNlgShwGh3PWLECABOP/30bs833XRT2ttdAeo333wTyLQ7W2655af6XfubOBZOcihnjVm6dCkA3/rWt4DMovbBBx8wduxYAF555RUgs/zIWqTnu+++e+4ze2j5KQyxJlEauNAiJJkcdthhAF6+K7tWUVGbeecdV0RcWrXRo0d7q81vf/tbAJ588kkgs1wsWrSIhoaGbtfTMaeeeioAa6+9NgAzZ87MWTw0JgwWWQu1QclBlsonnniCa6+9FoArr7wSgB/84AfdzhksfbmvkSeCrDwjR470bfmAAw4AXPsGuOiiiwDYYYcdur0+0EmSJOeBEPe1lpYWwHlqvPjii0DW1h5++GEA7r//fgCefvpp3n33XQC+9KUvAbDWWmsBeOuE5v111lmHnXbaCYANN9ywt2+tKrjmmmsA+M///M+Kx6g/S+ZCliCtp/baay9OOOGEPviWA5N4riiHLLJ///vfARg+fLhv33pN4+drr73W7dzQmtSTz+opNjobhmEYhmEYhjFoMAtQgdHuWtqezTbbDMg0mIsWLfL+rdpNr7/++kDm9xrSE3/kaqXSPZV7/YgjjgCyWJWPP/4YgEmTJvn/jzrqKCDTGD300ENAFls1adKknKZNWo7BkJmxqamJxYsXA5lFbauttgLguOOOA1w8itqljpF2t62tDcBrOEePHs2oUaOA3tEMDVRkWZQGUm1o7bXX9vEn06ZNA1yMCsAPf/hD/7oskPvssw8As2fPBmD8+PHdPmerrbbyFjlp0KVxlmZ9sKIYq9GjR3vrr2KBpME0y0/vIo2wvBfq6+vZfPPNAdh///27Hfvqq68CcOONNwKuH+jYgUy5OMa5c+cCWZ9+4403/HuShaw6sjjIGnHQQQf5OUVjoqxmTU1NAHz44YeA69vPPefqHmu9sOOOOwKZha2I835I7IEgi7esbu3t7X5u1vpI8lQM0Ntvvw3g57aiEq8F4zn3zjvv5MILLwTgmWeeAbI5Zr311gPcvKLryPPgk08+ATJ5/sM//AMAhx56qPe46c35vbgrhUFKGLCo/7UoHzNmDJANcDU1Nb4xLV++HMgWOxp4Bzv33nsv4NwJXn75ZSDrpFrkzJgxA3Adc9111wWySej2228H8BOwAndPOukk77L05S9/GYCvfe1rQDEnGk24ctlqbGz0bS92a9tjjz0AePTRR5k6dSqQbdrlSqhFjwbKlpYW33bVvjXQFgG5/mjC1T1q09PW1kZrayuQ9XNt0O+8886VXl/9X+4FIfosbbrkrrDRRhut8n1UI7E722OPPQbAiSee6I+pr68H8rIxV7jeQS5waqf33HMPd9xxBwBnnXUWkG3qNa5I4ffAAw9UxQYoHPc1T2izrXtSu0qSxC/CtYjUPK/r1NbW+g2QFEg6Zvjw4UC2eRo/fry/no559tlnu50rxV8R5yfIlEFC87zaXJqmNDY2+v8hm9fk+iYZ/u1vf+v7L9yPxG0g7ovz5s3LtVmhDWV9fb1vn3HCCLXLP//5z4BTAFxyySUAXHrppUBe8bE62KhsGIZhGIZhGMagwSxABaOcm5pMjzKZa7e9dOlSr/ENrUKQaYhCiqr5Kccvf/lLAK6//nrAadplUZBpXFoKaTS22mor76IkTZDSjMbubgsWLPAuRfoMPZemo0jIJUCm7uHDh+esDe+//z4A2223HeCsPXEqTWnYZe2QRq69vd1r4aXBlAZPrnHViDSLM2fOBDI3wQULFgCZ9ayhocH3XblyyFoUyzC8btzf9dje3u5lLOub3pPbjOQdu88VjdjlQm4uW2+9tX/tyCOPBOAvf/kLMHisY31FJXdrtcGjjz6ao48+GsjGFrnLbLPNNgAceOCBQDYeVANKT62EBkoPHCcvgXzgvazBegytRHFCJKH+v3z5ct/OtRaQN4PcD3fbbTcAX+qhaMi9ULKOS2F0dHTkQgPkgRCPo5rLio6sY0qiozY0YcIE76YuOcbp1RsaGnxb1VytNZXmdTFs2DCWLFkCwLHHHgtk7uAbbLDBan9/swAZhmEYhmEYhjFoMAtQwSinOZNGQ5YKaSlqamq8FkmP2tHrechg8GeX/JQeOLT6fOYznwEyLZ20FNKIDRkyxGsnLr74YiDTQuo3kD/1mDFjfMIJBZUraF3av7gYWDUizU5shVi2bJl/LQ4o1eOHH37o5SVNqIoc6hxpmbq6uny7lBZJ/tnVbAGStUWWHmm7dY+Ke1p//fV7ZKGV3NS/1d4V8ycLXV1dnZenjlG7l9ZTv21RLUBxulUVmixXWFPxJ0p2IlY0Zg6G8XRVCONW47asZCeKZ5s2bZq3TGjOOuecc4DM2i7NcDUFpKuYcTzuqd9KLqElQv1RY6EehwwZ4tuW+rvOk8zC68YJkWQB1rmyfBbVAqSxVlayuC0OHTrUW8Pj9imZyaKxcOHCvv/CAwB5q0gushq2tbXlUoVr3RmuNSVHtXMRFlTV9eRxIEvQj3/8YwBuuOGG1f7+NvIahmEYhmEYhjFoMAtQwSinTdTOW77QoeZRWs5Yoy4Nc8hgiAF6+umngcwCNGnSJMAVjZVfrywUkqM04/X19V5L8dWvfhXIYlYkZz3fdtttfbpWxQsow5ksTUWwAOm+pcmRZrO+vj7XntQGZVno7Oz0VjZdJ8xyCN3be1y8tgjpxNVeNt10UyDLBict2Gc/+1nApfx99NFHAdhzzz2BTBunGIG5c+d6Lafi2KQtVxtWDMuiRYt8jIWyyul3USptXauoxBpMZTqSfEMUD3TPPfd0ez2MH5CW2Cw/5UmSJCcbPVcWOFlCTz75ZG9dj1Gpgc997nNAPu5lIKPCpJpHQmtO+HpDQ0Oufcr6EGaHi9MU6z2tCULLvI7VGK1HzXeKQ9x1113X9DYHJLKkabyUfCWj5uZm/5oe5V0g2amtlYuhLiJxwVK116FDh+ZifsJseuDGRMk27vfx2JimaW4+V/bdNcFGYMMwDMMwDMMwBg1mARoESDMU+/2H/8fapNgnEwaHBUhWmIkTJwKZhue1117zWvhYy3P88ccDcMYZZ3D55ZcDWRY5FZdTZi5l2Bk/fryPGzjooIOAzP87LHZX7UjDozYoOdTV1fk2F2snQ62kZBxnlBF6PnToUG+RiDPzVDOy8MjyI1nJGimN8Z577uktE7LqnH322UCmefvud7/LP//zPwN4687NN98MZFZH+VV3dXUxffp0IIszkvZZv6HisYqK2qxQXZTzzz+/4jmynKsOiCxt4fhahHbZF5QrBCpZ7bzzzgDeyvnQQw9x2mmnAVmsiorR7rTTTkA2TleTBUheGoqp0LinsTHMnBmPc3G2ws7OzlzsZZwVTrS1tfnP0vV0rPq9YiqLimSlNqi5R7/F0KFDvUVecVCyFmmdoDFjsFiAYi8AzTVArmhsPHeHbVNtT6htiyRJct5K8khYE2wkNgzDMAzDMAxj0GAWoEGAdtfS3EpbMWTIEK+p0K5aGo3BYO0phzKxqZaE/J4/+ugjr52TlkdZ3K677jrAVR6/+uqrgcxvWtrI559/HoDvf//7ANx///0+Tkia+m233RbI4juKgLQ2kpm0tTU1Nd6fX77mIqxFI62jNEKxr3CYFUlZDmVli7Wc1Yj6qu5XlgX1U7XJuro6Nttss27nyjJ5//33Ay7Dm7IUKnObLD5xtqjm5mafPWvatGlAVgdEVg3FBhUd+bmrLYfaybg96vdSBXPJqqamxmJ/VsKK5pzDDz+822OI5rXLLrsMyLL1ffnLXwbKW5YGKtKKKxujxkZZeqVx32233fycrfEuzlpYV1fnX9NjbOUILfKybsi6rP6uMaFI81I55PUiy4LmId13V1eX79+yCmkskHxlAS4XQ11E5JkgQguj2li5OnTQ3ZqpNiy0TlBbTpLE94W43t2aYBugQYCCxeLCiAsXLvSNSQsimSm1ERhsKN2qCk6K7bff3nfG+fPnA3DFFVcAmSuQ3OYgC4rWovy4444DsjS5kyZN4tJLLwWyYF11+iIs3IU233Fhs/b29pyJPAwYB9dOYxfNOI2zTO51dXV+s6TfI9xIhedUI5og5Kr24IMPAlmbW7x4sZe1+rk2mN/+9rcBJ1e5vmlSl8wkZ7XB2bNn+99MRT712YNl4yNuuukmAL7whS90ez1MvS4mT54MwLXXXgvASSedBPQsDbZtkPLE/T9cTMk186qrrgKytizFUniNatgApWnq+58W0LrfOHnJ+uuv72UTuxCH16vkHhcXQO/q6vJtV3IVGmP13drb26t6LK2EksYoOVGc7Ch0iY0D+yVHFaieOnXqp/CN+x+1S7Wv0M1tZX2us7Mz13bj9hq6uEvWmteVuGdNsJHWMAzDMAzDMIxBg1mACka5QqjSYEhLod32+++/7/+XO5e0HnKtGWxIfrIaSBNx0kkn+SJ8Sobwhz/8AcgsDqNGjeKDDz7o9p4sa0p1vcceewBw/fXXe7cGWZuklfvjH//YF7fWL8SF+3SPNTU1OXfLOE1wbW2t1zRKMxSnzQyLo0lDFBfwlOm8CFpLFeaV69rdd98NOBcZyU/9XFYeWWwkb8j3b8lMrh2tra2+4KfSXg9W1Jcfe+yxbq+Xs9Rsv/32AJx++ukrvW58vll+8sRuNLfddhvg3N3UVo844ggAfvjDHwKZ+1i1WdQ6Ozv9PY0bNw7I+ukhhxwCZGUZZsyY4S0WoSsRdB8rK5UCCDXr4Ny+1M+/9KUv+c8A2GKLLbp9l/nz53trcJHQPHzXXXcBmRw1boaWb93/e++91+0askpojVB0ZHWVt4D6aU1NTc6qsyLiJAjlzolLX4Tz2epSHSODYRiGYRiGYRhGLzCgLEAvv/yyDzqXNkIaD/lfyq+9HOWsH4ONUAYKYpaWXJYK+W3utNNO3q9Xmgv5HofFKKF7EG+loLZqRtoEaeCUklqxUI899pjXiF988cUAXHPNNQDceuutgNMGqd0qFbGuI/kqLfaUKVPYZZddgEzGcduXViROx1tNqC/GFjUgZ92Jz+no6MgF7wrJTJqnhoaG3GfERVOLiCyMM2fO9GNj7LuuYNFQ9koNHGvJ5f/f0dGRC0wtwviqQq/q52EQOGRtcvLkyZxwwgkAPh34woULgSwpwrhx4/x4KVlVKhbb0tLiLZSySOo76LpKvCJrsZFx1llnAVl8xpVXXumtbTHV2k7b2tpyhSB1L/LQ0HjX3NzsXwut6pC15dbW1lypAaHnGlebmpr8uDFlyhQgSyah5Cr6HK0ZiobiduPYVN23Ul9DZg2SBUhyVB/ffPPNP4Vv3P/ERWPD4qflipmGj6GFMrb0lpv3Y6tlueLqq4pZgAzDMAzDMAzDGDT0ugWoksYW8hoZZb/S6yeffLIvRClNmnxhpQ1funSpTy2slJjKjKLrhLvQVaHaNEblCO/hr3/9K9C9kBdkGseJEyd6DagsFNL2SN7Sfko7WVRia4S0sLK+vPvuu/zP//wPAOeeey4At9xyCwAvvPAC4LQ/Sh16zz33APD2228Dma/sBhtsADgNsVJjS+O23XbbAVkxVmmTimABiguifvTRR15jI9/yUDMErh9LBko/KtTH9X5nZ2cupkifVWQLUJjxLtbyxoR+1rGmWciSUaRivCFK9atYPWnUpTUPCxgqhkrFaBUDpLHhjTfe8G1M2R51Pcnx4YcfBlzMgOY0aSylYZ4zZw6QaZUHqwUoTdOcn7/GTVk3FfMWEhdQrtZ5vKOjw99DXOxR6yq1xVtvvdXH5mgsVP/WNVpaWrylV3KNM2lJzosXL/YZJXW+LD1xAcqw2GWR0HpUxNYIrUUha4+al+LCnSppUVSUCVfEZS7CNNgxanPLly+vGB9ULquc2l3cz1UaQuunVcEsQIZhGIZhGIZhDBp63QK0Mi0kwO9+9zsg28HJLxvgO9/5DpDt/J555hkgKwQ2atQov/tUDIa0IscccwzQXYu3Kqyo5kC1EO66pcWNLQiy+nR1dXmtkbTwumdp5yX3bbbZpirlsapIIyEfXsUA3X333d5H+Pe//z2QxVF8/vOfB5wmV/LceeedgaxOiyxoigm67777vNVN5+y///4AvPLKK0DvZDnpL9SHYo2utGkLFizI9bPYUpMkSa7QXGxR0nXb2tq8Zj3WEFWzHGNin2lZGhoaGnLZoCQ7Pba1tfljYp9tjRGKaWlra+vRWF5tSHMrbaL8+nWvGhsnTJjgMz1J5qqTomNDq5ssyNKSKzZL1veWlhYve1mJNE8p7qoIWQp7wqrE6Kh/Kxa4HOrvL7/8crdHxXCVq9c0EGlra/P9UI+ygKmdqs00NjbmCkir7UoeoVVCx8ZjYWiZj/tGfN1q9kToCerf6oeStQqkhvX5JIvY20DnFN0CpHWMiC2XSZLkYnDj57W1tblYt0rndHZ25upcCa3RVscC1Osz3IsvvghkDSFMHaibUjE+uSOIjo6OXADzrrvuCmSN86qrrvKLU6W9VFDqf//3fwNw2GGHAVkgek9ZWeXaamL58uU+QE8LbHVgDYYdHR3+fyVMiE3kKuxVdCQHTTiSlQbDvfbaKzcJa1J66aWXAGciV/uVm6FclFRdW2b2oUOH+t9F6UxlPpbbgzb6SutaTcRuE/GGZfz48X5xKOJNEuRN4bFbW+imIPnpOmEyhaIiedTV1XXbDELeza1cgd3YfSZMpV30BQ+QW0SqDX388cfevUXJT+bOnQtkm8Thw4d72UpWOkep7DWuTpkyxRdZjov6StkUf5eiUmmREyIZScmkAH2lJB89erR3Y9R4qXE4LkJZLRuglpaW3HiptqE2KMaMGePbljY6UoZokzNs2DDfpuKxIHZnC9deul5c7FMUfaOuFNbxelBurpC13VhJFBdQLypyOxOSkeb0pqamnNv6ivp7nCAhprOz08/j8XyutdXqMPBHBcMwDMMwDMMwjF6i1y1At99+O5AFjO677765FI6nnnoqkKX9lctPmPZWu0Rp0mWGXbhwoU8tGqcqlvZeO8J99tnHay+ktZBFI9R8gNO0SHMilzolW6hG5s2b1y1AvBzt7e057UYcSF7UlJcx77zzDkBOyyD5jBgxwmvYpEWTdUeuA8OHD/dWTbl17rvvvkBmxVEShGeffdZblCRrBV1L+ykLUDVqlWJtj2Qmt7/GxkZvZYz7omTe3Nzsz5c2qVJa7XHjxuU060V04YoJNdtxSuvY8lvOoqP3Qjc5Hau+r3G7WoPLQ6ShlPUgto6p7bS1tfk+q0QmOmbvvff2zzVu6lHzlFxe9Xnz58/3Gvv499BzyXmwUC5NfSVLjcaKK664AnDtNW6POje2pFWD9QdcG4rdgnXfcYrf2tpa37ZiN0w9dnR0+P91bOyqJDo7Oyumyo7H3KIXSZeXhlKux0khILNIxt4GlVKzFw1Zs+NC52oz6667rm8nartxiEmapjlX7EreG3V1db4ta72gY9bES6k6RgbDMAzDMAzDMIxeoNdVpBdccAEAl19+OQD33nuvt+JodydNl9I0S7M+d+5cnwI09lcPfdWlpdSOUtoN7Qi183zllVdyFqVYI60da0NDg9+pKiajmvnwww9zu/JYpm1tbX5XHfq3hkhjv2zZslyqxyKhhBGSw5NPPglk2obGxkZvYZQ8Ze2R1nfOnDk+acSRRx4JZDEAcZuvra31bVHtV8G7cVHKakZabmnRpJ2dOHFiRZ9eUV9fn9NY6li1W2klx4wZ4y1y+p0UiF5kn3W1xWHDhnkZSWsca9VWhOQaxhQp5iVM/1rt6F5k3dGYH6YIB1fgcM899wSygpCS58EHHwy4tqz2LJmr7akthr+B5hWNMZK1NJirU8hvoFEukYlQ+4zjJ8JjZAXXMUqYJCucLOjNzc1+PopLDOy3334Vv8NAprm52QfcC8VQx3HJixcv9seq3cRFKRsaGrxs1NbicTQMWo/HC/UVrc9Cy3yR0f3G81L4XPLUuKE2pvjAoiPvFMlBaxh5e+2+++7cdNNNQOa9Eaf/DxMlxHOU2prWT5tttpmfz1V2RJ+9JuskswAZhmEYhmEYhjFo6DMn+X/5l3/xj9o5K9ZHVgXF8shi09HRUbGomTRC6667rt+ha2cpbZ40QtIsdXZ2+tfibD3SCkt7UjQt8bx587rJAfKZs1paWvz/snTE1jU9nzdvXi4TTZGQdlaP0jYok15ra6vX7kjTJo2GLEFz5szx2mFlQ1SRQ2UmlPZs2bJlzJs3D4D11lsPyNJgP/TQQ0B1t0nJKM42JEvYqFGjclqfOB4jSZKK6TFj3+G2tjYfUxVbM6tFA9wT4nvR2Dl06FD/nvp9nPK6J2g8HDFihM+uVSQkE/VDzQ9x0cORI0d6Laf6t7Sciu+bMGGCjwuIU7lL8y7q6upy8ZXqC5JzEbLuVepraZquNLvqOeec4z1ILrnkEiArcn7iiScC8P3vf98fr99Ba43jjjtulb7TQCPsbxrDlAUvvofOzs6cVUeoDba3t+diNMqVD4DuGePULmUBiotYV0tM1eoSxz+r34blVSQLjRcaGyrFWxcNeXVpvpClZo899gBc2vpKBXNDb6xycYAhYQzQjjvuCGTeOcrCuyYxacVuyYZhGIZhGIZhGAGfSpokaSRVMNLoexYsWJDTEIWadXBa+VgLGRem0jkffPBBoS1A0lZIIyxL0PPPPw+4zIKSm/yy9Sht7/Dhw30B1FjjJmQRWrBggZexCi7usMMOQKbZqGbibEbSuCt7Tn19vdewSVZxXF5ra6v/XWTtjbOV6XOGDBniLWnS2MftvYgofiSsSRNbgFZEXHtJVvn6+nofjxG35UptuxpQ+1O7knY3tuo2Njb6+9Q4qvYqGY0dO9a/FhffjmXT1NSUi++Qll/tdHULeA9E4roeNTU1Pjur+qMySd1yyy0AzJ4922eIfe655wC4+eabgazNyQr/8ccfe6tQbPmpVDR5oBPGN8v6H2dhDeVaybqj5+3t7bm6P7EFKM6mGSILkH63SrHERUMyV/9Ue9pll138Mao1dddddwGZFUJjZtHRfC5vLFmAVEMpnHsqzb9dXV05C1C87lR7/eijj7x1SVbi3shUbBYgwzAMwzAMwzAGDcUvlDFI+fjjj3NanVgz1tbW5nfwsmLEsVfy8XzzzTfZdddd+/6L9xPScil7kx5l5VlvvfW8BnfzzTcHMu3Z9OnTAadVvu+++4CsloB8ZWU9kwZ6yZIlvhaJtCdCWmhpmqsRaRjjLIOy4NTV1fnXKsU61dbW5mI0pCHSOaG/u9qqtHBx5sciorZSX1+fi6GKNbZdXV05//1KY8S4ceO8lk/Z4JRlq5pjANSHZVGMfc91/+3t7d2yFUGmaSxXn0syiWuvSfZDhw717V1W99j6Xm3a49AKERP3vZdfftnX1TviiCMA+PnPfw7AaaedBsBPf/pT/7to3FVW2LjOUm1tLaecckrZz67W+l+NjY1+ThGxfDVPL1u2LFczJbZ0lft9KllvwvhrobWB4ls0FldzbGpPkGUytqDvtttu/v9tt90WyNerUcxw0dFYFc8FWhs98sgjuX4Yx/PG/6/o+ZIlS7zMRW9kJazOkcJYKQsWLPCuVFpgx2mxly1b5gdEDXJxI9WjXLeKShyIPGPGDCCbiMeOHevlpkWOFlMKVG1sbPQyf/TRR4GsIKImDSXseO+99/zkfvjhhwOZu51+g2oOqNTgFBfaLRf0qGPUFsNCZ3ILqpQMQY8dHR1+QRm35WpxgVkdtCAaNWpUzvUt3hCFr4l4QaT3m5ubfZvVJl4boGreUCpNvfq72pcUE5JHe3s7f/vb37odqwWgUjJPnTrVyzwu9SDZ6f2lS5fmEvHoucaEauzvsWuVErgopb+UOJ2dnVx77bVA1j+1EZJibe211/ayVrsOCydDVsD20EMP9XOSxk2Nw/ou2qBOnDixt263Txk9enS3QryQzT8iDPhW24rdOMMNUbmCp9A93T24MVdJeeRmqGPj8hdFL9grF+o4HEApniFzgYsX+bNmzfoUvmH/U2kjrcLvN9xwg1dIxhvJcA6P53Gh5xqfW1pacteJE9esDtWryjMMwzAMwzAMw1hFzAJUMLQbDjWOcYG00F2jUiCZztEuW8HWRWXatGlApt2VBm7y5MlA90K50vrIDCwXoYaGBp8+e/vtt+92Pf0usvosWbLEazulLX788ccBvCZOAYXVSFxYM04lGqa4rpSmvb293V8nLu4p1H7b29u95lLnyJIkzXCRqampqWjNiV3iwtfCNKPQPeBflok1CTIdaMi9RZaKDTfcEMgX5ZwwYYK3NsiqG7t9zJkzp2JxT7VXWYaGDBmSS3Mt7b76/9ixY3vpLj8dkiTJuaaq1IUSklx00UUAnHfeeTkt79FHHw3ASy+9BDg5xO5WsjbIQqfHG2+8kauvvhrI2rDkKZmfeeaZABx77LG9cbt9ztChQ31bULuK3c1C60Ts8iv5atwrZwGKvRgkz8bGxorphMNU2eW+U9FQGxSSa9h/44QlGjeKXiR2ZWgMW7JkSa4Miwg9CGILUDxGqI0vXLjQr7Pic9fEJdssQIZhGIZhGIZhDBrMAlQwZD0Ii6DFRSNDrbkI4y4g0xSF6TjDgOuiMWXKFCDzsZblRs9D7Y/koDSh0kQsWrTIy0bnKeZgs802AzLrRhjEescddwCZ1UhaT1mLqpE4gFxaRN1TmAIzDuKVPFtbW3NF+OJj1YZDv/TwfCCXfrgIxEXmQi1bueQHMfF7seZ92LBh/jdTey8XxFptyDIhq6CsBrpXtavW1lafCl+xJArQVxueP3++1wRrnIx/F31eZ2enl6O0pGrTGrP1frXw5JNPeuuN+l8cmH/NNdcAbjyVxXvRokVANo8ouPndd9/146b6tYLK9bpk1dHR4S1zkmOcgCIMWq8WdN+V4hffeustwI1pcdHyctbxOEZF7TWWVX19fc56EX92HNdZVGQV0/wRt2nIWzXKzUNFplx8KWTJpJqamnJeG/H80dHRkYvxjePUy6WD12uS+ZqsR80CZBiGYRiGYRjGoMEsQAXjnXfeAdwOPSyIFqIdeVtbW24HH2vudW5HR4e3Zmy99dZ99O37D2kRjjrqKCCLCVKmobfffttrySUzaR5nzpwJuFiB2267DciyFUnbq4xSDz74IJBlRQuRzJW1aE2ym/Q3sU+vNI7l/HZji4LkPHz4cB/XI2K/Ymnc5s2bx6RJk4Asq5Y0pJX86asZZccSY8aM8bEAum9pMtVOu7q6cjE/Olavh20uTOEM1W35EZKFMtqpf8bxkpBlIotTXCurZm1trddMxtrxuFBgGM+mc+KYojj2YKDT0tLCAw88AGT9UFnf1Gb0+ogRI/z9xtmbJOdFixblLECx9l1Wn5qaGv9eXNxTY0S1FZQO4/gkG5VjEGp7DQ0NOYthpZTu8WeEx+oazc3Nfs4SkqvGCFH0QqgqTC5ro6zFSvEMWduKLRQaV4qOPFrkKSM0hjU3N+eyCapfhnN4vB6Ii/uGGQjjuGKdq3ludTALkGEYhmEYhmEYgwazABUMadBqa2u9Fk0anFhz09bWlssQFx8Txv3Iv7OIFiBlhxK6b/mnv/LKK76mj7Q/0m4qFminnXbiueeeAzIL0IEHHghkhVB1venTp/vzZA2S9kRakLhAajURFyoNC6DqdWl9KhXn7OzszMWtqS3H2t6mpiavhZOmPv4ORULtU9qwpqamXJYxEWZ/jOODYl/uUL5hRknItPLVbElTXE8cqxOPg01NTd6KIy28+mmY0TC2MupRMgtlF8dbCY3Zxx9//Brf36fJVlttlWs/ei5rj+aMcnU8YivPiBEjKsZQqG3Hcg7P16Os+ZX6w0AlnHs13sX3MHv2bMDVpKlkAQprM8XxOjqnnFVcFg+h+AxZMeO4oaKi+V33KQtDGEsquaq9KvOgskoWnc9+9rMA/OEPfwCyuMgwPieea+LYnY6OjpxFMm6vYVuTdS2u96fYzNXBLECGYRiGYRiGYQwazAJUMKZPnw44DVKsRdJuWpqdxYsX+/8VdyItjzT12mXX1NR468Z+++3X5/fxaSPNg+KcpKX43ve+B8AJJ5zg46tUE0maB2k7Z86c6f1eL730UgD+9Kc/AZn2OPRbf+2117p9xmOPPQZk2qRqtrRJMy7/aVnEpIFfe+21fXuUZjj2A07TNBd3omN0ruS68cYbew2d4mP0m8aZkIqAZBbWpoqtYiLUzsf9WseWOzf22VasRrXVqwnZcsstuz3XeCkLraivr89ZG6QJ1/PW1tayGaIgn9GwsbEx58MejwmqOVYtbLDBBt4iobFQ9615RePhkCFDfJtTm9WxskoMGTIkl+UxtBhDvn4VZJplWeyq1ULZ1taW04DHmd7EkiVLcjWDRKhxD8fSctcNf4PYQqe1gB7jjF1FZZNNNun2fEV15JRFUvWZqq0Pry4aw+J5Q9aZlpaWXIxePN8PGzbMXye2isfXT9PU/y6y0MlrJ45xXxWKtzIY5Cid84wZM5g1axaQpRLVAlEL7Pfee88X7lR6TTUqNWRtCEaOHJkbGIqECvZV4oILLuCYY44BMpcVDX7q/I888ogPoLz++uuBrLM+9dRTQNbRlyxZwiGHHALAEUcc0e2xCMSulNokapHS1dXlZRGnula63NBErok8LkAnt7dwklLBNL1XhOD9GKUSDtGiJt7UVHI1hLzrUhjwHB+vBXs1b4DE6aefDsC5554LZElK5O7S1dXl/9eCL3YJjIPDIZNZPIEPHz7ct31dR2PvOeec02v39WmSJInfQF544YUA3HDDDUCm8NDiJEkS/3+cyKTcglrtMl7chMfqOlp06npf/OIX1+i++otPPvnEJ9TROCclmMawK6+80j+vVDyyJ8QbozBBipDsY9fiohf7jJPJlEtYJOIi0ZWKyRYNJYfS/arvKTnCGWecwXnnnQdkSk+1uTDRidqUxknJWomM9FzXBXj11Ve7nRO7M68K5gJnGIZhGIZhGMagIekDc2aR7KP9rTpebVkuXbqUGTNmAFlq0hdffBHIgsk6Ojp8oT4Ftd18881A5hIibc9BBx3kj11N+luW0Ettc/78+UCmNZbFYfny5V4boWO22GILIAukllxjl5vVoKrkKe1i6GIVp2CW1ldtrr293bvQxNrjsGAndA+eVPIIWTx7aAGqKnlKAyfa2trKWiQgs6hBPmWwHiVP/RZrrbWWd/nSa7KI6PWVUBXyVJuT+6kCwdW3IdMwxvJdZ511vCzion9C7faTTz7xVnVpRL/+9a+vyr1UhTyF5Cc33zfffNN7Iqg9yWorl7hRo0b5/yUrtcv42BEjRuTeU3+XZX4lDDh5NjU1eZdC3YOshGuS6nd1kadI7BY+derUcjIecPJcXbRu+tGPfgRknhnl+uudd94JZJbPM844A4Cdd955Tb/GgJankptcffXVQLa+OfXUU/0x8iaSjGQtlnV46dKl3gtE7pya32UBkkfTT37yE39dhRW8/vrrABx77LFAloyqAmXlaRYgwzAMwzAMwzAGDX1hATIMwzAMwzAMwxiQmAXIMAzDMAzDMIxBg22ADMMwDMMwDMMYNNgGyDAMwzAMwzCMQYNtgAzDMAzDMAzDGDTYBsgwDMMwDMMwjEGDbYAMwzAMwzAMwxg0/H8UgFisMsbjMAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# extra code – this cell generates and saves Figure 10–10\n", "\n", "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]])\n", "plt.subplots_adjust(wspace=0.2, hspace=0.5)\n", "\n", "save_fig(\"fashion_mnist_plot\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Creating the model using the Sequential API" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "tf.random.set_seed(42)\n", "model = tf.keras.Sequential()\n", "model.add(tf.keras.layers.InputLayer(input_shape=[28, 28]))\n", "model.add(tf.keras.layers.Flatten())\n", "model.add(tf.keras.layers.Dense(300, activation=\"relu\"))\n", "model.add(tf.keras.layers.Dense(100, activation=\"relu\"))\n", "model.add(tf.keras.layers.Dense(10, activation=\"softmax\"))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "# extra code – clear the session to reset the name counters\n", "tf.keras.backend.clear_session()\n", "tf.random.set_seed(42)\n", "\n", "model = tf.keras.Sequential([\n", " tf.keras.layers.Flatten(input_shape=[28, 28]),\n", " tf.keras.layers.Dense(300, activation=\"relu\"),\n", " tf.keras.layers.Dense(100, activation=\"relu\"),\n", " tf.keras.layers.Dense(10, activation=\"softmax\")\n", "])" ] }, { "cell_type": "code", "execution_count": 25, "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", "=================================================================\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": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# extra code – another way to display the model's architecture\n", "tf.keras.utils.plot_model(model, \"my_fashion_mnist_model.png\", show_shapes=True)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[,\n", " ,\n", " ,\n", " ]" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.layers" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'dense'" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hidden1 = model.layers[1]\n", "hidden1.name" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.get_layer('dense') is hidden1" ] }, { "cell_type": "code", "execution_count": 30, "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": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "weights, biases = hidden1.get_weights()\n", "weights" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(784, 300)" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "weights.shape" ] }, { "cell_type": "code", "execution_count": 32, "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": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "biases" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(300,)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "biases.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Compiling the model" ] }, { "cell_type": "code", "execution_count": 34, "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": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "# extra code – this cell is equivalent to the previous cell\n", "model.compile(loss=tf.keras.losses.sparse_categorical_crossentropy,\n", " optimizer=tf.keras.optimizers.SGD(),\n", " metrics=[tf.keras.metrics.sparse_categorical_accuracy])" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n", " [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# extra code – shows how to convert class ids to one-hot vectors\n", "tf.keras.utils.to_categorical([0, 5, 1, 0], num_classes=10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note: it's important to set `num_classes` when the number of classes is greater than the maximum class id in the sample." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 5, 1, 0])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# extra code – shows how to convert one-hot vectors to class ids\n", "np.argmax(\n", " [[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n", " [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.]],\n", " axis=1\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Training and evaluating the model" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.7220 - sparse_categorical_accuracy: 0.7649 - val_loss: 0.4959 - val_sparse_categorical_accuracy: 0.8332\n", "Epoch 2/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.4825 - sparse_categorical_accuracy: 0.8332 - val_loss: 0.4567 - val_sparse_categorical_accuracy: 0.8384\n", "Epoch 3/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.4369 - sparse_categorical_accuracy: 0.8480 - val_loss: 0.4228 - val_sparse_categorical_accuracy: 0.8542\n", "Epoch 4/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.4122 - sparse_categorical_accuracy: 0.8558 - val_loss: 0.3966 - val_sparse_categorical_accuracy: 0.8624\n", "Epoch 5/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3910 - sparse_categorical_accuracy: 0.8631 - val_loss: 0.3890 - val_sparse_categorical_accuracy: 0.8632\n", "Epoch 6/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3751 - sparse_categorical_accuracy: 0.8686 - val_loss: 0.3912 - val_sparse_categorical_accuracy: 0.8600\n", "Epoch 7/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3628 - sparse_categorical_accuracy: 0.8710 - val_loss: 0.3723 - val_sparse_categorical_accuracy: 0.8698\n", "Epoch 8/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3514 - sparse_categorical_accuracy: 0.8755 - val_loss: 0.3767 - val_sparse_categorical_accuracy: 0.8612\n", "Epoch 9/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3406 - sparse_categorical_accuracy: 0.8795 - val_loss: 0.3513 - val_sparse_categorical_accuracy: 0.8726\n", "Epoch 10/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3306 - sparse_categorical_accuracy: 0.8812 - val_loss: 0.3539 - val_sparse_categorical_accuracy: 0.8738\n", "Epoch 11/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3223 - sparse_categorical_accuracy: 0.8860 - val_loss: 0.3606 - val_sparse_categorical_accuracy: 0.8712\n", "Epoch 12/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3146 - sparse_categorical_accuracy: 0.8869 - val_loss: 0.3472 - val_sparse_categorical_accuracy: 0.8742\n", "Epoch 13/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3071 - sparse_categorical_accuracy: 0.8900 - val_loss: 0.3284 - val_sparse_categorical_accuracy: 0.8800\n", "Epoch 14/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3001 - sparse_categorical_accuracy: 0.8922 - val_loss: 0.3413 - val_sparse_categorical_accuracy: 0.8780\n", "Epoch 15/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2938 - sparse_categorical_accuracy: 0.8945 - val_loss: 0.3376 - val_sparse_categorical_accuracy: 0.8822\n", "Epoch 16/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2867 - sparse_categorical_accuracy: 0.8971 - val_loss: 0.3272 - val_sparse_categorical_accuracy: 0.8796\n", "Epoch 17/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2822 - sparse_categorical_accuracy: 0.8978 - val_loss: 0.3317 - val_sparse_categorical_accuracy: 0.8796\n", "Epoch 18/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2757 - sparse_categorical_accuracy: 0.9001 - val_loss: 0.3240 - val_sparse_categorical_accuracy: 0.8824\n", "Epoch 19/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2711 - sparse_categorical_accuracy: 0.9030 - val_loss: 0.3484 - val_sparse_categorical_accuracy: 0.8720\n", "Epoch 20/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2662 - sparse_categorical_accuracy: 0.9045 - val_loss: 0.3209 - val_sparse_categorical_accuracy: 0.8800\n", "Epoch 21/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2613 - sparse_categorical_accuracy: 0.9046 - val_loss: 0.3178 - val_sparse_categorical_accuracy: 0.8862\n", "Epoch 22/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2563 - sparse_categorical_accuracy: 0.9069 - val_loss: 0.3122 - val_sparse_categorical_accuracy: 0.8848\n", "Epoch 23/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2520 - sparse_categorical_accuracy: 0.9098 - val_loss: 0.3480 - val_sparse_categorical_accuracy: 0.8716\n", "Epoch 24/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2469 - sparse_categorical_accuracy: 0.9113 - val_loss: 0.3202 - val_sparse_categorical_accuracy: 0.8878\n", "Epoch 25/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2428 - sparse_categorical_accuracy: 0.9123 - val_loss: 0.3152 - val_sparse_categorical_accuracy: 0.8856\n", "Epoch 26/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2393 - sparse_categorical_accuracy: 0.9143 - val_loss: 0.3102 - val_sparse_categorical_accuracy: 0.8852\n", "Epoch 27/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2341 - sparse_categorical_accuracy: 0.9147 - val_loss: 0.3200 - val_sparse_categorical_accuracy: 0.8850\n", "Epoch 28/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2313 - sparse_categorical_accuracy: 0.9169 - val_loss: 0.3100 - val_sparse_categorical_accuracy: 0.8900\n", "Epoch 29/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2268 - sparse_categorical_accuracy: 0.9185 - val_loss: 0.3215 - val_sparse_categorical_accuracy: 0.8864\n", "Epoch 30/30\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2235 - sparse_categorical_accuracy: 0.9200 - val_loss: 0.3056 - val_sparse_categorical_accuracy: 0.8894\n" ] } ], "source": [ "history = model.fit(X_train, y_train, epochs=30,\n", " validation_data=(X_valid, y_valid))" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'verbose': 1, 'epochs': 30, 'steps': 1719}" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "history.params" ] }, { "cell_type": "code", "execution_count": 40, "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": 41, "metadata": {}, "outputs": [ { "data": { "image/png": "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VVCRjyEqKkobXWXziouLy+2ZQyVT1L/VCxcu4MKFCza3eXt7Izw8vKySVqlY5vOJEyeQajnPiIWqVauiquUIlnTVSloCw98X+7BkoHwwnwunlCpRFRK01n8A+CPPuk8t7j8E4KGSJJIcgxfU0segj4io7FXukXiJiIioUmIAQ0RERE6HAQwRERE5HQYwRERE5HQYwBAREZHTYQBTgXTp0gVjxowp9X2JiIgqGwYwRERE5HQYwBAREZHTYQBTSj777DOEhoYiKyvLav2gQYMQExODgwcPIiYmBmFhYfD19UXbtm3x22+/ldr5L168iGHDhiEoKAje3t7o3r07du3albv98uXLuP/++xESEgIvLy/Ur18fH374oVX6IyMj4eXlherVq6NHjx75XgsREVFFwQCmlNx99924dOkSli5dmrsuOTkZCxYswJAhQ5CUlIRevXrh77//xrZt29C/f3/cdddd2LNnT6mcf/jw4fjvv/+wYMECrF+/Hj4+PujZs2fukPYvvvgiduzYgd9++w179uzBrFmzckeM3bhxIx577DFMnDgRe/fuxdKlS9GzZ89SSRcREVFZsGsqgYrgySeBrVvL95ytWwMWhRSFCgoKwu233465c+fmXvznz58PNzc39O3bF15eXmjVqlXu/i+88AIWLVqEefPm4cUXXyxROvfv34+FCxdi5cqVuPnmmwEAX3/9NerUqYMff/wRY8aMQXx8PNq0aYP27dsDAOrWrZv7/KNHj8LX1xd33HEH/P39ERERYZVWIiKiioYlMKVoyJAh+PXXX5GSkgIAmDt3LgYMGAAvLy8kJyfj2WefRdOmTREUFAQ/Pz9s3LgRR48eLfF54+Li4OLigujo6Nx1gYGBaNGiRW4Jz+jRo/Hjjz+iVatWGDduHFauXJm776233oqIiAjUq1cPgwcPxpdffonExMQSp4uIiKisOE0JjL0lIY7Up08fuLm5YcGCBejWrRuWLl2KJUuWAADGjRuHxYsX4/3330ejRo3g4+ODoUOHIiMjo8TnLWxGcaUUAKBXr16Ij4/Hn3/+iWXLlqF3794YOHAgZs+eDX9/f2zevBmrVq3C33//jbfeegsTJkzAhg0bULNmzRKnj4iIqLSxBKYUeXp6YsCAAZg7dy5++OEHhIWFoXPnzgCANWvWYOjQoejfvz9atmyJWrVq4eDBg6Vy3qZNm8JkMmHt2rW5665cuYIdO3agcePGueuCg4Nx//33Y86cOfjiiy/w5ZdfIj09HQDg5uaGrl274q233sL27duRnJxcqo2MiYiISpPTlMA4iyFDhqB79+44fPgwBg0aBBcXiREjIyMxf/58xMTEwN3dHZMmTUJaWlqpnLNRo0aIiYnBI488ghkzZqBKlSp44YUXEBAQgIEDBwIAXn75ZbRt2xbNmjVDVlYWfvnlF9SvXx+enp747bffcPDgQdx8882oWrUqVqxYgcTERDRp0qRU0kdERFTaWAJTym6++WaEh4dj9+7dGDJkSO76yZMnIyQkBJ06dUKvXr3QoUMHdOrUqdTOO3v2bLRv3x533HEH2rdvj5SUFCxevBje3t4ApHTohRdeQKtWrXDTTTchMTERixYtAgBUqVIFv/76K7p3747GjRvj/fffx8yZM0s1fURERKVJFdZ+oixFRUXpvXv32twWFxfHf/+lJDExEf7+/o5ORqXHfC4/Jc1r/r7YJzY2Fl26dHF0Mio95nPhlFKbtNbtbG1jCQwRERE5HQYwFdDq1avh5+dX4EJERHStYyPeCqhdu3bYWt6j9hERETkRBjAVkLe3Nxo2bOjoZBAREVVYrEIiIiIip8MAhoiIiJwOAxgiIiJyOgxgiIiIyOkwgCEiIiKnwwCmAunSpQvGjBnj6GRQKRs+fDj69OlTasebM2cOxwMiomseu1FTpaKUwk8//YQBAwY4Oim5PvroIzhqyg4iosqKAQzZLSMjAx4eHo5OhtPIysqCq6srAgMDHZ2UCoWfIyIqDZW+CunkSaBzZ+DUqbI9z2effYbQ0FBkZWVZrR80aBBiYmJw8OBBxMTEICwsDL6+vmjbti1+++23Yp/vl19+QcuWLeHt7Y2qVauic+fOOH36NADglVdeQfPmzTFz5kw0bdoU3t7euPPOO3Hu3Lnc52/YsAG33XYbgoODERAQgI4dO2Lt2rVW51BKYerUqbjrrrvg6+uLCRMmIDMzE0888QRq1qwJT09P1K5dG+PHj899TkZGBp577jnUqlULvr6+uP766/HXX3/Z/br27NmDO+64A4GBgfDz80N0dDR27NhhV5rr1q0LABg4cCCUUrmPAWDRokW47rrr4OXlhXr16uGFF15ARkZG7vbTp0/jjjvugLe3NyIiIjB79mw0b94cr7zySu4+R48eRb9+/eDv7w9/f3/cddddOH78eO52I9/nzJmDBg0awNPTE8nJyfmqkLTW+OCDD9CoUSN4enqiVq1aeP7553O3jx8/HlFRUfD29kbdunXx7LPPIi0tze48tGTP5y4jIwMTJkxAREQEPD09Ub9+fXz88cd2vSe2qseMfDAY+7zzzjuoVasWatWqBQD45ptvcP3118Pf3x8hISEYOHAgTpw4YXUsW+fetWsXVq1aBXd3d5zK88V+4YUX0LJly2LlFRE5l0ofwLz2GrBmDfDqq2V7nrvvvhuXLl3C0qVLc9clJydjwYIFGDJkCJKSktCrVy/8/fff2LZtG/r374+77roLe/bsuepznTp1Cvfeey+GDRuGuLg4rFq1Cvfff7/VPkeOHME333yD7777DkuXLsX+/fsxYsSI3O2JiYm4//77sXr1aqxfvx6tW7fG7bffbhXkAMCkSZNw++23Y8eOHXjsscfw8ccfY/78+fj++++xf/9+/PDDD4iKisrd/4EHHsDKlSvx7bffYseOHRg2bBj69u2Lbdu2Ffm6EhIS0LFjRyil8Pfff2Pz5s147LHHkJ2dbVeaN2zYAAD4/PPPcfLkydzHf/31FwYPHowxY8Zg165dmDVrFubNm4cJEybknnvYsGGIj4/H8uXLsWDBAnzzzTeIj4/P3a61xp133onTp09j+fLlWLFiBRISEnDnnXdaVQ8dPnwY3377LX766Sds27YNXl5e+V7nhAkT8Nprr+H555/Hrl278NNPP6F27dq52319fTFr1izExcVh2rRp+P777/HGG28UmX+22PO5GzZsGL766itMnjwZcXFx+OKLL1ClShW73hN7rVy5Etu3b8fixYuxbNkyABI4TZo0Cdu2bcNvv/2Gc+fO4b777st9TmHnvvnmm9GgQQN89dVXufubTCZ89dVXePDBB4uVV0TkZLTWDlkiIyN1QXbv3p1v3dixWnfubP/i4qI1kH9xcbH/GGPHFphEm+688049ZMiQ3Mdff/21DggI0KmpqTb3v+GGG/Rrr72W+7hz5876scceK/I8mzZt0gD0kSNHbG6fOHGidnFx0fHx8frKlStaa61Xr16tAeh9+/bZfI7JZNJhYWH666+/zl0HQI8ZM8Zqv8cff1x37dpVm0ymfMc4cOCAVkrp+Ph4q/UxMTF69OjRRb6uCRMm6Dp16uj09PQi9y0szT/99JPVfp06ddKvvvqq1br58+drX19fbTKZ9J49ezQAvXbt2tztR48e1S4uLnrixIlaa62XLFmiXVxc9OHDh3P3OXjwoFZK6b///ltfuXJFT5w4Ubu5uelTp05ZnWvYsGG6d+/eWmutExMTtaenp54+fbpdr1FrradPn64bNGiQ+3j27Nna19fX7ufnZfm527dvnwag//zzT5v7FvWeWL42w8SJE3WzZs2s9gkODtZpaWmFpisuLk4D0MeOHSv03MZn+r333tONGzfOXf/HH39oDw8Pfe7cuULPY+v3hfJbsWKFo5NwTWA+Fw7ARl1AHFFpS2DatwdCQgCXnFfo4iKPb7ih7M45ZMgQ/Prrr0hJSQEAzJ07FwMGDICXlxeSk5Px7LPPomnTpggKCoKfnx82btyIo0ePXvV5WrVqhe7du6N58+bo378/pk+fjrNnz1rtEx4ejjp16uQ+vuGGG+Di4oK4uDgAwJkzZ/DII48gMjISgYGB8Pf3x5kzZ/Klp127dlaPhw8fjq1btyIyMhKPPfYYfv/9d5hMJgDA5s2bobVG06ZNrWbP/v3333Hw4MEiX9eWLVvQsWPHAttH2JvmvDZt2oQ33njDKk2DBg1CcnIyTp06hT179sDFxcXqtdauXRs1a9bMfRwXF4eaNWtaVUvVr18fNWvWxO7du3PX1apVC6GhoQWmZffu3UhPT0e3bt0K3GfevHno2LEjwsLC4Ofnh//973/F+pwAKPJzt2XLFri4uOCWW26x+fyi3hN7NW/eHJ6enlbrNm/ejJiYGERERMDf3z83/y3TVti5hw0bhkOHDuHff/8FAMyaNQt33nknqlWrVqK0EpFzcJpGvB9+ePXPGT0amDED8PICMjKA/v2BadNKPWm5+vTpAzc3NyxYsADdunXD0qVLsWTJEgDAuHHjsHjxYrz//vto1KgRfHx8MHToUKt2GPZydXXFkiVLsG7dOixZsgRffPEFnn/+eaxcuRKtWrWy6xjDhg3D6dOnMWXKFNStWxeenp7o1q1bvvT4+vpaPW7bti2OHDmCxYsXY/ny5Rg2bBhatWqFv//+GyaTCUopbNiwAe7u7lbP8/b2LjJNuoieOvamOS+TyYSJEydi4MCB+bZVr17drh5CWmsopWxus1yfN79sHacw69atw7333ouJEydiypQpqFKlChYuXIhx48YVmUZbivrcFZWeora7uLjk2yczMzPffnnzJTk5GT169ED37t3x9ddfIyQkBOfOnUOnTp3sTlv16tVxxx13YNasWYiKisLChQuxaNGiQp9DRJWH0wQwxXH6NDBqFDBypAQyJ0+W7fk8PT0xYMAAzJ07F+fOnUNYWBg6d+4MAFizZg2GDh2K/v37AwDS0tJw8OBBREZGFutcSilER0cjOjoaL7/8Mpo1a4YffvghN4A5ceIEjh07ltuWYf369TCZTGjSpEluej7++GP07t0bgDRiPWlnBvn7+2PgwIEYOHAghg8fjg4dOuDAgQNo06YNtNY4depUgf/oC9O2bVt88803BfZSsSfN7u7u+dpntG3bFnv27Clwhu8mTZrAZDJh06ZNuCGniO748eNISEjI3adp06Y4ceIEjhw5klsKc+jQISQkJKBp06Z2v8amTZvC09MTy5YtQ6NGjfJt/+effxAeHo6XXnopd51lW5yrVdTnrm3btjCZTFixYgV69uyZ7/lFvSfVq1fH1q1brdblfWzLnj17cO7cObz55puoV68eAGmYfjXnBoCHH34YAwYMQP369REaGoru3bsXeW4iqhwqbRUSAPzyCzB1KtCqldzm+X0sE0OGDMFff/2FTz/9FIMGDYJLTh1WZGQk5s+fj82bN2PHjh0YMmRIsXuWrFu3Dq+//jo2bNiAo0ePYuHChTh27JjVhdTb2xvDhg3D9u3bsXbtWowaNQq9e/fOvWhGRkbim2++we7du7Fhwwbce++9dlUTTJ48Gd999x3i4uJw4MABfPvttwgICECtWrUQGRmJwYMHY/jw4Zg3bx4OHTqEjRs34v333893cbLl0UcfRVJSEu6++25s2LABBw4cwHfffZd7QbQnzXXr1sWyZctw6tQpXLx4EQDw8ssv49tvv8XLL7+MnTt3Ys+ePZg3bx6effZZAEBUVBR69OiBUaNGYd26ddi6dSseeOAB+Pj45JaudO/eHa1atcLgwYOxadMmbNy4EYMHD0bbtm3RtWvXot+0HP7+/hg7diyef/55zJ49GwcPHsT69esxffr03Nd44sQJzJ07F4cOHcL06dPx3Xff2X38vIr63DVq1Ah33303HnroIfz88884fPgwVq9eja+//hpA0e9J165dsWXLFsyaNQsHDhzAu+++i3/++afIdNWpUweenp74v//7Pxw6dAi///67VdBW2Lm3b9+eu8+tt96KatWqYdKkSXjggQdyv29EdA0oqHFMWS9X24jXWZhMJh0REaEB6O3bt+euP3LkiO7WrZv28fHR4eHh+r333tO9e/fWw4YNy93H3ka8u3fv1j179tQhISHaw8NDN2jQQL/zzju5241GlJ999pkODw/XXl5e+o477tBnzpzJ3Wfr1q26ffv22svLS9evX19/9dVXulmzZrmNVrW23SB2xowZuk2bNtrPz0/7+/vrm2++Wf/zzz+52zMyMvTEiRN1vXr1tLu7uw4NDdV9+/bVGzdutCv/du7cqXv16qV9fX21n5+fjo6O1jt27LA7zQsXLtQNGzbUbm5uOiIiInf9X3/9pTt27Ki9vb21v7+/vu666/Qnn3ySu/3kyZO6T58+2tPTU9euXVvPnj1b169fX7/99tu5+8THx+uYmBjt5+en/fz89J133pnb4NRoxGvZeNWQt6Frdna2fuutt3LzqFatWnrChAm528ePH6+Dg4O1r6+v7tevn542bZqWr6q4mka89nzu0tLS9DPPPKNr1qypPTw8dP369a3yprD3RGv5vIWFhemAgAA9evRo/fzzz+drxJu3oa/WWn///fe6fv362tPTU19//fV68eLFGoBVo0Zb5163bp3VcSZNmqSVUlYNrAvjzL8v5YmNS8sH87lwKKQRr9IOGiE0KipK79271+a2uLi43KoOunqvvPIK5s2bh507dyIxMRH+/v6OTpLTOXfuHGrWrInvvvsut/qlMMzn8pM3r0ePHo0DBw7g77//tuv5/H2xT2xsLLp06eLoZFR6zOfCKaU2aa3b2dpWqdvAENlr+fLlSExMRIsWLXDmzBm88MILCA4OttkuhCqGy5cvY9OmTfjqq6/w448/Ojo5RFTOWGFcAa1evdqqy2/exVmNGjWqwNc0atQoh6YtMzMTL774Ilq0aIG+ffvC29sbq1atKrJXkaM1a9aswDydO3euo5NXpmJiYtCnTx+MGDEit2E3EV07WIVUAaWmpuYbUt1SQb1pbKlIVRtnzpzBlStXbG4LCAhASEhIOaeo9Dgqn+Pj4212WwaA0NDQCvPel6aS5vW1/vtiL1ZtlA/mc+FYheRkvL29rypIcRYhISFOHaRURBEREY5OAhGRQ7AKiYiIiJxOhQ1gHFW1RUSVF39XiCqPChnAuLu7IzU11dHJIKJKJjU1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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "\n", "pd.DataFrame(history.history).plot(\n", " figsize=(8, 5), xlim=[0, 29], ylim=[0, 1], grid=True, xlabel=\"Epoch\",\n", " style=[\"r--\", \"r--.\", \"b-\", \"b-*\"])\n", "plt.legend(loc=\"lower left\") # extra code\n", "save_fig(\"keras_learning_curves_plot\") # extra code\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "image/png": "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5nofazAd0Jyrx1NTHXfuSkoyo5s578PX1wyoEhZmlp865RrM/fy89p7XQuRHgrEQouj5+LgGSbs95xvzWm3agYFQp44jWKemmskaueziRXNZV9YbLV99temEduqUGWPSCtJWwLbuGHD0qOmgFhlp2tWl1C08TIKxEMJ7WEHR1zfvWzeVLWumtDRHoE5JcbRH+/mZErZV6k5IMOtY12h//LFjBAY/P8edC5YuNcF58WIzsHHW2xJVqCCBWxQJCcZCiOLLKnFn7cGddUAVcO1Jfuedpld41jsZWHcJmDcPJk923d7X1wR2pcx989ascb0lUdWqjmu8z541I62VoBuGiKIlwVgIUTo4l2jzG6D4gw/g1VddA3V8vGPAFV9fU9res8csS0yE6tXhk0/M8n794OefTSnbCtbNmsF775nlc+ea2wdFRJhOaxERZgoOziExojSQYCyEEFkp5agKzylojxljJktiohmudOdO83rYMLjuOteSt3W3eoBx40w1uLNOnWD5cvO8Vy/zns6B+pproGdPs3zvXrMsNFSqzUsICcaiVBo3bhxz5sxh69athfJ+K1as4IYbbuDEiRNEREQUynuKYsTqBW4F4z59zJSb5ctNcD51ytxP8ORJ1+u+w8LMvC1bzDqnT0P//o5g3LixCdYBAabUXamSuT3QY4+Z6vjJk7O3d0vg9moSjEWRq1GjBo888gijRo3ydFIyjRo1ikcffdTTyRClVfnyeQ+68vnnrq/T0ky1NphgO2WKKW0fPeqoRrfExcHIkdnf84UX4KWXTHDv08eRBmu66SZTlX7hgil5R0SYmgG5necVIblczCU7j34k8pWenk5aWhplypQhxOqsI0hNTcXHxyfHe3ALL+Dj42hPVgryumlMaKgJ0lagPnrUVJW3a2eWW0F9504TmE+dMr3OP/zQBOMdO8wtPy3WsKrvvWdK5jt2wBtvmN7u1rLwcBPMo6NN2/rJk2Z+WJhc9+0muZ9xIVu1ahVt27YlJCSE8PBw2rRpw9atW/nkk08ICQlhwYIF1K1bl4CAAG644Qb27NmTue3u3bvp1asXlSpVIjg4mBYtWvD999+7vH+NGjUYN24c9913H2XKlGHAgAEAvPTSS1SvXh273U6lSpUYPHhw5jZaa/79739Tu3ZtAgMDady4MV988YXbx3T48GEGDBhA+fLlCQoKolmz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d841mI8fb0rH1rJz50xb92Uq2cEYTAC+QkF47969TJ06lZ49exIVFcWePXv4888/Mzsu+fr68vjjj/Pee+8RGBjIE088QcOGDenSpQsAdevWZd68efTq1Qs/Pz/Gjx/PBesyhDzMnDkTX19f2rRpQ0hICLNnz8bPz486deoQGhrKqFGjGDVqFFprOnToQEJCAuvWrcNmszFs2LA837t///68/vrr9O7dmwkTJhAdHU1MTAyhoaHccMMNbqW5Ro0arF69moEDB2K324mIiOCZZ56hbdu2DB8+nIceeojQ0FB27NjBggULmDp1KiEhIdx3330888wzREREULlyZV555RXS09MzA0ydOnXo1asXDz30ENOmTaNMmTKMGTOGsLAw+vfvX6DPbsyYMTzxxBNERkbSo0cPkpKSWLp0KU8++SR16tQhPT2dd999lz59+rBu3TrefffdAr2/s7p16zJ79mzWrFlDREQE77//Pnv37qV5xuUkoaGhPPbYYzz33HPY7XY6dOjAqVOn2LhxIyNGjMj3M+nUqROnT5/mtddeo1+/fqxYsSKzU1xeypYtS0REBB999BFVq1bl0KFDPPXUU/g6XWea376t42vfvj1PPfUU/fr1IyzrGNFCFAd+fjlfD57XYC6XI6eG5CsxXVIHLi939OhRffvtt+sqVapof39/XbVqVf3UU0/p5OTkzA403377rb7qqqu0v7+/7tChg/77778zt9+3b5/u3LmzDgoK0lFRUfrNN9/UPXr0yOywpHXOnaFmzZql27Ztq8PDw3VQUJBu2bKlXrBgQeby9PR0PWnSJF2/fn3t7++vIyIidJcuXfSiRYvcOq5//vlH33XXXTo8PFwHBgbqZs2aZXZUcSfNa9eu1U2aNNF2u12br5yxfv163bVrVx0aGqqDgoJ0o0aN9AtOHS3i4+P1wIEDdVBQkK5YsaKeMGGCvvHGG/Xw4cMz1zl9+rQePHiwLlOmjA4ICNCdO3fWW7duzVyeteOS1jl34NJa648//ljXr19f+/n56cjISH3vvfdmLnvvvfd0lSpVdEBAgL7xxhv17NmzNaD37t2rtS5YB67Tp0/r22+/XYeEhOgKFSrop556So8YMUJ3dOo0mJaWpidMmKBr1qyp/fz8dHR0tB49erRbn4nWWk+ZMkVXq1ZNBwUF6bvvvlu/++672TpwZT1+rbVeunSpbtiwobbb7bphw4Z64cKFOjg4WM+YMcPtfWut9aeffpqtc523kA5c3qM05he5dOByK3AC3YC/gF3AszksHwD8mTH9CjTN7z1LYjDOS05BobCUtLzKzYULF3RkZKR+6623Lut9Skt+FZZLya/XX39d16lTpwhSc/kkGHuP0phfuQXjfKuplVI+wAfATcBBYL1S6jut9Xan1fYCHbXWZ5RS3YFpQJtCKLiLUmzz5s3ExsbSunVr4uPjeeONN4iPj+fuu+/2dNJELhISEtixYwfvvfceY5xvpCCEyJM7I3C1BnZprfdorZOBr4BezitorX/VWp/JeLkOiC7cZIqi8tprrxESEpLj1L17d08nj4kTJ9K8eXNuvPFGjh07xqpVq4iO9u6vV/fu3XPN09dee83TyStSjzzyCNdddx3XXXcdDz30kKeTI0SxoXQ+lyoopfoC3bTWD2S8HgS00Vo/ksv6o4CrrfWzLBsGDAOIjIy85quvvspxn+Hh4dSsWTPPy1GEQ1pa2iXn1enTpzlz5kyOywIDAwt8DW1xcDn55Y7Dhw9z/vz5HJdZw0wWJ0WdX1farl27OHfuXJG8d0JCgox5XgClMb9uuOGGjVrrllnnu9ObOqcLPXOM4EqpG4D7gfY5LddaT8NUYdOyZUvdKevF3hliY2Px8fEh1HmINpGr+Pj4S86r0NBQqlevXsgp8m6Xk1/uqJfXTeuLoaLOrystICAgs+d6YVuxYgW5/a+J7CS/HNwJxgeBqk6vo4HDWVdSSjUBPga6a61PFU7yhBBCiJLPnTbj9UAdpVRNpZQ/0A/4znkFpVQ1YC4wSGu9s/CTKYQQQpRc+ZaMtdapSqlHgJ8BH2C61nqbUmp4xvIpwItAeeDDjAEZUnOqExdCCCFEdm6NwKW1/hH4Mcu8KU7PHwCyddgSQgghRP7cqaYWQgghRBGSYOxFOnXqxCOP5HjF2GWtK4QQwrtJMBZCCCE8TIKxEEII4WESjAvJ1KlTiYyMdLn3K5hbzvXq1Yvdu3fTq1cvKlWqRHBwMC1atLise+JmdebMGYYMGULZsmUJDAykS5cubNu2LXP5uXPnGDRoEBUrViQgIIBatWq53AZw6tSp1K1bl4CAACpUqEDXrl2zHYsQQoiiIcG4kNx1112cPXuWJUuWZM5LTExk/vz5DBw4kISEBLp3787ixYv5448/uOOOO+jTpw87duwolP0PHTqU3377jfnz5/P7778TFBREt27dModlfP7554mJieH7779nx44dTJ8+naioKAA2bNjAyJEjGTt2LH/99RdLliyhW7duhZIuIYQQ+XPr0iZv8PjjsGXLld1ns2bg7j3ky5Ytyy233MLMmTMzA9m8efPw9fXltttuIyAggKZNm2auP2bMGBYsWMCcOXN4/vnnLyudu3bt4rvvvmPlypV06NABgM8//5xq1aoxc+ZMHnjgAfbv30/z5s1p3bo1ADVq1Mjc/sCBAwQHB9OzZ8/M4TGd0yqEEKJoScm4EA0cOJBvv/2WpKQkAGbOnEnfvn0JCAggMTGRp59+mgYNGlC2bFlCQkLYsGEDBw4cuOz97ty5E5vNRrt27TLnhYeH07hxY7ZvN3e6HDFiBF9//TVNmzZl1KhRrFy5MnPdm266ierVq1OzZk0GDBjAp59+Snx8/GWnSwghhHuKTcnY3RKqJ9166634+voyf/58OnfuzJIlS1i0aBEAo0aNYuHChbz11lvUqVOHoKAgBg8eTHJy8mXvN687b2WMiEb37t3Zv38/P/30E0uXLqVHjx7ceeedzJgxg9DQUDZt2sSqVatYvHgxEyZMYPTo0axfv75E3rVJCCG8jZSMC5Hdbqdv377MnDmT2bNnU6lSJTp27AjAmjVrGDx4MHfccQdNmjQhOjqa3bt3F8p+69WrR3p6OmvXrs2cFxcXR0xMDA0aNMicFxERwaBBg/jkk0/473//y6effsrFixcB8PX15cYbb2TChAn8+eefJCYmFmoHMyGEELkrNiXj4mLgwIF06dKFvXv30r9/f2w2c75Tt25d5s2bR69evfDz82P8+PFcuHChUPZ51VVX0atXLx566CGmTZtGmTJlGDNmDGFhYfTv3x+AF198kRYtWtCwYUNSU1OZO3cutWrVwm638/3337N79246dOhAuXLlWL58OfHx8dSvX79Q0ieEECJvUjIuZB06dCAqKort27czcODAzPkTJ06kYsWKXH/99XTv3p22bdty/fXXF9p+Z8yYQevWrenZsyetW7cmKSmJhQsXEhgYCJhS+5gxY2jatCnXXXcd8fHxLFiwAIAyZcrw7bff0qVLF66++mreeustPv7440JNnxBCiNypvNobi1LLli31hg0bclwWGxtLdHR0ibqheVEqaTd/L2qS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UCHb7T7duf3njh07OHnyJK+99ho1a9YETKfErPvO6/sA8OCDD9K3b19q1apFZGQkXbp0yXffQnijEltNDTB3LnzwATRtah6z/NaLxMCBA/n555+ZMmUK/fv3x5ZRT163bl3mzZvHpk2biImJYeDAgZfcQ3bdunW88sorrF+/ngMHDvDjjz/yzz//uASFwMBAhgwZwpYtW1i7di3Dhw+nR48emQGgbt26fPHFF2zfvp3169fTr18/t6oiJ06cyJdffklsbCy7du1i1qxZhIWFER0dTd26dRkwYABDhw5lzpw57Nmzhw0bNvDWW29l+6PNycMPP0xCQgJ33XUX69evZ9euXXz55ZeZf+7upLlGjRosXbqUo0ePcubMGQBefPFFZs2axYsvvsjWrVvZuXMnc+bM4emnnwagXr16dO3aleHDh7Nu3Tq2bNnCvffeS1BQUGapt0uXLjRt2pQBAwawceNGNmzYwIABA2jRogU33nhj/h9ahtDQUB577DGee+45ZsyYwe7du/n999+ZPHly5jEeOnSImTNnsmfPHiZPnsyXX37p9vtnld/3rk6dOtx111088MAD/O9//2Pv3r2sXr2azz//HMj/M7nxxhvZvHkz06dPZ9euXfz73//ml19+yTdd1apVw26385///Ic9e/bwww8/uJyAuLNvgJtuuony5cszfvx47r333szfmxDFTk4NyVdiKmgHruIiPT1dV69eXQP6zz//zJy/b98+3blzZx0UFKSjoqL0m2++qXv06KGHDBmSuY67Hbi2b9+uu3XrpitWrKj9/f11zZo19RtvvJG53OpAM3XqVB0dHa0DAgJ0z5499fHjxzPX2bJli27durUOCAjQtWrV0p999plu2LBhZoclrXPuDDVt2jTdvHlzHRISokNDQ3WHDh30L7/8krk8OTlZjx07VtesWVP7+fnpyMhIfdttt+kNGza4lX9bt27V3bt318HBwTokJES3a9dOx8TEuJ3m7777Tl911VXa19dXV69ePXP+zz//rNu3b68DAwN1aGiovuaaa/T777+fufzIkSP61ltv1Xa7XVetWlXPmDFD16pVS7/++uuZ6+zfv1/36tVLh4SE6JCQEN27d+/MzkbO+Z5V1k5OaWlpesKECZl5FB0drUePHp25/Nlnn9URERE6ODhY33777frDDz/U5qdqFKQDlzvfuwsX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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# extra code – shows how to shift the training curve by -1/2 epoch\n", "plt.figure(figsize=(8, 5))\n", "for key, style in zip(history.history, [\"r--\", \"r--.\", \"b-\", \"b-*\"]):\n", " epochs = np.array(history.epoch) + (0 if key.startswith(\"val_\") else -0.5)\n", " plt.plot(epochs, history.history[key], style, label=key)\n", "plt.xlabel(\"Epoch\")\n", "plt.axis([-0.5, 29, 0., 1])\n", "plt.legend(loc=\"lower left\")\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "313/313 [==============================] - 0s 867us/step - loss: 0.3243 - sparse_categorical_accuracy: 0.8864\n" ] }, { "data": { "text/plain": [ "[0.32431697845458984, 0.8863999843597412]" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.evaluate(X_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Using the model to make predictions" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0. , 0. , 0. , 0. , 0. , 0.01, 0. , 0.02, 0. , 0.97],\n", " [0. , 0. , 0.99, 0. , 0.01, 0. , 0. , 0. , 0. , 0. ],\n", " [0. , 1. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ]],\n", " dtype=float32)" ] }, "execution_count": 44, "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": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([9, 2, 1])" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred = y_proba.argmax(axis=-1)\n", "y_pred" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['Ankle boot', 'Pullover', 'Trouser'], dtype='" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# extra code – this cell generates and saves Figure 10–12\n", "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]])\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": [ "## Building a Regression MLP Using the Sequential API" ] }, { "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": 49, "metadata": {}, "outputs": [], "source": [ "# extra code – load and split the California housing dataset, like earlier\n", "housing = fetch_california_housing()\n", "X_train_full, X_test, y_train_full, y_test = train_test_split(\n", " housing.data, housing.target, random_state=42)\n", "X_train, X_valid, y_train, y_valid = train_test_split(\n", " X_train_full, y_train_full, random_state=42)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/20\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.9051 - root_mean_squared_error: 0.9514 - val_loss: 0.4030 - val_root_mean_squared_error: 0.6348\n", "Epoch 2/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3843 - root_mean_squared_error: 0.6199 - val_loss: 0.8436 - val_root_mean_squared_error: 0.9185\n", "Epoch 3/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3609 - root_mean_squared_error: 0.6007 - val_loss: 0.3744 - val_root_mean_squared_error: 0.6119\n", "Epoch 4/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3416 - root_mean_squared_error: 0.5844 - val_loss: 0.4343 - val_root_mean_squared_error: 0.6590\n", "Epoch 5/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3301 - root_mean_squared_error: 0.5746 - val_loss: 0.3085 - val_root_mean_squared_error: 0.5554\n", "Epoch 6/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3168 - root_mean_squared_error: 0.5629 - val_loss: 0.4544 - val_root_mean_squared_error: 0.6741\n", "Epoch 7/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3162 - root_mean_squared_error: 0.5623 - val_loss: 0.2941 - val_root_mean_squared_error: 0.5423\n", "Epoch 8/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3045 - root_mean_squared_error: 0.5518 - val_loss: 0.3333 - val_root_mean_squared_error: 0.5773\n", "Epoch 9/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.2974 - root_mean_squared_error: 0.5453 - val_loss: 0.3446 - val_root_mean_squared_error: 0.5870\n", "Epoch 10/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.2921 - root_mean_squared_error: 0.5404 - val_loss: 0.2874 - val_root_mean_squared_error: 0.5361\n", "Epoch 11/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.2863 - root_mean_squared_error: 0.5351 - val_loss: 0.4141 - val_root_mean_squared_error: 0.6435\n", "Epoch 12/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.2942 - root_mean_squared_error: 0.5424 - val_loss: 1.0956 - val_root_mean_squared_error: 1.0467\n", "Epoch 13/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.2864 - root_mean_squared_error: 0.5352 - val_loss: 0.3063 - val_root_mean_squared_error: 0.5534\n", "Epoch 14/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.2804 - root_mean_squared_error: 0.5295 - val_loss: 0.2709 - val_root_mean_squared_error: 0.5205\n", "Epoch 15/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.2784 - root_mean_squared_error: 0.5276 - val_loss: 0.3680 - val_root_mean_squared_error: 0.6066\n", "Epoch 16/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.2757 - root_mean_squared_error: 0.5250 - val_loss: 0.2730 - val_root_mean_squared_error: 0.5225\n", "Epoch 17/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.2739 - root_mean_squared_error: 0.5234 - val_loss: 0.3668 - val_root_mean_squared_error: 0.6056\n", "Epoch 18/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.2694 - root_mean_squared_error: 0.5191 - val_loss: 0.4188 - val_root_mean_squared_error: 0.6472\n", "Epoch 19/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.2677 - root_mean_squared_error: 0.5174 - val_loss: 0.9663 - val_root_mean_squared_error: 0.9830\n", "Epoch 20/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.2755 - root_mean_squared_error: 0.5249 - val_loss: 0.2978 - val_root_mean_squared_error: 0.5457\n", "162/162 [==============================] - 0s 508us/step - loss: 0.2806 - root_mean_squared_error: 0.5297\n" ] } ], "source": [ "tf.random.set_seed(42)\n", "norm_layer = tf.keras.layers.Normalization(input_shape=X_train.shape[1:])\n", "model = tf.keras.Sequential([\n", " norm_layer,\n", " tf.keras.layers.Dense(50, activation=\"relu\"),\n", " tf.keras.layers.Dense(50, activation=\"relu\"),\n", " tf.keras.layers.Dense(50, activation=\"relu\"),\n", " tf.keras.layers.Dense(1)\n", "])\n", "optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)\n", "model.compile(loss=\"mse\", optimizer=optimizer, metrics=[\"RootMeanSquaredError\"])\n", "norm_layer.adapt(X_train)\n", "history = model.fit(X_train, y_train, epochs=20,\n", " validation_data=(X_valid, y_valid))\n", "mse_test, rmse_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": { "text/plain": [ "0.5297096967697144" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rmse_test" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.4969182],\n", " [1.195265 ],\n", " [4.9428763]], dtype=float32)" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Building Complex Models Using the 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": [ "# extra code – reset the name counters and make the code reproducible\n", "tf.keras.backend.clear_session()\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "normalization_layer = tf.keras.layers.Normalization()\n", "hidden_layer1 = tf.keras.layers.Dense(30, activation=\"relu\")\n", "hidden_layer2 = tf.keras.layers.Dense(30, activation=\"relu\")\n", "concat_layer = tf.keras.layers.Concatenate()\n", "output_layer = tf.keras.layers.Dense(1)\n", "\n", "input_ = tf.keras.layers.Input(shape=X_train.shape[1:])\n", "normalized = normalization_layer(input_)\n", "hidden1 = hidden_layer1(normalized)\n", "hidden2 = hidden_layer2(hidden1)\n", "concat = concat_layer([normalized, hidden2])\n", "output = output_layer(concat)\n", "\n", "model = tf.keras.Model(inputs=[input_], outputs=[output])" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: \"model\"\n", "__________________________________________________________________________________________________\n", " Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", " input_1 (InputLayer) [(None, 8)] 0 [] \n", " \n", " normalization (Normalization) (None, 8) 17 ['input_1[0][0]'] \n", " \n", " dense (Dense) (None, 30) 270 ['normalization[0][0]'] \n", " \n", " dense_1 (Dense) (None, 30) 930 ['dense[0][0]'] \n", " \n", " concatenate (Concatenate) (None, 38) 0 ['input_1[0][0]', \n", " 'dense_1[0][0]'] \n", " \n", " dense_2 (Dense) (None, 1) 39 ['concatenate[0][0]'] \n", " \n", "==================================================================================================\n", "Total params: 1,256\n", "Trainable params: 1,239\n", "Non-trainable params: 17\n", "__________________________________________________________________________________________________\n" ] } ], "source": [ "model.summary()" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/20\n", "363/363 [==============================] - 1s 1ms/step - loss: 122.3226 - root_mean_squared_error: 11.0600 - val_loss: 305.9134 - val_root_mean_squared_error: 17.4904\n", "Epoch 2/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 5.5425 - root_mean_squared_error: 2.3543 - val_loss: 183.4622 - val_root_mean_squared_error: 13.5448\n", "Epoch 3/20\n", "363/363 [==============================] - 0s 979us/step - loss: 3.0631 - root_mean_squared_error: 1.7502 - val_loss: 87.2228 - val_root_mean_squared_error: 9.3393\n", "Epoch 4/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 1.5796 - root_mean_squared_error: 1.2568 - val_loss: 35.3699 - val_root_mean_squared_error: 5.9473\n", "Epoch 5/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.9536 - root_mean_squared_error: 0.9765 - val_loss: 12.3882 - val_root_mean_squared_error: 3.5197\n", "Epoch 6/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.6322 - root_mean_squared_error: 0.7951 - val_loss: 4.1676 - val_root_mean_squared_error: 2.0415\n", "Epoch 7/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.5069 - root_mean_squared_error: 0.7120 - val_loss: 1.2937 - val_root_mean_squared_error: 1.1374\n", "Epoch 8/20\n", "363/363 [==============================] - 0s 980us/step - loss: 0.4525 - root_mean_squared_error: 0.6727 - val_loss: 0.4837 - val_root_mean_squared_error: 0.6955\n", "Epoch 9/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.4293 - root_mean_squared_error: 0.6552 - val_loss: 0.4343 - val_root_mean_squared_error: 0.6590\n", "Epoch 10/20\n", "363/363 [==============================] - 0s 962us/step - loss: 0.4120 - root_mean_squared_error: 0.6419 - val_loss: 0.3996 - val_root_mean_squared_error: 0.6321\n", "Epoch 11/20\n", "363/363 [==============================] - 0s 988us/step - loss: 0.4203 - root_mean_squared_error: 0.6483 - val_loss: 0.4149 - val_root_mean_squared_error: 0.6441\n", "Epoch 12/20\n", "363/363 [==============================] - 0s 952us/step - loss: 0.3916 - root_mean_squared_error: 0.6257 - val_loss: 0.4569 - val_root_mean_squared_error: 0.6759\n", "Epoch 13/20\n", "363/363 [==============================] - 0s 957us/step - loss: 0.4147 - root_mean_squared_error: 0.6440 - val_loss: 0.3736 - val_root_mean_squared_error: 0.6113\n", "Epoch 14/20\n", "363/363 [==============================] - 0s 949us/step - loss: 0.3824 - root_mean_squared_error: 0.6184 - val_loss: 0.4550 - val_root_mean_squared_error: 0.6745\n", "Epoch 15/20\n", "363/363 [==============================] - 0s 982us/step - loss: 0.4003 - root_mean_squared_error: 0.6327 - val_loss: 0.8553 - val_root_mean_squared_error: 0.9248\n", "Epoch 16/20\n", "363/363 [==============================] - 0s 960us/step - loss: 0.4245 - root_mean_squared_error: 0.6516 - val_loss: 1.9204 - val_root_mean_squared_error: 1.3858\n", "Epoch 17/20\n", "363/363 [==============================] - 0s 987us/step - loss: 0.4580 - root_mean_squared_error: 0.6767 - val_loss: 2.0632 - val_root_mean_squared_error: 1.4364\n", "Epoch 18/20\n", "363/363 [==============================] - 0s 961us/step - loss: 0.4692 - root_mean_squared_error: 0.6850 - val_loss: 3.5730 - val_root_mean_squared_error: 1.8902\n", "Epoch 19/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.4367 - root_mean_squared_error: 0.6608 - val_loss: 3.9989 - val_root_mean_squared_error: 1.9997\n", "Epoch 20/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.4683 - root_mean_squared_error: 0.6843 - val_loss: 2.2966 - val_root_mean_squared_error: 1.5155\n", "162/162 [==============================] - 0s 612us/step - loss: 0.5723 - root_mean_squared_error: 0.7565\n" ] } ], "source": [ "optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)\n", "model.compile(loss=\"mse\", optimizer=optimizer, metrics=[\"RootMeanSquaredError\"])\n", "normalization_layer.adapt(X_train)\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": [ "tf.random.set_seed(42) # extra code" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "input_wide = tf.keras.layers.Input(shape=[5]) # features 0 to 4\n", "input_deep = tf.keras.layers.Input(shape=[6]) # features 2 to 7\n", "norm_layer_wide = tf.keras.layers.Normalization()\n", "norm_layer_deep = tf.keras.layers.Normalization()\n", "norm_wide = norm_layer_wide(input_wide)\n", "norm_deep = norm_layer_deep(input_deep)\n", "hidden1 = tf.keras.layers.Dense(30, activation=\"relu\")(norm_deep)\n", "hidden2 = tf.keras.layers.Dense(30, activation=\"relu\")(hidden1)\n", "concat = tf.keras.layers.concatenate([norm_wide, hidden2])\n", "output = tf.keras.layers.Dense(1)(concat)\n", "model = tf.keras.Model(inputs=[input_wide, input_deep], outputs=[output])" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/20\n", "363/363 [==============================] - 1s 2ms/step - loss: 1.2768 - root_mean_squared_error: 1.1300 - val_loss: 0.9497 - val_root_mean_squared_error: 0.9745\n", "Epoch 2/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.4767 - root_mean_squared_error: 0.6904 - val_loss: 1.4311 - val_root_mean_squared_error: 1.1963\n", "Epoch 3/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.4433 - root_mean_squared_error: 0.6658 - val_loss: 0.4258 - val_root_mean_squared_error: 0.6525\n", "Epoch 4/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.4057 - root_mean_squared_error: 0.6370 - val_loss: 0.4016 - val_root_mean_squared_error: 0.6338\n", "Epoch 5/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3940 - root_mean_squared_error: 0.6277 - val_loss: 1.4914 - val_root_mean_squared_error: 1.2212\n", "Epoch 6/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3873 - root_mean_squared_error: 0.6224 - val_loss: 2.6759 - val_root_mean_squared_error: 1.6358\n", "Epoch 7/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3914 - root_mean_squared_error: 0.6257 - val_loss: 3.0592 - val_root_mean_squared_error: 1.7490\n", "Epoch 8/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3735 - root_mean_squared_error: 0.6112 - val_loss: 3.3043 - val_root_mean_squared_error: 1.8178\n", "Epoch 9/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3712 - root_mean_squared_error: 0.6093 - val_loss: 2.1298 - val_root_mean_squared_error: 1.4594\n", "Epoch 10/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3693 - root_mean_squared_error: 0.6077 - val_loss: 1.7402 - val_root_mean_squared_error: 1.3192\n", "Epoch 11/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3578 - root_mean_squared_error: 0.5982 - val_loss: 0.6127 - val_root_mean_squared_error: 0.7827\n", "Epoch 12/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3605 - root_mean_squared_error: 0.6005 - val_loss: 1.3970 - val_root_mean_squared_error: 1.1819\n", "Epoch 13/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3527 - root_mean_squared_error: 0.5939 - val_loss: 0.9449 - val_root_mean_squared_error: 0.9721\n", "Epoch 14/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3436 - root_mean_squared_error: 0.5861 - val_loss: 0.7757 - val_root_mean_squared_error: 0.8807\n", "Epoch 15/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3421 - root_mean_squared_error: 0.5849 - val_loss: 0.8920 - val_root_mean_squared_error: 0.9445\n", "Epoch 16/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3405 - root_mean_squared_error: 0.5835 - val_loss: 0.9334 - val_root_mean_squared_error: 0.9661\n", "Epoch 17/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3394 - root_mean_squared_error: 0.5826 - val_loss: 1.3433 - val_root_mean_squared_error: 1.1590\n", "Epoch 18/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3384 - root_mean_squared_error: 0.5817 - val_loss: 2.6406 - val_root_mean_squared_error: 1.6250\n", "Epoch 19/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3459 - root_mean_squared_error: 0.5881 - val_loss: 2.2482 - val_root_mean_squared_error: 1.4994\n", "Epoch 20/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3503 - root_mean_squared_error: 0.5919 - val_loss: 1.4407 - val_root_mean_squared_error: 1.2003\n", "162/162 [==============================] - 0s 672us/step - loss: 0.3388 - root_mean_squared_error: 0.5821\n" ] } ], "source": [ "optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)\n", "model.compile(loss=\"mse\", optimizer=optimizer, metrics=[\"RootMeanSquaredError\"])\n", "\n", "X_train_wide, X_train_deep = X_train[:, :5], X_train[:, 2:]\n", "X_valid_wide, X_valid_deep = X_valid[:, :5], X_valid[:, 2:]\n", "X_test_wide, X_test_deep = X_test[:, :5], X_test[:, 2:]\n", "X_new_wide, X_new_deep = X_test_wide[:3], X_test_deep[:3]\n", "\n", "norm_layer_wide.adapt(X_train_wide)\n", "norm_layer_deep.adapt(X_train_deep)\n", "history = model.fit((X_train_wide, X_train_deep), y_train, epochs=20,\n", " validation_data=((X_valid_wide, X_valid_deep), y_valid))\n", "mse_test = model.evaluate((X_test_wide, X_test_deep), y_test)\n", "y_pred = model.predict((X_new_wide, X_new_deep))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Adding an auxiliary output for regularization:" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [], "source": [ "tf.keras.backend.clear_session()\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "input_wide = tf.keras.layers.Input(shape=[5]) # features 0 to 4\n", "input_deep = tf.keras.layers.Input(shape=[6]) # features 2 to 7\n", "norm_layer_wide = tf.keras.layers.Normalization()\n", "norm_layer_deep = tf.keras.layers.Normalization()\n", "norm_wide = norm_layer_wide(input_wide)\n", "norm_deep = norm_layer_deep(input_deep)\n", "hidden1 = tf.keras.layers.Dense(30, activation=\"relu\")(norm_deep)\n", "hidden2 = tf.keras.layers.Dense(30, activation=\"relu\")(hidden1)\n", "concat = tf.keras.layers.concatenate([norm_wide, hidden2])\n", "output = tf.keras.layers.Dense(1)(concat)\n", "aux_output = tf.keras.layers.Dense(1)(hidden2)\n", "model = tf.keras.Model(inputs=[input_wide, input_deep],\n", " outputs=[output, aux_output])" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)\n", "model.compile(loss=(\"mse\", \"mse\"), loss_weights=(0.9, 0.1), optimizer=optimizer,\n", " metrics=[\"RootMeanSquaredError\"])" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/20\n", "363/363 [==============================] - 1s 2ms/step - loss: 1.3490 - dense_2_loss: 1.2742 - dense_3_loss: 2.0215 - dense_2_root_mean_squared_error: 1.1288 - dense_3_root_mean_squared_error: 1.4218 - val_loss: 1.5415 - val_dense_2_loss: 0.9593 - val_dense_3_loss: 6.7806 - val_dense_2_root_mean_squared_error: 0.9795 - val_dense_3_root_mean_squared_error: 2.6040\n", "Epoch 2/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.5101 - dense_2_loss: 0.4785 - dense_3_loss: 0.7952 - dense_2_root_mean_squared_error: 0.6917 - dense_3_root_mean_squared_error: 0.8917 - val_loss: 1.3624 - val_dense_2_loss: 1.0094 - val_dense_3_loss: 4.5401 - val_dense_2_root_mean_squared_error: 1.0047 - val_dense_3_root_mean_squared_error: 2.1307\n", "Epoch 3/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.4618 - dense_2_loss: 0.4404 - dense_3_loss: 0.6546 - dense_2_root_mean_squared_error: 0.6636 - dense_3_root_mean_squared_error: 0.8091 - val_loss: 0.5361 - val_dense_2_loss: 0.3975 - val_dense_3_loss: 1.7837 - val_dense_2_root_mean_squared_error: 0.6305 - val_dense_3_root_mean_squared_error: 1.3356\n", "Epoch 4/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.4252 - dense_2_loss: 0.4059 - dense_3_loss: 0.5985 - dense_2_root_mean_squared_error: 0.6371 - dense_3_root_mean_squared_error: 0.7736 - val_loss: 0.5182 - val_dense_2_loss: 0.4590 - val_dense_3_loss: 1.0517 - val_dense_2_root_mean_squared_error: 0.6775 - val_dense_3_root_mean_squared_error: 1.0255\n", "Epoch 5/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.4106 - dense_2_loss: 0.3931 - dense_3_loss: 0.5690 - dense_2_root_mean_squared_error: 0.6269 - dense_3_root_mean_squared_error: 0.7543 - val_loss: 0.4049 - val_dense_2_loss: 0.3588 - val_dense_3_loss: 0.8196 - val_dense_2_root_mean_squared_error: 0.5990 - val_dense_3_root_mean_squared_error: 0.9053\n", "Epoch 6/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3944 - dense_2_loss: 0.3780 - dense_3_loss: 0.5424 - dense_2_root_mean_squared_error: 0.6148 - dense_3_root_mean_squared_error: 0.7365 - val_loss: 0.4168 - val_dense_2_loss: 0.3934 - val_dense_3_loss: 0.6275 - val_dense_2_root_mean_squared_error: 0.6272 - val_dense_3_root_mean_squared_error: 0.7921\n", "Epoch 7/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3837 - dense_2_loss: 0.3694 - dense_3_loss: 0.5126 - dense_2_root_mean_squared_error: 0.6078 - dense_3_root_mean_squared_error: 0.7160 - val_loss: 0.3661 - val_dense_2_loss: 0.3430 - val_dense_3_loss: 0.5747 - val_dense_2_root_mean_squared_error: 0.5856 - val_dense_3_root_mean_squared_error: 0.7581\n", "Epoch 8/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3731 - dense_2_loss: 0.3608 - dense_3_loss: 0.4840 - dense_2_root_mean_squared_error: 0.6007 - dense_3_root_mean_squared_error: 0.6957 - val_loss: 0.8555 - val_dense_2_loss: 0.8704 - val_dense_3_loss: 0.7218 - val_dense_2_root_mean_squared_error: 0.9330 - val_dense_3_root_mean_squared_error: 0.8496\n", "Epoch 9/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3672 - dense_2_loss: 0.3567 - dense_3_loss: 0.4624 - dense_2_root_mean_squared_error: 0.5972 - dense_3_root_mean_squared_error: 0.6800 - val_loss: 2.6877 - val_dense_2_loss: 2.9011 - val_dense_3_loss: 0.7675 - val_dense_2_root_mean_squared_error: 1.7033 - val_dense_3_root_mean_squared_error: 0.8761\n", "Epoch 10/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3837 - dense_2_loss: 0.3765 - dense_3_loss: 0.4481 - dense_2_root_mean_squared_error: 0.6136 - dense_3_root_mean_squared_error: 0.6694 - val_loss: 3.6017 - val_dense_2_loss: 3.8004 - val_dense_3_loss: 1.8132 - val_dense_2_root_mean_squared_error: 1.9495 - val_dense_3_root_mean_squared_error: 1.3466\n", "Epoch 11/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3728 - dense_2_loss: 0.3656 - dense_3_loss: 0.4377 - dense_2_root_mean_squared_error: 0.6046 - dense_3_root_mean_squared_error: 0.6616 - val_loss: 0.6115 - val_dense_2_loss: 0.6325 - val_dense_3_loss: 0.4226 - val_dense_2_root_mean_squared_error: 0.7953 - val_dense_3_root_mean_squared_error: 0.6501\n", "Epoch 12/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3750 - dense_2_loss: 0.3688 - dense_3_loss: 0.4303 - dense_2_root_mean_squared_error: 0.6073 - dense_3_root_mean_squared_error: 0.6560 - val_loss: 0.9371 - val_dense_2_loss: 0.9545 - val_dense_3_loss: 0.7799 - val_dense_2_root_mean_squared_error: 0.9770 - val_dense_3_root_mean_squared_error: 0.8831\n", "Epoch 13/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3570 - dense_2_loss: 0.3499 - dense_3_loss: 0.4203 - dense_2_root_mean_squared_error: 0.5915 - dense_3_root_mean_squared_error: 0.6483 - val_loss: 0.4224 - val_dense_2_loss: 0.4245 - val_dense_3_loss: 0.4039 - val_dense_2_root_mean_squared_error: 0.6515 - val_dense_3_root_mean_squared_error: 0.6355\n", "Epoch 14/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3493 - dense_2_loss: 0.3421 - dense_3_loss: 0.4148 - dense_2_root_mean_squared_error: 0.5849 - dense_3_root_mean_squared_error: 0.6440 - val_loss: 0.3410 - val_dense_2_loss: 0.3221 - val_dense_3_loss: 0.5105 - val_dense_2_root_mean_squared_error: 0.5676 - val_dense_3_root_mean_squared_error: 0.7145\n", "Epoch 15/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3496 - dense_2_loss: 0.3432 - dense_3_loss: 0.4076 - dense_2_root_mean_squared_error: 0.5858 - dense_3_root_mean_squared_error: 0.6384 - val_loss: 0.6461 - val_dense_2_loss: 0.6671 - val_dense_3_loss: 0.4570 - val_dense_2_root_mean_squared_error: 0.8168 - val_dense_3_root_mean_squared_error: 0.6760\n", "Epoch 16/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3435 - dense_2_loss: 0.3370 - dense_3_loss: 0.4022 - dense_2_root_mean_squared_error: 0.5805 - dense_3_root_mean_squared_error: 0.6342 - val_loss: 0.6875 - val_dense_2_loss: 0.6841 - val_dense_3_loss: 0.7182 - val_dense_2_root_mean_squared_error: 0.8271 - val_dense_3_root_mean_squared_error: 0.8475\n", "Epoch 17/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3458 - dense_2_loss: 0.3393 - dense_3_loss: 0.4037 - dense_2_root_mean_squared_error: 0.5825 - dense_3_root_mean_squared_error: 0.6354 - val_loss: 1.1564 - val_dense_2_loss: 1.2129 - val_dense_3_loss: 0.6483 - val_dense_2_root_mean_squared_error: 1.1013 - val_dense_3_root_mean_squared_error: 0.8052\n", "Epoch 18/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3446 - dense_2_loss: 0.3385 - dense_3_loss: 0.3994 - dense_2_root_mean_squared_error: 0.5818 - dense_3_root_mean_squared_error: 0.6320 - val_loss: 3.9325 - val_dense_2_loss: 4.0947 - val_dense_3_loss: 2.4722 - val_dense_2_root_mean_squared_error: 2.0235 - val_dense_3_root_mean_squared_error: 1.5723\n", "Epoch 19/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3563 - dense_2_loss: 0.3511 - dense_3_loss: 0.4029 - dense_2_root_mean_squared_error: 0.5925 - dense_3_root_mean_squared_error: 0.6347 - val_loss: 1.4560 - val_dense_2_loss: 1.5433 - val_dense_3_loss: 0.6697 - val_dense_2_root_mean_squared_error: 1.2423 - val_dense_3_root_mean_squared_error: 0.8183\n", "Epoch 20/20\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3546 - dense_2_loss: 0.3498 - dense_3_loss: 0.3981 - dense_2_root_mean_squared_error: 0.5914 - dense_3_root_mean_squared_error: 0.6310 - val_loss: 1.1709 - val_dense_2_loss: 1.1945 - val_dense_3_loss: 0.9589 - val_dense_2_root_mean_squared_error: 1.0929 - val_dense_3_root_mean_squared_error: 0.9792\n" ] } ], "source": [ "norm_layer_wide.adapt(X_train_wide)\n", "norm_layer_deep.adapt(X_train_deep)\n", "history = model.fit(\n", " (X_train_wide, X_train_deep), (y_train, y_train), epochs=20,\n", " validation_data=((X_valid_wide, X_valid_deep), (y_valid, y_valid))\n", ")" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "162/162 [==============================] - 0s 778us/step - loss: 0.3446 - dense_2_loss: 0.3381 - dense_3_loss: 0.4031 - dense_2_root_mean_squared_error: 0.5815 - dense_3_root_mean_squared_error: 0.6349\n" ] } ], "source": [ "eval_results = model.evaluate((X_test_wide, X_test_deep), (y_test, y_test))\n", "weighted_sum_of_losses, main_loss, aux_loss, main_rmse, aux_rmse = eval_results" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:5 out of the last 5 calls to .predict_function at 0x7fb250e69310> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n" ] } ], "source": [ "y_pred_main, y_pred_aux = model.predict((X_new_wide, X_new_deep))" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [], "source": [ "y_pred_tuple = model.predict((X_new_wide, X_new_deep))\n", "y_pred = dict(zip(model.output_names, y_pred_tuple))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using the Subclassing API to Build Dynamic Models" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "class WideAndDeepModel(tf.keras.Model):\n", " def __init__(self, units=30, activation=\"relu\", **kwargs):\n", " super().__init__(**kwargs) # needed to support naming the model\n", " self.norm_layer_wide = tf.keras.layers.Normalization()\n", " self.norm_layer_deep = tf.keras.layers.Normalization()\n", " self.hidden1 = tf.keras.layers.Dense(units, activation=activation)\n", " self.hidden2 = tf.keras.layers.Dense(units, activation=activation)\n", " self.main_output = tf.keras.layers.Dense(1)\n", " self.aux_output = tf.keras.layers.Dense(1)\n", " \n", " def call(self, inputs):\n", " input_wide, input_deep = inputs\n", " norm_wide = self.norm_layer_wide(input_wide)\n", " norm_deep = self.norm_layer_deep(input_deep)\n", " hidden1 = self.hidden1(norm_deep)\n", " hidden2 = self.hidden2(hidden1)\n", " concat = tf.keras.layers.concatenate([norm_wide, hidden2])\n", " output = self.main_output(concat)\n", " aux_output = self.aux_output(hidden2)\n", " return output, aux_output\n", "\n", "tf.random.set_seed(42) # extra code – just for reproducibility\n", "model = WideAndDeepModel(30, activation=\"relu\", name=\"my_cool_model\")" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/10\n", "363/363 [==============================] - 1s 2ms/step - loss: 1.3490 - output_1_loss: 1.2742 - output_2_loss: 2.0215 - output_1_root_mean_squared_error: 1.1288 - output_2_root_mean_squared_error: 1.4218 - val_loss: 1.5415 - val_output_1_loss: 0.9593 - val_output_2_loss: 6.7806 - val_output_1_root_mean_squared_error: 0.9795 - val_output_2_root_mean_squared_error: 2.6040\n", "Epoch 2/10\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.5101 - output_1_loss: 0.4785 - output_2_loss: 0.7952 - output_1_root_mean_squared_error: 0.6917 - output_2_root_mean_squared_error: 0.8917 - val_loss: 1.3624 - val_output_1_loss: 1.0094 - val_output_2_loss: 4.5401 - val_output_1_root_mean_squared_error: 1.0047 - val_output_2_root_mean_squared_error: 2.1307\n", "Epoch 3/10\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.4618 - output_1_loss: 0.4404 - output_2_loss: 0.6546 - output_1_root_mean_squared_error: 0.6636 - output_2_root_mean_squared_error: 0.8091 - val_loss: 0.5361 - val_output_1_loss: 0.3975 - val_output_2_loss: 1.7837 - val_output_1_root_mean_squared_error: 0.6305 - val_output_2_root_mean_squared_error: 1.3356\n", "Epoch 4/10\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.4252 - output_1_loss: 0.4059 - output_2_loss: 0.5985 - output_1_root_mean_squared_error: 0.6371 - output_2_root_mean_squared_error: 0.7736 - val_loss: 0.5182 - val_output_1_loss: 0.4590 - val_output_2_loss: 1.0517 - val_output_1_root_mean_squared_error: 0.6775 - val_output_2_root_mean_squared_error: 1.0255\n", "Epoch 5/10\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.4106 - output_1_loss: 0.3931 - output_2_loss: 0.5690 - output_1_root_mean_squared_error: 0.6269 - output_2_root_mean_squared_error: 0.7543 - val_loss: 0.4049 - val_output_1_loss: 0.3588 - val_output_2_loss: 0.8196 - val_output_1_root_mean_squared_error: 0.5990 - val_output_2_root_mean_squared_error: 0.9053\n", "Epoch 6/10\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3944 - output_1_loss: 0.3780 - output_2_loss: 0.5424 - output_1_root_mean_squared_error: 0.6148 - output_2_root_mean_squared_error: 0.7365 - val_loss: 0.4168 - val_output_1_loss: 0.3934 - val_output_2_loss: 0.6275 - val_output_1_root_mean_squared_error: 0.6272 - val_output_2_root_mean_squared_error: 0.7921\n", "Epoch 7/10\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3837 - output_1_loss: 0.3694 - output_2_loss: 0.5126 - output_1_root_mean_squared_error: 0.6078 - output_2_root_mean_squared_error: 0.7160 - val_loss: 0.3661 - val_output_1_loss: 0.3430 - val_output_2_loss: 0.5747 - val_output_1_root_mean_squared_error: 0.5856 - val_output_2_root_mean_squared_error: 0.7581\n", "Epoch 8/10\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3731 - output_1_loss: 0.3608 - output_2_loss: 0.4840 - output_1_root_mean_squared_error: 0.6007 - output_2_root_mean_squared_error: 0.6957 - val_loss: 0.8555 - val_output_1_loss: 0.8704 - val_output_2_loss: 0.7218 - val_output_1_root_mean_squared_error: 0.9330 - val_output_2_root_mean_squared_error: 0.8496\n", "Epoch 9/10\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3672 - output_1_loss: 0.3567 - output_2_loss: 0.4624 - output_1_root_mean_squared_error: 0.5972 - output_2_root_mean_squared_error: 0.6800 - val_loss: 2.6877 - val_output_1_loss: 2.9011 - val_output_2_loss: 0.7675 - val_output_1_root_mean_squared_error: 1.7033 - val_output_2_root_mean_squared_error: 0.8761\n", "Epoch 10/10\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3837 - output_1_loss: 0.3765 - output_2_loss: 0.4481 - output_1_root_mean_squared_error: 0.6136 - output_2_root_mean_squared_error: 0.6694 - val_loss: 3.6017 - val_output_1_loss: 3.8004 - val_output_2_loss: 1.8132 - val_output_1_root_mean_squared_error: 1.9495 - val_output_2_root_mean_squared_error: 1.3466\n", "162/162 [==============================] - 0s 781us/step - loss: 0.3652 - output_1_loss: 0.3570 - output_2_loss: 0.4387 - output_1_root_mean_squared_error: 0.5975 - output_2_root_mean_squared_error: 0.6624\n", "WARNING:tensorflow:6 out of the last 7 calls to .predict_function at 0x7fb250b9d820> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for more details.\n" ] } ], "source": [ "optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)\n", "model.compile(loss=\"mse\", loss_weights=[0.9, 0.1], optimizer=optimizer,\n", " metrics=[\"RootMeanSquaredError\"])\n", "model.norm_layer_wide.adapt(X_train_wide)\n", "model.norm_layer_deep.adapt(X_train_deep)\n", "history = model.fit(\n", " (X_train_wide, X_train_deep), (y_train, y_train), epochs=10,\n", " validation_data=((X_valid_wide, X_valid_deep), (y_valid, y_valid)))\n", "eval_results = model.evaluate((X_test_wide, X_test_deep), (y_test, y_test))\n", "weighted_sum_of_losses, main_loss, aux_loss, main_rmse, aux_rmse = eval_results\n", "y_pred_main, y_pred_aux = model.predict((X_new_wide, X_new_deep))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Saving and Restoring a Model" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [], "source": [ "# extra code – delete the directory, in case it already exists\n", "\n", "import shutil\n", "\n", "shutil.rmtree(\"my_keras_model\", ignore_errors=True)" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: my_keras_model/assets\n" ] } ], "source": [ "model.save(\"my_keras_model\", save_format=\"tf\")" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "my_keras_model/assets\n", "my_keras_model/keras_metadata.pb\n", "my_keras_model/saved_model.pb\n", "my_keras_model/variables\n", "my_keras_model/variables/variables.data-00000-of-00001\n", "my_keras_model/variables/variables.index\n" ] } ], "source": [ "# extra code – show the contents of the my_keras_model/ directory\n", "for path in sorted(Path(\"my_keras_model\").glob(\"**/*\")):\n", " print(path)" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [], "source": [ "model = tf.keras.models.load_model(\"my_keras_model\")\n", "y_pred_main, y_pred_aux = model.predict((X_new_wide, X_new_deep))" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [], "source": [ "model.save_weights(\"my_weights\")" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.load_weights(\"my_weights\")" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "my_weights.data-00000-of-00001\n", "my_weights.index\n" ] } ], "source": [ "# extra code – show the list of my_weights.* files\n", "for path in sorted(Path().glob(\"my_weights.*\")):\n", " print(path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using Callbacks" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [], "source": [ "shutil.rmtree(\"my_checkpoints\", ignore_errors=True) # extra code" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/10\n", "363/363 [==============================] - 1s 2ms/step - loss: 0.3775 - output_1_loss: 0.3706 - output_2_loss: 0.4402 - output_1_root_mean_squared_error: 0.6088 - output_2_root_mean_squared_error: 0.6635 - val_loss: 0.3369 - val_output_1_loss: 0.3234 - val_output_2_loss: 0.4587 - val_output_1_root_mean_squared_error: 0.5687 - val_output_2_root_mean_squared_error: 0.6773\n", "Epoch 2/10\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3556 - output_1_loss: 0.3480 - output_2_loss: 0.4242 - output_1_root_mean_squared_error: 0.5899 - output_2_root_mean_squared_error: 0.6513 - val_loss: 0.4940 - val_output_1_loss: 0.4650 - val_output_2_loss: 0.7551 - val_output_1_root_mean_squared_error: 0.6819 - val_output_2_root_mean_squared_error: 0.8689\n", "Epoch 3/10\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3612 - output_1_loss: 0.3547 - output_2_loss: 0.4198 - output_1_root_mean_squared_error: 0.5956 - output_2_root_mean_squared_error: 0.6480 - val_loss: 0.3443 - val_output_1_loss: 0.3355 - val_output_2_loss: 0.4241 - val_output_1_root_mean_squared_error: 0.5792 - val_output_2_root_mean_squared_error: 0.6512\n", "Epoch 4/10\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3493 - output_1_loss: 0.3425 - output_2_loss: 0.4110 - output_1_root_mean_squared_error: 0.5852 - output_2_root_mean_squared_error: 0.6411 - val_loss: 0.4676 - val_output_1_loss: 0.4635 - val_output_2_loss: 0.5046 - val_output_1_root_mean_squared_error: 0.6808 - val_output_2_root_mean_squared_error: 0.7104\n", "Epoch 5/10\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3525 - output_1_loss: 0.3465 - output_2_loss: 0.4069 - output_1_root_mean_squared_error: 0.5886 - output_2_root_mean_squared_error: 0.6379 - val_loss: 1.3020 - val_output_1_loss: 1.3842 - val_output_2_loss: 0.5623 - val_output_1_root_mean_squared_error: 1.1765 - val_output_2_root_mean_squared_error: 0.7499\n", "Epoch 6/10\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3512 - output_1_loss: 0.3453 - output_2_loss: 0.4039 - output_1_root_mean_squared_error: 0.5876 - output_2_root_mean_squared_error: 0.6356 - val_loss: 1.6719 - val_output_1_loss: 1.7502 - val_output_2_loss: 0.9670 - val_output_1_root_mean_squared_error: 1.3230 - val_output_2_root_mean_squared_error: 0.9833\n", "Epoch 7/10\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3533 - output_1_loss: 0.3477 - output_2_loss: 0.4038 - output_1_root_mean_squared_error: 0.5897 - output_2_root_mean_squared_error: 0.6355 - val_loss: 0.6855 - val_output_1_loss: 0.7149 - val_output_2_loss: 0.4210 - val_output_1_root_mean_squared_error: 0.8455 - val_output_2_root_mean_squared_error: 0.6488\n", "Epoch 8/10\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3409 - output_1_loss: 0.3348 - output_2_loss: 0.3965 - output_1_root_mean_squared_error: 0.5786 - output_2_root_mean_squared_error: 0.6297 - val_loss: 2.0126 - val_output_1_loss: 1.9280 - val_output_2_loss: 2.7742 - val_output_1_root_mean_squared_error: 1.3885 - val_output_2_root_mean_squared_error: 1.6656\n", "Epoch 9/10\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3441 - output_1_loss: 0.3375 - output_2_loss: 0.4028 - output_1_root_mean_squared_error: 0.5810 - output_2_root_mean_squared_error: 0.6347 - val_loss: 1.6894 - val_output_1_loss: 1.8009 - val_output_2_loss: 0.6859 - val_output_1_root_mean_squared_error: 1.3420 - val_output_2_root_mean_squared_error: 0.8282\n", "Epoch 10/10\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3517 - output_1_loss: 0.3468 - output_2_loss: 0.3962 - output_1_root_mean_squared_error: 0.5889 - output_2_root_mean_squared_error: 0.6294 - val_loss: 1.2969 - val_output_1_loss: 1.3365 - val_output_2_loss: 0.9407 - val_output_1_root_mean_squared_error: 1.1561 - val_output_2_root_mean_squared_error: 0.9699\n" ] } ], "source": [ "checkpoint_cb = tf.keras.callbacks.ModelCheckpoint(\"my_checkpoints\",\n", " save_weights_only=True)\n", "history = model.fit(\n", " (X_train_wide, X_train_deep), (y_train, y_train), epochs=10,\n", " validation_data=((X_valid_wide, X_valid_deep), (y_valid, y_valid)),\n", " callbacks=[checkpoint_cb])" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3405 - output_1_loss: 0.3349 - output_2_loss: 0.3910 - output_1_root_mean_squared_error: 0.5787 - output_2_root_mean_squared_error: 0.6253 - val_loss: 0.6245 - val_output_1_loss: 0.6502 - val_output_2_loss: 0.3937 - val_output_1_root_mean_squared_error: 0.8063 - val_output_2_root_mean_squared_error: 0.6275\n", "Epoch 2/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3400 - output_1_loss: 0.3344 - output_2_loss: 0.3900 - output_1_root_mean_squared_error: 0.5783 - output_2_root_mean_squared_error: 0.6245 - val_loss: 0.9552 - val_output_1_loss: 0.9508 - val_output_2_loss: 0.9947 - val_output_1_root_mean_squared_error: 0.9751 - val_output_2_root_mean_squared_error: 0.9974\n", "Epoch 3/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3442 - output_1_loss: 0.3389 - output_2_loss: 0.3921 - output_1_root_mean_squared_error: 0.5821 - output_2_root_mean_squared_error: 0.6262 - val_loss: 0.3574 - val_output_1_loss: 0.3552 - val_output_2_loss: 0.3766 - val_output_1_root_mean_squared_error: 0.5960 - val_output_2_root_mean_squared_error: 0.6137\n", "Epoch 4/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3347 - output_1_loss: 0.3289 - output_2_loss: 0.3865 - output_1_root_mean_squared_error: 0.5735 - output_2_root_mean_squared_error: 0.6217 - val_loss: 0.4521 - val_output_1_loss: 0.4401 - val_output_2_loss: 0.5609 - val_output_1_root_mean_squared_error: 0.6634 - val_output_2_root_mean_squared_error: 0.7489\n", "Epoch 5/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3363 - output_1_loss: 0.3311 - output_2_loss: 0.3832 - output_1_root_mean_squared_error: 0.5754 - output_2_root_mean_squared_error: 0.6190 - val_loss: 0.4903 - val_output_1_loss: 0.5018 - val_output_2_loss: 0.3869 - val_output_1_root_mean_squared_error: 0.7084 - val_output_2_root_mean_squared_error: 0.6220\n", "Epoch 6/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3300 - output_1_loss: 0.3245 - output_2_loss: 0.3801 - output_1_root_mean_squared_error: 0.5696 - output_2_root_mean_squared_error: 0.6165 - val_loss: 0.8351 - val_output_1_loss: 0.8434 - val_output_2_loss: 0.7602 - val_output_1_root_mean_squared_error: 0.9184 - val_output_2_root_mean_squared_error: 0.8719\n", "Epoch 7/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3324 - output_1_loss: 0.3270 - output_2_loss: 0.3814 - output_1_root_mean_squared_error: 0.5718 - output_2_root_mean_squared_error: 0.6176 - val_loss: 0.6880 - val_output_1_loss: 0.7171 - val_output_2_loss: 0.4259 - val_output_1_root_mean_squared_error: 0.8468 - val_output_2_root_mean_squared_error: 0.6526\n", "Epoch 8/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3286 - output_1_loss: 0.3231 - output_2_loss: 0.3774 - output_1_root_mean_squared_error: 0.5684 - output_2_root_mean_squared_error: 0.6143 - val_loss: 4.4284 - val_output_1_loss: 4.2604 - val_output_2_loss: 5.9404 - val_output_1_root_mean_squared_error: 2.0641 - val_output_2_root_mean_squared_error: 2.4373\n", "Epoch 9/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3378 - output_1_loss: 0.3322 - output_2_loss: 0.3886 - output_1_root_mean_squared_error: 0.5764 - output_2_root_mean_squared_error: 0.6234 - val_loss: 1.7043 - val_output_1_loss: 1.7984 - val_output_2_loss: 0.8578 - val_output_1_root_mean_squared_error: 1.3410 - val_output_2_root_mean_squared_error: 0.9262\n", "Epoch 10/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3401 - output_1_loss: 0.3354 - output_2_loss: 0.3824 - output_1_root_mean_squared_error: 0.5792 - output_2_root_mean_squared_error: 0.6184 - val_loss: 0.6170 - val_output_1_loss: 0.6282 - val_output_2_loss: 0.5169 - val_output_1_root_mean_squared_error: 0.7926 - val_output_2_root_mean_squared_error: 0.7190\n", "Epoch 11/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3230 - output_1_loss: 0.3177 - output_2_loss: 0.3706 - output_1_root_mean_squared_error: 0.5637 - output_2_root_mean_squared_error: 0.6088 - val_loss: 0.3558 - val_output_1_loss: 0.3490 - val_output_2_loss: 0.4170 - val_output_1_root_mean_squared_error: 0.5907 - val_output_2_root_mean_squared_error: 0.6457\n", "Epoch 12/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3253 - output_1_loss: 0.3201 - output_2_loss: 0.3727 - output_1_root_mean_squared_error: 0.5658 - output_2_root_mean_squared_error: 0.6105 - val_loss: 0.4612 - val_output_1_loss: 0.4597 - val_output_2_loss: 0.4745 - val_output_1_root_mean_squared_error: 0.6780 - val_output_2_root_mean_squared_error: 0.6888\n", "Epoch 13/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3221 - output_1_loss: 0.3167 - output_2_loss: 0.3699 - output_1_root_mean_squared_error: 0.5628 - output_2_root_mean_squared_error: 0.6082 - val_loss: 0.3120 - val_output_1_loss: 0.3056 - val_output_2_loss: 0.3694 - val_output_1_root_mean_squared_error: 0.5528 - val_output_2_root_mean_squared_error: 0.6078\n", "Epoch 14/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3204 - output_1_loss: 0.3149 - output_2_loss: 0.3695 - output_1_root_mean_squared_error: 0.5612 - output_2_root_mean_squared_error: 0.6078 - val_loss: 0.4120 - val_output_1_loss: 0.4013 - val_output_2_loss: 0.5076 - val_output_1_root_mean_squared_error: 0.6335 - val_output_2_root_mean_squared_error: 0.7124\n", "Epoch 15/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3196 - output_1_loss: 0.3144 - output_2_loss: 0.3662 - output_1_root_mean_squared_error: 0.5607 - output_2_root_mean_squared_error: 0.6052 - val_loss: 0.3304 - val_output_1_loss: 0.3269 - val_output_2_loss: 0.3619 - val_output_1_root_mean_squared_error: 0.5718 - val_output_2_root_mean_squared_error: 0.6016\n", "Epoch 16/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3166 - output_1_loss: 0.3113 - output_2_loss: 0.3639 - output_1_root_mean_squared_error: 0.5579 - output_2_root_mean_squared_error: 0.6032 - val_loss: 0.4455 - val_output_1_loss: 0.4414 - val_output_2_loss: 0.4819 - val_output_1_root_mean_squared_error: 0.6644 - val_output_2_root_mean_squared_error: 0.6942\n", "Epoch 17/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3186 - output_1_loss: 0.3134 - output_2_loss: 0.3650 - output_1_root_mean_squared_error: 0.5599 - output_2_root_mean_squared_error: 0.6041 - val_loss: 0.3255 - val_output_1_loss: 0.3212 - val_output_2_loss: 0.3643 - val_output_1_root_mean_squared_error: 0.5667 - val_output_2_root_mean_squared_error: 0.6035\n", "Epoch 18/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3143 - output_1_loss: 0.3091 - output_2_loss: 0.3611 - output_1_root_mean_squared_error: 0.5560 - output_2_root_mean_squared_error: 0.6009 - val_loss: 1.6360 - val_output_1_loss: 1.6925 - val_output_2_loss: 1.1276 - val_output_1_root_mean_squared_error: 1.3010 - val_output_2_root_mean_squared_error: 1.0619\n", "Epoch 19/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3169 - output_1_loss: 0.3122 - output_2_loss: 0.3601 - output_1_root_mean_squared_error: 0.5587 - output_2_root_mean_squared_error: 0.6001 - val_loss: 1.2441 - val_output_1_loss: 1.3093 - val_output_2_loss: 0.6572 - val_output_1_root_mean_squared_error: 1.1442 - val_output_2_root_mean_squared_error: 0.8107\n", "Epoch 20/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3245 - output_1_loss: 0.3201 - output_2_loss: 0.3641 - output_1_root_mean_squared_error: 0.5658 - output_2_root_mean_squared_error: 0.6034 - val_loss: 1.5466 - val_output_1_loss: 1.5582 - val_output_2_loss: 1.4424 - val_output_1_root_mean_squared_error: 1.2483 - val_output_2_root_mean_squared_error: 1.2010\n", "Epoch 21/100\n", "363/363 [==============================] - 0s 1ms/step - loss: 0.3202 - output_1_loss: 0.3153 - output_2_loss: 0.3640 - output_1_root_mean_squared_error: 0.5615 - output_2_root_mean_squared_error: 0.6033 - val_loss: 0.6704 - val_output_1_loss: 0.6907 - val_output_2_loss: 0.4873 - val_output_1_root_mean_squared_error: 0.8311 - val_output_2_root_mean_squared_error: 0.6980\n", "Epoch 22/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3150 - output_1_loss: 0.3103 - output_2_loss: 0.3573 - output_1_root_mean_squared_error: 0.5570 - output_2_root_mean_squared_error: 0.5978 - val_loss: 0.4909 - val_output_1_loss: 0.4955 - val_output_2_loss: 0.4493 - val_output_1_root_mean_squared_error: 0.7039 - val_output_2_root_mean_squared_error: 0.6703\n", "Epoch 23/100\n", "363/363 [==============================] - 1s 1ms/step - loss: 0.3104 - output_1_loss: 0.3054 - output_2_loss: 0.3552 - output_1_root_mean_squared_error: 0.5526 - output_2_root_mean_squared_error: 0.5960 - val_loss: 0.3845 - val_output_1_loss: 0.3803 - val_output_2_loss: 0.4228 - val_output_1_root_mean_squared_error: 0.6167 - val_output_2_root_mean_squared_error: 0.6502\n" ] } ], "source": [ "early_stopping_cb = tf.keras.callbacks.EarlyStopping(patience=10,\n", " restore_best_weights=True)\n", "history = model.fit(\n", " (X_train_wide, X_train_deep), (y_train, y_train), epochs=100,\n", " validation_data=((X_valid_wide, X_valid_deep), (y_valid, y_valid)),\n", " callbacks=[checkpoint_cb, early_stopping_cb])" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [], "source": [ "class PrintValTrainRatioCallback(tf.keras.callbacks.Callback):\n", " def on_epoch_end(self, epoch, logs):\n", " ratio = logs[\"val_loss\"] / logs[\"loss\"]\n", " print(f\"Epoch={epoch}, val/train={ratio:.2f}\")" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch=0, val/train=2.29\n", "Epoch=1, val/train=1.03\n", "Epoch=2, val/train=2.07\n", "Epoch=3, val/train=1.76\n", "Epoch=4, val/train=3.56\n", "Epoch=5, val/train=1.86\n", "Epoch=6, val/train=2.45\n", "Epoch=7, val/train=7.86\n", "Epoch=8, val/train=11.20\n", "Epoch=9, val/train=1.14\n" ] } ], "source": [ "val_train_ratio_cb = PrintValTrainRatioCallback()\n", "history = model.fit(\n", " (X_train_wide, X_train_deep), (y_train, y_train), epochs=10,\n", " validation_data=((X_valid_wide, X_valid_deep), (y_valid, y_valid)),\n", " callbacks=[val_train_ratio_cb], verbose=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using TensorBoard for Visualization" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "TensorBoard is preinstalled on Colab, but not the `tensorboard-plugin-profile`, so let's install it:" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [], "source": [ "if \"google.colab\" in sys.modules: # extra code\n", " %pip install -q -U tensorboard-plugin-profile" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "tags": [] }, "outputs": [], "source": [ "shutil.rmtree(\"my_logs\", ignore_errors=True)" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [], "source": [ "from pathlib import Path\n", "from time import strftime\n", "\n", "def get_run_logdir(root_logdir=\"my_logs\"):\n", " return Path(root_logdir) / strftime(\"run_%Y_%m_%d_%H_%M_%S\")\n", "\n", "run_logdir = get_run_logdir()" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [], "source": [ "# extra code – builds the first regression model we used earlier\n", "tf.keras.backend.clear_session()\n", "tf.random.set_seed(42)\n", "norm_layer = tf.keras.layers.Normalization(input_shape=X_train.shape[1:])\n", "model = tf.keras.Sequential([\n", " norm_layer,\n", " tf.keras.layers.Dense(30, activation=\"relu\"),\n", " tf.keras.layers.Dense(30, activation=\"relu\"),\n", " tf.keras.layers.Dense(1)\n", "])\n", "optimizer = tf.keras.optimizers.SGD(learning_rate=1e-3)\n", "model.compile(loss=\"mse\", optimizer=optimizer, metrics=[\"RootMeanSquaredError\"])\n", "norm_layer.adapt(X_train)" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2022-08-01 17:25:59.099970: I tensorflow/core/profiler/lib/profiler_session.cc:110] Profiler session initializing.\n", "2022-08-01 17:25:59.099982: I tensorflow/core/profiler/lib/profiler_session.cc:125] Profiler session started.\n", "2022-08-01 17:25:59.100137: I tensorflow/core/profiler/lib/profiler_session.cc:143] Profiler session tear down.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/20\n", "261/363 [====================>.........] - ETA: 0s - loss: 2.3165 - root_mean_squared_error: 1.5220" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-08-01 17:25:59.430946: I tensorflow/core/profiler/lib/profiler_session.cc:110] Profiler session initializing.\n", "2022-08-01 17:25:59.430962: I tensorflow/core/profiler/lib/profiler_session.cc:125] Profiler session started.\n", "2022-08-01 17:25:59.510100: I tensorflow/core/profiler/lib/profiler_session.cc:67] Profiler session collecting data.\n", "2022-08-01 17:25:59.524969: I tensorflow/core/profiler/lib/profiler_session.cc:143] Profiler session tear down.\n", "2022-08-01 17:25:59.539451: I tensorflow/core/profiler/rpc/client/save_profile.cc:136] Creating directory: my_logs/run_2022_08_01_17_25_59/plugins/profile/2022_08_01_17_26_00\n", "\n", "2022-08-01 17:25:59.549606: I tensorflow/core/profiler/rpc/client/save_profile.cc:142] Dumped gzipped tool data for trace.json.gz to my_logs/run_2022_08_01_17_25_59/plugins/profile/2022_08_01_17_26_00/my_computer.trace.json.gz\n", "2022-08-01 17:25:59.558338: I tensorflow/core/profiler/rpc/client/save_profile.cc:136] Creating directory: my_logs/run_2022_08_01_17_25_59/plugins/profile/2022_08_01_17_26_00\n", "\n", "2022-08-01 17:25:59.558474: I tensorflow/core/profiler/rpc/client/save_profile.cc:142] Dumped gzipped tool data for memory_profile.json.gz to my_logs/run_2022_08_01_17_25_59/plugins/profile/2022_08_01_17_26_00/my_computer.memory_profile.json.gz\n", "2022-08-01 17:25:59.559618: I tensorflow/core/profiler/rpc/client/capture_profile.cc:251] Creating directory: my_logs/run_2022_08_01_17_25_59/plugins/profile/2022_08_01_17_26_00\n", "Dumped tool data for xplane.pb to my_logs/run_2022_08_01_17_25_59/plugins/profile/2022_08_01_17_26_00/my_computer.xplane.pb\n", "Dumped tool data for overview_page.pb to my_logs/run_2022_08_01_17_25_59/plugins/profile/2022_08_01_17_26_00/my_computer.overview_page.pb\n", "Dumped tool data for input_pipeline.pb to my_logs/run_2022_08_01_17_25_59/plugins/profile/2022_08_01_17_26_00/my_computer.input_pipeline.pb\n", "Dumped tool data for tensorflow_stats.pb to my_logs/run_2022_08_01_17_25_59/plugins/profile/2022_08_01_17_26_00/my_computer.tensorflow_stats.pb\n", "Dumped tool data for kernel_stats.pb to my_logs/run_2022_08_01_17_25_59/plugins/profile/2022_08_01_17_26_00/my_computer.kernel_stats.pb\n", "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "363/363 [==============================] - 1s 1ms/step - loss: 1.8866 - root_mean_squared_error: 1.3736 - val_loss: 0.7126 - val_root_mean_squared_error: 0.8442\n", "Epoch 2/20\n", "363/363 [==============================] - 0s 907us/step - loss: 0.6577 - root_mean_squared_error: 0.8110 - val_loss: 0.6880 - val_root_mean_squared_error: 0.8295\n", "Epoch 3/20\n", "363/363 [==============================] - 0s 836us/step - loss: 0.5934 - root_mean_squared_error: 0.7703 - val_loss: 0.5803 - val_root_mean_squared_error: 0.7618\n", "Epoch 4/20\n", "363/363 [==============================] - 0s 832us/step - loss: 0.5557 - root_mean_squared_error: 0.7455 - val_loss: 0.5166 - val_root_mean_squared_error: 0.7188\n", "Epoch 5/20\n", "363/363 [==============================] - 0s 985us/step - loss: 0.5272 - root_mean_squared_error: 0.7261 - val_loss: 0.4895 - val_root_mean_squared_error: 0.6997\n", "Epoch 6/20\n", "363/363 [==============================] - 0s 887us/step - loss: 0.5033 - root_mean_squared_error: 0.7094 - val_loss: 0.4951 - val_root_mean_squared_error: 0.7036\n", "Epoch 7/20\n", "363/363 [==============================] - 0s 894us/step - loss: 0.4854 - root_mean_squared_error: 0.6967 - val_loss: 0.4862 - val_root_mean_squared_error: 0.6973\n", "Epoch 8/20\n", "363/363 [==============================] - 0s 868us/step - loss: 0.4709 - root_mean_squared_error: 0.6862 - val_loss: 0.4554 - val_root_mean_squared_error: 0.6748\n", "Epoch 9/20\n", "363/363 [==============================] - 0s 780us/step - loss: 0.4578 - root_mean_squared_error: 0.6766 - val_loss: 0.4413 - val_root_mean_squared_error: 0.6643\n", "Epoch 10/20\n", "363/363 [==============================] - 0s 819us/step - loss: 0.4474 - root_mean_squared_error: 0.6689 - val_loss: 0.4379 - val_root_mean_squared_error: 0.6617\n", "Epoch 11/20\n", "363/363 [==============================] - 0s 795us/step - loss: 0.4393 - root_mean_squared_error: 0.6628 - val_loss: 0.4396 - val_root_mean_squared_error: 0.6630\n", "Epoch 12/20\n", "363/363 [==============================] - 0s 852us/step - loss: 0.4318 - root_mean_squared_error: 0.6571 - val_loss: 0.4505 - val_root_mean_squared_error: 0.6712\n", "Epoch 13/20\n", "363/363 [==============================] - 0s 910us/step - loss: 0.4260 - root_mean_squared_error: 0.6527 - val_loss: 0.3997 - val_root_mean_squared_error: 0.6322\n", "Epoch 14/20\n", "363/363 [==============================] - 0s 796us/step - loss: 0.4202 - root_mean_squared_error: 0.6482 - val_loss: 0.3956 - val_root_mean_squared_error: 0.6290\n", "Epoch 15/20\n", "363/363 [==============================] - 0s 816us/step - loss: 0.4155 - root_mean_squared_error: 0.6446 - val_loss: 0.3916 - val_root_mean_squared_error: 0.6257\n", "Epoch 16/20\n", "363/363 [==============================] - 0s 759us/step - loss: 0.4112 - root_mean_squared_error: 0.6412 - val_loss: 0.3937 - val_root_mean_squared_error: 0.6275\n", "Epoch 17/20\n", "363/363 [==============================] - 0s 826us/step - loss: 0.4077 - root_mean_squared_error: 0.6385 - val_loss: 0.3809 - val_root_mean_squared_error: 0.6172\n", "Epoch 18/20\n", "363/363 [==============================] - 0s 832us/step - loss: 0.4039 - root_mean_squared_error: 0.6356 - val_loss: 0.3793 - val_root_mean_squared_error: 0.6159\n", "Epoch 19/20\n", "363/363 [==============================] - 0s 747us/step - loss: 0.4004 - root_mean_squared_error: 0.6328 - val_loss: 0.3850 - val_root_mean_squared_error: 0.6205\n", "Epoch 20/20\n", "363/363 [==============================] - 0s 755us/step - loss: 0.3980 - root_mean_squared_error: 0.6308 - val_loss: 0.3809 - val_root_mean_squared_error: 0.6172\n" ] } ], "source": [ "tensorboard_cb = tf.keras.callbacks.TensorBoard(run_logdir,\n", " profile_batch=(100, 200))\n", "history = model.fit(X_train, y_train, epochs=20,\n", " validation_data=(X_valid, y_valid),\n", " callbacks=[tensorboard_cb])" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "my_logs\n", " run_2022_08_01_17_25_59\n", " events.out.tfevents.1638910166.my_computer.profile-empty\n", " plugins\n", " profile\n", " 2022_08_01_17_26_00\n", " my_computer.input_pipeline.pb\n", " my_computer.kernel_stats.pb\n", " my_computer.memory_profile.json.gz\n", " my_computer.overview_page.pb\n", " my_computer.tensorflow_stats.pb\n", " my_computer.trace.json.gz\n", " my_computer.xplane.pb\n", " train\n", " events.out.tfevents.1638910166.my_computer.22294.0.v2\n", " validation\n", " events.out.tfevents.1638910166.my_computer.22294.1.v2\n" ] } ], "source": [ "print(\"my_logs\")\n", "for path in sorted(Path(\"my_logs\").glob(\"**/*\")):\n", " print(\" \" * (len(path.parts) - 1) + path.parts[-1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's load the `tensorboard` Jupyter extension and start the TensorBoard server: " ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%load_ext tensorboard\n", "%tensorboard --logdir=./my_logs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Note**: if you prefer to access TensorBoard in a separate tab, click the \"localhost:6006\" link below:" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/html": [ "http://localhost:6006/" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# extra code\n", "\n", "if \"google.colab\" in sys.modules:\n", " from google.colab import output\n", "\n", " output.serve_kernel_port_as_window(6006)\n", "else:\n", " from IPython.display import display, HTML\n", "\n", " display(HTML('http://localhost:6006/'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can use also visualize histograms, images, text, and even listen to audio using TensorBoard:" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [], "source": [ "test_logdir = get_run_logdir()\n", "writer = tf.summary.create_file_writer(str(test_logdir))\n", "with writer.as_default():\n", " for step in range(1, 1000 + 1):\n", " tf.summary.scalar(\"my_scalar\", np.sin(step / 10), step=step)\n", " \n", " data = (np.random.randn(100) + 2) * step / 100 # gets larger\n", " tf.summary.histogram(\"my_hist\", data, buckets=50, step=step)\n", " \n", " images = np.random.rand(2, 32, 32, 3) * step / 1000 # gets brighter\n", " tf.summary.image(\"my_images\", images, step=step)\n", " \n", " texts = [\"The step is \" + str(step), \"Its square is \" + str(step ** 2)]\n", " tf.summary.text(\"my_text\", texts, step=step)\n", " \n", " sine_wave = tf.math.sin(tf.range(12000) / 48000 * 2 * np.pi * step)\n", " audio = tf.reshape(tf.cast(sine_wave, tf.float32), [1, -1, 1])\n", " tf.summary.audio(\"my_audio\", audio, sample_rate=48000, step=step)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Note**: it used to be possible to easily share your TensorBoard logs with the world by uploading them to https://tensorboard.dev/. Sadly, this service will shut down in December 2023, so I have removed the corresponding code examples from this notebook." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When you stop this Jupyter kernel (a.k.a. Runtime), it will automatically stop the TensorBoard server as well. Another way to stop the TensorBoard server is to kill it, if you are running on Linux or MacOSX. First, you need to find its process ID:" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Known TensorBoard instances:\n", " - port 6006: logdir ./my_logs (started 0:00:31 ago; pid 22701)\n" ] } ], "source": [ "# extra code – lists all running TensorBoard server instances\n", "\n", "from tensorboard import notebook\n", "\n", "notebook.list()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next you can use the following command on Linux or MacOSX, replacing `` with the pid listed above:\n", "\n", " !kill \n", "\n", "On Windows:\n", "\n", " !taskkill /F /PID " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Fine-Tuning Neural Network Hyperparameters" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this section we'll use the Fashion MNIST dataset again:" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [], "source": [ "(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist\n", "X_train, y_train = X_train_full[:-5000], y_train_full[:-5000]\n", "X_valid, y_valid = X_train_full[-5000:], y_train_full[-5000:]" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [], "source": [ "tf.keras.backend.clear_session()\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [], "source": [ "if \"google.colab\" in sys.modules:\n", " %pip install -q -U keras_tuner" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [], "source": [ "import keras_tuner as kt\n", "\n", "def build_model(hp):\n", " n_hidden = hp.Int(\"n_hidden\", min_value=0, max_value=8, default=2)\n", " n_neurons = hp.Int(\"n_neurons\", min_value=16, max_value=256)\n", " learning_rate = hp.Float(\"learning_rate\", min_value=1e-4, max_value=1e-2,\n", " sampling=\"log\")\n", " optimizer = hp.Choice(\"optimizer\", values=[\"sgd\", \"adam\"])\n", " if optimizer == \"sgd\":\n", " optimizer = tf.keras.optimizers.SGD(learning_rate=learning_rate)\n", " else:\n", " optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)\n", "\n", " model = tf.keras.Sequential()\n", " model.add(tf.keras.layers.Flatten())\n", " for _ in range(n_hidden):\n", " model.add(tf.keras.layers.Dense(n_neurons, activation=\"relu\"))\n", " model.add(tf.keras.layers.Dense(10, activation=\"softmax\"))\n", " model.compile(loss=\"sparse_categorical_crossentropy\", optimizer=optimizer,\n", " metrics=[\"accuracy\"])\n", " return model" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trial 5 Complete [00h 00m 24s]\n", "val_accuracy: 0.8736000061035156\n", "\n", "Best val_accuracy So Far: 0.8736000061035156\n", "Total elapsed time: 00h 01m 43s\n", "INFO:tensorflow:Oracle triggered exit\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "I1208 09:51:50.359315 4451454400 1158129808.py:4] Oracle triggered exit\n" ] } ], "source": [ "random_search_tuner = kt.RandomSearch(\n", " build_model, objective=\"val_accuracy\", max_trials=5, overwrite=True,\n", " directory=\"my_fashion_mnist\", project_name=\"my_rnd_search\", seed=42)\n", "random_search_tuner.search(X_train, y_train, epochs=10,\n", " validation_data=(X_valid, y_valid))" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [], "source": [ "top3_models = random_search_tuner.get_best_models(num_models=3)\n", "best_model = top3_models[0]" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'n_hidden': 5,\n", " 'n_neurons': 70,\n", " 'learning_rate': 0.00041268008323824807,\n", " 'optimizer': 'adam'}" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "top3_params = random_search_tuner.get_best_hyperparameters(num_trials=3)\n", "top3_params[0].values # best hyperparameter values" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trial summary\n", "Hyperparameters:\n", "n_hidden: 5\n", "n_neurons: 70\n", "learning_rate: 0.00041268008323824807\n", "optimizer: adam\n", "Score: 0.8736000061035156\n" ] } ], "source": [ "best_trial = random_search_tuner.oracle.get_best_trials(num_trials=1)[0]\n", "best_trial.summary()" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.8736000061035156" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "best_trial.metrics.get_last_value(\"val_accuracy\")" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/10\n", "1875/1875 [==============================] - 3s 1ms/step - loss: 0.3274 - accuracy: 0.8799\n", "Epoch 2/10\n", "1875/1875 [==============================] - 2s 1ms/step - loss: 0.3155 - accuracy: 0.8827\n", "Epoch 3/10\n", "1875/1875 [==============================] - 2s 1ms/step - loss: 0.3049 - accuracy: 0.8867\n", "Epoch 4/10\n", "1875/1875 [==============================] - 2s 1ms/step - loss: 0.2962 - accuracy: 0.8914\n", "Epoch 5/10\n", "1875/1875 [==============================] - 2s 1ms/step - loss: 0.2886 - accuracy: 0.8931\n", "Epoch 6/10\n", "1875/1875 [==============================] - 2s 1ms/step - loss: 0.2831 - accuracy: 0.8935\n", "Epoch 7/10\n", "1875/1875 [==============================] - 2s 1ms/step - loss: 0.2795 - accuracy: 0.8962\n", "Epoch 8/10\n", "1875/1875 [==============================] - 2s 1ms/step - loss: 0.2701 - accuracy: 0.8999: 0s - loss: 0\n", "Epoch 9/10\n", "1875/1875 [==============================] - 2s 1ms/step - loss: 0.2661 - accuracy: 0.9009\n", "Epoch 10/10\n", "1875/1875 [==============================] - 2s 1ms/step - loss: 0.2628 - accuracy: 0.9012\n", "313/313 [==============================] - 0s 744us/step - loss: 0.3625 - accuracy: 0.8753\n" ] } ], "source": [ "best_model.fit(X_train_full, y_train_full, epochs=10)\n", "test_loss, test_accuracy = best_model.evaluate(X_test, y_test)" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [], "source": [ "class MyClassificationHyperModel(kt.HyperModel):\n", " def build(self, hp):\n", " return build_model(hp)\n", "\n", " def fit(self, hp, model, X, y, **kwargs):\n", " if hp.Boolean(\"normalize\"):\n", " norm_layer = tf.keras.layers.Normalization()\n", " X = norm_layer(X)\n", " return model.fit(X, y, **kwargs)" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [], "source": [ "hyperband_tuner = kt.Hyperband(\n", " MyClassificationHyperModel(), objective=\"val_accuracy\", seed=42,\n", " max_epochs=10, factor=3, hyperband_iterations=2,\n", " overwrite=True, directory=\"my_fashion_mnist\", project_name=\"hyperband\")" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trial 60 Complete [00h 00m 18s]\n", "val_accuracy: 0.819599986076355\n", "\n", "Best val_accuracy So Far: 0.8704000115394592\n", "Total elapsed time: 00h 08m 44s\n", "INFO:tensorflow:Oracle triggered exit\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "I1208 10:00:59.856360 4451454400 3169670597.py:4] Oracle triggered exit\n" ] } ], "source": [ "root_logdir = Path(hyperband_tuner.project_dir) / \"tensorboard\"\n", "tensorboard_cb = tf.keras.callbacks.TensorBoard(root_logdir)\n", "early_stopping_cb = tf.keras.callbacks.EarlyStopping(patience=2)\n", "hyperband_tuner.search(X_train, y_train, epochs=10,\n", " validation_data=(X_valid, y_valid),\n", " callbacks=[early_stopping_cb, tensorboard_cb])" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trial 10 Complete [00h 00m 13s]\n", "val_accuracy: 0.7228000164031982\n", "\n", "Best val_accuracy So Far: 0.8636000156402588\n", "Total elapsed time: 00h 02m 10s\n", "INFO:tensorflow:Oracle triggered exit\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "I1208 10:03:10.004801 4451454400 1918178380.py:5] Oracle triggered exit\n" ] } ], "source": [ "bayesian_opt_tuner = kt.BayesianOptimization(\n", " MyClassificationHyperModel(), objective=\"val_accuracy\", seed=42,\n", " max_trials=10, alpha=1e-4, beta=2.6,\n", " overwrite=True, directory=\"my_fashion_mnist\", project_name=\"bayesian_opt\")\n", "bayesian_opt_tuner.search(X_train, y_train, epochs=10,\n", " validation_data=(X_valid, y_valid),\n", " callbacks=[early_stopping_cb])" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%tensorboard --logdir {root_logdir}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercise solutions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. to 9." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Visit the [TensorFlow Playground](https://playground.tensorflow.org/) and play around with it, as described in this exercise.\n", "2. Here is a neural network based on the original artificial neurons that computes _A_ ⊕ _B_ (where ⊕ represents the exclusive OR), using the fact that _A_ ⊕ _B_ = (_A_ ∧ ¬ _B_) ∨ (¬ _A_ ∧ _B_). There are other solutions—for example, using the fact that _A_ ⊕ _B_ = (_A_ ∨ _B_) ∧ ¬(_A_ ∧ _B_), or the fact that _A_ ⊕ _B_ = (_A_ ∨ _B_) ∧ (¬ _A_ ∨ ¬ _B_), and so on.
\n", "3. A classical Perceptron will converge only if the dataset is linearly separable, and it won't be able to estimate class probabilities. In contrast, a Logistic Regression classifier will generally converge to a reasonably good solution even if the dataset is not linearly separable, and it will output class probabilities. If you change the Perceptron's activation function to the sigmoid activation function (or the softmax activation function if there are multiple neurons), and if you train it using Gradient Descent (or some other optimization algorithm minimizing the cost function, typically cross entropy), then it becomes equivalent to a Logistic Regression classifier.\n", "4. The sigmoid activation function was a key ingredient in training the first MLPs because its derivative is always nonzero, so Gradient Descent can always roll down the slope. When the activation function is a step function, Gradient Descent cannot move, as there is no slope at all.\n", "5. Popular activation functions include the step function, the sigmoid function, the hyperbolic tangent (tanh) function, and the Rectified Linear Unit (ReLU) function (see Figure 10-8). See Chapter 11 for other examples, such as ELU and variants of the ReLU function.\n", "6. Considering the MLP described in the question, composed of one input layer with 10 passthrough neurons, followed by one hidden layer with 50 artificial neurons, and finally one output layer with 3 artificial neurons, where all artificial neurons use the ReLU activation function:\n", " * The shape of the input matrix **X** is _m_ × 10, where _m_ represents the training batch size.\n", " * The shape of the hidden layer's weight matrix **W**_h_ is 10 × 50, and the length of its bias vector **b**_h_ is 50.\n", " * The shape of the output layer's weight matrix **W**_o_ is 50 × 3, and the length of its bias vector **b**_o_ is 3.\n", " * The shape of the network's output matrix **Y** is _m_ × 3.\n", " * **Y** = ReLU(ReLU(**X** **W**_h_ + **b**_h_) **W**_o_ + **b**_o_). Recall that the ReLU function just sets every negative number in the matrix to zero. Also note that when you are adding a bias vector to a matrix, it is added to every single row in the matrix, which is called _broadcasting_.\n", "7. To classify email into spam or ham, you just need one neuron in the output layer of a neural network—for example, indicating the probability that the email is spam. You would typically use the sigmoid activation function in the output layer when estimating a probability. If instead you want to tackle MNIST, you need 10 neurons in the output layer, and you must replace the sigmoid function with the softmax activation function, which can handle multiple classes, outputting one probability per class. If you want your neural network to predict housing prices like in Chapter 2, then you need one output neuron, using no activation function at all in the output layer. Note: when the values to predict can vary by many orders of magnitude, you may want to predict the logarithm of the target value rather than the target value directly. Simply computing the exponential of the neural network's output will give you the estimated value (since exp(log _v_) = _v_).\n", "8. Backpropagation is a technique used to train artificial neural networks. It first computes the gradients of the cost function with regard to every model parameter (all the weights and biases), then it performs a Gradient Descent step using these gradients. This backpropagation step is typically performed thousands or millions of times, using many training batches, until the model parameters converge to values that (hopefully) minimize the cost function. To compute the gradients, backpropagation uses reverse-mode autodiff (although it wasn't called that when backpropagation was invented, and it has been reinvented several times). Reverse-mode autodiff performs a forward pass through a computation graph, computing every node's value for the current training batch, and then it performs a reverse pass, computing all the gradients at once (see Appendix B for more details). So what's the difference? Well, backpropagation refers to the whole process of training an artificial neural network using multiple backpropagation steps, each of which computes gradients and uses them to perform a Gradient Descent step. In contrast, reverse-mode autodiff is just a technique to compute gradients efficiently, and it happens to be used by backpropagation.\n", "9. Here is a list of all the hyperparameters you can tweak in a basic MLP: the number of hidden layers, the number of neurons in each hidden layer, and the activation function used in each hidden layer and in the output layer. In general, the ReLU activation function (or one of its variants; see Chapter 11) is a good default for the hidden layers. For the output layer, in general you will want the sigmoid activation function for binary classification, the softmax activation function for multiclass classification, or no activation function for regression. If the MLP overfits the training data, you can try reducing the number of hidden layers and reducing the number of neurons per hidden layer." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 10." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Exercise: Train a deep MLP on the MNIST dataset (you can load it using `tf.keras.datasets.mnist.load_data()`. See if you can get over 98% accuracy by manually tuning the hyperparameters. Try searching for the optimal learning rate by using the approach presented in this chapter (i.e., by growing the learning rate exponentially, plotting the loss, and finding the point where the loss shoots up). Next, try tuning the hyperparameters using Keras Tuner with all the bells and whistles—save checkpoints, use early stopping, and plot learning curves using TensorBoard.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**TODO**: update this solution to use Keras Tuner." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's load the dataset:" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [], "source": [ "(X_train_full, y_train_full), (X_test, y_test) = tf.keras.datasets.mnist.load_data()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Just like for the Fashion MNIST dataset, the MNIST training set contains 60,000 grayscale images, each 28x28 pixels:" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(60000, 28, 28)" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train_full.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each pixel intensity is also represented as a byte (0 to 255):" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dtype('uint8')" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train_full.dtype" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's split the full training set into a validation set and a (smaller) training set. We also scale the pixel intensities down to the 0-1 range and convert them to floats, by dividing by 255, just like we did for Fashion MNIST:" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [], "source": [ "X_valid, X_train = X_train_full[:5000] / 255., X_train_full[5000:] / 255.\n", "y_valid, y_train = y_train_full[:5000], y_train_full[5000:]\n", "X_test = X_test / 255." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's plot an image using Matplotlib's `imshow()` function, with a `'binary'`\n", " color map:" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.imshow(X_train[0], cmap=\"binary\")\n", "plt.axis('off')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The labels are the class IDs (represented as uint8), from 0 to 9. Conveniently, the class IDs correspond to the digits represented in the images, so we don't need a `class_names` array:" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([7, 3, 4, ..., 5, 6, 8], dtype=uint8)" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_train" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The validation set contains 5,000 images, and the test set contains 10,000 images:" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(5000, 28, 28)" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_valid.shape" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(10000, 28, 28)" ] }, "execution_count": 113, "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": 114, "metadata": {}, "outputs": [ { "data": { "image/png": "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LpukQujBBx9k/PjxAEyaNAmAQw891GWTUmrRokUAPPnkkwAMHz6cbt26AfD888+7apYKgbVr1zJ//nwA3nnnHQCmTZvGwoULAbjqqqsAOOywwwC44447KFOmTNRrbNy4kcqVKxe7DRoRVUoppZRSTmhENARWrFgB+HepAA899BDG+OW2PM8vG3bkkUcC0L9/fy666CIHrVSurFmzBoBHHnkEICoaevLJJwNwwgknpL5hIXDIIYcAsGPHDpYuXQpoRBRgxowZDBs2DPCjxbnJcSPXkk6dOpUoohFWGzZsAPxr66pVqwD49ttvgeyJiI4ePZo+ffoA2D4wxvD+++/Hff7YsWNp06YNABUrVkxNI1XKjRgxAoABAwbYMYjwPM+OQUaNGhX1tb333pvbbrst6rHLLruMDz/8sNht0YGoI+vWrQNg4MCBvPLKKwCsX78e8C8SchCIxYsXA35Y/JRTTgGgSpUqqWpu0vz1118AnH766YD/BioqVaoEwIIFCzj44INT3rYw2LVrFw899BAAzz77rH28R48eADzxxBMA7LXXXqlvXAjIQBT8N1yASy+91FVznNm1axcAffv2Bfxj5Y8//gCIuZYATJ8+HQjOt3nz5sW84WQCOSZkAJYN/v77bwA7MLjuuuvsY/kZOnQoADfffDN16tQBoF+/fkBmnVP/93//Z1MUJJ3nhx9+sCkKnTt3dtW0lJBB54ABA6I+B3+QCVChQgV73ZBxyT///APAnXfeyb777gvA1VdfDcCvv/5aojbp1LxSSimllHIiZRHRl156CfDvzvfff3/AvwsBaNasmZ0qynT9+/cHsFMlxhg7/S53ILVq1aJq1apR3yd3JT///LONiEoCejqSSOg111wDREdCL7zwQgDuvfdeAGrWrJnva/32228AVK9ePdHNdK5nz55RkVCAbt262bJNKpCtUWGAXr16AfDoo48C0VNruZ1yyil88cUXUY999NFHbNmyBcis6djPP//cdRNSTmZJevbsmedz6tevzy233BL1mLzH7N69m2XLlgFw/fXX26+na1RUosETJkwA/IinXCvkvJkzZ07WRETlGiGR0L322otLLrkEwE65N2nSxD7/tddeA2DQoEEAzJ8/nx07dkS9ZkHv0QXRiKhSSimllHKiyBHRV199FYDvvvsOgJEjRxbq+zZt2hT80D38HytRsbJl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92zLn3/+afOgI8nMSWEjoUKi4VIOsG7dujYSGlmpQVbe33rrrUVuc9L2mheyO0E227hxI02bNgWC3XRy73ucF5lePfPMM5PYQuVS7dq1E7Z376JFi+zH6VYPsiSMMXYgmgn7YkvNWClRFPk7SYm74v59+/fvH9NHLVu2jKk3mmmkDJgszmndujUAZ5xxhrM2Fce4cePsQECm4/v161ek9LdJkybZKdfIfcWFpMGFfQAq5H00XmkmIfUwR44caRd5yoJO2cUvkgzQIwei0h+dOnXixhtvBIIarWHRrVs3vv3226jH2rRpU+idx3IrV64cABdffLF9TI6/SLJItjh0al4ppZRSSjmR0IioFE+NdNVVVyXyR6SlLVu2FLvYq0QuMqG4bmHlnjbM9CnDRJBppPfff5/q1asDQTpHJpOp60gbNmwA/MgA+FOQMnUn51Pv3r1tRCOMJBoTOW0qxcgjd90qimuuuQaI3ixB3H777TbykYlmzJgRs7PMo48+CoQvolWQyGiUpGfIjmwFueeeewAYPnx43EgoQPXq1WnYsGHJGpliskgpHlmsKeWH3njjDbuY54svvijSz5Gi7vPmzeP0008H/A0DwkDSFaUsEwQL1d56662k/MzI9+aSpEtmz+hGKaWUUkqFSkIjosuXL0/ky2WM/fff3yb1rl69GgjyVWrUqGGfJ4X7n3/+ebuVp+TqCEkiz2Txcv1km0aJYiif5ESdd955gH+HKseUbM2WjjZt2mSjD5LbJ8nykT766KOYx5555pmYx1q0aAEEkSMpWRNW8SIYskipuJHLGTNmAEH+KQT9ks6LINeuXQvAu+++C/jRvty5gkuWLGHnzp1AcF158803Ab/0TLrkQuZ2+OGHF/iczZs32/Jmw4cPB/zzKy/jx49Pm3JNQspMxSOzRVLyce3atezYsSMVzUqp77//Hoh+3yyoWH1xLFmyhPvuuy/mZ5VE0hcrKX9nF9kpqjCuvfbamNpukkzdqlWrrJqmF1KRQfmkZm/nzp0BWL9+PeBfGOQmJx198803gD91/sknnwDxd5TKjwyuIgek8apvhJlMGUZOfQ0ePLhYryWLm5YuXRrzNZna3XfffYv12q5s376dBx54AICnn34awA408yLXTVngI/uvDxw40K5Clxu6jh072gWlMpBZtWoVEPRnGMjA8oILLrCDsS+//BII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f6SA9kc07Y9oulhJKaWUUkqFR8ojolu3bmXAgAEAdOzYEYAjjzwy0T9GpNXdyIwZMwA4+eST7WM1atQAYOXKlQDssUdBFbfylVb9kQJp2R+vv/46l156KQCvvfYaABdffHEiXlojorHS8hhJorTojzlz5gBw3nnnAbBu3TqbY29M7K/QpUsXAF588cWi/qi06I8U0v6Ipv0RTSOiSimllFIqPEoUXiuOuXPn8vjjjwPYyGi227p1KwBPPfVUzNcuu+wyoMSRUJVB+vXrFzeqo5Tyc0AvuugiwI+EAvzrX//i8ssvB6BDhw4ANg//jTfeYNSoUUCQI/rcc8+lsslKZTUnoxtZeDN69GgAOnfu7KIZoTFlyhTAn3IVderUAeCGG25w0qZkGj58uP2d5fc744wz8v2eVatWAfDJJ58A2XnMjBs3DoClS5c6bklqPfPMMwDcdNNNANSvX5/9998fCNJZsslXX30FwL///W8AmjZtyjvvvANAzZo1nbXLtW3btgH+NPvq1asBqFSpEgAPPfQQp512WtTz7777bgCuuuoqLrjgAgA++OADADZt2mS/V/l++OGHqM+TmFKXEFu2bAGCgNehhx4KwPfff2+f89FHHwFQtmxZ5s+fn+drdevWDYAhQ4YAxVrUFlpz5861Hz/00EMATJw40aayyN+5atWq9vNbbrkl6mslpVPzSimllFLKCafzvbt27XL540Nh27ZtPPbYYzGPjx8/HoC6deumuklJ8/777wNw++2323SETz/9FIDDDz8cgLZt23LggQcCQSQMYPPmzQD8+uuvALRq1QrIrgjQ4sWLgWBGIdMNHDgQgN69ewPBIr6///6b//73vwBcf/31APTt29cu7MsWkp7x7bffcsQRRwBw7rnn2q8fe+yxAJxyyikA9jkSTc40kr4kCzsBjjnmGICYaGikqlWrMnnyZAD+97//ASUukxdaEtXs1KkTs2fPLvD5b731FuCfiz/++GPU13r27AnAfffdl+BWJsbHH38MwMMPP1yo5+eX7vTdd98B8NtvvwFQq1atErbOHUlXkevrk08+aX/3eAv65H1H/v4zZsywUVT527dt27ZEbdKIqFJKKaWUciLlEVGJZECQI3rNNdekuhnO7d69G/AjGFJ0WRhj2GeffVw0K6kkR6datWo2Irpp0yYgKLci/xdk8ODBADz66KMJbmV4Pfjgg0D+d+6ZRGYFJEI+ZswYAA455BDOOeccAIYNGwbAUUcdZXNIs9Gff/4J+AtvhHwsUY4El/oKnZEjRwLwzTff2MckGlyQypUrR/2faSQKJou4Fi9ebK+1cj2Rgv8TJ060H0dGynJHzWSmIqwR0dyk/U2bNrVRvuuuuw7wz4nly5cD2Pzidu3a2e+tVq0aAOXKlUtZexNNjgH5XXL/PSM/rl+/PuXLl4/7Oj/++KM9dnr16gX4syyFPdfiSflAtGLFivZjSX7NRn/88QcAX3zxhX1sr732AvxBVv369Z20K5nkd2rXrl3MAFIO+jp16lChQgUAvv7669Q2MOQKqPmbUaZMmcKCBQsAePXVVwF/ACqOPvpoIFhckk0iFxcURb9+/QB/kdMBBxyQyCaFgixKMcbYhUY9evRw2KLw6NSpExBMsxpj+Ne//mU/huhpWXks8qZXPpaFO+lG0jQib1QinXDCCalsTsrJVHzuv23btm3tgFLUr18/z0H3gAED7E2IHE8jRoywrxdZB72wdGpeKaWUUko5kfKIqCxYAez0WjaKXIgj5A61e/fuqW5OSvXt29fu9ywlqyT5e8KECZQtWxYIppGkXA0EkdNM76N4Iu9kq1SpAsBBBx3ksklJE1nKTPYBjzRo0CAgWIjw2WefZc3UvEybSgSrZcuWdtGfLOabMGGCff7tt98OBGVrVqxYkVERUYlwyZSqMcZG7bJ51k1cf/31fPjhh0D8adh4n8s5J4tQZAo7nUycODHu41988YU9T9577z0gOl1F3ocz7doqaSfyd5ap9DfffDPmuT/88AMrVqwAgn6UNChjTMyxM2bMGMaOHRv1+vL+He/1c9OIqFJKKaWUcsJp+SYpTp5Ni5XkTiwy4rP33nsDcO211zppU6qVK1fO7iIlOVwSBT3kkENYuHAhEJRSiSQlWqTgfzaQIsqRpBTPiSeemOrmJJWUplqwYAFnn302kP8CkmbNmgHBeZUNcud4rVmzxn5Nypnddttt9rE77rgj6vmZJvcOfdWqVYtaaJKt+vfvD8Dbb79t//YSBYtXiLxr1672Yyn9la7++ecffvnll6jHFi1aBEDr1q3ZuXNn1NdkYST4Cx8hmG3JlJlb+b3kWJByTJEbFci5NHHiRLtBRO7rTby84dwfAzRo0KDQbdOIqFJKKaWUciLlEVEZlQMsW7Ys1T/eOSkQLFE/CMpgZOO2lfXq1Yt57KeffgKw5TQAqlevDgTbXGaLDRs28Pzzz8c83rFjRwetST7Zlm/OnDl228r87LvvvkBQBiwbLVmyJO7juc+VRo0aAdHX4Ezwf//3f1Gf9+jRg6ZNmzpqjTtSnkdmUCS65XkeLVq0AODzzz930rZU++KLL2wutSjsRiBSYlJyq08//fSM2NJT8n0vvPBCIMj9bNCgQdzKCbnzQCPPKckfle/r16+fzQmV9QtFkfKBaHGW9meSyDqqQuokKt8TTzwR85iU6zn11FNT3Rynxo0bFzPQaNy4Meeff76jFiXXu+++az+uXbt2ns+TxPgpU6YA/lR0ly5dADjjjDMAuPLKK5PTSMdk2lTqhOY16IpcGApw6623AtEl9NKZnBeSliFvnNn4HrNu3To7hSzlvSKnSku68026kZq58Zx++uk27UcWJkGwCFACQ3J8Sc3vdCdBMJmSz29a3RjDyy+/DART7JHpGrKjnQw+zzzzzBK1TafmlVJKKaWUE04XK2UTuQuJTIoGP7G+ffv2eX6fLOSSfXPfffddGjdunJxGhsDHH38ct+Bwtt3Ri+nTp9tIj/xft27djCq/E+nf//63/Vj+5hK9kAVaQEy6guy0Bdhi5pkaEb3nnnuAIPIbLyI6b948G12W40Y2isgUEgmVtIz8FmMtW7bMLo6V0lbNmzcHgh3L0tkpp5xii4vHK8ski9fkvJk7d25a7xJUkL333tv+frJAS3ZyrFSpEnvuuWfM98j1RSKiYsSIEdx8883JbG7SjR071i5aXLt2LZD/zkpt27a1JbzilUCLly5WEhoRVUoppZRSTmhENEW+/fZbIHZRRcuWLW35JrFr1y5bkFn2TxZt27aNWsSTKaRo/fDhw9m+fXvM12X7U4mCSJmabJA70nP//fc7aknySV5o+/btbZ7Xs88+m+fzJYJap04dW7BdirtnuvwW5EybNo2tW7cCmVu2qTCmTp0K+NsKy0I46Y/p06cD/sJRyZ9LN1J6Z/HixXHz/HJ/LFHTt956K2NnDMBfZyDvofEWxBZFvPejdCHH9R133MH69euBYK95ye/s2rUrDz30EOCX+gJ/IZNsqRxvzUaiOR2IynT14sWLS3ywpKt4Sb7jx4+PGYCKf/75J9lNSqkZM2YAwTSsnCy5SY1VmU6TOqxVqlSxtUWzhawUz0RywzFhwgQ7hSp/68jafzJgleMB/B27INh1af78+UCwx3Q22LBhAwBDhw61j0kfZdNCPxmgSWrT1q1b7a5sstBPjq9MqLhwxRVX2PdTWax13333Af5CJhl0y+BswIABGT0QhZIPQNOZ1ACVNIO1a9famxEZc0ReI2T3o8iBq6Q7yXnTr1+/pLVXp+aVUkoppZQTTkNJMlUi/2ey/fbbDwgiPrt27QL8CKdMH0kUVD6PZ/PmzXaHiKLsXBBWMtWeVyQ0N4mgymKdxx9/3NZ7yySyYGvWrFn2sfPOOw/If6ehTHTJJZcU6fkSOZXFOtkUEZXaoZElv2S2QaIdkTvoZKKHHnrI1n1ctWqVfVxKfsmilUwgOySNGTMmz+dUqVLFXl8jp+glahxvlyWV3mSKXVIxjDE2OnrQQQcBQWpKZLkzma6fMWMGTz75ZNRraURUKaWUUkplnJRHRPfff39bUDkbIqEidwFdiexdd911RXqdRo0aZUQkVEiUb+bMmUB0+Z7CeOeddzIyIirFx1euXGkfk/IbuRe3qfjy2nEoE8kMy4cffgj4ZVjkOhu573wmadmyJRDkPUrOW7wZpfHjx9tr74033ggEpWqkvE8mk91u5P/169fbnZg0IuqT2blMMHz4cCA4xq+44gpbgqqwOx/J96ZiXYpGRJVSSimllBMpj4g2bNjQbmkpq/yyyaWXXgoEEdHCkiiYbOuXKaTosOStlClTJmp1NPh5K5dddlnc7y/OvrZhJlG8NWvWANHFhmW/aBVfJuwHXVySByrbehpjMrrMV6RevXoBQZHteOWq9t57b/s8iXyVLVsWgNatW6eimQkl+b6S01cQiXpK3xhjMmpmLRGkhFFuHTp0SHFLEkf+3tddd12R3yvle0uVSn680sliJTnxZSC6atUqjjvuOBdNSbmOHTsC8MorrwDw9ddf5/v8Ro0aAXD33XcDQQ2wTFOrVi0Abr/9dgYOHBj1tQYNGnDxxRe7aFbKScmhX375BfAvBpm8k1YiyTEiZWuyxZIlS5g8eTIQvHmcfvrp3HTTTS6blTIS2MjPZZddxp9//gkEfSTpLyeeeGLS2pYsste3/E4FlWLq378/EOyqc/3112fcTXxJTJ8+nUmTJkU91qlTJyB4b0on+++/PxAEMiQNoyBSsumVV16xv3dkmadk0al5pZRSSinlhJOI6IUXXghgywMMGjSI008/HQimakuXLu2iaUknxchl95cNGzbYhUwLFy4E/L3EZVpNpl4yeV9glT+Joqv81a1bFwgWBK5evdplc1ImXlmVM844w5aKyxYSGY236CRydxyZVWrXrl1qGpYEEs0cMWIE4O+yldeio/79+/Pwww8Dwe+e6SW8IIgCSmkrmYmNTEn47LPPAP9YkJQweY++/PLLgfTcmSwyBaMoZJHT+vXr7Zgj3l7ziaYRUaWUUkop5YSTiOhJJ50EQPXq1QG/aLfczc2dOzfqa5lKFh8ddNBBdo9sFd/EiRNtPpfkviiVF4kCSLRj/fr1GZkPJxtgvPLKKzYX7N577wWCnPJsIptAjBo1yi48kUhoo0aNePXVVwHYZ599gGCBZDqS66Esem3QoIF9D5VjQYqZ16tXz275KNu9HnvssalsrhOS2/joo48CRJX5kxJeslbjjz/+sF+TNQrxtt9OF1dccQUAH330EQBDhgyxe8c3bdoUCCLGH374oc2HlWPHGMPjjz8OQP369ZPeXicD0T333BMIVni2bt3aXhwyfQCq8nfSSSfZ1aw7duwA/JQFuZBm20C0c+fOWVHnMJGkNq3sSvX6669zww03uGxSQkn95SFDhgD+m4YMtLt37+6sXa7Jbms9e/akZ8+ejluTXFJ/WgafY8eOtQPPyMEE+ANSSUNIxcKTsPj8888B+Ouvv4BgIPrWW2/ZxaCiQoUKNsWlqLW9w0h2S5LrwvTp0zn33HMBOPjgg4FgN8MVK1bETOG3a9eu0BUZEkGn5pVSSimllBMmsk5hHPl+MQ0kOstY+yNaUvrjhBNOAIKpNvDv2iDhpTTSoj9SKBlZ+SnvE9ldSBYnnHHGGfaxYtTEC90xItOyTz/9tH1s9uzZQEqmXEPXH4457Q/ZL37AgAF51uVu06aN3Wc8BUJzfFx11VUAjB49OuZrMisr9alvvfXWZJXJC0V/GGNs1DN3xNzzPLuITab077vvvmSlM8XtD42IKqWUUkopJ5zkiCqVH9kBpU2bNo5botLRqaeeCkD79u0BeO2113j77beB9C7ZIyQXUgwdOjQrFp+oWJIjKiWKVEBmDmRh8LJlywC/z2TWTUo0ZbopU6bYRVjTpk0Dgohot27dbDkvV9cRjYgqpZRSSiknNEe0aLQ/oml/RNP+iKV9Ek37I5r2RzTtj2jaH9Eysj80IqqUUkoppZzQgahSSimllHKioKl5pZRSSimlkkIjokoppZRSygkdiCqllFJKKSd0IKqUUkoppZzQgahSSimllHJCB6JKKaWUUsoJHYgqpZRSSikndCCqlFJKKaWcSOlA1BhT2hjTzxiz3BizI+f//saYPVLZjjAxxvQwxiwwxmzO+feVMeZc1+0KA2PMfcYYzxjzjOu2hIH2h15DcjPG/JxzTOT+N9l121zQ62ksY8wBxpjRxph1OefMImNMC9ftCgO9pobj+Ej1xfseoAfQGfgeOBoYDewE+qW4LWGxCr9fluLfGHQGJhpjmnqet8BpyxwyxpwIdAWytg8iaX9Yeg2JdjxQOuLzA4C5wGtumuOcXk8jGGMqATOBGcC5wDrgUGCtw2aFgl5Tw3N8pHogehLwnud57+V8/rMx5l3ghBS3IzQ8z3sn10O9jDE3AM3I0hPEGLMv8ApwDXC/4+Y4p/0RRa8hETzPWxf5uTHmGmAz8LqbFrml19MYdwNrPM/rFPHYcleNCQu9plqhOD5SnSM6AzjVGFMfwBjTADgNeD/F7QilnGnHDkAF4EvX7XHoBeANz/M+dd2QkND+COg1JA/GGIP/xjrW87w/XbfHNb2eAnAhMMsYM8EYs9YYM88Yc2POsZLN9Jrqu5AQHB+pjog+DFQEFhljduf8/Ic8z3suxe0IFWNMI+AroCywFWjred73blvlhjGmK3A40NF1W8JA+yOGXkPy1gqoA4xw3RCX9Hoa5VCgOzAYGAQ0Bp7O+VpW5kXqNTVKKI6PVA9ELwU6AZcD/8X/pYcYY5Z7nvdiitsSJovx+6IS0A4YbYxp6XneQpeNSjVjTD1gAHCy53l/uW6Pa9ofcek1JG9dgdme581z3RDH9HoaKAXM8TyvZ87n3xlj6uLnWWfdQFSvqTFCcXwYz/NS9bMwxqwEHvM8b0jEY72BLp7nHZ6yhoScMWYqsMLzvGtctyWVjDFdgJeA3REPlwY84B+gvOd5Ox00zQntj1h6DYnPGFMNf6FOD8/zhrtuT5hk6/UUwBizAvjY87xrIx7rCDzveV55dy1zQ6+p0cJyfKQ6IlqO6AOAnM+1nmm0UkAZ141wYCIwJ9djL+GvgB0AZNsd7ES0P3LTa0h8XfArB4x33I4wytbrKfgrouvleuwIYIWDtoTBRPSaGikUx0eqB6LvAfcaY5bjT6s1AW4HXk5xO0LDGDMImAysxM99uxxoiV9KIat4nrcJ2BT5mDFmG7AxG6fVtD/i0mtILjkLC64Fxnuet8V1e1zS62mMwcCXxphewAT88+Vm4D6nrXJEr6kxQnF8pHogehN+rb/ngGrAGmA48GCK2xEmNYCxOf//gV9i5GzP8z502iqlwkmvIbFaAnWBKx23Iwz0ehrB87zZxpgL8aN9fYBfcv7XxX0qNMdHSnNElVJKKaWUEtmeV6WUUkoppRzRgahSSimllHJCB6JKKaWUUsoJHYgqpZRSSiknClo1n+4rmRK9X6r2RzTtj2jaH7G0T6Jpf0TT/oim/RFN+yNaRvaHRkSVUkoppZQTOhBVSimllFJO6EBUKaWUUko5oQNRpZRSSinlhA5ElVJKKQXAzz//zCWXXMIll1xCjRo1qFGjBvPnz3fdLOXY0qVLWbp0KYMHD6ZmzZrUrFmTOnXqUKdOHS677LISvbYORJVSSimllBMFlW9SSTZ69GjefPNNACZNmgSA53kYE7/qQ58+fbj22msBqFatGgBlypRJQUuLT34X+b9MmTJ8/fXXABxzzDHO2qWUUsq3cOFCAFq3bs2vv/4K+O9FAOPHj9drdZZZtmwZAMOGDQNgzJgxAPz2228xz92xYwfr1q0DoGrVqkX+WRoRVUoppZRSThi548lDUoqnnnrqqQB8/vnn9rEHHngAgL59+ybyR4W2mOzo0aMBuP/++1m1alX0D8knIhr5tTfeeAOAtm3bFvbHOumPUqX8+53SpUvbx84991wAJk6cmOAmFUlojw9H0q6g/WuvvQbAwIEDmTdvXqG/r0uXLrz00kuFeWoojpGqVavSqVMnAB5//PGENqiIQtEfADt37gTgu+++A2DGjBkAzJw50864/O9//4v5Prn2PPbYYwDUr1+/uE2AEPVHcb3//vsAdqYtss9kfPDss8/SvXv3wrxc2vdHgqVVf+zevRuAF198kTvvvBOALVu2AFClShUAmjVrRtOmTf3G5Bwfo0aN4osvvgDgkEMOye9HxO0PJwPRvAZZkT777DMAWrZsWaIfVZJvjiNh/TF79mwATjzxRPvYEUccAcSfrl6yZAkA8+bNs/0nz/viiy+oWLFiYX6sk/6YNWsWEB3ib926NQBvvfUWAHvuuWe+r/HXX38BcOuttwLBm8hee+3FHnsUO8MktMfHH3/8AUCdOnVo3LgxAJ9++mmhvlem2OrUqQNA+fLlC/tjQz0QXbRoEeAfR+PGjQNg8+bNQHB8FJYxxg7sChiQhuIYqVatGuvXrwewA+6jjz46YY0qglD0B8C9994LwMMPP1ys75frxuzZs+05Vgyh6Y+iGjFiBAA9e/YEYMOGDQBUr16dBx98EPCvrwBXXnllVCAhH6Hrjx07dgBw/vnnA37w5+STTy7pyxZW6PojHhmAduzYEYBx48bZv/1pp50GwODBg4H4N25Dhw7lyiuvBChoLKI7KymllFJKqfAIRUS0ZcuWUdP0kT777LOSREVDezeyadMmAB566CEOP/xwADp06ADAvvvuG/N8CY+fdtppfPvttwBccsklgJ9IXkhO+6NPnz4ADBo0yD4mkc1bbrkl3++96qqrABg7dmzU4+PHj6ddu3ZFaUak0B4fcnc5btw4GymfOXMmAJUrV87z+5YtW2afL7MKLVq0KOyPDXVEtFatWgAxqSwl9c8//+T35VAcI5ER0bPOOguA119/HYAKFSokqGmFEor+AJgyZQoAZ599NoCNap544ok22nnNNdfY599xxx1A7MzCuHHj7LW3GELTH0UxadIkGyGU92OZUv3kk0849NBDi/vSoeuP/v37A8H7z8iRI+37SX4kReHRRx+1KYOFnHmMFLr+yG39+vW2P2TBNARpTzLOSBCNiCqllFJKqfAIRfmmFi1a2OiNREZlQdOpp55qI6KyoKmEeaOhUKlSJcC/2yoMuRNr0qQJc+fOBWDx4sWAHy0txp1a2pg9e7b9nTPd8OHDAWxJL4DDDjsMyD8SKjmSktsFfgI5FCkiGiqStyQRjdWrVxfq+w466CAgiGjs2rUrCa1zRyKBEuGR3K1sc8YZZwCwfPlyIDg/9tlnnyK9zgEHHJDYhoXYtGnTgCBfEoL8fCnPU4JoaKhIzuszzzwDQO3atQEKjIbKdUOOr2XLltlZiDPPPDMZTXXqrLPOsrOskhc6c+ZMjjvuuJS1IRQD0UgyyJSUgb59+/Kf//wHCAapBaQTZJTvv/8ewK5IGzFihJ1KOfDAA521KxVkIDJ79mx++OGHqK/JdIFcLDJFt27dgGC67Mgjj+T5558v8PtkGuWVV16xj+23335JaGHqbN++HYCnnnoKiD7vDz74YAC7krdu3br2a1Jfd86cOYCf/iJvSpFkFWi6Gjp0KACNGjXi6quvLvT3LVmyxD7/iiuuAOCGG25IfAOTTKbfZYCRn1mzZtkFokIGXPXq1Ut428Jm6dKlQFCVxhhjB6ByY9O8eXMnbUuWDz/8EAjqXt5///35Pl9udKWqwn//+1/ATwnKxAHoXXfdBfiLH+WaKelfki6YKjo1r5RSSimlnAhdRDS3vn37Jrq2aOj9+eefNtIjdTZlsVKk3r17A8VKoE4LsrtHvIVMMg0Xb2FXOpJyRLm99dZbdqo5HokaRk7PSiQ0HaNckaTslNQ3jExjeffdd4HoUmcSMZXIx0MPPZTnaxtj7PmTDjzPs4vQOnfuDEC/fv0Af0GOXB9k2nGfffbh77//BoLyaRIhfvjhh+30o5SFS/djJTdJVZEZpVtuuSXmGipli2rUqJHaxjnw9NNPA9G1uz/55BMg8yKhQlKTCktmB+bPnw8EKQv5XUfS0YIFC4BgoTAE19ZUR0KFRkSVUkoppZQToYiISv5jQSQymgkRUrk7l6LCECxU2bRpU9z9XIXkhh177LFJbKE7r776KhDk+GS6JUuWcOONNwJBVE/yIiUKlhcp5i27y+y333426hGZN5mO5Bwp7II+iYIVJoJRtWpVbr755uI3LsWMMbaAvUTyZBFb586due222wB48sknAShbtqwtSyX5gfE0atQoWU12qkePHkD09VVI/0mkPdP179/fvreUKVMG8K8vmRoJFWvXri30cx9++GG+/PLLqMdOOukkICill+5kk5Tc5Q579epF+/btXTTJ0oioUkoppZRyIhQR0c8//zwmyilR0niF7lu2bJl2JZxkH2TZ0lJ+P4lkRYrcT75cuXIAtGrVCvDzQmWf10wgxe2bNGkCwC+//GJzQmX7xkiyQragFZDp5Ndff7UbHMjfXVZ5S9FyCFZxNmvWzEY2ZLW8fF+fPn0yJsoluc+ylWPkRggS1ZJ9siE4xwpj69at9hxMl/JWDRs2jPpcohilSpWiV69eQBD9jLyGxHPkkUcCQe5gpvnoo49iHqtatSqAnX3IdFICbtCgQezcuRPA7h/etWtXZ+1yRWZANm7caEs6yfvx999/H7OxRaZVZFm2bFnU/1J1595776Vs2bLO2gUOBqJ57aAkJZpyk9qhEJR2SrdBKMCECRMAeO6554BgCjavNwuphSf7YLdt2zbZTUw62fmkSpUqdpcY+f/0008v1GtIArmUm0hn27ZtA+Duu++O+VpkPdDcSpcubfd9lulouWhm0pusnBtykyK/8+7du23dYbluzJkzp9ApPgADBgxImwEowI8//pjnosSLL77YTiNK+a6RI0fy888/A9hBiKhUqRKjR48GoEGDBklqsVuyeE92Vtq0aRPr1q0DsOXQ8jvHMoEs1tm2bRutW7cGMv93zo/swBVZxkvqZu6zzz42GCBksWQm2LZtG1OnTo167OWXXwZSvjNbXDo1r5RSSimlnEjZXvO5d0zKi0Q6EhT1DM0+rxKxkFIq0u8nnXQSf/75JxAsTHnttdfo0qUL4Ec2EigU/dG8eXPbD0UlC3AWLVpUrO/PxWl/SDJ95M4u+UXKZSrF8zxb2koi51KmJr9ST4UQ6r3mZfpIosBFIekssnjl4IMPznenqgihOGeK6rfffrORZCnVJAYNGhQ3Cl9IadUfW7duBfwUBFnEJmWtvvrqK6DEiz5D1x+S5iazBRUqVGD69OlA9PVBNgSQXf4SJDT9IQs5ZQcy+bvvscce9v1Y0n7+/vtv2rRpAwRlnCRiWKpUieJ1oeiPTZs22XQmuY4WtCObTOEPGzYMCBa63XvvvSWJoupe80oppZRSKjxSliMamRsamfcJ0fmh6Zj/WRiSHC77Xp9zzjkA3HPPPfYxyQHr27evTaI+8cQTAXj77beBzNgXefz48XbLNMkR/f333wH/7l1+R9ni86effnLQyuTbe++9Ab+IsNx9Ciks3KZNGxsdlwhehw4dbERUvlbCSGgorVy5EgiOkaJu7SvF7o855hibOxtZAD8TSdm3U045hTVr1kR9Ta5BJYiGph2J3PTs2dNuZSn7rcvitkwrgyeF6sWuXbvshgWyVfKee+5pF+dIgfNM2zL6nnvuAYLZENn8o0yZMjFbdsp1FODxxx8HShwJDZVNmzbZnGHZ9CIeec/t06ePXdCVeyOI2rVrJ7z0WcoXKz3wwAMZVQ+0sOSPn99BIOrXr29Pgm+++QYIwuOZ0GcHHXSQnVqXlZ2SktGkSRO7wEAGIrIndKaRG4/FixcX6vmyy9YXX3xh3zwHDBiQlLa5ItPuP/zwA5dccglAzCA9LzLFeOGFFwLBOSML3DKZ3Mz2798f8GvTSnqH1A3Ma0FotpBzRgaiUjEgnerJ5kcqJuRedLNz5047AJVatN98841dxCZ7rGfaQFTkt/pdBuFvv/02Bx98MBBMQWeSrVu3smPHDgAuuOCCmK/LDazs2pZfDe+FCxcmvH2ZM+RXSimllFJpJWkRUZmKl7twmY7PtKl3uauUu9Hctf6KSxYu1atXD4Bzzz03Ia8bNhKtyb3bg4olSffGGFsPUKb309nu3bttZEIWGEh91MKqVKmSjapn+vR7bmvWrLHT7pF1VeUactdddwGZkdZTEj/++GPU5xIF2rp1ayhK2JSUTClLvWFRtmxZu6/4qlWrADjvvPPs1LXsHCTlfWrVqpWS9oaBLNjZvHkzF110EZDwxVuhMHfuXPvx8uXLo762fv16W9oqsq65zEjJLNU777yTtPZpRFQppZRSSjmR9Iio/C/FozMtIip7gsud5pAhQxLyurn3CZcI0fHHH5+Q11fpQxZVLFmyxD5Ws2ZNV81JuC5duthC7MVVoUKFrIuEim+++SYqEgr+5hHyWLZHQsHfQSf3Ih4p57Np06aMiIjKgsXci/r69+8fd3GJRERlNm/evHlAdkVEZQc7gB49ejhsSXJJuSqAL7/8EsAuYDvrrLNsJFR2LnzkkUdsQX+JFMvn8n2JpBFRpZRSSinlhNO95iNXcUp+V7qRaIPsff7333/bbTyLa8uWLbz44otAEAWLzPHIZlLmSaIbhd0aNJ3JVo2yMvrggw/OiK0ZL7vsMqDo+aAnnngiX3/9ddRjq1evtls3Xn/99YlpYMjJKlj5vSNNmTKF6tWrp7pJoSHRzltuuQWA4cOH2/NHSF56ppQ+k9k5qZYgf/927drZtQwycyeVSSAobC/bXWYDKV0VeUxk0pae+ZkzZw7gl1EEPxJ+5JFHAjBp0iTAvyZLhR45dqRCi6xbSaSUDUQjyw7F210pXafspQSP/LGef/55u5dt7969AWjWrFnM3uhSmmjNmjX2gJDw+Oeff24vJuXKlQPg9ttvT+avkTakpqQsznj55ZftNPWtt94K+DcFAwcOBII3JPHuu++mqKWJsX379pgdMJ566imqVq3qqEWJI8d9vF2k8iNTiZE8z4v5W2eqzZs3A/4e8wAff/yx/Zo8lo2DUBlUjB8/nieeeAKIXnwh5P3n0UcfTV3jHJAdtc4880xbgzjejnbnn38+gN2PPhvIwrUPPvgA8Mta1ahRw2WTkqpy5crUr18fCH736667DvAH5VKvXIIDUjYSoFOnTgDcdNNNSWufTs0rpZRSSiknUh4RbdmyZdQuS5C+0/IArVq1AoJk4K+++opvv/0WgLZt2wJQpUqVmCjw66+/DsSPBhlj7ONy13LeeeclofXhJoWF4+08JBHlVq1a2b6SiNjUqVNt8ep03x3j4YcftlGd/fbbD8DuiZytIhcYiOrVq9tyI5lO9seWcjvGGA477DAg2B87U8mMyNixY+1jsiGEpGvIoptIZcqUsSXP5L1IpqQzxb777gsEfSTizSBAsIB4xIgRyW1YGqhdu7a9vmai/fff384GNmrUCIjeMemll16K+R4p/9avXz8guRuDpPe7tFJKKaWUSlspuyWUhUmRC5Qyoci95HCOHDkS8IvA5t4Ca8OGDbzxxhuFfs327dvbvMds3pZP8mpfffVVu72lJORv3boV8PPCJB8uMgFfir+na9RDIr6vvfaajfjK75QpZLtb2QO5OMqWLQvAkUcemdE5XhBEQIcOHQpEz6Z069YNyIwNDuKRBXsyyxQv6hlJolvHHXcc4G/nmYxFFmEiC1xzv5+WLVuWK664AoB99tkH8BcwRZb0UZlPSkKOGTMG8McZuUlh++OOO84u+kxFqUCTu+ZYLvl+MT8y/Z7fwqQUTMkXbRVEwQrsj7Vr19pV85MnTwawU/UATZs29V8op99r1qzJOeecAwS7JyVxFWfK+yPRpAaa7FH/1FNP8dFHHwHxj7UChLY/5Jj48MMP7WrW+fPnA8GUSRIkuj8gnz6RG7bzzz/f/u3khmPTpk12IWC8wZWshj7qqKOA+PsnJ0hojhG52ZUbLpkqGzBggF3MmIJUFCf9UZh94WVHnKuvvpqePXsCflpUkoXm+AiJtOiPRYsWAdHXjyTtHJQW/ZFCcftDp+aVUkoppZQTSYuICol0SIT0gQceiCrllGR6NxJN+yNa6Ppj27ZtADRv3hyABQsW2Gm1FCxESWlENJ5ff/0V8NMxZCGg4x2TQnOMyN7okoIgdf0k+pciTvpDUlVkwdGKFSvslKEs3pO6oCneJSk0x0dIpEV/aETUGY2IKqWUUkqp8Eh6RNQxvRuJpv0RLXT9IXmTEgXce++9mT59OgBNmjQp6csXxHlENIRCd4w4pv0RTfsjWlr0h8wudOjQAfA3oknSYra06I8U0oioUkoppZQKD42IFo32RzTtj2jaH7G0T6Jpf0TT/oim/RFN+yNaRvaHRkSVUkoppZQTOhBVSimllFJOFDQ1r5RSSimlVFJoRFQppZRSSjmhA1GllFJKKeWEDkSVUkoppZQTOhBVSimllFJO6EBUKaWUUko5oQNRpZRSSinlxP8DWAmHs2FmCG0AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "n_rows = 4\n", "n_cols = 10\n", "plt.figure(figsize=(n_cols * 1.2, n_rows * 1.2))\n", "for row in range(n_rows):\n", " for col in range(n_cols):\n", " index = n_cols * row + col\n", " plt.subplot(n_rows, n_cols, index + 1)\n", " plt.imshow(X_train[index], cmap=\"binary\", interpolation=\"nearest\")\n", " plt.axis('off')\n", " plt.title(y_train[index])\n", "plt.subplots_adjust(wspace=0.2, hspace=0.5)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's build a simple dense network and find the optimal learning rate. We will need a callback to grow the learning rate at each iteration. It will also record the learning rate and the loss at each iteration:" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [], "source": [ "K = tf.keras.backend\n", "\n", "class ExponentialLearningRate(tf.keras.callbacks.Callback):\n", " def __init__(self, factor):\n", " self.factor = factor\n", " self.rates = []\n", " self.losses = []\n", " def on_batch_end(self, batch, logs):\n", " self.rates.append(K.get_value(self.model.optimizer.learning_rate))\n", " self.losses.append(logs[\"loss\"])\n", " K.set_value(self.model.optimizer.learning_rate, self.model.optimizer.learning_rate * self.factor)" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [], "source": [ "tf.keras.backend.clear_session()\n", "np.random.seed(42)\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [], "source": [ "model = tf.keras.Sequential([\n", " tf.keras.layers.Flatten(input_shape=[28, 28]),\n", " tf.keras.layers.Dense(300, activation=\"relu\"),\n", " tf.keras.layers.Dense(100, activation=\"relu\"),\n", " tf.keras.layers.Dense(10, activation=\"softmax\")\n", "])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will start with a small learning rate of 1e-3, and grow it by 0.5% at each iteration:" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [], "source": [ "optimizer = tf.keras.optimizers.SGD(learning_rate=1e-3)\n", "model.compile(loss=\"sparse_categorical_crossentropy\", optimizer=optimizer,\n", " metrics=[\"accuracy\"])\n", "expon_lr = ExponentialLearningRate(factor=1.005)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's train the model for just 1 epoch:" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1719/1719 [==============================] - 3s 2ms/step - loss: nan - accuracy: 0.5843 - val_loss: nan - val_accuracy: 0.0958\n" ] } ], "source": [ "history = model.fit(X_train, y_train, epochs=1,\n", " validation_data=(X_valid, y_valid),\n", " callbacks=[expon_lr])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now plot the loss as a functionof the learning rate:" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Loss')" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(expon_lr.rates, expon_lr.losses)\n", "plt.gca().set_xscale('log')\n", "plt.hlines(min(expon_lr.losses), min(expon_lr.rates), max(expon_lr.rates))\n", "plt.axis([min(expon_lr.rates), max(expon_lr.rates), 0, expon_lr.losses[0]])\n", "plt.grid()\n", "plt.xlabel(\"Learning rate\")\n", "plt.ylabel(\"Loss\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The loss starts shooting back up violently when the learning rate goes over 6e-1, so let's try using half of that, at 3e-1:" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [], "source": [ "tf.keras.backend.clear_session()\n", "np.random.seed(42)\n", "tf.random.set_seed(42)" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [], "source": [ "model = tf.keras.Sequential([\n", " tf.keras.layers.Flatten(input_shape=[28, 28]),\n", " tf.keras.layers.Dense(300, activation=\"relu\"),\n", " tf.keras.layers.Dense(100, activation=\"relu\"),\n", " tf.keras.layers.Dense(10, activation=\"softmax\")\n", "])" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [], "source": [ "optimizer = tf.keras.optimizers.SGD(learning_rate=3e-1)\n", "model.compile(loss=\"sparse_categorical_crossentropy\", optimizer=optimizer,\n", " metrics=[\"accuracy\"])" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PosixPath('my_mnist_logs/run_001')" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "run_index = 1 # increment this at every run\n", "run_logdir = Path() / \"my_mnist_logs\" / \"run_{:03d}\".format(run_index)\n", "run_logdir" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2363 - accuracy: 0.9264 - val_loss: 0.0972 - val_accuracy: 0.9720\n", "Epoch 2/100\n", "1719/1719 [==============================] - 2s 997us/step - loss: 0.0948 - accuracy: 0.9702 - val_loss: 0.1035 - val_accuracy: 0.9706\n", "Epoch 3/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0667 - accuracy: 0.9792 - val_loss: 0.0783 - val_accuracy: 0.9770\n", "Epoch 4/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0463 - accuracy: 0.9848 - val_loss: 0.0827 - val_accuracy: 0.9766\n", "Epoch 5/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0359 - accuracy: 0.9881 - val_loss: 0.0698 - val_accuracy: 0.9826\n", "Epoch 6/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0297 - accuracy: 0.9908 - val_loss: 0.1048 - val_accuracy: 0.9758\n", "Epoch 7/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0245 - accuracy: 0.9917 - val_loss: 0.0932 - val_accuracy: 0.9794\n", "Epoch 8/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0239 - accuracy: 0.9922 - val_loss: 0.0816 - val_accuracy: 0.9798\n", "Epoch 9/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0154 - accuracy: 0.9952 - val_loss: 0.0775 - val_accuracy: 0.9838\n", "Epoch 10/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0126 - accuracy: 0.9960 - val_loss: 0.0805 - val_accuracy: 0.9812\n", "Epoch 11/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0111 - accuracy: 0.9964 - val_loss: 0.0962 - val_accuracy: 0.9804\n", "Epoch 12/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0118 - accuracy: 0.9963 - val_loss: 0.1044 - val_accuracy: 0.9774\n", "Epoch 13/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0114 - accuracy: 0.9961 - val_loss: 0.1055 - val_accuracy: 0.9802\n", "Epoch 14/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0150 - accuracy: 0.9948 - val_loss: 0.0993 - val_accuracy: 0.9826\n", "Epoch 15/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0054 - accuracy: 0.9981 - val_loss: 0.0955 - val_accuracy: 0.9822\n", "Epoch 16/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0046 - accuracy: 0.9984 - val_loss: 0.0982 - val_accuracy: 0.9822\n", "Epoch 17/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0055 - accuracy: 0.9983 - val_loss: 0.0908 - val_accuracy: 0.9844\n", "Epoch 18/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0070 - accuracy: 0.9978 - val_loss: 0.0883 - val_accuracy: 0.9840\n", "Epoch 19/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0025 - accuracy: 0.9992 - val_loss: 0.0978 - val_accuracy: 0.9838\n", "Epoch 20/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0058 - accuracy: 0.9983 - val_loss: 0.1011 - val_accuracy: 0.9830\n", "Epoch 21/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 0.0039 - accuracy: 0.9989 - val_loss: 0.0991 - val_accuracy: 0.9840\n", "Epoch 22/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 9.2480e-04 - accuracy: 0.9998 - val_loss: 0.0963 - val_accuracy: 0.9840\n", "Epoch 23/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 1.2642e-04 - accuracy: 1.0000 - val_loss: 0.0970 - val_accuracy: 0.9846\n", "Epoch 24/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 6.9068e-05 - accuracy: 1.0000 - val_loss: 0.0970 - val_accuracy: 0.9854\n", "Epoch 25/100\n", "1719/1719 [==============================] - 2s 1ms/step - loss: 5.1481e-05 - accuracy: 1.0000 - val_loss: 0.0977 - val_accuracy: 0.9850\n" ] } ], "source": [ "early_stopping_cb = tf.keras.callbacks.EarlyStopping(patience=20)\n", "checkpoint_cb = tf.keras.callbacks.ModelCheckpoint(\"my_mnist_model\", save_best_only=True)\n", "tensorboard_cb = tf.keras.callbacks.TensorBoard(run_logdir)\n", "\n", "history = model.fit(X_train, y_train, epochs=100,\n", " validation_data=(X_valid, y_valid),\n", " callbacks=[checkpoint_cb, early_stopping_cb, tensorboard_cb])" ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "313/313 [==============================] - 0s 908us/step - loss: 0.0708 - accuracy: 0.9799\n" ] }, { "data": { "text/plain": [ "[0.07079131156206131, 0.9799000024795532]" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = tf.keras.models.load_model(\"my_mnist_model\") # rollback to best model\n", "model.evaluate(X_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We got over 98% accuracy. Finally, let's look at the learning curves using TensorBoard:" ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%tensorboard --logdir=./my_mnist_logs" ] }, { "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.9.10" }, "nav_menu": { "height": "264px", "width": "369px" }, "toc": { "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 6, "toc_cell": false, "toc_section_display": "block", "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }