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.