{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Preface\n", "([article source](https://machinelearningmastery.com/evaluate-performance-deep-learning-models-keras/)) **Keras is an easy to use and powerful Python library for deep learning.**\n", "\n", "**There are a lot of decisions to make when designing and configuring your deep learning models.** Most of these decisions must be resolved empirically through trial and error and evaluating them on real data.\n", "\n", "**As such, it is critically important to have a robust way to evaluate the performance of your neural networks and deep learning models. In this post you will discover a few ways that you can use to evaluate model performance using Keras.**\n", "\n", "### Agenda\n", "* [**Empirically Evaluate Network Configurations**](#sect1)\n", "* [**Data Splitting**](#sect2)\n", "* [**Manual k-Fold Cross Validation**](#sect3)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "from keras.models import Sequential\n", "from keras.layers import Dense\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.model_selection import StratifiedKFold\n", "from matplotlib import pyplot as plt\n", "\n", "# fix random seed for reproducibility\n", "seed = 7\n", "\n", "# fix random seed for reproducibility\n", "np.random.seed(seed)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Data Set\n", "All examples in this post use the [Pima Indians onset of diabetes dataset](https://archive.ics.uci.edu/ml/datasets/Pima+Indians+Diabetes). You can [download it](https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data) from the UCI Machine Learning Repository and save the data file in your current working directory with the filename pima-indians-diabetes.csv ([update: download from here](https://www.kaggle.com/uciml/pima-indians-diabetes-database))." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PregnanciesGlucoseBloodPressureSkinThicknessInsulinBMIDiabetesPedigreeFunctionAgeOutcome
061487235033.60.627501
11856629026.60.351310
28183640023.30.672321
318966239428.10.167210
40137403516843.12.288331
\n", "
" ], "text/plain": [ " Pregnancies Glucose BloodPressure SkinThickness Insulin BMI \\\n", "0 6 148 72 35 0 33.6 \n", "1 1 85 66 29 0 26.6 \n", "2 8 183 64 0 0 23.3 \n", "3 1 89 66 23 94 28.1 \n", "4 0 137 40 35 168 43.1 \n", "\n", " DiabetesPedigreeFunction Age Outcome \n", "0 0.627 50 1 \n", "1 0.351 31 0 \n", "2 0.672 32 1 \n", "3 0.167 21 0 \n", "4 2.288 33 1 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pima_df = pd.read_csv(\"../../datas/kaggle_pima-indians-diabetes-database/diabetes.csv\")\n", "pima_df.head()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# split into input (X) and output (Y) variables\n", "X = pima_df.iloc[:,:-1].values\n", "y = pima_df.iloc[:,-1].values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Empirically Evaluate Network Configurations\n", "**There are a myriad of decisions you must make when designing and configuring your deep learning models.**\n", "\n", "Many of these decisions can be resolved by copying the structure of other people’s networks and using heuristics. Ultimately, the best technique is to actually design small experiments and empirically evaluate options using real data.\n", "\n", "This includes high-level decisions like the number, size and type of layers in your network. It also includes the lower level decisions like the choice of loss function, activation functions, optimization procedure and [number of epochs](https://machinelearningmastery.com/difference-between-a-batch-and-an-epoch/).\n", "\n", "Deep learning is often used on problems that have very large datasets. That is tens of thousands or hundreds of thousands of instances.\n", "\n", "As such, **you need to have a robust test harness that allows you to estimate the performance of a given configuration on unseen data, and reliably compare the performance to other configurations.**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Data Splitting\n", "**The large amount of data and the complexity of the models require very long training times.**\n", "\n", "As such, it is typically to use a simple separation of data into training and test datasets or training and validation datasets. Keras provides a two convenient ways of evaluating your deep learning algorithms this way:\n", "* [**Use an automatic verification dataset.**](#sect2_1)\n", "* [**Use a manual verification dataset.**](#sect2_2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Use a Automatic Verification Dataset\n", "**Keras can separate a portion of your training data into a validation dataset and evaluate the performance of your model on that validation dataset each epoch.**\n", "\n", "You can do this by setting the validation_split argument on the fit() function to a percentage of the size of your training dataset. For example, a reasonable value might be 0.2 or 0.33 for 20% or 33% of your training data held back for validation.\n", "\n", "The example below demonstrates the use of using an automatic validation dataset on a small binary classification problem." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def get_model():\n", " model = Sequential()\n", " model.add(Dense(12, input_dim=8, activation='relu'))\n", " model.add(Dense(8, activation='relu'))\n", " model.add(Dense(1, activation='sigmoid'))\n", " # Compile model\n", " model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n", " \n", " return model" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/150\n", "52/52 [==============================] - 0s 3ms/step - loss: 18.9152 - accuracy: 0.3605 - val_loss: 7.5055 - val_accuracy: 0.4921\n", "Epoch 2/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 5.0327 - accuracy: 0.5364 - val_loss: 1.7996 - val_accuracy: 0.6535\n", "Epoch 3/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 1.7254 - accuracy: 0.6657 - val_loss: 1.4343 - val_accuracy: 0.5984\n", "Epoch 4/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 1.3628 - accuracy: 0.6790 - val_loss: 1.2649 - val_accuracy: 0.6220\n", "Epoch 5/150\n", "52/52 [==============================] - 0s 972us/step - loss: 1.0699 - accuracy: 0.6923 - val_loss: 1.1931 - val_accuracy: 0.6457\n", "Epoch 6/150\n", "52/52 [==============================] - 0s 987us/step - loss: 1.0621 - accuracy: 0.6967 - val_loss: 1.0318 - val_accuracy: 0.6378\n", "Epoch 7/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.9721 - accuracy: 0.6704 - val_loss: 0.9163 - val_accuracy: 0.6299\n", "Epoch 8/150\n", "52/52 [==============================] - 0s 965us/step - loss: 0.8950 - accuracy: 0.6549 - val_loss: 0.8384 - val_accuracy: 0.6732\n", "Epoch 9/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.7947 - accuracy: 0.6496 - val_loss: 0.7866 - val_accuracy: 0.6614\n", "Epoch 10/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.8344 - accuracy: 0.6359 - val_loss: 0.7438 - val_accuracy: 0.6535\n", "Epoch 11/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6911 - accuracy: 0.6387 - val_loss: 0.7171 - val_accuracy: 0.6575\n", "Epoch 12/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.7080 - accuracy: 0.6610 - val_loss: 0.7107 - val_accuracy: 0.6260\n", "Epoch 13/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6499 - accuracy: 0.6559 - val_loss: 0.6853 - val_accuracy: 0.6457\n", "Epoch 14/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6726 - accuracy: 0.6783 - val_loss: 0.6595 - val_accuracy: 0.6378\n", "Epoch 15/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6444 - accuracy: 0.6473 - val_loss: 0.6703 - val_accuracy: 0.6496\n", "Epoch 16/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6760 - accuracy: 0.6354 - val_loss: 0.6308 - val_accuracy: 0.6457\n", "Epoch 17/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6364 - accuracy: 0.6627 - val_loss: 0.6283 - val_accuracy: 0.6496\n", "Epoch 18/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6210 - accuracy: 0.6499 - val_loss: 0.6160 - val_accuracy: 0.6496\n", "Epoch 19/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5395 - accuracy: 0.7300 - val_loss: 0.6108 - val_accuracy: 0.6575\n", "Epoch 20/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5991 - accuracy: 0.6681 - val_loss: 0.6342 - val_accuracy: 0.6890\n", "Epoch 21/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5767 - accuracy: 0.7156 - val_loss: 0.6029 - val_accuracy: 0.6969\n", "Epoch 22/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5525 - accuracy: 0.7019 - val_loss: 0.6020 - val_accuracy: 0.6890\n", "Epoch 23/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6077 - accuracy: 0.6815 - val_loss: 0.6222 - val_accuracy: 0.6457\n", "Epoch 24/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6422 - accuracy: 0.6434 - val_loss: 0.6003 - val_accuracy: 0.6929\n", "Epoch 25/150\n", "52/52 [==============================] - 0s 985us/step - loss: 0.6011 - accuracy: 0.6704 - val_loss: 0.5947 - val_accuracy: 0.6890\n", "Epoch 26/150\n", "52/52 [==============================] - 0s 998us/step - loss: 0.5926 - accuracy: 0.6856 - val_loss: 0.5873 - val_accuracy: 0.7008\n", "Epoch 27/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5909 - accuracy: 0.6778 - val_loss: 0.5900 - val_accuracy: 0.7126\n", "Epoch 28/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6287 - accuracy: 0.6620 - val_loss: 0.5868 - val_accuracy: 0.7047\n", "Epoch 29/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5796 - accuracy: 0.6667 - val_loss: 0.5859 - val_accuracy: 0.7205\n", "Epoch 30/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5606 - accuracy: 0.6908 - val_loss: 0.5924 - val_accuracy: 0.6811\n", "Epoch 31/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6027 - accuracy: 0.6814 - val_loss: 0.5891 - val_accuracy: 0.7126\n", "Epoch 32/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5588 - accuracy: 0.6959 - val_loss: 0.5951 - val_accuracy: 0.6811\n", "Epoch 33/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5972 - accuracy: 0.6608 - val_loss: 0.5830 - val_accuracy: 0.7165\n", "Epoch 34/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5433 - accuracy: 0.7047 - val_loss: 0.5800 - val_accuracy: 0.7087\n", "Epoch 35/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5781 - accuracy: 0.6951 - val_loss: 0.5819 - val_accuracy: 0.7126\n", "Epoch 36/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5741 - accuracy: 0.7066 - val_loss: 0.5793 - val_accuracy: 0.7205\n", "Epoch 37/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5872 - accuracy: 0.6616 - val_loss: 0.5926 - val_accuracy: 0.7047\n", "Epoch 38/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5408 - accuracy: 0.7101 - val_loss: 0.5963 - val_accuracy: 0.6850\n", "Epoch 39/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5682 - accuracy: 0.6682 - val_loss: 0.6016 - val_accuracy: 0.6890\n", "Epoch 40/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5695 - accuracy: 0.6746 - val_loss: 0.6748 - val_accuracy: 0.7008\n", "Epoch 41/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6486 - accuracy: 0.6527 - val_loss: 0.5871 - val_accuracy: 0.7008\n", "Epoch 42/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5355 - accuracy: 0.7316 - val_loss: 0.5764 - val_accuracy: 0.7008\n", "Epoch 43/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5755 - accuracy: 0.6892 - val_loss: 0.5762 - val_accuracy: 0.7441\n", "Epoch 44/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5455 - accuracy: 0.7216 - val_loss: 0.5849 - val_accuracy: 0.6969\n", "Epoch 45/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5538 - accuracy: 0.6868 - val_loss: 0.5747 - val_accuracy: 0.7244\n", "Epoch 46/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6165 - accuracy: 0.6696 - val_loss: 0.5884 - val_accuracy: 0.6850\n", "Epoch 47/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5810 - accuracy: 0.6419 - val_loss: 0.5962 - val_accuracy: 0.7008\n", "Epoch 48/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5873 - accuracy: 0.6674 - val_loss: 0.5646 - val_accuracy: 0.7126\n", "Epoch 49/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5931 - accuracy: 0.6584 - val_loss: 0.5800 - val_accuracy: 0.7205\n", "Epoch 50/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5382 - accuracy: 0.7282 - val_loss: 0.5703 - val_accuracy: 0.7126\n", "Epoch 51/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5566 - accuracy: 0.7085 - val_loss: 0.5801 - val_accuracy: 0.6969\n", "Epoch 52/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5577 - accuracy: 0.7127 - val_loss: 0.6136 - val_accuracy: 0.6969\n", "Epoch 53/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5475 - accuracy: 0.7163 - val_loss: 0.5687 - val_accuracy: 0.7323\n", "Epoch 54/150\n", "52/52 [==============================] - 0s 984us/step - loss: 0.5505 - accuracy: 0.6984 - val_loss: 0.5721 - val_accuracy: 0.7244\n", "Epoch 55/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5325 - accuracy: 0.7306 - val_loss: 0.5734 - val_accuracy: 0.7165\n", "Epoch 56/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5550 - accuracy: 0.6789 - val_loss: 0.5697 - val_accuracy: 0.7244\n", "Epoch 57/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5329 - accuracy: 0.7258 - val_loss: 0.5675 - val_accuracy: 0.7087\n", "Epoch 58/150\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "52/52 [==============================] - 0s 982us/step - loss: 0.5498 - accuracy: 0.7122 - val_loss: 0.5675 - val_accuracy: 0.7402\n", "Epoch 59/150\n", "52/52 [==============================] - 0s 995us/step - loss: 0.5590 - accuracy: 0.7104 - val_loss: 0.5670 - val_accuracy: 0.7087\n", "Epoch 60/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5406 - accuracy: 0.7065 - val_loss: 0.5920 - val_accuracy: 0.6890\n", "Epoch 61/150\n", "52/52 [==============================] - 0s 999us/step - loss: 0.5826 - accuracy: 0.6772 - val_loss: 0.5677 - val_accuracy: 0.7283\n", "Epoch 62/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5440 - accuracy: 0.7091 - val_loss: 0.5611 - val_accuracy: 0.7402\n", "Epoch 63/150\n", "52/52 [==============================] - 0s 999us/step - loss: 0.5571 - accuracy: 0.6901 - val_loss: 0.5879 - val_accuracy: 0.7008\n", "Epoch 64/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5514 - accuracy: 0.7140 - val_loss: 0.5772 - val_accuracy: 0.7441\n", "Epoch 65/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5261 - accuracy: 0.7390 - val_loss: 0.5681 - val_accuracy: 0.7244\n", "Epoch 66/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5428 - accuracy: 0.7071 - val_loss: 0.5629 - val_accuracy: 0.7323\n", "Epoch 67/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5405 - accuracy: 0.6881 - val_loss: 0.5627 - val_accuracy: 0.7441\n", "Epoch 68/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5453 - accuracy: 0.6851 - val_loss: 0.6258 - val_accuracy: 0.7205\n", "Epoch 69/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5731 - accuracy: 0.6603 - val_loss: 0.5681 - val_accuracy: 0.7165\n", "Epoch 70/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5778 - accuracy: 0.6737 - val_loss: 0.5957 - val_accuracy: 0.6929\n", "Epoch 71/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5501 - accuracy: 0.7077 - val_loss: 0.5734 - val_accuracy: 0.7087\n", "Epoch 72/150\n", "52/52 [==============================] - 0s 953us/step - loss: 0.5376 - accuracy: 0.7079 - val_loss: 0.5656 - val_accuracy: 0.7205\n", "Epoch 73/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5422 - accuracy: 0.6936 - val_loss: 0.5735 - val_accuracy: 0.7008\n", "Epoch 74/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5565 - accuracy: 0.6997 - val_loss: 0.5698 - val_accuracy: 0.7402\n", "Epoch 75/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5496 - accuracy: 0.6858 - val_loss: 0.5522 - val_accuracy: 0.7362\n", "Epoch 76/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5430 - accuracy: 0.7094 - val_loss: 0.5788 - val_accuracy: 0.7283\n", "Epoch 77/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5236 - accuracy: 0.7278 - val_loss: 0.5613 - val_accuracy: 0.7283\n", "Epoch 78/150\n", "52/52 [==============================] - 0s 966us/step - loss: 0.5886 - accuracy: 0.6732 - val_loss: 0.5745 - val_accuracy: 0.7323\n", "Epoch 79/150\n", "52/52 [==============================] - 0s 988us/step - loss: 0.5351 - accuracy: 0.7129 - val_loss: 0.5509 - val_accuracy: 0.7362\n", "Epoch 80/150\n", "52/52 [==============================] - 0s 973us/step - loss: 0.5630 - accuracy: 0.7002 - val_loss: 0.5584 - val_accuracy: 0.7205\n", "Epoch 81/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5450 - accuracy: 0.7259 - val_loss: 0.5656 - val_accuracy: 0.7362\n", "Epoch 82/150\n", "52/52 [==============================] - 0s 951us/step - loss: 0.5661 - accuracy: 0.7053 - val_loss: 0.5609 - val_accuracy: 0.7323\n", "Epoch 83/150\n", "52/52 [==============================] - 0s 980us/step - loss: 0.5326 - accuracy: 0.6866 - val_loss: 0.5680 - val_accuracy: 0.7244\n", "Epoch 84/150\n", "52/52 [==============================] - 0s 957us/step - loss: 0.5645 - accuracy: 0.6805 - val_loss: 0.5451 - val_accuracy: 0.7402\n", "Epoch 85/150\n", "52/52 [==============================] - 0s 992us/step - loss: 0.5543 - accuracy: 0.6969 - val_loss: 0.5470 - val_accuracy: 0.7480\n", "Epoch 86/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5638 - accuracy: 0.7000 - val_loss: 0.5625 - val_accuracy: 0.7402\n", "Epoch 87/150\n", "52/52 [==============================] - 0s 980us/step - loss: 0.5423 - accuracy: 0.7169 - val_loss: 0.5608 - val_accuracy: 0.7205\n", "Epoch 88/150\n", "52/52 [==============================] - 0s 972us/step - loss: 0.5342 - accuracy: 0.7121 - val_loss: 0.5548 - val_accuracy: 0.7480\n", "Epoch 89/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5445 - accuracy: 0.6828 - val_loss: 0.5874 - val_accuracy: 0.7205\n", "Epoch 90/150\n", "52/52 [==============================] - 0s 971us/step - loss: 0.5679 - accuracy: 0.6952 - val_loss: 0.5598 - val_accuracy: 0.7441\n", "Epoch 91/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5627 - accuracy: 0.6807 - val_loss: 0.5453 - val_accuracy: 0.7480\n", "Epoch 92/150\n", "52/52 [==============================] - 0s 986us/step - loss: 0.5631 - accuracy: 0.6894 - val_loss: 0.5591 - val_accuracy: 0.7402\n", "Epoch 93/150\n", "52/52 [==============================] - 0s 998us/step - loss: 0.6183 - accuracy: 0.6571 - val_loss: 0.5450 - val_accuracy: 0.7323\n", "Epoch 94/150\n", "52/52 [==============================] - 0s 947us/step - loss: 0.5577 - accuracy: 0.6922 - val_loss: 0.5498 - val_accuracy: 0.7323\n", "Epoch 95/150\n", "52/52 [==============================] - 0s 992us/step - loss: 0.5355 - accuracy: 0.7255 - val_loss: 0.5573 - val_accuracy: 0.7244\n", "Epoch 96/150\n", "52/52 [==============================] - 0s 986us/step - loss: 0.5235 - accuracy: 0.7273 - val_loss: 0.5521 - val_accuracy: 0.7480\n", "Epoch 97/150\n", "52/52 [==============================] - 0s 957us/step - loss: 0.5407 - accuracy: 0.7055 - val_loss: 0.5872 - val_accuracy: 0.7323\n", "Epoch 98/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5330 - accuracy: 0.7317 - val_loss: 0.5763 - val_accuracy: 0.7165\n", "Epoch 99/150\n", "52/52 [==============================] - 0s 990us/step - loss: 0.5702 - accuracy: 0.7067 - val_loss: 0.5418 - val_accuracy: 0.7559\n", "Epoch 100/150\n", "52/52 [==============================] - 0s 948us/step - loss: 0.5520 - accuracy: 0.6878 - val_loss: 0.5379 - val_accuracy: 0.7441\n", "Epoch 101/150\n", "52/52 [==============================] - 0s 998us/step - loss: 0.5426 - accuracy: 0.6944 - val_loss: 0.5598 - val_accuracy: 0.7283\n", "Epoch 102/150\n", "52/52 [==============================] - 0s 928us/step - loss: 0.5643 - accuracy: 0.6746 - val_loss: 0.5566 - val_accuracy: 0.7520\n", "Epoch 103/150\n", "52/52 [==============================] - 0s 970us/step - loss: 0.5344 - accuracy: 0.7185 - val_loss: 0.5402 - val_accuracy: 0.7559\n", "Epoch 104/150\n", "52/52 [==============================] - 0s 990us/step - loss: 0.5603 - accuracy: 0.6967 - val_loss: 0.5435 - val_accuracy: 0.7480\n", "Epoch 105/150\n", "52/52 [==============================] - 0s 985us/step - loss: 0.5242 - accuracy: 0.7299 - val_loss: 0.5623 - val_accuracy: 0.7402\n", "Epoch 106/150\n", "52/52 [==============================] - 0s 957us/step - loss: 0.5541 - accuracy: 0.6801 - val_loss: 0.5684 - val_accuracy: 0.7244\n", "Epoch 107/150\n", "52/52 [==============================] - 0s 941us/step - loss: 0.5322 - accuracy: 0.7073 - val_loss: 0.5610 - val_accuracy: 0.7520\n", "Epoch 108/150\n", "52/52 [==============================] - 0s 1000us/step - loss: 0.4698 - accuracy: 0.7545 - val_loss: 0.5497 - val_accuracy: 0.7441\n", "Epoch 109/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5737 - accuracy: 0.6653 - val_loss: 0.5603 - val_accuracy: 0.7402\n", "Epoch 110/150\n", "52/52 [==============================] - 0s 984us/step - loss: 0.5345 - accuracy: 0.6927 - val_loss: 0.5469 - val_accuracy: 0.7480\n", "Epoch 111/150\n", "52/52 [==============================] - 0s 942us/step - loss: 0.5444 - accuracy: 0.7113 - val_loss: 0.5392 - val_accuracy: 0.7520\n", "Epoch 112/150\n", "52/52 [==============================] - 0s 941us/step - loss: 0.5286 - accuracy: 0.7288 - val_loss: 0.5414 - val_accuracy: 0.7638\n", "Epoch 113/150\n", "52/52 [==============================] - 0s 968us/step - loss: 0.5602 - accuracy: 0.7164 - val_loss: 0.5553 - val_accuracy: 0.7480\n", "Epoch 114/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5728 - accuracy: 0.6691 - val_loss: 0.5538 - val_accuracy: 0.7402\n", "Epoch 115/150\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "52/52 [==============================] - 0s 981us/step - loss: 0.5695 - accuracy: 0.6678 - val_loss: 0.5384 - val_accuracy: 0.7402\n", "Epoch 116/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.4741 - accuracy: 0.7422 - val_loss: 0.5531 - val_accuracy: 0.7480\n", "Epoch 117/150\n", "52/52 [==============================] - 0s 966us/step - loss: 0.5128 - accuracy: 0.7126 - val_loss: 0.5440 - val_accuracy: 0.7402\n", "Epoch 118/150\n", "52/52 [==============================] - 0s 961us/step - loss: 0.5635 - accuracy: 0.6885 - val_loss: 0.5333 - val_accuracy: 0.7520\n", "Epoch 119/150\n", "52/52 [==============================] - 0s 945us/step - loss: 0.5053 - accuracy: 0.7274 - val_loss: 0.5720 - val_accuracy: 0.7362\n", "Epoch 120/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5453 - accuracy: 0.6960 - val_loss: 0.5321 - val_accuracy: 0.7598\n", "Epoch 121/150\n", "52/52 [==============================] - 0s 988us/step - loss: 0.5905 - accuracy: 0.6828 - val_loss: 0.5371 - val_accuracy: 0.7520\n", "Epoch 122/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5017 - accuracy: 0.7114 - val_loss: 0.5438 - val_accuracy: 0.7677\n", "Epoch 123/150\n", "52/52 [==============================] - 0s 980us/step - loss: 0.5135 - accuracy: 0.7157 - val_loss: 0.5550 - val_accuracy: 0.7441\n", "Epoch 124/150\n", "52/52 [==============================] - 0s 980us/step - loss: 0.5382 - accuracy: 0.7135 - val_loss: 0.5500 - val_accuracy: 0.7283\n", "Epoch 125/150\n", "52/52 [==============================] - 0s 993us/step - loss: 0.5402 - accuracy: 0.7250 - val_loss: 0.5499 - val_accuracy: 0.7598\n", "Epoch 126/150\n", "52/52 [==============================] - 0s 984us/step - loss: 0.4802 - accuracy: 0.7358 - val_loss: 0.5468 - val_accuracy: 0.7598\n", "Epoch 127/150\n", "52/52 [==============================] - 0s 976us/step - loss: 0.5284 - accuracy: 0.7124 - val_loss: 0.5358 - val_accuracy: 0.7480\n", "Epoch 128/150\n", "52/52 [==============================] - 0s 976us/step - loss: 0.5280 - accuracy: 0.7147 - val_loss: 0.5598 - val_accuracy: 0.7205\n", "Epoch 129/150\n", "52/52 [==============================] - 0s 975us/step - loss: 0.5566 - accuracy: 0.6681 - val_loss: 0.5408 - val_accuracy: 0.7323\n", "Epoch 130/150\n", "52/52 [==============================] - 0s 952us/step - loss: 0.5157 - accuracy: 0.7162 - val_loss: 0.5323 - val_accuracy: 0.7677\n", "Epoch 131/150\n", "52/52 [==============================] - 0s 980us/step - loss: 0.5319 - accuracy: 0.7112 - val_loss: 0.5596 - val_accuracy: 0.7205\n", "Epoch 132/150\n", "52/52 [==============================] - 0s 984us/step - loss: 0.5381 - accuracy: 0.6991 - val_loss: 0.5403 - val_accuracy: 0.7520\n", "Epoch 133/150\n", "52/52 [==============================] - 0s 978us/step - loss: 0.5174 - accuracy: 0.7029 - val_loss: 0.5398 - val_accuracy: 0.7362\n", "Epoch 134/150\n", "52/52 [==============================] - 0s 982us/step - loss: 0.5577 - accuracy: 0.7050 - val_loss: 0.5402 - val_accuracy: 0.7638\n", "Epoch 135/150\n", "52/52 [==============================] - 0s 973us/step - loss: 0.4723 - accuracy: 0.7453 - val_loss: 0.5558 - val_accuracy: 0.7638\n", "Epoch 136/150\n", "52/52 [==============================] - 0s 980us/step - loss: 0.4931 - accuracy: 0.7321 - val_loss: 0.5391 - val_accuracy: 0.7402\n", "Epoch 137/150\n", "52/52 [==============================] - 0s 971us/step - loss: 0.5175 - accuracy: 0.7359 - val_loss: 0.5462 - val_accuracy: 0.7717\n", "Epoch 138/150\n", "52/52 [==============================] - 0s 969us/step - loss: 0.5312 - accuracy: 0.7038 - val_loss: 0.5380 - val_accuracy: 0.7283\n", "Epoch 139/150\n", "52/52 [==============================] - 0s 986us/step - loss: 0.5437 - accuracy: 0.7098 - val_loss: 0.5347 - val_accuracy: 0.7402\n", "Epoch 140/150\n", "52/52 [==============================] - 0s 991us/step - loss: 0.5233 - accuracy: 0.6885 - val_loss: 0.5759 - val_accuracy: 0.7283\n", "Epoch 141/150\n", "52/52 [==============================] - 0s 997us/step - loss: 0.5145 - accuracy: 0.7183 - val_loss: 0.5316 - val_accuracy: 0.7638\n", "Epoch 142/150\n", "52/52 [==============================] - 0s 978us/step - loss: 0.5379 - accuracy: 0.6831 - val_loss: 0.5288 - val_accuracy: 0.7677\n", "Epoch 143/150\n", "52/52 [==============================] - 0s 959us/step - loss: 0.4955 - accuracy: 0.7292 - val_loss: 0.5397 - val_accuracy: 0.7677\n", "Epoch 144/150\n", "52/52 [==============================] - 0s 962us/step - loss: 0.5604 - accuracy: 0.6982 - val_loss: 0.5576 - val_accuracy: 0.7362\n", "Epoch 145/150\n", "52/52 [==============================] - 0s 990us/step - loss: 0.4942 - accuracy: 0.7228 - val_loss: 0.5600 - val_accuracy: 0.7520\n", "Epoch 146/150\n", "52/52 [==============================] - 0s 966us/step - loss: 0.5438 - accuracy: 0.7001 - val_loss: 0.5336 - val_accuracy: 0.7559\n", "Epoch 147/150\n", "52/52 [==============================] - 0s 946us/step - loss: 0.5476 - accuracy: 0.6875 - val_loss: 0.5434 - val_accuracy: 0.7677\n", "Epoch 148/150\n", "52/52 [==============================] - 0s 937us/step - loss: 0.5363 - accuracy: 0.7002 - val_loss: 0.5335 - val_accuracy: 0.7362\n", "Epoch 149/150\n", "52/52 [==============================] - 0s 942us/step - loss: 0.5290 - accuracy: 0.7073 - val_loss: 0.5371 - val_accuracy: 0.7559\n", "Epoch 150/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5097 - accuracy: 0.7412 - val_loss: 0.5336 - val_accuracy: 0.7638\n" ] } ], "source": [ "# create model\n", "model = get_model()\n", "\n", "# Fit the model\n", "history = model.fit(X, y, validation_split=0.33, epochs=150, batch_size=10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Running the example, you can see that the verbose output on each epoch shows the loss and accuracy on both the training dataset and the validation dataset." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Use a Manual Verification Dataset\n", "**Keras also allows you to manually specify the dataset to use for validation during training.**\n", "\n", "In this example we use the handy [train_test_split()](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) function from the Python scikit-learn machine learning library to separate our data into a training and test dataset. We use 67% for training and the remaining 33% of the data for validation.\n", "\n", "The validation dataset can be specified to the fit() function in Keras by the validation_data argument. It takes a tuple of the input and output datasets." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/150\n", "52/52 [==============================] - 0s 3ms/step - loss: 4.9019 - accuracy: 0.6612 - val_loss: 1.6766 - val_accuracy: 0.5630\n", "Epoch 2/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 1.2200 - accuracy: 0.6519 - val_loss: 1.2403 - val_accuracy: 0.5945\n", "Epoch 3/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 1.0933 - accuracy: 0.6060 - val_loss: 1.0395 - val_accuracy: 0.5827\n", "Epoch 4/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.9907 - accuracy: 0.5811 - val_loss: 0.9501 - val_accuracy: 0.6693\n", "Epoch 5/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.8971 - accuracy: 0.6181 - val_loss: 0.8985 - val_accuracy: 0.6772\n", "Epoch 6/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.7916 - accuracy: 0.6405 - val_loss: 0.8396 - val_accuracy: 0.6732\n", "Epoch 7/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6753 - accuracy: 0.7202 - val_loss: 0.7964 - val_accuracy: 0.6339\n", "Epoch 8/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.7467 - accuracy: 0.6267 - val_loss: 0.8471 - val_accuracy: 0.6654\n", "Epoch 9/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.7098 - accuracy: 0.6618 - val_loss: 0.7352 - val_accuracy: 0.6496\n", "Epoch 10/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6523 - accuracy: 0.6797 - val_loss: 0.7203 - val_accuracy: 0.6732\n", "Epoch 11/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6474 - accuracy: 0.6659 - val_loss: 0.7367 - val_accuracy: 0.6811\n", "Epoch 12/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6751 - accuracy: 0.7054 - val_loss: 0.6879 - val_accuracy: 0.6299\n", "Epoch 13/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6253 - accuracy: 0.6829 - val_loss: 0.6671 - val_accuracy: 0.6575\n", "Epoch 14/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6162 - accuracy: 0.6936 - val_loss: 0.6535 - val_accuracy: 0.6811\n", "Epoch 15/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6221 - accuracy: 0.6974 - val_loss: 0.6514 - val_accuracy: 0.6417\n", "Epoch 16/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6353 - accuracy: 0.6773 - val_loss: 0.6486 - val_accuracy: 0.6575\n", "Epoch 17/150\n", "52/52 [==============================] - 0s 993us/step - loss: 0.5967 - accuracy: 0.7071 - val_loss: 0.6951 - val_accuracy: 0.6772\n", "Epoch 18/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6329 - accuracy: 0.6760 - val_loss: 0.6247 - val_accuracy: 0.6654\n", "Epoch 19/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6040 - accuracy: 0.7051 - val_loss: 0.6239 - val_accuracy: 0.6654\n", "Epoch 20/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6151 - accuracy: 0.6705 - val_loss: 0.6142 - val_accuracy: 0.6772\n", "Epoch 21/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6100 - accuracy: 0.7242 - val_loss: 0.6351 - val_accuracy: 0.6339\n", "Epoch 22/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5850 - accuracy: 0.7120 - val_loss: 0.6077 - val_accuracy: 0.6850\n", "Epoch 23/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5946 - accuracy: 0.7012 - val_loss: 0.6123 - val_accuracy: 0.6929\n", "Epoch 24/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5915 - accuracy: 0.7056 - val_loss: 0.6408 - val_accuracy: 0.6339\n", "Epoch 25/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6035 - accuracy: 0.6895 - val_loss: 0.6468 - val_accuracy: 0.6811\n", "Epoch 26/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6106 - accuracy: 0.6761 - val_loss: 0.6021 - val_accuracy: 0.6693\n", "Epoch 27/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5812 - accuracy: 0.7010 - val_loss: 0.6432 - val_accuracy: 0.6929\n", "Epoch 28/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5822 - accuracy: 0.7209 - val_loss: 0.6388 - val_accuracy: 0.6693\n", "Epoch 29/150\n", "52/52 [==============================] - 0s 930us/step - loss: 0.6176 - accuracy: 0.6924 - val_loss: 0.6109 - val_accuracy: 0.6772\n", "Epoch 30/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.6116 - accuracy: 0.6781 - val_loss: 0.5969 - val_accuracy: 0.6654\n", "Epoch 31/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5547 - accuracy: 0.7129 - val_loss: 0.6014 - val_accuracy: 0.6850\n", "Epoch 32/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5935 - accuracy: 0.6776 - val_loss: 0.6197 - val_accuracy: 0.6693\n", "Epoch 33/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5645 - accuracy: 0.7356 - val_loss: 0.6228 - val_accuracy: 0.6417\n", "Epoch 34/150\n", "52/52 [==============================] - 0s 987us/step - loss: 0.6245 - accuracy: 0.6578 - val_loss: 0.6107 - val_accuracy: 0.6535\n", "Epoch 35/150\n", "52/52 [==============================] - 0s 989us/step - loss: 0.5428 - accuracy: 0.7675 - val_loss: 0.5994 - val_accuracy: 0.6890\n", "Epoch 36/150\n", "52/52 [==============================] - 0s 970us/step - loss: 0.5953 - accuracy: 0.6971 - val_loss: 0.6261 - val_accuracy: 0.6890\n", "Epoch 37/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5858 - accuracy: 0.7248 - val_loss: 0.5819 - val_accuracy: 0.6693\n", "Epoch 38/150\n", "52/52 [==============================] - 0s 998us/step - loss: 0.5452 - accuracy: 0.7160 - val_loss: 0.5914 - val_accuracy: 0.6732\n", "Epoch 39/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5896 - accuracy: 0.6789 - val_loss: 0.5888 - val_accuracy: 0.6929\n", "Epoch 40/150\n", "52/52 [==============================] - 0s 956us/step - loss: 0.5586 - accuracy: 0.7164 - val_loss: 0.6368 - val_accuracy: 0.6457\n", "Epoch 41/150\n", "52/52 [==============================] - 0s 969us/step - loss: 0.5927 - accuracy: 0.6643 - val_loss: 0.6126 - val_accuracy: 0.7008\n", "Epoch 42/150\n", "52/52 [==============================] - 0s 997us/step - loss: 0.5836 - accuracy: 0.6944 - val_loss: 0.6154 - val_accuracy: 0.7008\n", "Epoch 43/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5361 - accuracy: 0.7339 - val_loss: 0.5800 - val_accuracy: 0.6969\n", "Epoch 44/150\n", "52/52 [==============================] - 0s 997us/step - loss: 0.5262 - accuracy: 0.7535 - val_loss: 0.6061 - val_accuracy: 0.6929\n", "Epoch 45/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5554 - accuracy: 0.7004 - val_loss: 0.5792 - val_accuracy: 0.6850\n", "Epoch 46/150\n", "52/52 [==============================] - 0s 965us/step - loss: 0.5606 - accuracy: 0.6781 - val_loss: 0.5852 - val_accuracy: 0.6772\n", "Epoch 47/150\n", "52/52 [==============================] - 0s 973us/step - loss: 0.5639 - accuracy: 0.7113 - val_loss: 0.5764 - val_accuracy: 0.6969\n", "Epoch 48/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5354 - accuracy: 0.7344 - val_loss: 0.6002 - val_accuracy: 0.6693\n", "Epoch 49/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5602 - accuracy: 0.7011 - val_loss: 0.5812 - val_accuracy: 0.6969\n", "Epoch 50/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5475 - accuracy: 0.7251 - val_loss: 0.6730 - val_accuracy: 0.6732\n", "Epoch 51/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5445 - accuracy: 0.7203 - val_loss: 0.5788 - val_accuracy: 0.6850\n", "Epoch 52/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5392 - accuracy: 0.7112 - val_loss: 0.5773 - val_accuracy: 0.6929\n", "Epoch 53/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5730 - accuracy: 0.7155 - val_loss: 0.5772 - val_accuracy: 0.6969\n", "Epoch 54/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5495 - accuracy: 0.7403 - val_loss: 0.6254 - val_accuracy: 0.6969\n", "Epoch 55/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5082 - accuracy: 0.7600 - val_loss: 0.6080 - val_accuracy: 0.6850\n", "Epoch 56/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5177 - accuracy: 0.7308 - val_loss: 0.5666 - val_accuracy: 0.6969\n", "Epoch 57/150\n", "52/52 [==============================] - 0s 979us/step - loss: 0.5291 - accuracy: 0.7355 - val_loss: 0.5794 - val_accuracy: 0.6890\n", "Epoch 58/150\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "52/52 [==============================] - 0s 967us/step - loss: 0.5567 - accuracy: 0.7019 - val_loss: 0.6077 - val_accuracy: 0.6969\n", "Epoch 59/150\n", "52/52 [==============================] - 0s 993us/step - loss: 0.5400 - accuracy: 0.7476 - val_loss: 0.5736 - val_accuracy: 0.6850\n", "Epoch 60/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5185 - accuracy: 0.7434 - val_loss: 0.5659 - val_accuracy: 0.6929\n", "Epoch 61/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5520 - accuracy: 0.6849 - val_loss: 0.5662 - val_accuracy: 0.6969\n", "Epoch 62/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5349 - accuracy: 0.7231 - val_loss: 0.5701 - val_accuracy: 0.7047\n", "Epoch 63/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.4949 - accuracy: 0.7584 - val_loss: 0.5611 - val_accuracy: 0.6969\n", "Epoch 64/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5723 - accuracy: 0.6852 - val_loss: 0.5634 - val_accuracy: 0.7047\n", "Epoch 65/150\n", "52/52 [==============================] - 0s 975us/step - loss: 0.5511 - accuracy: 0.7065 - val_loss: 0.5770 - val_accuracy: 0.7047\n", "Epoch 66/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5775 - accuracy: 0.6794 - val_loss: 0.5892 - val_accuracy: 0.7047\n", "Epoch 67/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5238 - accuracy: 0.7243 - val_loss: 0.5615 - val_accuracy: 0.7008\n", "Epoch 68/150\n", "52/52 [==============================] - 0s 999us/step - loss: 0.5373 - accuracy: 0.7547 - val_loss: 0.5593 - val_accuracy: 0.7087\n", "Epoch 69/150\n", "52/52 [==============================] - 0s 952us/step - loss: 0.5089 - accuracy: 0.7657 - val_loss: 0.6025 - val_accuracy: 0.7008\n", "Epoch 70/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5436 - accuracy: 0.7451 - val_loss: 0.5550 - val_accuracy: 0.7087\n", "Epoch 71/150\n", "52/52 [==============================] - 0s 992us/step - loss: 0.5184 - accuracy: 0.7476 - val_loss: 0.5637 - val_accuracy: 0.6890\n", "Epoch 72/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5099 - accuracy: 0.7413 - val_loss: 0.5572 - val_accuracy: 0.7047\n", "Epoch 73/150\n", "52/52 [==============================] - 0s 969us/step - loss: 0.5305 - accuracy: 0.7389 - val_loss: 0.5628 - val_accuracy: 0.7087\n", "Epoch 74/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5103 - accuracy: 0.7463 - val_loss: 0.5572 - val_accuracy: 0.7047\n", "Epoch 75/150\n", "52/52 [==============================] - 0s 999us/step - loss: 0.5469 - accuracy: 0.7152 - val_loss: 0.5575 - val_accuracy: 0.7008\n", "Epoch 76/150\n", "52/52 [==============================] - 0s 998us/step - loss: 0.5250 - accuracy: 0.7361 - val_loss: 0.5520 - val_accuracy: 0.7126\n", "Epoch 77/150\n", "52/52 [==============================] - 0s 981us/step - loss: 0.5246 - accuracy: 0.7412 - val_loss: 0.5553 - val_accuracy: 0.7087\n", "Epoch 78/150\n", "52/52 [==============================] - 0s 996us/step - loss: 0.5350 - accuracy: 0.7060 - val_loss: 0.5689 - val_accuracy: 0.7165\n", "Epoch 79/150\n", "52/52 [==============================] - 0s 983us/step - loss: 0.5453 - accuracy: 0.7237 - val_loss: 0.5567 - val_accuracy: 0.6890\n", "Epoch 80/150\n", "52/52 [==============================] - 0s 990us/step - loss: 0.5178 - accuracy: 0.7479 - val_loss: 0.5662 - val_accuracy: 0.7087\n", "Epoch 81/150\n", "52/52 [==============================] - 0s 997us/step - loss: 0.5411 - accuracy: 0.7439 - val_loss: 0.5554 - val_accuracy: 0.7047\n", "Epoch 82/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5351 - accuracy: 0.7439 - val_loss: 0.5552 - val_accuracy: 0.7008\n", "Epoch 83/150\n", "52/52 [==============================] - 0s 997us/step - loss: 0.5470 - accuracy: 0.7072 - val_loss: 0.5577 - val_accuracy: 0.7087\n", "Epoch 84/150\n", "52/52 [==============================] - 0s 989us/step - loss: 0.5076 - accuracy: 0.7567 - val_loss: 0.5771 - val_accuracy: 0.7126\n", "Epoch 85/150\n", "52/52 [==============================] - 0s 993us/step - loss: 0.5361 - accuracy: 0.7006 - val_loss: 0.5749 - val_accuracy: 0.7205\n", "Epoch 86/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5322 - accuracy: 0.7246 - val_loss: 0.5526 - val_accuracy: 0.6890\n", "Epoch 87/150\n", "52/52 [==============================] - 0s 984us/step - loss: 0.5280 - accuracy: 0.7447 - val_loss: 0.5588 - val_accuracy: 0.7087\n", "Epoch 88/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.4960 - accuracy: 0.7652 - val_loss: 0.5586 - val_accuracy: 0.7165\n", "Epoch 89/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5107 - accuracy: 0.7502 - val_loss: 0.5674 - val_accuracy: 0.7165\n", "Epoch 90/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5256 - accuracy: 0.7245 - val_loss: 0.5567 - val_accuracy: 0.7165\n", "Epoch 91/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5188 - accuracy: 0.7406 - val_loss: 0.5502 - val_accuracy: 0.6890\n", "Epoch 92/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5194 - accuracy: 0.7496 - val_loss: 0.5669 - val_accuracy: 0.7087\n", "Epoch 93/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5212 - accuracy: 0.7429 - val_loss: 0.5942 - val_accuracy: 0.7126\n", "Epoch 94/150\n", "52/52 [==============================] - 0s 982us/step - loss: 0.5141 - accuracy: 0.7309 - val_loss: 0.5485 - val_accuracy: 0.6929\n", "Epoch 95/150\n", "52/52 [==============================] - 0s 984us/step - loss: 0.5343 - accuracy: 0.7160 - val_loss: 0.5463 - val_accuracy: 0.7008\n", "Epoch 96/150\n", "52/52 [==============================] - 0s 999us/step - loss: 0.5243 - accuracy: 0.7342 - val_loss: 0.5463 - val_accuracy: 0.7165\n", "Epoch 97/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5372 - accuracy: 0.7258 - val_loss: 0.5479 - val_accuracy: 0.7165\n", "Epoch 98/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.4842 - accuracy: 0.7610 - val_loss: 0.5523 - val_accuracy: 0.7165\n", "Epoch 99/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.4856 - accuracy: 0.7772 - val_loss: 0.5850 - val_accuracy: 0.7126\n", "Epoch 100/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.4929 - accuracy: 0.7620 - val_loss: 0.5499 - val_accuracy: 0.7047\n", "Epoch 101/150\n", "52/52 [==============================] - 0s 976us/step - loss: 0.4989 - accuracy: 0.7450 - val_loss: 0.5483 - val_accuracy: 0.7087\n", "Epoch 102/150\n", "52/52 [==============================] - 0s 978us/step - loss: 0.5290 - accuracy: 0.7150 - val_loss: 0.5543 - val_accuracy: 0.7165\n", "Epoch 103/150\n", "52/52 [==============================] - 0s 987us/step - loss: 0.5114 - accuracy: 0.7456 - val_loss: 0.5545 - val_accuracy: 0.6969\n", "Epoch 104/150\n", "52/52 [==============================] - 0s 966us/step - loss: 0.5000 - accuracy: 0.7711 - val_loss: 0.5521 - val_accuracy: 0.7008\n", "Epoch 105/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5134 - accuracy: 0.7482 - val_loss: 0.5734 - val_accuracy: 0.7126\n", "Epoch 106/150\n", "52/52 [==============================] - 0s 992us/step - loss: 0.5422 - accuracy: 0.7063 - val_loss: 0.5435 - val_accuracy: 0.7008\n", "Epoch 107/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5141 - accuracy: 0.7388 - val_loss: 0.5488 - val_accuracy: 0.6969\n", "Epoch 108/150\n", "52/52 [==============================] - 0s 997us/step - loss: 0.4824 - accuracy: 0.7869 - val_loss: 0.5493 - val_accuracy: 0.7165\n", "Epoch 109/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5201 - accuracy: 0.7434 - val_loss: 0.5826 - val_accuracy: 0.7283\n", "Epoch 110/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.4761 - accuracy: 0.7947 - val_loss: 0.5442 - val_accuracy: 0.7126\n", "Epoch 111/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5161 - accuracy: 0.7229 - val_loss: 0.5436 - val_accuracy: 0.7008\n", "Epoch 112/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5348 - accuracy: 0.7351 - val_loss: 0.5461 - val_accuracy: 0.7165\n", "Epoch 113/150\n", "52/52 [==============================] - 0s 969us/step - loss: 0.5186 - accuracy: 0.7422 - val_loss: 0.5647 - val_accuracy: 0.7205\n", "Epoch 114/150\n", "52/52 [==============================] - 0s 964us/step - loss: 0.5140 - accuracy: 0.7293 - val_loss: 0.5502 - val_accuracy: 0.7126\n", "Epoch 115/150\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "52/52 [==============================] - 0s 1ms/step - loss: 0.5172 - accuracy: 0.7330 - val_loss: 0.5624 - val_accuracy: 0.7126\n", "Epoch 116/150\n", "52/52 [==============================] - 0s 987us/step - loss: 0.5284 - accuracy: 0.7317 - val_loss: 0.5412 - val_accuracy: 0.7047\n", "Epoch 117/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.4833 - accuracy: 0.7848 - val_loss: 0.5728 - val_accuracy: 0.7283\n", "Epoch 118/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5356 - accuracy: 0.7296 - val_loss: 0.5428 - val_accuracy: 0.7205\n", "Epoch 119/150\n", "52/52 [==============================] - 0s 987us/step - loss: 0.4858 - accuracy: 0.7589 - val_loss: 0.6472 - val_accuracy: 0.6969\n", "Epoch 120/150\n", "52/52 [==============================] - 0s 997us/step - loss: 0.5861 - accuracy: 0.7313 - val_loss: 0.5434 - val_accuracy: 0.7008\n", "Epoch 121/150\n", "52/52 [==============================] - 0s 978us/step - loss: 0.5009 - accuracy: 0.7473 - val_loss: 0.5416 - val_accuracy: 0.7205\n", "Epoch 122/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5139 - accuracy: 0.7254 - val_loss: 0.5384 - val_accuracy: 0.7165\n", "Epoch 123/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.4956 - accuracy: 0.7896 - val_loss: 0.5498 - val_accuracy: 0.7165\n", "Epoch 124/150\n", "52/52 [==============================] - 0s 978us/step - loss: 0.5094 - accuracy: 0.7538 - val_loss: 0.5451 - val_accuracy: 0.7126\n", "Epoch 125/150\n", "52/52 [==============================] - 0s 969us/step - loss: 0.4979 - accuracy: 0.7501 - val_loss: 0.6062 - val_accuracy: 0.7165\n", "Epoch 126/150\n", "52/52 [==============================] - 0s 986us/step - loss: 0.5348 - accuracy: 0.7489 - val_loss: 0.5759 - val_accuracy: 0.7047\n", "Epoch 127/150\n", "52/52 [==============================] - 0s 998us/step - loss: 0.5347 - accuracy: 0.7176 - val_loss: 0.5454 - val_accuracy: 0.7165\n", "Epoch 128/150\n", "52/52 [==============================] - 0s 977us/step - loss: 0.4638 - accuracy: 0.7781 - val_loss: 0.5471 - val_accuracy: 0.7205\n", "Epoch 129/150\n", "52/52 [==============================] - 0s 950us/step - loss: 0.4854 - accuracy: 0.7789 - val_loss: 0.5585 - val_accuracy: 0.7244\n", "Epoch 130/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5051 - accuracy: 0.7263 - val_loss: 0.5514 - val_accuracy: 0.7008\n", "Epoch 131/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.4861 - accuracy: 0.7536 - val_loss: 0.5413 - val_accuracy: 0.7126\n", "Epoch 132/150\n", "52/52 [==============================] - 0s 984us/step - loss: 0.5211 - accuracy: 0.7315 - val_loss: 0.6114 - val_accuracy: 0.7047\n", "Epoch 133/150\n", "52/52 [==============================] - 0s 985us/step - loss: 0.5273 - accuracy: 0.7457 - val_loss: 0.6004 - val_accuracy: 0.7283\n", "Epoch 134/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5007 - accuracy: 0.7440 - val_loss: 0.6352 - val_accuracy: 0.7047\n", "Epoch 135/150\n", "52/52 [==============================] - 0s 981us/step - loss: 0.5464 - accuracy: 0.7297 - val_loss: 0.5383 - val_accuracy: 0.6969\n", "Epoch 136/150\n", "52/52 [==============================] - 0s 962us/step - loss: 0.5011 - accuracy: 0.7594 - val_loss: 0.5472 - val_accuracy: 0.7205\n", "Epoch 137/150\n", "52/52 [==============================] - 0s 978us/step - loss: 0.4844 - accuracy: 0.7566 - val_loss: 0.5552 - val_accuracy: 0.7087\n", "Epoch 138/150\n", "52/52 [==============================] - 0s 981us/step - loss: 0.4966 - accuracy: 0.7594 - val_loss: 0.5927 - val_accuracy: 0.7244\n", "Epoch 139/150\n", "52/52 [==============================] - 0s 994us/step - loss: 0.5000 - accuracy: 0.7674 - val_loss: 0.5811 - val_accuracy: 0.7244\n", "Epoch 140/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5375 - accuracy: 0.7253 - val_loss: 0.5885 - val_accuracy: 0.7126\n", "Epoch 141/150\n", "52/52 [==============================] - 0s 967us/step - loss: 0.4828 - accuracy: 0.7741 - val_loss: 0.5442 - val_accuracy: 0.7087\n", "Epoch 142/150\n", "52/52 [==============================] - 0s 969us/step - loss: 0.5068 - accuracy: 0.7556 - val_loss: 0.5376 - val_accuracy: 0.7126\n", "Epoch 143/150\n", "52/52 [==============================] - 0s 972us/step - loss: 0.5071 - accuracy: 0.7358 - val_loss: 0.5938 - val_accuracy: 0.7126\n", "Epoch 144/150\n", "52/52 [==============================] - 0s 975us/step - loss: 0.5362 - accuracy: 0.7247 - val_loss: 0.5434 - val_accuracy: 0.7047\n", "Epoch 145/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.5086 - accuracy: 0.7600 - val_loss: 0.5401 - val_accuracy: 0.7244\n", "Epoch 146/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.4829 - accuracy: 0.7551 - val_loss: 0.5405 - val_accuracy: 0.7047\n", "Epoch 147/150\n", "52/52 [==============================] - 0s 1ms/step - loss: 0.4995 - accuracy: 0.7499 - val_loss: 0.5591 - val_accuracy: 0.7047\n", "Epoch 148/150\n", "52/52 [==============================] - 0s 962us/step - loss: 0.4913 - accuracy: 0.7268 - val_loss: 0.5487 - val_accuracy: 0.7323\n", "Epoch 149/150\n", "52/52 [==============================] - 0s 978us/step - loss: 0.4699 - accuracy: 0.7632 - val_loss: 0.5641 - val_accuracy: 0.7244\n", "Epoch 150/150\n", "52/52 [==============================] - 0s 978us/step - loss: 0.4971 - accuracy: 0.7594 - val_loss: 0.5943 - val_accuracy: 0.7165\n" ] } ], "source": [ "# split into 67% for train and 33% for test\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=seed)\n", "\n", "# create model\n", "model = get_model()\n", "\n", "# Fit the model\n", "history = model.fit(X_train, y_train, validation_data=(X_test,y_test), epochs=150, batch_size=10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Manual k-Fold Cross Validation\n", "**The gold standard for machine learning model evaluation is - [k-fold cross validation](https://en.wikipedia.org/wiki/Cross-validation_(statistics)).**\n", "\n", "It provides a robust estimate of the performance of a model on unseen data. It does this by splitting the training dataset into `K` subsets and takes turns training models on all subsets except one which is held out, and evaluating model performance on the held out validation dataset. The process is repeated until all subsets are given an opportunity to be the held out validation set. The performance measure is then averaged across all models that are created.\n", "\n", "**Cross validation is often not used for evaluating deep learning models because of the greater computational expense.** For example k-fold cross validation is often used with 5 or 10 folds. As such, 5 or 10 models must be constructed and evaluated, greatly adding to the evaluation time of a model.\n", "\n", "Nevertheless, it when the problem is small enough or if you have sufficient compute resources, k-fold cross validation can give you a less biased estimate of the performance of your model.\n", "\n", "In the example below we use the handy [**StratifiedKFold class**](http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.StratifiedKFold.html) from the scikit-learn Python machine learning library to split up the training dataset into 10 folds. The folds are stratified, meaning that **the algorithm attempts to balance the number of instances of each class in each fold**.\n", "\n", "The example creates and evaluates 10 models using the 10 splits of the data and collects all of the scores. The verbose output for each epoch is turned off by passing verbose=0 to the fit() and evaluate() functions on the model.\n", "\n", "The performance is printed for each model and it is stored. The average and standard deviation of the model performance is then printed at the end of the run to provide a robust estimate of model accuracy." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "accuracy: 71.43%\n", "accuracy: 74.03%\n", "accuracy: 76.62%\n", "WARNING:tensorflow:5 out of the last 3910 calls to .test_function at 0x00000263A9B354C0> 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", "accuracy: 77.92%\n", "WARNING:tensorflow:5 out of the last 13 calls to .test_function at 0x00000263ACB2F9D0> 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", "accuracy: 71.43%\n", "WARNING:tensorflow:5 out of the last 13 calls to .test_function at 0x00000263A8EAFDC0> 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", "accuracy: 70.13%\n", "WARNING:tensorflow:5 out of the last 13 calls to .test_function at 0x00000263AC665B80> 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", "accuracy: 70.13%\n", "WARNING:tensorflow:5 out of the last 13 calls to .test_function at 0x00000263A8EAFDC0> 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", "accuracy: 76.62%\n", "WARNING:tensorflow:5 out of the last 13 calls to .test_function at 0x00000263A9B87CA0> 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", "accuracy: 76.32%\n", "WARNING:tensorflow:5 out of the last 13 calls to .test_function at 0x00000263ACB95DC0> 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", "accuracy: 81.58%\n", "74.62% (+/- 3.62%)\n" ] } ], "source": [ "# define 10-fold cross validation test harness\n", "kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)\n", "cvscores = []\n", "\n", "for train, test in kfold.split(X, y):\n", " # create model\n", " model = get_model()\n", " \n", " # Fit the model\n", " model.fit(X[train], y[train], epochs=150, batch_size=10, verbose=0)\n", "\n", " # evaluate the model\n", " scores = model.evaluate(X[test], y[test], verbose=0)\n", " print(\"%s: %.2f%%\" % (model.metrics_names[1], scores[1]*100))\n", " cvscores.append(scores[1] * 100)\n", " \n", "print(\"%.2f%% (+/- %.2f%%)\" % (np.mean(cvscores), np.std(cvscores)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Running the example will take less than a minute and will produce the above output." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Train/Validation Performance\n", "If you are interested how train/validation accuracy history during training, you can draw a chart of them as below:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:5 out of the last 13 calls to .test_function at 0x00000263AB2E45E0> 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": [ "# create model\n", "model = get_model()\n", "\n", "# Fit the model\n", "history = model.fit(X, y, validation_split=0.33, epochs=150, batch_size=10, verbose=0)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "history.history.keys()" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(history.history['accuracy'])\n", "plt.plot(history.history['val_accuracy'])\n", "plt.title('model accuracy')\n", "plt.ylabel('accuracy')\n", "plt.xlabel('epoch')\n", "plt.legend(['train', 'val'], loc='upper left')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(history.history['loss'])\n", "plt.plot(history.history['val_loss'])\n", "plt.title('model loss')\n", "plt.ylabel('loss')\n", "plt.xlabel('epoch')\n", "plt.legend(['train', 'val'], loc='upper left')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Summary\n", "In this post you discovered the importance of having a robust way to estimate the performance of your deep learning models on unseen data. You discovered three ways that you can estimate the performance of your deep learning models in Python using the Keras library:\n", "* Use Automatic Verification Datasets.\n", "* Use Manual Verification Datasets.\n", "* Use Manual k-Fold Cross Validation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Supplement\n", "* [Kaggle - Pima Indians Diabetes EDA](https://www.kaggle.com/michaelchen1116/pima-indians-diabetes-eda)" ] } ], "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.8.7" } }, "nbformat": 4, "nbformat_minor": 4 }