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.
- Pipelines de données à la vitesse du TPU: tf.data.Dataset et TFRecords
- [THIS LAB] Votre premier modèle Keras, avec l'apprentissage par transfert
- Réseaux de neurones convolutifs, avec Keras et des TPU
- Réseaux de neurones convolutifs (convnets) modernes, SqueezeNet et Xception, avec Keras et des TPU
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.
Vous pouvez ouvrir cet exemple de notebook et exécuter quelques cellules pour vous familiariser avec Colaboratory.
Sélectionner un backend TPU
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
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
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
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
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, ... )
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.
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.
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.
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" :
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.
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à.
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.
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.
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é.
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.
- Pipelines de données à la vitesse des TPU : tf.data.Dataset et TFRecords
- [THIS LAB] Votre premier modèle Keras, avec l'apprentissage par transfert
- Réseaux de neurones convolutifs, avec Keras et des TPU
- Réseaux de neurones convolutifs (convnets) modernes, SqueezeNet et Xception, avec Keras et des TPU
TPU en pratique
Les TPU et les GPU sont disponibles sur Cloud AI Platform :
- Sur les VM de deep learning
- Dans AI Platform Notebooks
- Dans les tâches AI Platform Training
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].
|