
Dans les articles précédents de cette série de didacticiels, les options possibles pour la préparation des données ont été décrites.
Pré-traitement et ajout de données avec des images ; dans ces articles, le
modèle de base pour reconnaître les émotions à partir des images d'un réseau de neurones convolutionnels a également été construit.
Dans cet article, nous allons construire un modèle de réseau de neurones convolutionnel amélioré pour reconnaître les émotions dans les images en utilisant une technique appelée
apprentissage inductif .
Vous devez d'abord vous familiariser avec l'article sur le
modèle de base pour la reconnaissance des émotions dans les images , et vous pouvez également vous y référer pendant la lecture, car certaines sections, y compris l'étude des données sources et la description des indicateurs de réseau, ne seront pas détaillées ici.
Les données
L'ensemble de données contient 1630 images avec des émotions de deux classes:
négatives (classe 0) et
positives (classe 1). Quelques exemples de ces images sont donnés ci-dessous.
Négatif

Positif


Certains exemples contiennent une émotion positive ou négative évidente, tandis que d'autres peuvent ne pas être classés - même avec une implication humaine. Sur la base d'une inspection visuelle de ces cas, nous estimons que la précision maximale possible devrait être d'environ 80%. Notez qu'un classificateur aléatoire fournit une précision d'environ 53% en raison d'un petit déséquilibre dans les classes.
Pour former le modèle, nous utilisons la technique de
conservation d'une partie des échantillons et divisons l'ensemble de données initial en deux parties, dont l'une (20 pour cent de l'ensemble initial) sera utilisée par nous pour vérification. Le partitionnement est effectué par
stratification : cela signifie que l'équilibre entre les classes est maintenu dans les ensembles de formation et de test.
Résoudre l'insuffisance des données
Le modèle de base a montré des résultats, légèrement meilleurs que les prédictions aléatoires de la classe d'images. Il peut y avoir plusieurs raisons possibles à ce comportement. Nous pensons que la raison principale est que la quantité de données disponibles est décidément insuffisante pour une telle formation de la partie convolutionnelle du réseau qui permettrait d'obtenir des caractéristiques sur la base de l'image d'entrée.
Il existe de nombreuses façons de résoudre le problème de l'insuffisance des données. En voici quelques uns:
- Récupérer . L'idée de la méthode est d'évaluer la distribution des données et de sélectionner de nouveaux exemples à partir de cette distribution.
- Apprendre sans professeur . Tout le monde peut trouver de grandes quantités de données de même nature que des exemples marqués dans un ensemble de données donné. Par exemple, il peut s'agir de films pour la reconnaissance vidéo ou de livres audio pour la reconnaissance vocale. L'étape suivante en cours de route consiste à utiliser ces données pour la pré-formation du modèle (par exemple, en utilisant des auto-encodeurs).
- Augmentation des données . Au cours de ce processus, les échantillons de données sont modifiés de manière aléatoire à l'aide d'un ensemble donné de transformations.
- Apprentissage inductif . Ce sujet nous intéresse beaucoup, alors apprenons-le plus en détail.
Apprentissage inductif
Le terme
entraînement inductif fait référence à un ensemble de techniques utilisant des modèles (souvent très volumineux) formés sur différents ensembles de données approximativement de même nature.


