La reconnaissance de chiffres manuscrits représente un problème important dans le domaine du machine learning. Bien qu’un tel problème semble triviale, il est directement applicable à des systèmes pratiques comme la lecture automatique de chèques bancaires, la reconnaissance de codes postaux pour les services postaux, et bien d'autres. Résoudre un problème simple comme la classification de chiffres permet de mettre en œuvre des concepts généraux pouvant être appliqués à des problématiques plus complexes, comme la reconnaissance de caractères manuscrits dans différentes langues, la compréhension d’écriture cursive ou encore l’analyse de documents numérisés. En progressant dans ces problématiques, les modèles peuvent être adaptés pour des applications plus avancées comme la lecture automatique d'articles scientifiques ou l'identification de schémas complexes dans des bases de données manuscrites. Ce cas d’utilisation illustre également la manière dont les réseaux de neurones convolutionnels (CNN), peuvent être appliqués efficacement à des images en exploitant leurs caractéristiques spatiales et visuelles.
Le dataset MNIST (Modified National Institute of Standards and Technology) est une référence dans le domaine du machine learning, spécialement pour les tâches de classification d’images. Il s'agit d'une base de données contenant 70 000 images de chiffres manuscrits en niveaux de gris, réparties en deux ensembles :
Chaque image a une résolution de 28 x 28 pixels, soit 784 pixels par image, ce qui en fait un dataset relativement léger et facile à manipuler. Chaque pixel est représenté par une intensité de gris allant de 0 (noir) à 255 (blanc).
TensorFlow est une bibliothèque open-source optimisée pour le développement et l'entraînement de modèles de deep learning, intégrant une gestion avancée des tenseurs et des opérations différentiables. Sa compatibilité native avec Keras permet de concevoir des modèles en utilisant une API haut niveau, tout en offrant une flexibilité pour personnaliser des graphes computationnels bas-niveau. TensorFlow exploite efficacement les GPU et TPU pour accélérer l'entraînement grâce à sa prise en charge de calculs parallèles.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
import tensorflow_datasets as tfds
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = tf.keras.utils.normalize(x_train, axis=1)
x_test = tf.keras.utils.normalize(x_test, axis=1)
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28, 28)))
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=3)
model.save('handwrittenRecognition.keras')
x_train
et y_train
pendant 3 époques (iterations complètes sur l'ensemble des données d'entraînement).
model = tf.keras.models.load_model('handwrittenRecognition.keras')
loss, accuracy = model.evaluate(x_test, y_test)
La fonction de perte utilisée est l'entropie croisée catégorique, souvent employée dans les tâches de classification. Voici comment elle est calculée :
Les probabilités prédites \(\hat{y}_{i,k}\) sont calculées avec la fonction softmax :
\[ \hat{y}_{i,k} = \frac{\exp(z_{i,k})}{\sum_{j=1}^{C} \exp(z_{i,j})} \]Où \(z_{i,k}\) est la sortie brute (logit) du modèle pour la classe \(k\).