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