Comparaison des méthodes traditionnelles d'apprentissage automatique et d'apprentissage inductif. Image tirée de l'entrée de blog de S. Ruder
«Qu'est-ce que l'apprentissage inductif?» .
Il existe
trois principaux scénarios d'utilisation de l'apprentissage inductif:
- Modèles pré-formés . Tout utilisateur peut simplement prendre un modèle formé par quelqu'un d'autre et l'utiliser pour ses tâches. Un tel scénario est possible si les tâches sont très similaires.
- Bloquer la sélection des signes . À ce stade, nous savons que l'architecture du modèle peut être divisée en deux parties principales: l' unité d'extraction d'entités, qui est chargée d'extraire les entités des données d'entrée, et le module de classification , qui classe les exemples en fonction des entités reçues. En règle générale, le bloc d'extraction d'entités est la partie principale du modèle. L'idée de la méthode est de prendre un bloc pour distinguer les caractéristiques d'un modèle formé à un autre problème, de fixer ses coefficients de pondération (les rendre non formés), puis de construire sur sa base de nouveaux modules de classification pour le problème considéré. Le module de classification n'est généralement pas très profond et se compose de plusieurs couches entièrement connectées, ce modèle est donc beaucoup plus facile à former.
- Accord précis et profond . Cette méthode est comme un scénario utilisant un bloc d'extraction d'entités. Les mêmes actions sont effectuées à l'exception de «geler» le bloc d'extraction de fonctionnalités. Par exemple, vous pouvez prendre le réseau VGG comme un bloc d'extraction de fonctionnalités et y «geler» uniquement les trois premiers (sur quatre) blocs convolutifs. Dans ce cas, l'unité d'extraction de fonctionnalités peut mieux s'adapter à la tâche en cours. Pour plus d'informations, consultez l'article de blog de F. Chollet. Créez des modèles de classification d'images puissants en utilisant une très petite quantité de données .
Une description détaillée des scénarios d'utilisation de l'apprentissage inductif se trouve dans le cours
CS231n sur les réseaux de neurones convolutionnels de l'Université de Stanford
pour la reconnaissance visuelle par Fei-Fei Li et les articles de blog de S. Ruder L'
apprentissage inductif est la prochaine frontière du développement apprentissage automatique (sujets abordés de manière plus approfondie).
Vous pouvez avoir des questions: pourquoi toutes ces méthodes sont-elles nécessaires et pourquoi peuvent-elles fonctionner? Nous essaierons d'y répondre.
- Avantages de l'utilisation de grands ensembles de données. Par exemple, nous pouvons prendre le bloc d'extraction d'entités à partir d'un modèle formé sur 14 millions d'images contenues dans le jeu de données du concours ImageNet . Ces modèles sont suffisamment complexes pour permettre l' extraction de fonctionnalités de très haute qualité à partir des données d'entrée.
- Considérations liées au temps. La formation de grands modèles peut prendre des semaines, voire des mois. Dans ce cas, tout le monde peut économiser énormément de temps et de ressources informatiques .
- Une hypothèse de poids sous-jacente à la raison pour laquelle tout cela peut fonctionner est la suivante: Les attributs obtenus de la formation dans une tâche peuvent être utiles et adaptés à une autre tâche. En d'autres termes, les caractéristiques ont la propriété de l'invariance par rapport au problème. Notez que le domaine de la nouvelle tâche doit être similaire au domaine de la tâche d'origine. Sinon, l'unité d'extraction de fonctionnalités peut même aggraver les résultats.
Architecture de modèle améliorée
Nous connaissons maintenant le concept d'apprentissage inductif. Nous savons également qu'ImageNet est un événement majeur, dans lequel presque toutes les architectures modernes de réseaux de neurones convolutionnels avancés ont été testées. Essayons de prendre le bloc d'extraction de fonctionnalités de l'un de ces réseaux.
Heureusement, la bibliothèque Keras nous fournit
plusieurs modèles pré-formés (via ImageNet) qui ont été créés à l'intérieur de cette plate-forme. Nous importons et utilisons l'un de ces modèles.

