Plot loss and accuracy of a trained model

Pour afficher les résultats de la fonction de coût et l’accuracy, le plus simple est d’utiliser TensorBoard, comme ici, mais il y a de nombreuses situations où TensorBoard n’est pas disponible ou pas suffisant. Dans ces cas là, on recourt aux méthodes classiques.

Pour illustrer le plot, l’exemple retenu est celui d’une régression linéaire.

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow import keras


def generate_dataset():
 x_batch = np.linspace(0, 2, 100)
 y_batch = 1.5 * x_batch + np.random.randn(*x_batch.shape) * 0.2 + 0.5
 return x_batch, y_batch

xs, ys = generate_dataset()
plt.figure()
plt.scatter(xs, ys)
plt.show()
model = keras.Sequential([
    keras.layers.Dense(1, input_dim=1),
])

model.compile(loss="mean_squared_error", optimizer="sgd")
history = model.fit(xs, ys, epochs=500)
to_predict=np.array([10,11,12,13])
print(model.predict(to_predict))
[14.973569]
[16.421339]
[17.869108]
[19.316877]
plt.plot(history.epoch, history.history["loss"], 'g', label='Training loss')
plt.title('Training loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

On utilise history pour afficher la perte.

Si on regarde history au debugger, on retrouve tous les paramètres du fit.

Le code, sur GCP, avec TensorBoard :

Il existe une autre façon d’utiliser TensorBoard sur GCP, en contrôlant les données enregistrées.

Avec tf.summary.

%reload_ext tensorboard
model=create_model()
!rm -rf /tmp/newlogs
current_time = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
train_log_dir = '/tmp/newlogs/' + current_time + '/train'
writer = tf.summary.create_file_writer(train_log_dir)
train_loss = tf.keras.metrics.Mean('train_loss', dtype=tf.float32)
def train_step(model, optimizer, x_train, y_train):
  with tf.GradientTape() as tape:
    predictions = model(x_train, training=True)
    loss = loss_object(y_train, predictions)
  grads = tape.gradient(loss, model.trainable_variables)
  optimizer.apply_gradients(zip(grads, model.trainable_variables))

  train_loss(loss)
for epoch in range(EPOCHS):
  for (x_train, y_train) in train_dataset:
    train_step(model, optimizer, x_train, y_train)
  with writer.as_default():
    tf.summary.scalar('loss', train_loss.result(), step=epoch)

  train_loss.reset_states()
%tensorboard --logdir /tmp/newlogs/20200430-120334/train