Votre premier modèle Keras, avec apprentissage par transfert

1. Présentation

Dans cet atelier, vous allez apprendre à créer un classificateur Keras. Au lieu d'essayer de trouver la combinaison parfaite de couches de réseau de neurones pour reconnaître les fleurs, nous allons d'abord utiliser une technique appelée "transfert d'apprentissage" pour adapter un modèle pré-entraîné puissant à notre ensemble de données.

Cet atelier comprend les explications théoriques nécessaires concernant les réseaux de neurones et constitue un bon point de départ pour les développeurs qui apprennent le deep learning.

Cet atelier constitue la deuxième partie de la série "Keras sur TPU". Vous pouvez les effectuer dans l'ordre suivant ou indépendamment.

ca8cc21f6838eccc.png

Points abordés

  • Créer votre propre classificateur d'images Keras avec une couche softmax et une perte de cross-entropy
  • Pour tricher 🇦, en utilisant l'apprentissage par transfert au lieu de créer vos propres modèles.

Commentaires

Si vous remarquez quelque chose d'anormal dans cet atelier de programmation, veuillez nous en informer. Vous pouvez envoyer vos commentaires via les problèmes GitHub [ lien de commentaires].

2. Démarrage rapide de Google Colaboratory

Cet atelier utilise Google Colaboratory et ne nécessite aucune configuration de votre part. Colaboratory est une plate-forme de notebooks en ligne destinée à l'enseignement. Il propose un entraînement gratuit sur les processeurs, les GPU et les TPU.

688858c21e3beff2.png

Vous pouvez ouvrir cet exemple de notebook et exécuter quelques cellules pour vous familiariser avec Colaboratory.

c3df49e90e5a654f.png Welcome to Colab.ipynb

Sélectionner un backend TPU

8832c6208c99687d.png

Dans le menu Colab, sélectionnez Exécution > Modifier le type d'exécution, puis TPU. Dans cet atelier de programmation, vous allez utiliser un TPU (Tensor Processing Unit) puissant compatible avec l'entraînement accéléré par matériel. La connexion au runtime s'effectue automatiquement lors de la première exécution. Vous pouvez également utiliser le bouton "Connect" (Connecter) en haut à droite.

Exécution du notebook

76d05caa8b4db6da.png

Pour exécuter les cellules une par une, cliquez dessus et utilisez Maj + ENTRÉE. Vous pouvez également exécuter l'intégralité du notebook avec Runtime > Run all (Environnement d'exécution > Exécuter tout).

Sommaire

429f106990037ec4.png

Tous les notebooks comportent une table des matières. Vous pouvez l'ouvrir à l'aide de la flèche noire sur la gauche.

Cellules masquées

edc3dba45d26f12a.png

Certaines cellules n'affichent que leur titre. Il s'agit d'une fonctionnalité de notebook propre à Colab. Vous pouvez double-cliquer dessus pour afficher le code qu'ils contiennent, mais il n'est généralement pas très intéressant. Elles sont généralement associées à des fonctions d'assistance ou de visualisation. Vous devez quand même exécuter ces cellules pour que les fonctions qu'elles contiennent soient définies.

Authentification

cdd4b41413100543.png

Colab peut accéder à vos buckets Google Cloud Storage privés à condition que vous vous authentifiiez avec un compte autorisé. L'extrait de code ci-dessus déclenche un processus d'authentification.

3. [INFO] Présentation du classificateur de réseau de neurones

En résumé

Si vous connaissez déjà tous les termes en gras dans le paragraphe suivant, vous pouvez passer à l'exercice suivant. Si vous débutez dans le deep learning, bienvenue et poursuivez votre lecture.

Pour les modèles créés sous la forme d'une séquence de couches, Keras propose l'API Sequential. Par exemple, un classificateur d'images utilisant trois couches denses peut être écrit dans Keras sous la forme suivante:

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
    tf.keras.layers.Dense(500, activation="relu"),
    tf.keras.layers.Dense(50, activation="relu"),
    tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 classes
])

# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
  optimizer='adam',
  loss= 'categorical_crossentropy',
  metrics=['accuracy']) # % of correct answers

# train the model
model.fit(dataset, ... )

688858c21e3beff2.png

Réseau de neurones dense