Dans ce cas, nous utiliserons un réseau avec une architecture VGG. Pour sélectionner uniquement l'unité d'extraction d'entités, nous supprimons le module de classification (les trois premières couches entièrement connectées) du réseau en définissant le paramètre
include_top sur
False . Nous voulons également initialiser notre réseau en utilisant les poids du réseau formé à ImageNet. Le dernier paramètre est la taille de l'entrée.
Veuillez noter que la taille des images originales du concours ImageNet est de (224, 224, 3), tandis que nos images sont de (400, 500, 3). Cependant, nous utilisons des couches convolutives - cela signifie que les poids du réseau sont les poids des noyaux en mouvement dans l'opération de convolution. Avec la propriété de la séparation des paramètres (une discussion à ce sujet se trouve dans notre article théorique
Aperçu des réseaux de neurones convolutionnels pour la classification des images ), cela conduit au fait que la taille des données d'entrée peut être presque arbitraire, car la convolution est effectuée au moyen d'une fenêtre coulissante, et cette fenêtre peut glisser le long image de toute taille. La seule limitation est que la taille des données d'entrée doit être suffisamment grande pour ne pas s'effondrer à un point (mesures spatiales) dans une couche intermédiaire, car sinon il sera impossible de faire d'autres calculs.
Une autre astuce que nous utilisons est la
mise en cache . VGG est un très grand réseau. Un passage direct pour toutes les images (1630 exemples) à travers l'unité d'extraction de fonctionnalités prend environ 50 secondes. Cependant, il faut se rappeler que les poids de l'unité d'extraction d'entités sont fixes, et un passage direct donne toujours le même résultat pour la même image. Nous pouvons utiliser ce fait pour effectuer un passage direct à travers l'unité d'extraction de fonctionnalités
une seule
fois , puis mettre en cache les résultats dans un tableau intermédiaire. Pour implémenter ce scénario, nous créons d'abord une instance de la classe
ImageDataGenerator pour charger directement les fichiers depuis le disque dur (pour plus d'informations, consultez l'article de
base Modèle de base pour reconnaître les émotions dans les images ).

À l'étape suivante, nous utilisons en mode prédiction le bloc d'extraction d'entités créé précédemment dans le cadre du modèle pour obtenir des entités d'image.

Cela prend environ 50 secondes. Nous pouvons maintenant utiliser les résultats pour un entraînement très rapide de la partie de classification supérieure du modèle - une ère dure environ 1 seconde pour nous. Imaginez maintenant que chaque ère dure 50 secondes de plus. Ainsi, cette simple technique de mise en cache nous a permis d'accélérer le processus de formation réseau de 50 fois! Dans ce scénario, nous enregistrons tous les signes pour tous les exemples en RAM, car son volume est suffisant pour cela. Lorsque vous utilisez un ensemble de données plus grand, vous pouvez calculer les propriétés, les écrire sur le disque dur, puis les lire en utilisant la même approche associée à la classe du générateur.
Enfin, considérons l'architecture de la partie classification du modèle:


N'oubliez pas qu'à la sortie du bloc d'extraction de caractéristiques du réseau neuronal convolutionnel, un tenseur à quatre dimensions (exemples, hauteur, largeur et canaux) est émis, et une couche entièrement connectée pour la classification prend un tenseur à deux dimensions (exemples, caractéristiques). Une façon de transformer un tenseur à quatre dimensions avec des caractéristiques consiste simplement à l'aligner autour des trois derniers axes (nous avons utilisé une technique similaire dans le modèle de base). Dans ce scénario, nous utilisons une approche différente, appelée
sous -
échantillonnage de la valeur moyenne mondiale (BPA). Au lieu d'aligner les vecteurs à quatre dimensions, nous prendrons la valeur moyenne basée sur deux dimensions spatiales. En fait, nous prenons une carte d'attributs et faisons simplement la moyenne de toutes les valeurs qu'il contient. La méthode GAP a été introduite pour la première fois dans l'excellent travail du réseau Min Lin
sur le Net (ce livre vaut vraiment la peine de le connaître car il traite de certains concepts importants - par exemple, les convolutions 1 × 1). Un avantage évident de l'approche GAP est une réduction significative du nombre de paramètres. En utilisant GAP, nous n'obtenons que 512 fonctionnalités pour chaque exemple, tout en alignant les données brutes, le nombre de fonctionnalités sera de 15 × 12 × 512 = 92 160. Cela peut entraîner des frais généraux importants, car dans ce cas, la partie classification du modèle aura environ 50 millions de paramètres! D'autres éléments de la partie classification du modèle, tels que les couches entièrement connectées et les couches qui implémentent la méthode d'exclusion, sont discutés en détail dans l'article
Modèle de base pour reconnaître les émotions dans les images .
Paramètres et options de formation
Après avoir préparé l'architecture de notre modèle à l'aide de Keras, vous devez configurer l'ensemble du modèle pour la formation à l'aide de la méthode de compilation.

