🧩 Keras – L'API "Humaine" du Deep Learning
Guide complet IDEO-Lab : API tf.keras, Sequential, Functional, compile, fit.
Vue d'ensemble
API Haut Niveau pour TensorFlow (tf.keras). "Deep Learning for humans".
Pourquoi Keras ?
Simplicité (vs PyTorch), prototypage rapide, API simple.
Simplicité R&DInstallation
Keras est **inclus** dans TensorFlow. pip install tensorflow.
🔁 Le Workflow Keras
compile(), fit(), evaluate(), predict().
Modèle 1 : Sequential
Modèle simple : une pile linéaire de couches.
Sequential ModèleModèle 2 : API Fonctionnelle
Modèles complexes (multi-input, multi-output, "ResNet").
Functional API ModèleModèle 3 : Subclassing
Hériter de keras.Model (Style PyTorch). Contrôle total.
Layers (Core)
Input, Dense, Activation, Flatten, Dropout.
Layers (CNN - Vision)
Conv2D, MaxPooling2D, BatchNormalization.
Layers (RNN - Texte)
Embedding, LSTM, GRU, TextVectorization.
Gestion des Données
Intégration tf.data.Dataset (perf) ou NumPy (simple).
Sauvegarde & Chargement
model.save(), load_model(). (SavedModel ou .h5).
.compile() (Loss)
Fonctions de Perte. 'binary_crossentropy', 'mse'...
.compile() (Optimizer)
Optimiseurs. 'adam', 'sgd', 'rmsprop'.
.fit() (Entraînement)
epochs, batch_size, validation_data.
Callbacks (.fit())
EarlyStopping, ModelCheckpoint (sauvegarde).
Évaluation & Prédiction
model.evaluate() (Test set), model.predict() (Nouveau).
Écosystème
KerasCV, KerasNLP. Déploiement (TFX, TF Lite, TF.js).
KerasCV TF LiteVitrine (Qui l'utilise ?)
Netflix, NASA, Uber, CERN. (Tous ceux qui utilisent TF).
Netflix NASALiens Utiles & Formation
keras.io (Docs), Guides tensorflow.org/keras.
Cheat-sheet
Workflow complet : Sequential, compile, fit.
cheat WorkflowQu'est-ce que Keras ?
Keras est une **API (interface) haut niveau** de Deep Learning, écrite en Python, créée par François Chollet.
Sa philosophie est d'être **simple, flexible et puissante** ("Deep Learning for humans"). Elle abstrait la complexité mathématique (Tensors, Gradients).
Keras & TensorFlow
Historiquement, Keras était une API "multi-backend" (pouvait tourner sur Theano, CNTK ou TensorFlow).
Depuis 2019 (TensorFlow 2.0), Keras est devenu l'API haut niveau **officielle et intégrée** de TensorFlow. On l'utilise via tensorflow.keras (ou tf.keras).
Diagramme : La Place de Keras
+-------------------------+
| Utilisateur (Vous) |
+-------------------------+
| (API Simple)
▼
+-------------------------+
| Keras (tf.keras) |
| (Layers, Model, fit()) |
+-------------------------+
| (Moteur "backend")
▼
+-------------------------+
| TensorFlow (Core) |
| (Tensors, Gradients, Graph)|
+-------------------------+
| (Exécution)
▼
[ CPU / GPU / TPU ]
Le Problème (TF 1.x / PyTorch)
Écrire un réseau en TensorFlow 1.x (graphes statiques) ou même en PyTorch (boucle manuelle) est verbeux. Il faut gérer :
- La boucle d'entraînement (
for epoch...) - La boucle sur les batchs (
for inputs...) - La RAZ des gradients (
zero_grad()) - Le Forward pass (
model(inputs)) - Le calcul de la Loss (
criterion(...)) - Le Backward pass (
loss.backward()) - La mise à jour des poids (
optimizer.step())
La Solution (.fit())
Keras masque **toute** cette complexité (vue en 1.1) dans trois commandes simples :
model.compile(...): "Quoi optimiser et comment le mesurer ?"model.fit(...): "Entraîne-toi sur ces données pendant X epochs."model.evaluate(...): "Quel est ton score final ?"
C'est l'API **idéale pour le prototypage rapide**, l'enseignement, et la plupart des applications standards de ML/DL.
Keras n'est **pas** un paquet séparé. Il est **inclus** dans tensorflow.
(Si vous voyez pip install keras, c'est l'ancienne version "multi-backend" ou le nouveau "Keras Core 3.0" qui est différent. Pour 99% des usages, on utilise tf.keras).
Installation (via TensorFlow)
# 1. (Recommandé) Créer un environnement virtuel python -m venv tf_env source tf_env/bin/activate # 2. Installer TensorFlow (Keras est inclus) pip install tensorflow # 3. Import en Python import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers print(tf.__version__)
compile, fit, evaluate)C'est le "diagramme mental" de Keras. 90% des modèles suivent ce flux.
from tensorflow import keras
from tensorflow.keras import layers
# --- 1. Définir le Modèle (Architecture) ---
model = keras.Sequential([
layers.Dense(64, activation='relu', input_shape=(784,)),
layers.Dense(10, activation='softmax')
])
# --- 2. Compiler le Modèle (Configurer) ---
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# --- 3. Entraîner le Modèle (Apprentissage) ---
model.fit(
x_train,
y_train,
epochs=5,
batch_size=32,
validation_data=(x_val, y_val)
)
# --- 4. Évaluer le Modèle (Test) ---
results = model.evaluate(x_test, y_test)
print(f"Test Loss: {results[0]}, Test Accuracy: {results[1]}")
# --- 5. Prédire (Inférence) ---
predictions = model.predict(x_new_data)
SequentialLe Sequential est le modèle le plus simple. C'est une pile linéaire de couches. (Parfait pour les CNN, MLP, et RNN simples).
Syntaxe 1 : Liste dans le constructeur (Préférée)
model = keras.Sequential([
layers.Conv2D(32, (3,3), activation='relu', input_shape=(28, 28, 1)),
layers.MaxPooling2D((2,2)),
layers.Flatten(),
layers.Dense(10, activation='softmax')
], name="mon_cnn_simple")
Syntaxe 2 : .add()
model = keras.Sequential(name="mon_cnn_simple") model.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=(28, 28, 1))) model.add(layers.MaxPooling2D((2,2))) model.add(layers.Flatten()) model.add(layers.Dense(10, activation='softmax')) // Visualiser le modèle model.summary()
L'API Fonctionnelle est utilisée pour les modèles complexes : graphes (non-linéaires), multi-input, multi-output, ou connexions résiduelles (ResNet).
L'idée : 1. Définir un Input. 2. "Appeler" les couches sur les Tensors. 3. Définir le Model.
Exemple (Multi-Input)
from tensorflow.keras import Model from tensorflow.keras.layers import Input, Dense, concatenate # 1. Définir les Entrées input_A = Input(shape=(32,), name="Input_Texte") input_B = Input(shape=(64,), name="Input_Metadata") # 2. Branche A x = Dense(16, activation='relu')(input_A) # 3. Branche B y = Dense(32, activation='relu')(input_B) # 4. Combiner (Concaténer) combined = concatenate([x, y]) # 5. Sortie output = Dense(1, activation='sigmoid', name="Output")(combined) # 6. Créer le Modèle model = Model(inputs=[input_A, input_B], outputs=output) model.summary()
Pour un contrôle total (ex: R&D), on peut hériter de keras.Model (similaire à nn.Module en PyTorch).
__init__(self): Définir les couches (qui ont des poids).call(self, x): Définir le "forward pass" (la logique).
Exemple (Modèle simple)
class SimpleNet(keras.Model):
def __init__(self):
super(SimpleNet, self).__init__()
# 1. Définir les couches
self.dense1 = layers.Dense(64, activation='relu')
self.dense2 = layers.Dense(10, activation='softmax')
def call(self, inputs):
# 2. Définir la logique "forward"
x = self.dense1(inputs)
return self.dense2(x)
# Instancier
model = SimpleNet()
Inconvénient : Plus difficile à déboguer et model.summary() ne montre pas les connexions (car défini en runtime).
Couche (layers.*) | Description |
|---|---|
Input | Définit la shape d'entrée (pour l'API Fonctionnelle). |
Dense | Couche "Fully-Connected" (y = W*x + b). La couche la plus commune. |
Activation | Applique une fonction d'activation ('relu', 'sigmoid', 'softmax'). (Souvent intégré dans Dense(activation=...)). |
Flatten | Aplatit un tensor (ex: (Batch, 28, 28) -> (Batch, 784)) pour connecter un CNN à un Dense. |
Dropout | Régularisation. "Éteint" aléatoirement des neurones (pendant l'entraînement) pour éviter l'overfitting. |
(Pour les Réseaux de Neurones Convolutifs - Vision par Ordinateur)
Couche (layers.*) | Description |
|---|---|
Conv2D | (Convolution) L'opération principale. Applique des "filtres" (kernels) pour détecter des features (contours, textures...). |
MaxPooling2D | (Pooling) Réduit la taille de l'image (Downsampling) en gardant la valeur max (ex: 2x2 -> 1x1). Réduit le coût de calcul. |
AveragePooling2D | Similaire à Max, mais prend la moyenne. |
BatchNormalization | Normalise la sortie d'une couche. Accélère et stabilise l'entraînement. |
(Pour les Réseaux Récurrents - NLP, Séries Temporelles)
Couche (layers.*) | Description |
|---|---|
TextVectorization | Couche de preprocessing (intégrée) qui transforme le texte (string) en tokens (IDs entiers). |
Embedding | Couche (obligatoire) pour le NLP. Transforme les tokens (IDs) en vecteurs denses (Word Embeddings). |
LSTM (Long Short-Term Memory) | Couche récurrente (avec "mémoire") pour traiter les séquences. |
GRU (Gated Recurrent Unit) | Alternative plus simple (et souvent aussi performante) que LSTM. |
model.fit() accepte plusieurs types d'entrées :
1. NumPy Arrays (Simple)
Pour les petits datasets qui tiennent en mémoire (RAM).
(x_train, y_train) = load_mnist_data() // x_train est un array NumPy model.fit(x_train, y_train, ...)
2. tf.data.Dataset (Performant)
Pour les gros datasets (streaming depuis le disque) ou le preprocessing à la volée.
// (Voir le guide TensorFlow 4.2) dataset = tf.data.Dataset.from_tensor_slices(...) dataset = dataset.map(preprocess_fn) dataset = dataset.batch(32) dataset = dataset.prefetch(tf.data.AUTOTUNE) model.fit(dataset, epochs=5)
Sauvegarder l'architecture ET les poids (weights) du modèle après l'entraînement.
Format SavedModel (Dossier)
Format par défaut de TF 2.x. Sauvegarde tout (poids, architecture, traces @tf.function) dans un dossier. Requis pour TF Serving ou TFX.
# 1. Sauvegarder
model.save("mon_modele_dossier")
# 2. Charger
new_model = keras.models.load_model("mon_modele_dossier")
Format .h5 (Fichier unique HDF5)
L'ancien format Keras. Pratique (fichier unique) mais moins complet que SavedModel.
# 1. Sauvegarder (en spécifiant .h5)
model.save("mon_modele.h5")
# 2. Charger
new_model = keras.models.load_model("mon_modele.h5")
.compile() : Loss & MétriquesLoss (Perte) : Ce que le modèle doit minimiser. (L'erreur).
| Tâche | Loss (String ou keras.losses.*) | Description |
|---|---|---|
| Classification Binaire | 'binary_crossentropy' | (1 sortie, activation 'sigmoid'). |
| Classification Multi-classe | 'categorical_crossentropy' | (N sorties, 'softmax'). y doit être en One-Hot (ex: [0, 0, 1]). |
| Classification Multi-classe | 'sparse_categorical_crossentropy' | (N sorties, 'softmax'). y est un entier (ex: 2). (Préféré). |
| Régression | 'mean_squared_error' (MSE) | (1 sortie, 'linear'). |
Metrics : Ce que l'on veut surveiller (pour les humains). Ex: metrics=['accuracy', 'mae'].
.compile() : OptimiseursL'optimiseur est l'algorithme (Descente de Gradient) qui met à jour les poids pour minimiser la Loss.
Optimiseur (keras.optimizers.*) | Description |
|---|---|
'adam' (ou Adam(lr=...)) | Le défaut (99% des cas). Robuste, rapide, s'adapte (Momentum + RMSProp). |
'sgd' (ou SGD(lr=...)) | Descente de Gradient Stochastique (simple). |
'rmsprop' | Bon choix (historique) pour les RNNs. |
// Syntaxe 1: String (avec défauts) model.compile(optimizer='adam', ...) // Syntaxe 2: Objet (pour changer le learning rate) from tensorflow.keras.optimizers import Adam model.compile(optimizer=Adam(learning_rate=0.001), ...)
.fit() (Entraînement & Callbacks)model.fit() est la fonction qui lance la boucle d'entraînement (backpropagation).
model.fit()
Retourne un objet History (history.history['loss']) qui contient l'historique de la loss et des métriques (epoch par epoch).
history = model.fit(
x_train, // Données d'entraînement
y_train, // Labels d'entraînement
epochs=10, // (Combien de fois voir tout le dataset)
batch_size=32, // (Combien d'items par mise à jour des poids)
validation_data=(x_val, y_val), // (Données pour évaluer (pas entraîner))
# ou validation_split=0.2 // (Prend 20% de x_train pour val)
callbacks=[...] // (Actions (voir onglet 2))
)
Callbacks
Les "Callbacks" sont des "hooks" (points d'arrêt) appelés pendant .fit() (ex: à la fin de chaque epoch).
EarlyStopping (Essentiel) : Arrête l'entraînement si la performance (sur validation_data) stagne ou se dégrade (évite l'overfitting).
ModelCheckpoint : Sauvegarde le modèle (ex: uniquement le meilleur .h5).
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
// (Arrête si 'val_loss' n'a pas baissé
// depuis 'patience'=3 epochs)
cb_early_stop = EarlyStopping(
monitor='val_loss',
patience=3
)
// (Sauvegarde le meilleur modèle (basé sur 'val_loss'))
cb_checkpoint = ModelCheckpoint(
filepath="best_model.h5",
monitor='val_loss',
save_best_only=True
)
model.fit(
...,
callbacks=[cb_early_stop, cb_checkpoint]
)
.fit())Les "Callbacks" sont des "hooks" (points d'arrêt) appelés pendant .fit() (ex: à la fin de chaque epoch).
EarlyStopping (Essentiel) : Arrête l'entraînement si la performance (sur validation_data) stagne ou se dégrade (évite l'overfitting).
ModelCheckpoint : Sauvegarde le modèle (ex: uniquement le meilleur .h5).
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
// (Arrête si 'val_loss' n'a pas baissé
// depuis 'patience'=3 epochs)
cb_early_stop = EarlyStopping(
monitor='val_loss',
patience=3
)
// (Sauvegarde le meilleur modèle (basé sur 'val_loss'))
cb_checkpoint = ModelCheckpoint(
filepath="best_model.h5",
monitor='val_loss',
save_best_only=True
)
model.fit(
...,
callbacks=[cb_early_stop, cb_checkpoint]
)
.evaluate() (Test)
Calcule la loss et les metrics (définies dans .compile()) sur un dataset (ex: Test set).
results = model.evaluate(x_test, y_test) print(results) // [0.123, 0.981] (Ex: [loss, accuracy])
.predict() (Inférence)
Génère les sorties brutes du modèle (ex: logits ou probabilités) pour de nouvelles données.
predictions_proba = model.predict(x_new) // (predictions_proba[0] -> // [0.01, 0.05, 0.9, 0.04...]) // (Pour avoir la classe prédite (l'index max)) import numpy as np predictions_class = np.argmax(predictions_proba, axis=1) // [2]
L'écosystème Keras est (principalement) l'écosystème TensorFlow, qui utilise les modèles Keras comme entrée.
| Outil | Description |
|---|---|
| KerasCV / KerasNLP | Bibliothèques "standalone" (pip install keras-cv) fournissant des couches de pointe (ex: Data Augmentation, Transformers) et des modèles pré-entraînés. |
| TFX (TensorFlow Extended) | Plateforme MLOps (Production). Utilise un modèle Keras comme entrée pour un pipeline de déploiement. |
| TF Lite (TFLite) | Convertit un SavedModel Keras en format .tflite optimisé pour le mobile (Android/iOS). |
| TensorFlow.js (TF.js) | Convertit un SavedModel Keras pour l'exécuter dans le navigateur (JavaScript). |
Keras (en tant que tf.keras) est utilisé par toutes les entreprises qui s'appuient sur l'écosystème TensorFlow pour le prototypage et la production.
| Entreprise | Cas d'usage |
|---|---|
| Netflix | (Utilise TF/Keras) Recommandation de contenu, optimisation des artworks (miniatures). |
| NASA | Détection d'exoplanètes (analyse des courbes de lumière), recherche sur le climat (analyse d'images satellites). |
| CERN | Analyse des données du LHC (ex: filtrage d'événements, reconstruction de particules) en utilisant Keras/TF. |
| Uber | Prévision de la demande (pricing), optimisation des trajets (Horovod, basé sur TF). |
Ressources pour apprendre et travailler avec Keras.
| Site | Description |
|---|---|
| keras.io | Le site officiel. Documentation claire, guides, et documentation de KerasCV/NLP. |
| tensorflow.org/guide/keras | La documentation officielle de tf.keras au sein de l'écosystème TensorFlow. Essentiel. |
| François Chollet (Twitter/X) | Le créateur de Keras. Source d'information sur la philosophie et les futures versions. |
1. Imports & Data
import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers from tensorflow.keras.callbacks import EarlyStopping # (Data (ex: NumPy) # x_train, y_train, x_test, y_test
2. Définir (Sequential)
model = keras.Sequential([
layers.Dense(
64,
activation='relu',
input_shape=(784,)
),
layers.Dropout(0.5),
layers.Dense(
10,
activation='softmax'
)
])
3. Visualiser
model.summary()
4. Compiler
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
5. Entraîner (Fit)
cb_stop = EarlyStopping(
monitor='val_loss',
patience=3
)
history = model.fit(
x_train, y_train,
epochs=50,
batch_size=32,
validation_split=0.2,
callbacks=[cb_stop]
)
6. Évaluer & Sauvegarder
results = model.evaluate(x_test, y_test)
preds = model.predict(x_new)
model.save("mon_modele.h5")
