La traduction de cette page n'est pas à jour. Cliquez ici pour voir la dernière version en anglais.
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®.
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 Data. La boîte de dialogue « Import Image Data » apparaît.
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, remplacez 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'
.
Sur le volet Designer, faites glisser une nouvelle convolution2dLayer
sur le canevas. Pour correspondre à la couche de convolution d’origine, définissez FilterSize
à 1,1
. Définissez NumFilters
comme le nombre de catégories dans le nouveau jeu de données, 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
.
Supprimez la dernière couche de convolution 2D et connectez votre nouvelle couche à la place.
Remplacez la couche de sortie. Faites défiler jusqu’à la fin de la Layer Library et faites glisser une nouvelle classificationLayer
sur le canevas. Supprimez la couche de sortie d’origine et connectez votre nouvelle couche à sa place.
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
, ValidationFrequency à 5
, MaxEpochs à 8
. 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 Close 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
trainNetwork
| trainingOptions
| squeezenet
| Deep Network Designer
Sujets associés
- Essayer le Deep Learning en 10 lignes de code MATLAB
- Classer une image avec un réseau préentraîné
- Transfer Learning with Deep Network Designer
- Créer un réseau simple de classification d’images avec Deep Network Designer
- Créer un réseau simple de classification d’image
- Create Simple Sequence Classification Network Using Deep Network Designer
- Generate Experiment Using Deep Network Designer