diff --git a/RAPPORT.md b/RAPPORT.md new file mode 100644 index 0000000000000000000000000000000000000000..f178dc554d527f6e5ec6da916fec92266282ec0b --- /dev/null +++ b/RAPPORT.md @@ -0,0 +1,72 @@ +# Rapport : Classification d'Images + +## Introduction + +Ce TP à pour objectif le développement d'un programme complet de classification d'images. On développe deux model comme le sujet le demande : les k plus proches voisins (k-NN) et les réseaux de neurones (NN). Le jeu de données utilisé est CIFAR-10 (60 000 images couleur de taille 32x32 réparties en 10 classes) + +## Préparation des Données CIFAR + +Les données CIFAR-10 ont été chargé et préparé à l'aide de plusieurs fonctions utilitaires : + +- `read_cifar_batch` : Lecture d'un batch unique de données CIFAR. +- `read_cifar` : Lecture de tous les batches (5 batches d'entraînement et 1 batch de test). +- `split_dataset` : Division aléatoire des données en ensembles d'entraînement et de test. + + +On place dans le main de read_cifar.py un test pour voir si on arrive bien a lire et split , les sortie sont satisfaisante : + +data shape: (60000, 3072) +labels shape: (60000,) +Training shape: (54000, 3072) +Testing shape: (6000, 3072) +## Classification k-NN + +L'implémentation du classificateur k-NN repose sur plusieurs fonctions demandé dans le README.md : + +- `distance_matrix` : Calcul de la matrice des distances euclidiennes L2 entre deux matrices. Cette implémentation utilise uniquement des manipulations matricielles pour optimiser les performances. +- `knn_predict` : Prédiction des étiquettes pour les données de test en fonction des k plus proches voisins. +- `evaluate_knn` : Évaluation de la précision du modèle sur un ensemble de test. + + +On effectue finalement dans le main de knn.py un test avec 20 valeures de k différente pour juger de l'évolution de l'accuracy par rapport a k. La meilleure performance est obtenue avec k=1, atteignant environ 35.7% de précision. Or les valeurs pour 1 et 2 semble étonnante on se serait attendu a une courbe en cloche, on a éssayé de corrigé le tri mais impossible on a touojours ce saut pour k=1 et 2. Cependant observe ensuite une évolution assez cohérente, avec une max vers k=5 puis une diminution de l'accuracy. Cette diminution de performance avec l'augmentation de k suggère que les classes sont relativement bien séparées localement, mais que l'augmentation du nombre de voisins introduit du bruit dans la classification. + +## Réseau de Neurones Artificiel + +Le développement du classificateur basé sur un perceptron multicouche (MLP) a nécessité plusieurs étapes, notamment la compréhension théorique de la rétropropagation du gradient. + +### Formules de Rétropropagation + +On présente ici les formules que l'on nous demand de fournir : + +1. La dérivée de la fonction sigmoïde est donnée par : $\sigma' = \sigma \times (1-\sigma)$ + +2. $\frac{\partial C}{\partial A^{(2)}} = \frac{2}{N_{out}}(A^{(2)} - Y)$ + +3. $\frac{\partial C}{\partial Z^{(2)}} = \frac{\partial C}{\partial A^{(2)}} \times A^{(2)} \times (1-A^{(2)})$ + +4. $\frac{\partial C}{\partial W^{(2)}} = [A^{(1)}]^T \times \frac{\partial C}{\partial Z^{(2)}}$ + +5. $\frac{\partial C}{\partial B^{(2)}} = \frac{\partial C}{\partial Z^{(2)}}$ + +6. $\frac{\partial C}{\partial A^{(1)}} = \frac{\partial C}{\partial Z^{(2)}} \times [W^{(2)}]^T$ + +7. $\frac{\partial C}{\partial Z^{(1)}} = \frac{\partial C}{\partial A^{(1)}} \times A^{(1)} \times (1-A^{(1)})$ + +8. $\frac{\partial C}{\partial W^{(1)}} = [A^{(0)}]^T \times \frac{\partial C}{\partial Z^{(1)}}$ + +9. $\frac{\partial C}{\partial B^{(1)}} = \frac{\partial C}{\partial Z^{(1)}}$ + +Ensuite on passe a l'implémentation des fonctions demandé : + +- `learn_once_mse` : Apprentissage avec l'erreur quadratique moyenne. +- `learn_once_cross_entropy` : Apprentissage avec l'entropie croisée. +- `train_mlp` : Entraînement complet du réseau. +- `test_mlp` : Évaluation sur l'ensemble de test. + +Dans le main de mlp.py on commence par charger les données puis on les normalise, puis split. Ensuite on met en place le training et on finit par afficher nos résultats + +Les résultats montrent une amélioration continue de la précision d'entraînement avec les epochs, atteignant environ 45% après 100 époques. Cette progression régulière indique que le modèle apprend efficacement les patterns des données, bien que la performance finale reste modeste en raison de la complexité du jeu de données CIFAR-10. + +## Conclusion + +Les deux modèles implémentées montrent des performances différentes sur le jeu de données CIFAR-10. Le k-NN offre une performance de base intéressante mais limitée, tandis que le MLP montre une capacité d'apprentissage progressive avec de meilleures performances finales. Ces résultats soulignent l'importance du choix de l'architecture et des hyperparamètres dans les tâches de classification d'images. \ No newline at end of file