Main Content

En savoir plus sur l’apprentissage par transfert

Cet exemple indique comment utiliser l’apprentissage par transfert pour entraîner à nouveau SqueezeNet, un réseau de neurones à convolution préentraîné, afin de classer un nouveau jeu d’images. Essayez cet exemple pour voir comme il est simple de démarrer avec le Deep Learning dans MATLAB®.

Pour une présentation visuelle pas à pas de l’exemple, regardez la vidéo.

deep-network-designer-app.jpg

L’apprentissage par transfert est communément utilisé dans les applications de Deep Learning. Vous pouvez utiliser un réseau préentraîné comme point de départ pour apprendre une nouvelle tâche. L’ajustement précis d’un réseau avec l’apprentissage par transfert est généralement beaucoup plus rapide et plus facile que l’apprentissage d’un réseau avec des pondérations initialisées de manière entièrement aléatoire. Vous pouvez transférer rapidement les caractéristiques apprises vers une nouvelle tâche avec un nombre réduit d’images d’apprentissage.

Extraire des données

Dans l’espace de travail, extrayez le jeu de données MathWorks Merch. C’est un petit jeu de données contenant 75 images de marchandises MathWorks parmi cinq catégories différentes (casquette, cube, cartes à jouer, tournevis et lampe de poche).

unzip("MerchData.zip");

Charger un réseau préentraîné

Ouvrez Deep Network Designer.

deepNetworkDesigner

Sélectionnez SqueezeNet depuis la liste des réseaux préentraînés et cliquez sur Open.

Deep Network Designer affiche une vue dézoomée de l’ensemble du réseau.

Explorez la représentation du réseau. Pour zoomer avec la souris, utilisez Ctrl+ la roulette de défilement de la souris (scroll wheel). Pour vous déplacer dans l’image, utilisez les touches fléchées ou maintenez la roulette de défilement de la souris enfoncée et déplacez la souris. Sélectionnez une couche pour afficher ses propriétés. Désélectionnez toutes les couches pour afficher le résumé du réseau dans le volet Properties.

Importer des données

Pour charger les données dans Deep Network Designer, sur l’onglet Data, cliquez sur Import Data > Import Image Classification Data.

Dans la liste Data source, sélectionnez Folder. Cliquez sur Browse et sélectionnez le dossier MerchData.

Divisez les données avec la répartition suivante : 70 % de données d’apprentissage et 30 % de données de validation.

Spécifiez les opérations d'augmentation à réaliser sur les images d’apprentissage. L’augmentation des données contribue à éviter un surajustement (overfitting) du réseau et la mémorisation des détails exacts des images d’apprentissage. Pour cet exemple, appliquez une réflexion aléatoire sur l’axe des x, une rotation aléatoire sur la plage [-90,90] degrés et un changement d'échelle aléatoire sur la plage [1,2].

Cliquez sur Import pour importer les données dans Deep Network Designer.

Éditer le réseau pour l’apprentissage par transfert

Pour réentraîner SqueezeNet à classer de nouvelles images, modifiez la dernière couche de convolution 2D et la couche de classification finale du réseau. Dans SqueezeNet, ces couches sont respectivement nommées 'conv10' et 'ClassificationLayer_predictions'.

Dans le volet Designer, sélectionnez la couche 'conv10'. Au bas du volet Properties, cliquez sur Unlock Layer. Dans la boîte de dialogue d’avertissement qui apparaît, cliquez sur Unlock Anyway. Les propriétés des couches sont alors déverrouillées afin que vous puissiez les adapter à votre nouvelle tâche.

Avant R2023b : Pour modifier les propriétés des couches, vous devez remplacer les couches au lieu de les déverrouiller. Dans la nouvelle couche 2-D convolutive, définissez FilterSize à [1 1].

Définissez la propriété NumFilters à au nouveau nombre de classes, dans cet exemple, 5.

Modifiez les taux d’apprentissage de sorte que l’apprentissage soit plus rapide dans la nouvelle couche que dans les couches transférées en définissant WeightLearnRateFactor et BiasLearnRateFactor à 10.

Configurez la couche de sortie. Sélectionnez la couche de classification, ClassificationLayer_predictions, et cliquez sur Unlock Layer, puis cliquez sur Unlock Anyway. Pour la couche de sortie déverrouillée, vous n’avez pas besoin de définir OutputSize. Au moment de l’apprentissage, Deep Network Designer définit automatiquement les classes de sortie de la couche à partir des données.

Entraîner le réseau

Pour choisir les options d’apprentissage, sélectionnez l’onglet Training et cliquez sur Training Options. Définissez le taux d’apprentissage initial à une faible valeur afin de ralentir l’apprentissage dans les couches transférées. Lors de l'étape précédente, vous avez augmenté les facteurs de taux d’apprentissage pour la couche de convolution 2D afin d’accélérer l’apprentissage dans les nouvelles couches finales. Cette combinaison de réglages du taux d’apprentissage entraîne un apprentissage rapide dans les nouvelles couches et ralentit l'apprentissage dans les autres couches.

Pour cet exemple, définissez InitialLearnRate à 0.0001, MaxEpochs à 8 et ValidationFrequency à 5. Comme il y a 55 observations, définissez MiniBatchSize à 11 afin de diviser les données d’apprentissage uniformément et de s’assurer de l’utilisation de l’ensemble du jeu d’apprentissage pendant chaque epoch.

Pour entraîner le réseau avec les options d’apprentissage spécifiées, cliquez sur OK puis sur Train.

Deep Network Designer vous permet de visualiser et de surveiller la progression de l’apprentissage. Vous pouvez ensuite éditer les options d’apprentissage et réentraîner le réseau, si nécessaire.

Exporter les résultats et générer du code MATLAB

Pour exporter les résultats de l’apprentissage, sélectionnez Export > Export Trained Network and Results sous l’onglet Training. Deep Network Designer exporte le réseau entraîné sous la variable trainedNetwork_1 et les informations d’apprentissage sous la variable trainInfoStruct_1.

Vous pouvez également générer le code MATLAB permettant de recréer le réseau et les options d’apprentissage utilisées. Sélectionnez Export > Generate Code for Training sous l’onglet Training. Examinez le code MATLAB pour apprendre à préparer par programmation les données pour l’apprentissage, créer l’architecture réseau et entraîner le réseau.

Classer une nouvelle image

Chargez une nouvelle image à classer avec le réseau entraîné.

I = imread("MerchDataTest.jpg");

Redimensionnez l’image de test à la taille en entrée du réseau.

I = imresize(I, [227 227]);

Classez l’image de test avec le réseau entraîné.

[YPred,probs] = classify(trainedNetwork_1,I);
imshow(I)
label = YPred;
title(string(label) + ", " + num2str(100*max(probs),3) + "%");

Références

[1] ImageNet. http://www.image-net.org

[2] Iandola, Forrest N., Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, and Kurt Keutzer. "SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5 MB model size." Preprint, submitted November 4, 2016. https://arxiv.org/abs/1602.07360.

[3] Iandola, Forrest N. "SqueezeNet." https://github.com/forresti/SqueezeNet.

Voir aussi

| | |

Sujets associés