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éseaux de neurones pour reconnaître les fleurs, nous allons d'abord utiliser une technique appelée "apprentissage par transfert" pour adapter un modèle pré-entraîné performant à 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 fait partie 2 de la série "Keras sur TPU" de la série. 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
- 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 d'entropie croisée
- Pour tricher 🇦, utilisez l'apprentissage par transfert au lieu de créer vos propres modèles.
Commentaires
Si vous constatez une anomalie dans cet atelier de programmation, veuillez nous en informer. Vous pouvez nous faire part de vos commentaires via GitHub [lien de commentaires].
2. Guide de 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 sans frais sur les processeurs, les GPU et les TPU.
Vous pouvez ouvrir cet exemple de notebook et l'exécuter sur quelques cellules pour vous familiariser avec Colaboratory.
Sélectionner un backend TPU
Dans le menu Colab, sélectionnez Environnement d'exécution > Modifiez le type d'environnement d'exécution, puis sélectionnez "TPU". Dans cet atelier de programmation, vous allez utiliser un TPU (Tensor Processing Unit) puissant sauvegardé pour l'entraînement avec accélération matérielle. La connexion à l'environnement d'exécution se fera automatiquement lors de la première exécution. Vous pouvez également utiliser la commande dans le coin supérieur droit.
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 Environnement d'exécution > Tout exécuter
Sommaire
Tous les notebooks comportent une table des matières. Vous pouvez l'ouvrir à l'aide de la flèche noire située à gauche.
Cellules masquées
Certaines cellules n'affichent que leur titre. Cette fonctionnalité de notebook spécifique à Colab. Vous pouvez double-cliquer dessus pour voir le code à l'intérieur, mais ce n'est généralement pas très intéressant. Elles sont généralement compatibles avec les fonctions de visualisation ou de compatibilité. 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] Principes de base du classificateur de réseaux 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 classer des images. Elle est composée de "neurones" organisées 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 la somme pondérée de toutes ses entrées, ajoute une valeur appelée "biais" et transmet le résultat via une "fonction d'activation". Dans un premier temps, les pondérations et les biais sont inconnus. Elles seront initialisées de manière aléatoire et "apprises" 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 pour l'unité de rectification linéaire (rectified Linear Unit). Comme vous pouvez le voir sur le graphique ci-dessus, il s'agit d'une fonction très simple.
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 souhaitons calculer des nombres compris entre 0 et 1 représentant la probabilité que cette fleur soit une rose, une tulipe, etc. Pour cela, nous allons utiliser une fonction d'activation appelée "softmax".
L'application de la fonction softmax à un vecteur s'effectue en prenant l'exposant exponentiel de chaque élément, puis en normalisant le vecteur, généralement à l'aide de la norme L1 (somme des valeurs absolues) de sorte que les valeurs s'additionnent pour être égales à 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 d'étiquettes correctes 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 cela notre erreur ou « perte » :
Descente de gradient
« Entraînement » le réseau de neurones consiste en fait à utiliser des images et des étiquettes d'entraînement pour ajuster les pondérations 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 pour nous. La propriété mathématique d'un dégradé est qu'il pointe "vers le haut". Puisque 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. Ensuite, nous faisons la même chose encore et encore en utilisant les lots suivants d'images et d'étiquettes d'entraînement dans une boucle d'entraînement. Espérons que cela aboutit à un point où l'entropie croisée est minimale, bien que rien ne garantit que ce minimum soit unique.
Mini-lot et momentum
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 les 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 de gradient stochastique", présente un autre avantage, plus pragmatique: le traitement par lot implique également de travailler avec des matrices plus volumineuses, 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 avoir une valeur minimale ou maximale égale à zéro. 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: un 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 à donner une dynamique à l'algorithme d'optimisation afin qu'il puisse passer en selle sans s'arrêter.
Glossaire
lot ou mini-lot: l'entraînement est toujours effectué sur des lots de données d'entraînement et d'étiquettes. Cela contribue à la convergence de l'algorithme. Le "lot" est généralement la première dimension des Tensors 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.
features: les entrées d'un réseau de neurones sont parfois appelées "caractéristiques". L'ingénierie des caractéristiques consiste à déterminer quelles parties d'un ensemble de données (ou combinaisons de parties) alimenter un réseau de neurones afin d'obtenir de bonnes prédictions.
labels: autre nom pour "classes". ou les réponses correctes d'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". Le terme vient de la « fonction logistique » autrement dit la "fonction sigmoïde" qui était autrefois la fonction d'activation la plus populaire. "Sorties de neurones avant la fonction logistique" a été abrégé en "logits".
loss: fonction d'erreur comparant les sorties du réseau de neurones aux bonnes réponses
neurone: calcule la somme pondérée de ses entrées, ajoute un biais et alimente 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 utilisée pour les neurones.
sigmoïde: autre fonction d'activation populaire et qui reste utile dans des cas particuliers.
softmax: fonction d'activation spéciale qui agit sur un vecteur, augmente la différence entre la composante la plus grande et les autres, et normalise également le vecteur pour obtenir une somme égale à 1, de sorte qu'il puisse être interprété comme un vecteur de probabilités. Il s'agit de la dernière étape des classificateurs.
tensor: un "Tensor" est semblable à une matrice mais avec un nombre arbitraire de dimensions. Un Tensor unidimensionnel est un vecteur. Un Tensor à 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 seront probablement pas suffisantes. Nous devons nous familiariser avec 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. C'est ce que l'on 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 "suffisamment proche" à la vôtre.
Pratique
Veuillez ouvrir le notebook suivant, exécuter les cellules (Maj-ENTRÉE) et suivre les instructions dès que le message "TÂCHE REQUISE" s'affiche libellé.
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é, sous la forme d'une boîte noire, pour ne réentraîner que 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 pondérations et les biais du modèle pré-entraîné afin que vous n'entraîniez que votre couche softmax. En général, cette opération implique relativement peu de pondérations et peut être effectuée rapidement, 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 pondérations pré-entraînées fournissent ensuite d'excellentes valeurs initiales et peuvent toujours être ajustées par l'entraînement pour mieux correspondre à votre problème.
Enfin, notez que la couche Flatten()
s'est insérée avant la couche dense softmax. Les couches denses fonctionnent sur des vecteurs plats de données, mais nous ne savons pas si c'est ce que renvoie le modèle pré-entraîné. C'est pourquoi nous
devons aplatir. Dans le prochain chapitre, alors que nous nous pencherons sur les architectures convolutives, nous expliquerons le format de données renvoyé par les couches convolutives.
Avec cette approche, vous devriez obtenir une précision de près 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
- 🤓 Configuration d'une dernière couche softmax et d'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 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
- Convnets modernes, Squeezenet et Xception, avec Keras et des TPU
Les 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, les commentaires sont les bienvenus. Veuillez nous indiquer si vous constatez une anomalie dans cet atelier ou si vous pensez qu'elle doit être améliorée. Vous pouvez nous faire part de vos commentaires via GitHub [lien de commentaires].
|