Build sequential models with multiple layers

Keras est l’API par excellence pour créer des modèles séquentiels.

Il y a 3 façons de créer des modèles (voir tutoriel GCP)

  • Programmation symbolique – Modèle séquentiel
  • Programmation symbolique – Modèle fonctionnel
  • Programmation impérative (Model Subclassing)

Le mode séquentiel est à privilégier car c’est le plus simple. Il est parfaitement adapté à la majorité des cas.

import pdb
import tensorflow as tf
print(tf.__version__)

mnist = tf.keras.datasets.mnist

# Le dataset est préalablement réparti entre train et test
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

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)

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

model.summary()
model.fit(x_train, y_train, epochs=5)

print(model.evaluate(x_test,  y_test, verbose=1))

Ce modèle n’est pas très compliqué et c’est exactement le même principe que l’on met en oeuvre pour avoir de multiples couches.

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
_________________________________________________________________
_________________________________________________________________
Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 19s 310us/sample - loss: 0.2974 - accuracy: 0.9133
Epoch 2/5
60000/60000 [==============================] - 16s 268us/sample - loss: 0.1432 - accuracy: 0.9573
Epoch 3/5
60000/60000 [==============================] - 18s 292us/sample - loss: 0.1082 - accuracy: 0.9676
Epoch 4/5
60000/60000 [==============================] - 18s 303us/sample - loss: 0.0876 - accuracy: 0.9732
Epoch 5/5
60000/60000 [==============================] - 14s 236us/sample - loss: 0.0747 - accuracy: 0.9767
[0.07470446648886428, 0.9777]

Une autre façon d’écrire (assez fréquente) :

import tensorflow as tf
import pdb

print("Tensorflow version " + tf.__version__)

from tensorflow.keras import datasets, layers, models
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout
from tensorflow.keras.datasets import mnist


mnist = datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0


model = Sequential([
    Flatten(input_shape=(28, 28)),
    Dense(128, activation='relu'),
    Dropout(0.2),
    Dense(10)
])

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

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

model.summary()
model.fit(x_train, y_train, epochs=5)

Il existe quelques autres façons de construire un modèle de façon séquentielle. Voir ici.