Il s'agit du réseau de neurones le plus simple pour la classification des images. Elle est constituée de "neurones" disposés en couches. La première couche traite les données d'entrée et transmet ses sorties à d'autres couches. Elle est appelée "dense", car chaque neurone est connecté à tous les neurones de la couche précédente.

c21bae6dade487bc.png

Vous pouvez alimenter un tel réseau en aplatissant les valeurs RVB de tous ses pixels dans un vecteur long et en les utilisant comme entrées. Ce n'est pas la meilleure technique de reconnaissance d'image, mais nous l'améliorerons plus tard.

Neurones, activations, ReLU

Un "neurone" calcule une somme pondérée de toutes ses entrées, ajoute une valeur appelée "biais" et alimente le résultat via une "fonction d'activation". Dans un premier temps, les pondérations et les biais sont inconnus. Ils seront initialisés de manière aléatoire et "appris" en entraînant le réseau de neurones sur de nombreuses données connues.

644f4213a4ee70e5.png

La fonction d'activation la plus populaire est appelée RELU, ou unité de rectification linéaire. Il s'agit d'une fonction très simple, comme vous pouvez le voir sur le graphique ci-dessus.

Activation Softmax

Le réseau ci-dessus se termine par une couche à cinq neurones, car nous classons les fleurs en cinq catégories (rose, tulipe, pissenlit, marguerite, tournesol). Les neurones des couches intermédiaires sont activés à l'aide de la fonction d'activation RELU classique. Dans la dernière couche, nous voulons cependant calculer des nombres compris entre 0 et 1 représentant la probabilité que cette fleur soit une rose, une tulipe, etc. Pour ce faire, nous utiliserons une fonction d'activation appelée "softmax".

Pour appliquer la fonction softmax à un vecteur, vous devez prendre l'exponentielle de chaque élément, puis normaliser le vecteur, généralement à l'aide de la norme L1 (somme des valeurs absolues) afin que les valeurs totalisent 1 et puissent être interprétées comme des probabilités.

ef0d98c0952c262d.png d51252f75894479e.gif

Perte d'entropie croisée

Maintenant que notre réseau de neurones produit des prédictions à partir d'images d'entrée, nous devons mesurer leur qualité, c'est-à-dire la distance entre ce que le réseau nous dit et les bonnes réponses, souvent appelées "étiquettes". N'oubliez pas que nous disposons de libellés corrects pour toutes les images de l'ensemble de données.

N'importe quelle distance conviendrait, mais pour les problèmes de classification, la "distance d'entropie croisée" est la plus efficace. Nous appellerons cette fonction d'erreur ou "perte" :

7bdf8753d20617fb.png

Descente de gradient

"Entraîner" le réseau de neurones signifie en réalité utiliser des images et des étiquettes d'entraînement pour ajuster les poids et les biais afin de minimiser la fonction de perte d'entropie croisée. Voici comment cela fonctionne.

L'entropie croisée est une fonction des pondérations, des biais, des pixels de l'image d'entraînement et de sa classe connue.

Si nous calculons les dérivées partielles de l'entropie croisée par rapport à l'ensemble des pondérations et des biais, nous obtenons un "gradient" calculé pour une image, une étiquette et une valeur actuelle donnée de pondérations et de biais. N'oubliez pas que nous pouvons avoir des millions de pondérations et de biais. Calculer le gradient représente beaucoup de travail. Heureusement, TensorFlow s'en charge. La propriété mathématique d'un dégradé est qu'il pointe "vers le haut". Comme nous voulons aller là où l'entropie croisée est faible, nous allons dans la direction opposée. Nous mettons à jour les pondérations et les biais selon une fraction du gradient. Nous répétons ensuite la même chose à l'aide des prochains lots d'images et de libellés d'entraînement, dans une boucle d'entraînement. Espérons que cela converge vers un point où l'entropie croisée est minimale, même si rien ne garantit que ce minimum est unique.

gradient descent2.png

Mini-traitement par lot et élan

Vous pouvez calculer votre gradient à partir d'un exemple d'image et mettre immédiatement à jour les pondérations et les biais. Toutefois, avec un lot de 128 images, par exemple, vous obtenez un gradient qui représente mieux les contraintes imposées par différentes images d'exemple. Il est donc susceptible de converger plus rapidement vers la solution. La taille du mini-lot est un paramètre ajustable.

