1 Introduction : réseaux de neurones FCNN à propagation avant
Dans ce TD, nous allons travailler sur des réseaux de neurones classiques, qui sont
- fully connected (FCNN - fully connected neural networks),
- non bouclés (feed forward net),
- avec apprentissage supervisé (supervised learning).
Tous les exercices de ce TD vont faire une classification, l’objectif sera de reconstruire une fonction \(f: R^2 \rightarrow [0,1]\) à partir des échantillons :
\[ f(X) = y \]
Les données d’entrée \(X\) vivent donc l’espace 2D, et la sortie \(y\) est binaire (donc dans l’espace 1D).
Voici un exemple : les données d’entrée 2D sont caractérisés par des points, et la sortie correspondante est la couleur, ici bleu pour 1, et orange pour 0. Ici, il y a 500 données étiquettées (labeled data).

Vous pouvez donc identifier deux exemples (entourés en noir) correspondant aux exemples de la fonction à reconstruire suivant :
\[ f(0.38, 2) = 1 \] \[ f(-3.63, -2.28) = 0 \]
Nous allons maintenant construire un exemple de réseaux de neurones représentant cette fonction de \(f: R^2 \rightarrow [0,1]\).
Voici une illustration :
Voici les characteristics de ce réseaux de neurones:
- Entrée : \(R^2\)
- Sortie : \(R^1\)
- Deux couches cachées (une avec 4 neurones, et une avec 2 neurones)
- feed forward net (non-bouclés)
- fully connected (FCNN - fully connected neural networks)
- Apprentissage supervisé (supervised learning).
Ce réseau prend donc en entrée les coordonnées X = {\(x_1\), \(x_2\)}, et produit une seule sortie. Les couches cachées contiennent 4 et 2 neurones, et la couche de sortie un seul neurone. Les flèches correspondent aux poids \(w_i\).
Chaque neurone est modélisé selon le modèle de perceptron :
Sa sortie \(y\) est calculé en appliquant une fonction d’activation \(\varphi\) à la somme des entrées \(x_i\) pondérés par les poids \(w_i\) et son biais \(b\), donc :
\(y= \varphi(\left(\sum_{i=1}^{n} w_{i}x_{i}+b\right)\)
avec donc
- \(x_i\) : les entrées
- \(y\) : la sortie
- \(n\) : le nombre d’entrées
- \(w_i\) : les poids associés à chaque entrée \(x_i\) .
- \(b\) : le biais.
- \(\varphi\) : la fonction d’activation.
Les poids \(w_i\) pour \(i \in [1,n]\) et les biais \(b\) sont appelés paramètres. Chaque neurone des couches cachées et de la couche de sortie a donc \(n+1\) paramètres, avec \(n\) le nombre d’entrées de chaque neurone.
C’est ces paramètres qu’il s’agit à déterminer pendant la phase d’entraînement, on dit aussi que le réseau les “apprend” !
Exercice 1.1 : Nombre de paramètres d’un réseau de neurones
- Combien de paramètres au total doivent être entrainés pour le réseau de neurones illustré ci-dessus ?
2 Fonctions d’activations
Quant aux fonctions d’activations pour ce réseau de neurones, il y a plusieurs possibilités :
Par exemple, nous pouvons choisir la fonction d’activation \(tanh\) pour les neurones dans la couche cachée, et la fonction \(sigmoid\) pour le neurone de la couche de sortie.
Exercice 1.2 : Nombre de paramètres d’un réseau de neurones
- Quel est le rôle centrale des fonctions d’activation RELU, tanh, et Sigmoid ?
3 Application interactive : Tensorflow Playground
Nous allons maintenant travailler avec Tensorflow Playground l’excellente application web interactive permettant d’entraîner ce type de réseau de neurone, changer son architecture et ses hyperparamètres, et évaluer ses performances.

L’interface de Tensorflow Playground permet de configurer le réseau de neurones, et de lancer l’entraînement avec le bouton play. Plus précisément, parmi d’autres, vous pouvez changer :
- le jeu de données à l’entrée (parmi 4 options, appelons-les default (circle
), simple (linear
), XOR
, et spiral
) - la sortie du réseau montrant la forme de la classification
- l’architecture du réseaux de neurones, donc la structure globale du réseau (le nombre de couches, le nombre de neurones par couche), et la fonction d’activation. Vous ne pouvez pas modifier le type des couches (ici fully-connected), ni les connexions entre les couches (ici feedforward, donc sans boucle de rétro-action).
- les hyperparamètres sont des réglages utilisés pour optimiser l’entraînement du réseau, influençant sa performance sans modifier la structure. Ici, vous voyez
- le taux d’apprentissage (learning rate),
- Le nombre d’époques d’entraînement, donc le nombre de fois que le réseau “voit” les données d’entraînement,
- La taille du batch, donc le nombre de données d’entrée à partir duquel les poids sont ajustés (par rétropropagation)
- le type d’algorithme d’optimisation (par ex. Adam, SGD) et le taux de régularisation (par ex. L2 ou dropout) - on ne les manipulera pas dans ce TD
- et bien sûr les courbes d’apprentissage !
Attention, sur TensorFlow Playground, ce qui est appelé test loss dans les courbes d’apprentissage fait plutôt référence à ce que l’on considère généralement comme la validation loss, comme il est mis à jour constamment pendant la phase d’apprentissage. Ce qui est correctement appelé “test loss”, c’est pour les données de tests qui n’ont pas été touchées ni pendant le choix du modèle d’apprentissage, ni pendant l’entraînement, pour ne pas biaiser l’évaluation ! Donc :
- Le test loss est généralement évalué après la fin de l’entraînement sur un jeu de données complètement séparé, qui n’a jamais été utilisé pendant l’entraînement ou la validation. Il s’agit d’une mesure finale de la performance du modèle, tandis que
- le validation loss est utilisé pendant l’entraînement d’un réseau de neurones, on utilise un jeu de validation pour évaluer la performance du modèle après chaque itération (ou époque) d’entraînement, sans utiliser ces données pour ajuster les poids.
Exercice 1.3: Architecture : fonctions d’activation et hyperparamètre du taux d’apprentissage
Nous allons maintenant jouer avec le TensorFlow Playground, lancé avec la configuration par défaut (le données sous forme de “cercle”
, pour comprendre parfaitement les influences de différents architectures et hyperparamètres.
Lancez avec play en laissant tous les réglages par défaut. Combien d’époques faut-il à peu près pour que le validation loss tombe en dessous de \(0.002\) ?
Changez l’hyperparamètre du taux d’apprentissage. Est-ce que vous trouvez un meilleur taux, afin que le validation loss tombe en dessous de \(0.002\) avec moins d’époques d’entraînement ? Si oui, quel est le meilleur taux d’apprentissage dans cet exemple, et combien d’époques avez-vous besoin ?
Remettez le taux d’apprentissage à 0.03. (NB: Vous pouvez aussi rétablir les réglages par défaut à tout moment en rechargeant le Tensorflow Playground à l’adresse https://playground.tensorflow.org/). Changez les fonctions d’activation des couches cachées de \(tanh\) à \(ReLU\). Lancez l’apprentissage et étudiez la forme de la zone de classification de sortie. Qu’observez-vous par rapport à la forme générée à partir d’une fonction d’activation de \(tanh\) ? Est-ce que vous comprendez pourquoi la forme est différente ? Est-ce que vous arrivez à établir un lien entre la forme de classification de la première couche cachée et la forme de classification de sortie ?
Changez maintenant les fonctions d’activation des couches cachées à linéaire. Quel est le validation loss que vous obtenez ? Est-ce que un changement du taux d’apprentissage peut améliorer le validation loss ? Expliquez.
Exercice 1.4 : Architectures : Nombre de couches cachées et de neurones
Rétablissez les réglages par défaut en rechargeant https://playground.tensorflow.org/, et choisissez le jeu de données le plus simple (
), et entrainez le réseau.
Modifiez l’architecture en changeant le nombre de couche cachées et de neurones, afin de trouver le réseau avec le nombre de paramètres minimal à entraîner pour lequel le réseau apprend encore correctement. Combien de couches cachées avez-vous besoin ?
Cela fait combien de paramètres à entraîner ?
Exercice 1.5 : Le problème XOR
Choisissez maintenant le jeu de données XOR (
).
Avec une seule couche cachée, combien de neurones avez-vous minimum besoin pour que le réseau apprenne correctement ?
Cela fait combien de paramètres ?
On essayera maintenant deux couches cachées, pour voir si on arrive à baisser le nombre de paramètres. Maintenant, combien de neurones avez-vous besoin minimum pour que le réseau apprenne correctement ?
Cela fait combien de paramètres ?
Exercice 1.6 : Courbes d’apprentissage, et sur et sous-apprentissage
Dans cet exercice, nous allons étudier les courbes d’apprentissage du training loss et du validation loss. Pour commencer, rétablissez les réglages par défaut en rechargeant https://playground.tensorflow.org/.
Laissez le jeu de données par défaut (“cercle”). Choisissez une seule couche cachée avec 2 neurones et entraînez le réseau. Observez les courbes d’apprentissage. S’agit-il d’un sur-apprentissage (overfitting), un sous-apprentissage (underfitting), ou un bon apprentissage (good fit) ?
Choisissez maintenant le jeu de données le plus simple (“linear”). Modifiez l’architecture pour avoir 2 couches cachées avec 4 neurones chacune, entraînez le réseau, et observez les courbes d’apprentissage. S’agit-il d’un sur-apprentissage (overfitting), un sous-apprentissage (underfitting), ou un bon apprentissage (good fit) ?
Maintenant, ajoutez du bruit (avec une valeur maximale de \(50\)). Changez le ratio entre données d’entraînement et données de test pour utiliser uniquement 10% de données pour l’entraînement.Entraînez le réseau, et observez les courbes d’apprentissage. S’agit-il d’un sur-apprentissage (overfitting), un sous-apprentissage (underfitting), ou un bon apprentissage (good fit) ?
Pour cette dernière question, quelle technique pourraît-on appliquer pour obtenir un bon résultat sur ces données, tout en gardant la même architecture et hyperparamètres ?
Exercice 1.7 : Compétition de TensorFlow Playground avec jeu de données de spiral
Dans ce dernier exercice, nous allons lancer une compétition afin de trouver la meilleure architecture avec les meilleurs hyperparamètres, afin de minimiser le nombre de paramètres nécessaires.
Pour avoir un environnement pareil pour tous, vous ne touchez ni à la ratio training/validation (50%), ni au bruit (0), ni à la taille des batchs (10), ni aux features (nous utilisons seulement les entrées \(x_1\) et \(x_2\)), ni à la régularization (aucune), et bien sûr ni au type de problème (classification).
Vous pouvez donc recharger le Tensorflow Playground à l’adresse https://playground.tensorflow.org/), et chosir le jeu de données spiral (
).
Question compétition: Pour le jeu de données spiral. Quel est nombre de paramètres minimal que avez besoin afin d’arriver à un validation loss de \(0.10\) ou moins, en moins de 2000 époques ?
Cela vous fait combien de couches ?
Et combien de neurones au total ?
Prenez un screenshot de votre solution à environ \(2000\) époques (comme le screenshot en TensorFlow Playground en haut de ce TD)
4 TD à rendre
A rendre sur moodle avant le 3 Novembre 2025 à 23h59. Pour cela, il y a deux liens sur la page du cours (https://moodle.u-bordeaux.fr/course/view.php?id=22721) :
- Rendu TD1 - Exercices 1.1.1 - 1.7.3
- Compétition TD1 DeepLearning - 1.7.1 et 1.7.4