CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
better-data-science

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual use to large groups and classes!

GitHub Repository: better-data-science/TensorFlow
Path: blob/main/004_Optimizing_Learning_Rate.ipynb
Views: 47
Kernel: Python 3.9.7 64-bit ('env_tensorflow': conda)
import os import numpy as np import pandas as pd import warnings os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' warnings.filterwarnings('ignore') df = pd.read_csv('data/winequalityN.csv') df.sample(5)
from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # Prepare the data df = df.dropna() df['is_white_wine'] = [1 if typ == 'white' else 0 for typ in df['type']] df['is_good_wine'] = [1 if quality >= 6 else 0 for quality in df['quality']] df.drop(['type', 'quality'], axis=1, inplace=True) # Train/test split X = df.drop('is_good_wine', axis=1) y = df['is_good_wine'] X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # Scaling scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test)
X_train_scaled[:3]
array([[-0.86265684, 0.56588915, 0.22079121, 0.75048207, 0.07674805, 2.9415276 , 2.35882933, 0.788386 , 0.94784355, -0.20357893, -1.66472797, 0.57094748], [ 0.99186667, -1.02945526, 2.92098728, -0.3929423 , -0.17512717, -0.08344183, 0.21383119, -0.64578381, 0.38700578, -0.87653487, 1.63149383, 0.57094748], [-1.55810316, -0.72265826, 0.98238498, 0.14758559, 0.27265101, 0.5887736 , 1.25973937, -0.37229096, -0.17383198, -0.74194369, -0.62233304, 0.57094748]])

Training a model which finds the optimal learning rate

import tensorflow as tf tf.random.set_seed(42)
Init Plugin Init Graph Optimizer Init Kernel
  • This will be the minimum and maximum values for our learning rate:

1e-3 * 10 ** (1 / 30), 1e-3 * 10 ** (100 / 30)
(0.0010797751623277097, 2.1544346900318847)
  • You can pass it as a LearningRateScheduler callback when fitting the model:

initial_model = tf.keras.Sequential([ tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(256, activation='relu'), tf.keras.layers.Dense(256, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid') ]) initial_model.compile( loss=tf.keras.losses.binary_crossentropy, optimizer=tf.keras.optimizers.Adam(), metrics=[ tf.keras.metrics.BinaryAccuracy(name='accuracy') ] ) initial_history = initial_model.fit( X_train_scaled, y_train, epochs=100, callbacks=[ tf.keras.callbacks.LearningRateScheduler( lambda epoch: 1e-3 * 10 ** (epoch / 30) ) ] )
Epoch 1/100 162/162 [==============================] - 1s 5ms/step - loss: 0.5216 - accuracy: 0.7362 Epoch 2/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4935 - accuracy: 0.7615 Epoch 3/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4793 - accuracy: 0.7712 Epoch 4/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4642 - accuracy: 0.7774 Epoch 5/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4552 - accuracy: 0.7822 Epoch 6/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4473 - accuracy: 0.7896 Epoch 7/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4438 - accuracy: 0.7896 Epoch 8/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4346 - accuracy: 0.7965 Epoch 9/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4276 - accuracy: 0.8014 Epoch 10/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4243 - accuracy: 0.8044 Epoch 11/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4202 - accuracy: 0.8048 Epoch 12/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4084 - accuracy: 0.8091 Epoch 13/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4064 - accuracy: 0.8116 Epoch 14/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3989 - accuracy: 0.8182 Epoch 15/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4006 - accuracy: 0.8157 Epoch 16/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3897 - accuracy: 0.8236 Epoch 17/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3832 - accuracy: 0.8244 Epoch 18/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3817 - accuracy: 0.8236 Epoch 19/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3847 - accuracy: 0.8253 Epoch 20/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3874 - accuracy: 0.8271 Epoch 21/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3802 - accuracy: 0.8280 Epoch 22/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3743 - accuracy: 0.8317 Epoch 23/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3767 - accuracy: 0.8280 Epoch 24/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3664 - accuracy: 0.8342 Epoch 25/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3747 - accuracy: 0.8317 Epoch 26/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3679 - accuracy: 0.8329 Epoch 27/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3832 - accuracy: 0.8284 Epoch 28/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3761 - accuracy: 0.8300 Epoch 29/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3824 - accuracy: 0.8238 Epoch 30/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3868 - accuracy: 0.8153 Epoch 31/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3919 - accuracy: 0.8207 Epoch 32/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3892 - accuracy: 0.8205 Epoch 33/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4082 - accuracy: 0.8095 Epoch 34/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4081 - accuracy: 0.8139 Epoch 35/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4056 - accuracy: 0.8116 Epoch 36/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4239 - accuracy: 0.8044 Epoch 37/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4409 - accuracy: 0.7886 Epoch 38/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4263 - accuracy: 0.8074 Epoch 39/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4468 - accuracy: 0.7963 Epoch 40/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4474 - accuracy: 0.7861 Epoch 41/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4868 - accuracy: 0.7632 Epoch 42/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4518 - accuracy: 0.7805 Epoch 43/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4736 - accuracy: 0.7660 Epoch 44/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4935 - accuracy: 0.7567 Epoch 45/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4715 - accuracy: 0.7710 Epoch 46/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4703 - accuracy: 0.7799 Epoch 47/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4620 - accuracy: 0.7729 Epoch 48/100 162/162 [==============================] - 1s 5ms/step - loss: 0.5171 - accuracy: 0.7464 Epoch 49/100 162/162 [==============================] - 1s 5ms/step - loss: 0.5518 - accuracy: 0.7091 Epoch 50/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6125 - accuracy: 0.6868 Epoch 51/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6465 - accuracy: 0.6476 Epoch 52/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6167 - accuracy: 0.6472 Epoch 53/100 162/162 [==============================] - 1s 5ms/step - loss: 0.5946 - accuracy: 0.6350 Epoch 54/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6347 - accuracy: 0.6259 Epoch 55/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6576 - accuracy: 0.6344 Epoch 56/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6581 - accuracy: 0.6344 Epoch 57/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6596 - accuracy: 0.6344 Epoch 58/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6587 - accuracy: 0.6344 Epoch 59/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6572 - accuracy: 0.6344 Epoch 60/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6578 - accuracy: 0.6344 Epoch 61/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6602 - accuracy: 0.6344 Epoch 62/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6591 - accuracy: 0.6344 Epoch 63/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6599 - accuracy: 0.6344 Epoch 64/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6585 - accuracy: 0.6344 Epoch 65/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6601 - accuracy: 0.6344 Epoch 66/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6602 - accuracy: 0.6344 Epoch 67/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6604 - accuracy: 0.6344 Epoch 68/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6588 - accuracy: 0.6344 Epoch 69/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6611 - accuracy: 0.6344 Epoch 70/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6622 - accuracy: 0.6344 Epoch 71/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6596 - accuracy: 0.6344 Epoch 72/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6609 - accuracy: 0.6294 Epoch 73/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6636 - accuracy: 0.6313 Epoch 74/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6622 - accuracy: 0.6344 Epoch 75/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6628 - accuracy: 0.6344 Epoch 76/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6625 - accuracy: 0.6344 Epoch 77/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6632 - accuracy: 0.6275 Epoch 78/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6628 - accuracy: 0.6313 Epoch 79/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6619 - accuracy: 0.6344 Epoch 80/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6610 - accuracy: 0.6344 Epoch 81/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6643 - accuracy: 0.6344 Epoch 82/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6708 - accuracy: 0.6201 Epoch 83/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6691 - accuracy: 0.6344 Epoch 84/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6677 - accuracy: 0.6217 Epoch 85/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6785 - accuracy: 0.6116 Epoch 86/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6675 - accuracy: 0.6201 Epoch 87/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6683 - accuracy: 0.6251 Epoch 88/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6714 - accuracy: 0.6232 Epoch 89/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6692 - accuracy: 0.6244 Epoch 90/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6775 - accuracy: 0.6081 Epoch 91/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6733 - accuracy: 0.6124 Epoch 92/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6802 - accuracy: 0.6054 Epoch 93/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6675 - accuracy: 0.6213 Epoch 94/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6663 - accuracy: 0.6306 Epoch 95/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6735 - accuracy: 0.6178 Epoch 96/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6807 - accuracy: 0.6104 Epoch 97/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6811 - accuracy: 0.6015 Epoch 98/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6855 - accuracy: 0.5938 Epoch 99/100 162/162 [==============================] - 1s 5ms/step - loss: 0.7143 - accuracy: 0.5807 Epoch 100/100 162/162 [==============================] - 1s 5ms/step - loss: 0.6812 - accuracy: 0.5950
  • The accuracy was terrible at the end - makes sense as our model had a huge learning rate

  • Let's plot loss vs. accuracy vs. learning rate:

import matplotlib.pyplot as plt from matplotlib import rcParams rcParams['figure.figsize'] = (18, 8) rcParams['axes.spines.top'] = False rcParams['axes.spines.right'] = False
plt.plot(np.arange(1, 101), initial_history.history['loss'], label='Loss', lw=3) plt.plot(np.arange(1, 101), initial_history.history['accuracy'], label='Accuracy', lw=3) plt.plot(np.arange(1, 101), initial_history.history['lr'], label='Learning rate', color='#000', lw=3, linestyle='--') plt.title('Evaluation metrics', size=20) plt.xlabel('Epoch', size=14) plt.legend() plt.savefig('eval_vs_lr.jpg', dpi=300, bbox_inches='tight');
Image in a Jupyter notebook
  • Accuracy dipped significantly around epoch 50, then flattened, and dipped once again towards the end

  • The exact opposite happened to loss

  • Let's now plot the learning rate against loss:

learning_rates = 1e-3 * (10 ** (np.arange(100) / 30)) plt.semilogx(learning_rates, initial_history.history['loss'], lw=3, color='#000') plt.title('Learning rate vs. loss', size=20) plt.xlabel('Learning rate', size=14) plt.ylabel('Loss', size=14) plt.savefig('lr_vs_loss.jpg', dpi=300, bbox_inches='tight');
Image in a Jupyter notebook

Training a model with the optimal learning rate

  • You're looking for a learning rate value that achieved minimum loss

  • Looks like 0.007 works the best for this dataset

  • Let's retrain the model:

model_optimized = tf.keras.Sequential([ tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(256, activation='relu'), tf.keras.layers.Dense(256, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid') ]) model_optimized.compile( loss=tf.keras.losses.binary_crossentropy, optimizer=tf.keras.optimizers.Adam(learning_rate=0.007), metrics=[ tf.keras.metrics.BinaryAccuracy(name='accuracy') ] ) history_optimized = model_optimized.fit( X_train_scaled, y_train, epochs=100 )
Epoch 1/100 162/162 [==============================] - 1s 5ms/step - loss: 0.5336 - accuracy: 0.7412 Epoch 2/100 162/162 [==============================] - 1s 5ms/step - loss: 0.5084 - accuracy: 0.7565 Epoch 3/100 162/162 [==============================] - 1s 5ms/step - loss: 0.5006 - accuracy: 0.7636 Epoch 4/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4867 - accuracy: 0.7700 Epoch 5/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4807 - accuracy: 0.7710 Epoch 6/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4736 - accuracy: 0.7783 Epoch 7/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4738 - accuracy: 0.7737 Epoch 8/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4617 - accuracy: 0.7868 Epoch 9/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4571 - accuracy: 0.7892 Epoch 10/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4512 - accuracy: 0.7899 Epoch 11/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4460 - accuracy: 0.7909 Epoch 12/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4296 - accuracy: 0.8025 Epoch 13/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4284 - accuracy: 0.8048 Epoch 14/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4167 - accuracy: 0.8054 Epoch 15/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4234 - accuracy: 0.8029 Epoch 16/100 162/162 [==============================] - 1s 5ms/step - loss: 0.4071 - accuracy: 0.8145 Epoch 17/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3873 - accuracy: 0.8221 Epoch 18/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3872 - accuracy: 0.8190 Epoch 19/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3732 - accuracy: 0.8284 Epoch 20/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3743 - accuracy: 0.8292 Epoch 21/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3604 - accuracy: 0.8387 Epoch 22/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3482 - accuracy: 0.8385 Epoch 23/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3482 - accuracy: 0.8400 Epoch 24/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3339 - accuracy: 0.8524 Epoch 25/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3266 - accuracy: 0.8520 Epoch 26/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3272 - accuracy: 0.8503 Epoch 27/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3154 - accuracy: 0.8573 Epoch 28/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2986 - accuracy: 0.8673 Epoch 29/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2985 - accuracy: 0.8669 Epoch 30/100 162/162 [==============================] - 1s 5ms/step - loss: 0.3024 - accuracy: 0.8636 Epoch 31/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2941 - accuracy: 0.8662 Epoch 32/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2696 - accuracy: 0.8809 Epoch 33/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2608 - accuracy: 0.8810 Epoch 34/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2703 - accuracy: 0.8772 Epoch 35/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2614 - accuracy: 0.8799 Epoch 36/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2588 - accuracy: 0.8799 Epoch 37/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2458 - accuracy: 0.8938 Epoch 38/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2268 - accuracy: 0.8948 Epoch 39/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2381 - accuracy: 0.8917 Epoch 40/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2109 - accuracy: 0.9081 Epoch 41/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2115 - accuracy: 0.9108 Epoch 42/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2214 - accuracy: 0.9019 Epoch 43/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2155 - accuracy: 0.9006 Epoch 44/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1960 - accuracy: 0.9114 Epoch 45/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2055 - accuracy: 0.9083 Epoch 46/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1986 - accuracy: 0.9103 Epoch 47/100 162/162 [==============================] - 1s 5ms/step - loss: 0.2025 - accuracy: 0.9074 Epoch 48/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1857 - accuracy: 0.9164 Epoch 49/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1890 - accuracy: 0.9205 Epoch 50/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1598 - accuracy: 0.9280 Epoch 51/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1646 - accuracy: 0.9261 Epoch 52/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1656 - accuracy: 0.9242 Epoch 53/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1925 - accuracy: 0.9209 Epoch 54/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1648 - accuracy: 0.9315 Epoch 55/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1590 - accuracy: 0.9327 Epoch 56/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1537 - accuracy: 0.9337 Epoch 57/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1706 - accuracy: 0.9282 Epoch 58/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1659 - accuracy: 0.9292 Epoch 59/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1648 - accuracy: 0.9292 Epoch 60/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1484 - accuracy: 0.9402 Epoch 61/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1196 - accuracy: 0.9493 Epoch 62/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1523 - accuracy: 0.9360 Epoch 63/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1524 - accuracy: 0.9338 Epoch 64/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1294 - accuracy: 0.9418 Epoch 65/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1278 - accuracy: 0.9435 Epoch 66/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1407 - accuracy: 0.9422 Epoch 67/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1350 - accuracy: 0.9453 Epoch 68/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1698 - accuracy: 0.9329 Epoch 69/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1398 - accuracy: 0.9449 Epoch 70/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1279 - accuracy: 0.9487 Epoch 71/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1359 - accuracy: 0.9435 Epoch 72/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1216 - accuracy: 0.9503 Epoch 73/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1336 - accuracy: 0.9462 Epoch 74/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1036 - accuracy: 0.9569 Epoch 75/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1303 - accuracy: 0.9505 Epoch 76/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1251 - accuracy: 0.9544 Epoch 77/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1051 - accuracy: 0.9602 Epoch 78/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1327 - accuracy: 0.9482 Epoch 79/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1199 - accuracy: 0.9540 Epoch 80/100 162/162 [==============================] - 1s 5ms/step - loss: 0.0989 - accuracy: 0.9573 Epoch 81/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1213 - accuracy: 0.9524 Epoch 82/100 162/162 [==============================] - 1s 5ms/step - loss: 0.0965 - accuracy: 0.9607 Epoch 83/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1271 - accuracy: 0.9540 Epoch 84/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1013 - accuracy: 0.9611 Epoch 85/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1122 - accuracy: 0.9551 Epoch 86/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1046 - accuracy: 0.9609 Epoch 87/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1017 - accuracy: 0.9594 Epoch 88/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1136 - accuracy: 0.9530 Epoch 89/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1291 - accuracy: 0.9513 Epoch 90/100 162/162 [==============================] - 1s 5ms/step - loss: 0.0866 - accuracy: 0.9656 Epoch 91/100 162/162 [==============================] - 1s 5ms/step - loss: 0.0928 - accuracy: 0.9640 Epoch 92/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1095 - accuracy: 0.9571 Epoch 93/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1008 - accuracy: 0.9621 Epoch 94/100 162/162 [==============================] - 1s 5ms/step - loss: 0.0708 - accuracy: 0.9739 Epoch 95/100 162/162 [==============================] - 1s 5ms/step - loss: 0.0923 - accuracy: 0.9677 Epoch 96/100 162/162 [==============================] - 1s 5ms/step - loss: 0.0844 - accuracy: 0.9642 Epoch 97/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1246 - accuracy: 0.9551 Epoch 98/100 162/162 [==============================] - 1s 5ms/step - loss: 0.1174 - accuracy: 0.9545 Epoch 99/100 162/162 [==============================] - 1s 5ms/step - loss: 0.0821 - accuracy: 0.9700 Epoch 100/100 162/162 [==============================] - 1s 5ms/step - loss: 0.0996 - accuracy: 0.9596
  • Susipiciously high training accuracy - possible overfit

  • Let's plot loss vs. accuracy:

plt.plot(np.arange(1, 101), history_optimized.history['loss'], label='Loss', lw=3) plt.plot(np.arange(1, 101), history_optimized.history['accuracy'], label='Accuracy', lw=3) plt.title('Accuracy vs. Loss per epoch', size=20) plt.xlabel('Epoch', size=14) plt.legend() plt.savefig('accuracy_per_epoch.jpg', dpi=300, bbox_inches='tight');
Image in a Jupyter notebook

# Model evaluation on the test set - Let's now make predictions, convert them to classes and print accuracy and confusion matrix:
predictions = model_optimized.predict(X_test_scaled) predictions
array([[0.9578252], [0.9969375], [0.9997428], ..., [0.9999573], [0.660783 ], [0.4924225]], dtype=float32)
prediction_classes = [1 if prob > 0.5 else 0 for prob in np.ravel(predictions)] print(prediction_classes[:20])
[1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1]
from sklearn.metrics import confusion_matrix from sklearn.metrics import accuracy_score print(f'Accuracy on the test set: {accuracy_score(y_test, prediction_classes):.2f}') print() print('Confusion matrix:') print(confusion_matrix(y_test, prediction_classes))
Accuracy on the test set: 0.79 Confusion matrix: [[348 134] [135 676]]
  • The accuracy on the test set increased by 3% compared to the default learning rate (0.001) used in the previous notebook