Cette technique, parfois appelée "descente stochastique du gradient", présente un autre avantage plus pratique : travailler avec des lots signifie également travailler avec des matrices plus grandes, qui sont généralement plus faciles à optimiser sur les GPU et les TPU.

La convergence peut encore être un peu chaotique et peut même s'arrêter si le vecteur de gradient n'est que des zéros. Cela signifie-t-il que nous avons trouvé un minimum ? Non. Un composant de dégradé peut être nul à un minimum ou à un maximum. Avec un vecteur de gradient comportant des millions d'éléments, s'ils sont tous des zéros, la probabilité que chaque zéro corresponde à un minimum et aucun d'entre eux à un point maximal est assez faible. Dans un espace comportant de nombreuses dimensions, les points d'arrêt sont assez courants et nous ne voulons pas nous en arrêter là.

52e824fe4716c4a0.png

Illustration : point de selle. Le dégradé est de 0, mais ce n'est pas un minimum dans toutes les directions. (Attribution de l'image Wikimedia: By Nicoguaro - Own work, CC BY 3.0)

La solution consiste à ajouter un peu d'élan à l'algorithme d'optimisation afin qu'il puisse passer les points d'inflection sans s'arrêter.

Glossaire

par lot ou par mini-lot : l'entraînement est toujours effectué sur des lots de données d'entraînement et d'étiquettes. Cela permet à l'algorithme de converger. La dimension "lot" est généralement la première dimension des tenseurs de données. Par exemple, un Tensor de forme [100, 192, 192, 3] contient 100 images de 192 x 192 pixels avec trois valeurs par pixel (RVB).

perte d'entropie croisée: fonction de perte spéciale, souvent utilisée dans les classificateurs.

couche dense: couche de neurones où chaque neurone est connecté à tous les neurones de la couche précédente.

caractéristiques : les entrées d'un réseau de neurones sont parfois appelées "caractéristiques". L'art de déterminer quelles parties d'un ensemble de données (ou combinaisons de parties) doivent être transmises à un réseau de neurones pour obtenir de bonnes prédictions s'appelle l'ingénierie des caractéristiques.

labels: autre nom pour les "classes" ou réponses correctes concernant un problème de classification supervisée

Taux d'apprentissage: fraction du gradient par laquelle les pondérations et les biais sont mis à jour à chaque itération de la boucle d'entraînement.

logits: les sorties d'une couche de neurones avant l'application de la fonction d'activation sont appelées "logits". Ce terme vient de la "fonction logistique", également appelée "fonction sigmoïde", qui était la fonction d'activation la plus populaire. "Sorties des neurones avant la fonction logistique" a été raccourci en "logits".

loss: fonction d'erreur comparant les sorties des réseaux de neurones aux bonnes réponses

neurone : calcule la somme pondérée de ses entrées, ajoute un biais et transmet le résultat via une fonction d'activation.

Encodage one-hot: la classe 3 sur 5 est encodée sous la forme d'un vecteur de cinq éléments, tous des zéros à l'exception du troisième, qui est égal à 1.

relu : unité de rectification linéaire. Fonction d'activation populaire pour les neurones.

sigmoïde : autre fonction d'activation qui était populaire autrefois et qui est toujours utile dans des cas particuliers.

softmax : fonction d'activation spéciale qui agit sur un vecteur, augmente la différence entre le composant le plus important et tous les autres, et normalise également le vecteur pour que sa somme soit égale à 1 afin qu'il puisse être interprété comme un vecteur de probabilités. Utilisé comme dernière étape des classificateurs.

tensor : un "tensor" est comme une matrice, mais avec un nombre arbitraire de dimensions. Un tenseur unidimensionnel est un vecteur. Un tenseur à deux dimensions est une matrice. Vous pouvez aussi avoir des Tensors ayant au moins 3, 4, 5 dimensions ou plus.

4. Apprentissage par transfert

Pour un problème de classification d'images, les couches denses ne suffiront probablement pas. Nous devons apprendre à connaître les couches convolutives et les nombreuses façons de les organiser.

Mais nous pouvons aussi prendre un raccourci. Des réseaux de neurones convolutifs entièrement entraînés sont disponibles en téléchargement. Il est possible de découper leur dernière couche, la tête de classification softmax, et de la remplacer par la vôtre. Tous les biais et pondérations entraînés restent inchangés. Vous ne réentraînez que la couche softmax que vous ajoutez. Cette technique s'appelle l'apprentissage par transfert. Étonnamment, elle fonctionne tant que l'ensemble de données sur lequel le réseau de neurones est pré-entraîné est "assez proche" du vôtre.