Dans ce cas, nous utilisons des paramètres qui sont presque similaires aux paramètres du modèle de base, à l'exception du choix de l'optimiseur. Pour optimiser l'apprentissage, l'
entropie croisée binaire sera utilisée comme fonction de perte et une métrique de précision sera également suivie. Nous utilisons la méthode
Adam comme optimiseur. Adam est un type d'algorithme de descente de gradient stochastique avec un moment et une
vitesse d'apprentissage adaptative (pour plus d'informations, voir l'entrée de blog de S. Ruder
Présentation des algorithmes d'optimisation de la descente de gradient ).
La vitesse d'apprentissage est un hyperparamètre optimiseur qui doit être configuré pour garantir que le modèle est opérationnel. N'oubliez pas que la formule pour la descente du gradient «vanille» ne contient pas de fonctionnalités supplémentaires:

Θ est le vecteur des paramètres du modèle (dans notre cas, ce sont les coefficients de pondération du réseau de neurones), - est la fonction objective, ∇ est l'opérateur de gradient (calculé à l'aide de l'algorithme de propagation d'erreur de retour), et α est la vitesse d'apprentissage. Ainsi, le gradient de la fonction objectif représente la direction de l'étape d'optimisation dans l'espace des paramètres, et la vitesse d'apprentissage est sa taille. Lorsque vous utilisez une vitesse d'apprentissage déraisonnablement élevée, il y a la possibilité d'un glissement constant du point optimal en raison de la taille de pas trop grande. D'un autre côté, si la vitesse d'apprentissage est trop faible, l'optimisation prendra trop de temps et ne pourra assurer la convergence que vers des minima locaux de faible qualité au lieu d'un extremum global. Par conséquent, dans chaque situation spécifique, il est nécessaire de rechercher un compromis approprié. L'utilisation des paramètres par défaut de l'algorithme Adam est un bon point de départ pour commencer.
Cependant, dans cette tâche, les paramètres Adam par défaut affichent des résultats médiocres. Nous devons réduire le taux d'apprentissage initial à 0,0001. Sinon, la formation ne pourra pas assurer la convergence.
En fin de compte, nous pouvons commencer à apprendre plus de 100 époques, puis enregistrer le modèle lui-même et l'historique de l'apprentissage. La commande
% time est une commande magique Ipython * qui vous permet de mesurer le temps d'exécution du code.

Évaluation

Évaluons l'efficacité du modèle pendant la formation. Dans notre cas, la précision de vérification est de 73% (contre 55% avec le modèle de base). Ce résultat est bien meilleur que le résultat du modèle de base.
Examinons également la distribution des erreurs à l'aide de la matrice des inexactitudes. Les erreurs sont réparties presque également entre les classes avec un léger biais vers des exemples négatifs mal classés (cellule supérieure gauche de la matrice des inexactitudes). Cela peut s'expliquer par un
petit déséquilibre dans l'ensemble de données vers la classe positive.
Une autre mesure que nous suivons est la courbe de performance du récepteur (courbe ROC) et la zone sous cette courbe (AUC). Pour une description détaillée de ces mesures, consultez l'article
Modèle de base pour reconnaître les émotions dans les images .

Plus la courbe ROC est proche du point supérieur gauche du graphique et plus la zone sous-jacente (métrique AUC) est grande, mieux le classificateur fonctionne. Cette figure montre clairement qu'un modèle amélioré et pré-formé montre de meilleurs résultats par rapport au modèle de base créé à partir de zéro. La valeur AUC pour le modèle pré-formé est de 0,82, ce qui est un bon résultat.

Conclusion
Dans cet article, nous avons rencontré une technique puissante - l'apprentissage inductif. Nous avons également construit un classificateur de réseau neuronal convolutionnel à l'aide d'une unité d'extraction de fonctions pré-formée basée sur l'architecture VGG. Ce classificateur a surpassé dans ses caractéristiques de performance le modèle convolutionnel de base, formé à partir de zéro. L'augmentation de la précision était de 18 pour cent, et l'augmentation de la métrique AUC était de 0,25, ce qui démontre une augmentation très significative de la qualité du système.