MNIST

Dans ce projet, vous allez construire un système capable de reconnaître des chiffres écrits à la main. Ce système utilisera un réseau de neurones que vous allez développer. Étant donné une image d'un chiffre écrit à la main, le but du système est de prédire quel est le chiffre.

Exemple MNIST

Ces systèmes de reconnaissances de chiffres ou de caractères trouvent de nombreuses applications pratiques. Par exemple, de tels systèmes jouent un rôle important dans de nombreux systèmes de contrôle de la circulation, permettant la lecture automatique des plaques d'immatriculation des véhicules. De plus, des systèmes similaires sont utilisés pour lire automatiquement les adresses sur le courrier postal, ou même pour numériser des collections entières de livres, pour ne donner que quelques exemples.

Partie 1

Commencez par télécharger les fichiers du projets (mnist-zip) puis déplacez-les dans votre espace de travail.

Ouvrez le fichier main.py et exécutez-le. Une fenêtre devrait s'ouvrir, vous invitant à dessiner des chiffres à l'aide de votre souris. Le programme devrait donner une prédiction du chiffre que vous avez dessiné. La prédiction est faite par un réseau de neurones.

Essayez de dessiner différents chiffres et de voir comment le programme réagit. Le système est-il précis ? Si ce n'est pas le cas, quelle en est la raison ?

Partie 2

Pour faire ses prédictions, le programme utilise un réseau de neurones composé d'une seule couche de 10 neurones, un neurone pour chaque chiffre. Le neurone avec la sortie la plus élevée détermine le chiffre prédit. Chaque neurone prend en entrée l'image entière, qui est de taille 28x28 pixels. Chaque pixel est représenté par un seul nombre qui représente la couleur (0 pour noir, 255 pour blanc, et des valeurs intermédiaires pour les nuances de gris).

Combien de paramètres (poids) y a-t-il pour chaque neurone ? Combien de paramètres y a-t-il au total pour les 10 neurones ?

Ouvrez le fichier network.py et examinez-le. Le fichier contient la description du réseau de neurones utilisé par le système.

Quelle est la fonction d'activation utilisée par le réseau ?

Actuellement, le réseau n'a pas été entraîné et ses paramètres sont aléatoires, expliquant les résultats décevants que vous avez obtenus dans la partie précédente. Dans les parties suivantes, vous allez corriger cela en entraînant le réseau de neurones.

Partie 3

Pour entraîner le réseau, on doit disposer d'un ensemble d'exemples à partir desquels apprendre. Heureusement pour nous, un tel ensemble de données existe déjà : la base de données MNIST (Modified National Institute of Standards and Technology). La base de données MNIST contient 60'000 images de chiffres annotées avec le chiffre correspondant, qui peuvent être utilisées pour l'entraînement, ainsi que 10'000 images supplémentaires pour la validation. Avant d'entraîner le réseau de neurones, vous allez d'abord jeter un coup d'œil rapide à cet ensemble de données. Ouvrez le script nommé gallery.py et exécutez-le pour voir quelques-unes des images contenues dans l'ensemble de données. Si vous passez le curseur sur une partie de l'image, vous verrez les valeurs réelles codant les pixels de l'image.

Quelle est la taille de chaque image ? Combien de valeurs différentes peuvent prendre les pixels ?

Pour avoir une vue d'ensemble des différentes images, vous pouvez également exécuter le script overview.py et examiner les aperçus des images générés dans le dossier data.

Est-ce que vous constatez des différences entre la manière dont les chiffres sont écrits ? Reconnaissez-vous votre façon d'écrire les chiffres dans les images ?

Pouvez-vous trouver l'origine de ce jeu de données ?

Partie 4

Maintenant, il est temps d'entraîner le réseau de neurones. Ouvrez le script train.py et exécutez-le. Observez la sortie du script. Jetez un oeil au graphique nouvellement généré dans le dossier data.

Combien d'époques d'entraînement sont effectuées ?

Quelle est la précision du réseau de neurones sur l'ensemble de d'entraînement ? Et sur celui de validation ?

Est-ce que la performance du réseaux est satisfaisante ? Est-ce que le réseau de neurones semble être en surapprentissage ?

Partie 5

Jusqu'à présent, le réseau utilisé pour prédire les chiffres était composé d'une seule couche de 10 neurones. La définition de ce réseau de neurones se trouve dans le fichier network.py. Dans ce fichier, vous trouverez également la définition de plusieurs réseaux de neurones différents avec la même interface. Chacun de ces réseaux prend en entrée des images en niveaux de gris de 28 par 28 pixels et produit en sortie un vecteur de 10 valeurs, le plus grand élément de ce vecteur indiquant le chiffre prédit.

Pour la suite du projet, nous allons essayer d'autres architectures. Inspectez le réseau de neurones DeepNet trouvé dans ce fichier.

Combien de couches ce réseau a-t-il ? Combien de neurones comptent les différentes couches ?

Si nous voulons utiliser efficacement ce nouveau réseau, nous devons d'abord l'entraîner. Pour ce faire, ouvrez à nouveau le fichier train.py et changez la valeur de la variable NETWORK à DeepNet au lieu de SimpleNet. Vous pouvez ensuite exécuter le script pour entraîner le nouveau réseau.

Quelle est la précision du réseau de neurones sur l'ensemble de d'entraînement à la fin de l'entraînement ? Et sur celui de validation ?

Une fois le réseau entraîné, vous pouvez l'utiliser dans le programme principal en changeant la variable NETWORK à DeepNet dans le fichier main.py puis en l'exécutant.

Obtenez-vous de meilleurs résultats qu'auparavant ? Y a-t-il encore des formes de chiffres difficiles à reconnaître ? Sont-elles les mêmes formes qu'auparavant ? Quelles sont les raisons possibles de ces lacunes ?

Partie 6

Essayez différentes architectures de réseaux en suivant la procédure décrite dans la partie 5. Vous pouvez essayer de jouer avec le nombre de couches et le nombre de neurones dans chaque couche ou passer à une autre architecture de réseau (ConvNet) complètement.

Vous pouvez modifier le nombre d'époques d'entraînement de votre réseau en modifiant la variable appropriée dans le fichier train.py.

Quelle architecture de réseau vous a donné les meilleurs résultats ?