Pratiquer

Veuillez ouvrir le notebook suivant, exécuter les cellules (Maj+Entrée) et suivre les instructions chaque fois que le libellé "TRAVAIL REQUIS" s'affiche.

c3df49e90e5a654f.png Keras Flowers transfer learning (playground).ipynb

Informations supplémentaires

Avec l'apprentissage par transfert, vous bénéficiez à la fois d'architectures avancées de réseaux de neurones convolutifs développés par des chercheurs chevronnés et d'un pré-entraînement sur un vaste ensemble de données d'images. Dans notre cas, nous allons transférer l'apprentissage à partir d'un réseau entraîné sur ImageNet, une base de données d'images contenant de nombreuses plantes et des scènes d'extérieur, suffisamment proche des fleurs.

b8fc1efd2001f072.png

Illustration : utilisation d'un réseau de neurones convolutif complexe, déjà entraîné, comme boîte noire, en réentraînant uniquement la tête de classification. Il s'agit de l'apprentissage par transfert. Nous verrons plus tard comment fonctionnent ces dispositions complexes de couches convolutives. Pour l'instant, c'est le problème de quelqu'un d'autre.

Apprentissage par transfert dans Keras

Dans Keras, vous pouvez instancier un modèle pré-entraîné à partir de la collection tf.keras.applications.*. MobileNet V2, par exemple, est une très bonne architecture convolutive dont la taille reste raisonnable. En sélectionnant include_top=False, vous obtenez le modèle pré-entraîné sans sa couche softmax finale, ce qui vous permet d'ajouter la vôtre:

pretrained_model = tf.keras.applications.MobileNetV2(input_shape=[*IMAGE_SIZE, 3], include_top=False)
pretrained_model.trainable = False

model = tf.keras.Sequential([
    pretrained_model,
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(5, activation='softmax')
])

Notez également le paramètre pretrained_model.trainable = False. Il fige les poids et les biais du modèle pré-entraîné afin que vous n'entraînez que votre couche softmax. Cela implique généralement relativement peu de poids et peut être effectué rapidement et sans nécessiter un très grand ensemble de données. Toutefois, si vous avez beaucoup de données, l'apprentissage par transfert peut encore mieux fonctionner avec pretrained_model.trainable = True. Les poids pré-entraînés fournissent alors d'excellentes valeurs initiales et peuvent toujours être ajustés par l'entraînement pour mieux s'adapter à votre problème.

Enfin, notez la couche Flatten() insérée avant votre couche dense softmax. Les couches denses fonctionnent sur des vecteurs de données plats, mais nous ne savons pas si c'est ce que le modèle pré-entraîné renvoie. C'est pourquoi nous devons aplatir. Dans le chapitre suivant, nous allons nous intéresser aux architectures convolutives et expliquer le format de données renvoyé par les couches convolutives.

Avec cette approche, vous devriez obtenir une précision proche de 75 %.

Solution

Voici le notebook de la solution. Vous pouvez l'utiliser si vous êtes bloqué.

c3df49e90e5a654f.png Keras Flowers transfer learning (solution).ipynb

Points abordés

  • 🤔 Comment écrire un classificateur dans Keras
  • 🤓 configuré avec une dernière couche softmax et une perte d'entropie croisée
  • 😈 Apprentissage par transfert
  • 🤔 Entraîner votre premier modèle
  • 🧐 Suivre sa perte et sa justesse pendant l'entraînement

Veuillez prendre un moment pour passer en revue cette liste de contrôle.

5. Félicitations !

Vous pouvez maintenant créer un modèle Keras. Veuillez passer à l'atelier suivant pour apprendre à assembler des couches convolutives.

TPU en pratique

Les TPU et les GPU sont disponibles sur Cloud AI Platform :

Enfin, vos commentaires nous intéressent. Veuillez nous indiquer si vous constatez une anomalie dans cet atelier ou si vous pensez qu'elle doit être améliorée. Vous pouvez envoyer vos commentaires via les problèmes GitHub [ lien de commentaires].

HR.png

Martin Görner ID small.jpg
Auteur : Martin Görner
Twitter : @martin_gorner

tensorflow logo.jpg
www.tensorflow.org