{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "WSW9BmePM7zZ" }, "source": [ "# Exercise 5.3: Neural Networks in Keras - Solution" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "t02FemO-M7za" }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# See https://keras.io/\n", "# for extennsive documentation\n", "import tensorflow as tf\n", "from tensorflow import keras\n", "\n", "from keras.models import Sequential\n", "from keras.layers import Dense" ] }, { "cell_type": "markdown", "metadata": { "id": "IrvyHKHTM7ze" }, "source": [ "Let us visit the problem of wine quality prediction previously encountered in Exercises 3.2 and 4.1 one final time. After linear regression and a self-made network, we can now explore the comfort provided by the Keras library." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "-H-L5egsM7ze", "outputId": "82d3f95f-59b1-43e3-e8d7-4d939ea7eec6" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/bin/sh: wget: command not found\r\n" ] } ], "source": [ "# The code snippet below is responsible for downloading the dataset to\n", "# Google. You can directly download the file using the link\n", "# if you work with a local anaconda setup\n", "!wget https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "mDToshKJNWGY", "outputId": "8cce4ba8-392b-43a1-d659-26aa95d21113" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "data: (4898, 12)\n", "First example:\n", "Features: [7.0000e+00 3.1000e-01 3.5000e-01 1.6000e+00 6.3000e-02 1.3000e+01\n", " 1.1900e+02 9.9184e-01 3.2200e+00 5.0000e-01 1.0700e+01]\n", "Quality: 5.0\n" ] } ], "source": [ "# load all examples from the file\n", "data = np.genfromtxt('winequality-white.csv',delimiter=\";\",skip_header=1)\n", "\n", "print(\"data:\", data.shape)\n", "\n", "# Prepare for proper training\n", "np.random.shuffle(data) # randomly sort examples\n", "\n", "# take the first 3000 examples for training\n", "X_train = data[:3000,:11] # all features except last column\n", "y_train = data[:3000,11] # quality column\n", "\n", "# and the remaining examples for testing\n", "X_test = data[3000:,:11] # all features except last column\n", "y_test = data[3000:,11] # quality column\n", "\n", "print(\"First example:\")\n", "print(\"Features:\", X_train[0])\n", "print(\"Quality:\", y_train[0])\n" ] }, { "cell_type": "markdown", "metadata": { "id": "VXx8BXB_M7zi" }, "source": [ "Below is the simple network from exercise 4.1 implemented using Keras. In addition to the network we define the loss function and optimiser." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "id": "Z0HMdw9eM7zi" }, "outputs": [], "source": [ "# See: https://keras.io/api/models/sequential/ and \n", "# https://keras.io/api/layers/core_layers/dense/\n", "# We can use the Sequential class to very easiliy\n", "# build a simple architecture\n", "model = Sequential()\n", "# 11 inputs, 20 outputs, relu\n", "model.add(Dense(20, input_dim=11, activation='relu')) \n", "model.add(Dense(20, activation='relu')) \n", "model.add(Dense(20, activation='relu')) \n", "# 20 inputs (automatically detected by Keras), 1 output, linear activation\n", "model.add(Dense(1, activation='linear'))\n", "\n", "\n", "# Set loss function and optimiser algorithm\n", "# Remove comments from of these versions:\n", "\n", "# Initial:\n", "#model.compile(loss='mse', # mean squared error\n", "# optimizer='sgd'# stochastic gradient descent\n", "# ) \n", "#\n", "# sgd with mometum\n", "# instead of passing a string, we can explicitely construct the optimizer object\n", "# this gives us more control over its properties\n", "#opt = keras.optimizers.SGD(momentum=0.8) \n", "#model.compile(loss='mse', # mean squared error\n", "# optimizer='sgd'\n", "# ) \n", "#\n", "# Adam:\n", "opt = keras.optimizers.Adam(learning_rate=0.0005) \n", "model.compile(loss='mse', # mean squared error\n", " optimizer=opt\n", " ) \n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "I98jdZcqM7zm" }, "source": [ "# Training and evaluation below\n", "\n", "The code below trains the network for 5 epochs using the loss function and optimiser defined above. Each example is individually passed to the network" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/70\n", "300/300 [==============================] - 1s 2ms/step - loss: 46.4118 - val_loss: 3.1073\n", "Epoch 2/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 2.7097 - val_loss: 2.1891\n", "Epoch 3/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 1.9155 - val_loss: 0.9903\n", "Epoch 4/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.8393 - val_loss: 0.7024\n", "Epoch 5/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6665 - val_loss: 0.6581\n", "Epoch 6/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.7041 - val_loss: 0.6317\n", "Epoch 7/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6754 - val_loss: 0.6689\n", "Epoch 8/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6605 - val_loss: 0.6133\n", "Epoch 9/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6512 - val_loss: 0.6183\n", "Epoch 10/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6678 - val_loss: 0.6162\n", "Epoch 11/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6542 - val_loss: 0.5944\n", "Epoch 12/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6498 - val_loss: 0.6002\n", "Epoch 13/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6381 - val_loss: 0.5874\n", "Epoch 14/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6452 - val_loss: 0.6921\n", "Epoch 15/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6827 - val_loss: 0.6189\n", "Epoch 16/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5984 - val_loss: 0.7090\n", "Epoch 17/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6073 - val_loss: 0.5954\n", "Epoch 18/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6351 - val_loss: 0.6501\n", "Epoch 19/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6004 - val_loss: 0.5765\n", "Epoch 20/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6296 - val_loss: 0.5682\n", "Epoch 21/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6307 - val_loss: 0.5854\n", "Epoch 22/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6311 - val_loss: 0.6989\n", "Epoch 23/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5797 - val_loss: 0.6385\n", "Epoch 24/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6446 - val_loss: 0.5486\n", "Epoch 25/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6366 - val_loss: 0.5558\n", "Epoch 26/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6019 - val_loss: 0.5446\n", "Epoch 27/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6299 - val_loss: 0.5682\n", "Epoch 28/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5982 - val_loss: 0.5423\n", "Epoch 29/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5921 - val_loss: 0.5433\n", "Epoch 30/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5791 - val_loss: 0.5554\n", "Epoch 31/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5792 - val_loss: 0.6534\n", "Epoch 32/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5904 - val_loss: 0.5771\n", "Epoch 33/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5871 - val_loss: 0.5595\n", "Epoch 34/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5635 - val_loss: 0.5373\n", "Epoch 35/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6022 - val_loss: 0.7051\n", "Epoch 36/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5985 - val_loss: 0.5677\n", "Epoch 37/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5580 - val_loss: 0.5455\n", "Epoch 38/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6386 - val_loss: 0.5383\n", "Epoch 39/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6253 - val_loss: 0.6117\n", "Epoch 40/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5911 - val_loss: 0.5612\n", "Epoch 41/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5735 - val_loss: 0.5583\n", "Epoch 42/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5878 - val_loss: 0.5711\n", "Epoch 43/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5955 - val_loss: 0.5366\n", "Epoch 44/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5770 - val_loss: 0.5332\n", "Epoch 45/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5794 - val_loss: 0.5375\n", "Epoch 46/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6078 - val_loss: 0.5349\n", "Epoch 47/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5853 - val_loss: 0.5300\n", "Epoch 48/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6130 - val_loss: 0.5279\n", "Epoch 49/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5680 - val_loss: 0.7001\n", "Epoch 50/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5703 - val_loss: 0.6029\n", "Epoch 51/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6161 - val_loss: 0.5407\n", "Epoch 52/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5793 - val_loss: 0.5336\n", "Epoch 53/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5859 - val_loss: 0.5460\n", "Epoch 54/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5511 - val_loss: 0.5384\n", "Epoch 55/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5948 - val_loss: 0.5303\n", "Epoch 56/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5912 - val_loss: 0.5345\n", "Epoch 57/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5816 - val_loss: 0.5278\n", "Epoch 58/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5890 - val_loss: 0.5268\n", "Epoch 59/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5852 - val_loss: 0.5261\n", "Epoch 60/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5851 - val_loss: 0.5566\n", "Epoch 61/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.6098 - val_loss: 0.5239\n", "Epoch 62/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5671 - val_loss: 0.5541\n", "Epoch 63/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5868 - val_loss: 0.5280\n", "Epoch 64/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5735 - val_loss: 0.5238\n", "Epoch 65/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5701 - val_loss: 0.5417\n", "Epoch 66/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5502 - val_loss: 0.5333\n", "Epoch 67/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5938 - val_loss: 0.5467\n", "Epoch 68/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5668 - val_loss: 0.5323\n", "Epoch 69/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5883 - val_loss: 0.5417\n", "Epoch 70/70\n", "300/300 [==============================] - 0s 1ms/step - loss: 0.5458 - val_loss: 0.5390\n" ] } ], "source": [ "history = model.fit(X_train, y_train, \n", " validation_data=(X_test, y_test),\n", " epochs=70, batch_size=10) # changed batch size to 10 \n" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "# The history object returned by the model training above \n", "# contains the values of the loss function (the mean-squared-error)\n", "# at different epochs\n", "# We discard the first epoch as the loss value is very high,\n", "# obscuring the rest of the distribution\n", "train_loss = history.history[\"loss\"][1:]\n", "test_loss = history.history[\"val_loss\"][1:]" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Prepare and plot loss over time\n", "plt.plot(train_loss,label=\"train\")\n", "plt.plot(test_loss,label=\"test\")\n", "plt.legend()\n", "plt.xlabel(\"Epoch-1\")\n", "plt.ylabel(\"Loss\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Correlation coefficient: 0.5500396765061618\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# After the training:\n", "\n", "# Prepare scatter plot\n", "y_pred = model.predict(X_test)[:,0]\n", "\n", "print(\"Correlation coefficient:\", np.corrcoef(y_pred,y_test)[0,1])\n", "plt.scatter(y_pred,y_test)\n", "plt.xlabel(\"Predicted\")\n", "plt.ylabel(\"True\")\n", "plt.show()" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "Exercise 6 - Solution", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 1 }