Build, compile and train machine learning (ML) models

Intéressons nous ici à un modèle très simple qu’on peut construire, compiler et entraîner, une sorte de « Hello World » de TensorFlow.

Il y a un exemple sur le site de Tf : TensorFlow 2 quickstart for beginners. Le jeu de données est MNIST.

import tensorflow as tf
print (tf.__version__)
2.0.0
# Lecture du dataset
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

Les images MNIST sont carrées en 28.

Le jeu de données est préalablement réparti entre train et test.

x_train, x_test = x_train / 255.0, x_test / 255.0

Voici ce que dit A. Géron :

Moreover, since we are going to train the neural network using Gradient Descent, we must scale the input features. For simplicity, we just scale the pixel intensities down to the 0-1 range by dividing them by 255.0 (this also converts them to floats):

A vrai dire, ce n’est pas obligatoire dans notre cas en terme d’exécution mais les performantes sont différentes. Si on ne le fait pas, l’accuracy est de 84% alors que si on le fait, l’accuracy est supérieure à 97% ! preuve que si ce n’est pas obligatoire c’est fortement recommandé !

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10)
])

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

La fonction de coût préférée, dans le cas d’une classification non binaire, est SparseCategoricalCrossentropy

model.compile(optimizer='adam',
              loss=loss_fn,
              metrics=['accuracy'])

model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
flatten (Flatten)            (None, 784)               0         
_________________________________________________________________
dense (Dense)                (None, 128)               100480    
_________________________________________________________________
dropout (Dropout)            (None, 128)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 10)                1290      
=================================================================
Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0
_________________________________________________________________
model.fit(x_train, y_train, epochs=5)
Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 19s 315us/sample - loss: 0.3000 - accuracy: 0.9128
Epoch 2/5
60000/60000 [==============================] - 16s 269us/sample - loss: 0.1476 - accuracy: 0.9561
Epoch 3/5
60000/60000 [==============================] - 16s 271us/sample - loss: 0.1076 - accuracy: 0.9675
Epoch 4/5
60000/60000 [==============================] - 17s 279us/sample - loss: 0.0884 - accuracy: 0.9723
Epoch 5/5
60000/60000 [==============================] - 17s 275us/sample - loss: 0.0765 - accuracy: 0.9760