Hello world
L’exemple de référence
1. Présentation du dataset
Il est traditionnel d’illustrer la syntaxe des outils traitant des réseaux neuronaux (ou de machine learning sur des images) à l’aide du célèbre exemple de la reconnaissance des caractères numériques du dataset nmist (Mixed/Modified National Institute of Standards and Technology) que nous avons utilisé plus haut (LeCun et al. 1998).
Nous allons creuser un peu plus avant ce "hello world", souvent considéré comme "connu" de tous, mais qui mérite mieux que le simple statut d’exemple "syntaxique".
L’exemple est d’autant plus important à nos yeux qu’il est historiquement lié à l’activité du très respecté Yann Le Cun, ingénieur français lauréat du prestigieux prix Turing en 2018.
Les images sont codées via 28 * 28 pixels de 1 octet, en 256 niveaux de gris (de 0 à 255). Le barycentre des formes encodées est proche du centre de l’image.
Sans surprise, il faut initialiser notre programme et charger les données. Pour la mise au point syntaxique de notre petit programme, il n’est pas nécessaire de conserver toutes les observations d’entraînement, ce qui permettra de garder un temps de réponse agréable. Évidemment, quand on voudra disposer d’un modèle efficace, il faudra utiliser toutes les données d’entraînement disponibles.
Veuillez noter que, dans l’absolu, il serait également bienvenu de procéder à une étude approfondie de la qualité des données en cherchant par exemple à identifier...
Notre premier réseau de neurones
1. Construction "pas à pas" du réseau avec Keras
Keras nous permet de "dessiner" la topologie de notre réseau par couches successives. Quand il n’y a pas d’alternative à mettre en œuvre pour créer le modèle, les couches se présentent de façon séquentielle, ce qui s’exprime par l’instruction models.Sequential.
Chaque couche est en fait un tenseur de rang relativement élevé, qui exprime à la fois le nombre de nœuds concernés (typiquement les neurones), la structure des observations (ici nos images et nos labels), la nature des nœuds et la valeur des liens entre ces nœuds (les poids).
Keras nous fournit des modèles "sur étagère" pour ces différents tenseurs et un mécanisme sous-jacent qui effectue automatiquement la correspondance entre une couche et une autre : les poids et les données en entrée et sortie des couches "migrent" automatiquement d’une couche à l’autre sans que vous ayez aucune action à effectuer…
Évidemment, pour les cas complexes, il est toujours possible d’intervenir sur ces mécanismes, quitte à aller jusqu’au backend, c’est-à-dire jusqu’à écrire ces mécanismes en TensorFlow de base.
Nous allons maintenant explorer séquentiellement le sens et l’usage des différentes couches (layers) de notre modèle de reconnaissance de chiffres manuscrits.
2. En entrée du modèle
En entrée du modèle, nous avons un lot (batch) d’images sous forme de matrices carrées 28 x 28.
Dans la mesure où nous ne pensons pas avoir besoin d’utiliser directement la topologie de ces images, c’est-à-dire que nous ne désirons pas faire un pré-traitement l’utilisant, nous pouvons "aplatir" (flatten) ces images en une forme de structure (1,784).
Vous pouvez imaginer cette construction comme la vectorisation de chaque matrice d’image du lot, l’expression mathématique pour une matrice de dimension m lignes x n colonnes en serait :
On a mis les colonnes de la matrice "bout à bout". L’instruction Flatten vectorise les formes...
Conclusion
Nous avons obtenu un résultat rapide et prometteur malgré la simplicité du modèle utilisé et le nombre très restreint de lignes de code utilisées dans la phase d’entraînement. Un modèle séquentiel doté d’une structure de base peut donner donc de bons résultats dès lors qu’un bon optimiseur et une fonction de perte relativement élaborée sont utilisés.
Il va maintenant falloir explorer les options d’amélioration qui s’offrent à nous pour obtenir des résultats à la hauteur des "professionnels" de ce sujet.
Bibliographie du chapitre
Kingma, Diederik P., and Jimmy Ba. 2014. "Adam: A Method for Stochastic Optimization," December. http://arxiv.org/abs/1412.6980.
LeCun, Y., L. Bottou, Y. Bengio, and P. Haffner. 1998. "Gradient-Based Learning Applied to Document Recognition." Proceedings of the IEEE 86 (11): 2278-2324.