Main Content

La traduction de cette page n'est pas à jour. Cliquez ici pour voir la dernière version en anglais.

Ajuster des données avec un réseau de neurones peu profond

Les réseaux de neurones sont efficaces pour le fitting de fonctions. Il est prouvé qu’un réseau de neurones assez simple peut ajuster toutes les fonctions pratiques.

Supposez par exemple que vous disposiez de données d’un établissement de santé. Vous voulez concevoir un réseau permettant de prédire le pourcentage de graisse corporelle d’une personne à partir de 13 mesures anatomiques. Vous avez au total 252 personnes pour lesquelles vous disposez de ces 13 données et des pourcentages de graisse corporelle associés.

Il existe deux manières de résoudre ce problème :

Il est généralement préférable de commencer avec l’application puis d’utiliser l’application pour générer automatiquement des scripts de lignes de commande. Avant d’utiliser l’une des méthodes, commencez par définir le problème en sélectionnant un jeu de données. Chacune des applications du réseau de neurones a accès à de nombreux jeux de données que vous pouvez utiliser pour vous entraîner avec la toolbox (voir Exemples de jeux de données pour les réseaux de neurones peu profonds). Si vous voulez résoudre un problème spécifique, vous pouvez charger vos propres données dans l’espace de travail. La section suivante décrit le format des données.

Remarque

Utilisez l’application Deep Network Designer pour créer, visualiser et entraîner des réseaux de neurones de Deep Learning de manière interactive. Pour plus d’informations, veuillez consulter Introduction au Deep Network Designer.

Définir un problème

Pour définir un problème de fitting (régression) pour la toolbox, organisez un ensemble de vecteurs d’entrée (prédicteurs) sous forme de colonnes dans une matrice. Organisez ensuite un ensemble de réponses (les vecteurs de sortie corrects pour chacun des vecteurs d’entrée) dans une deuxième matrice. Vous pouvez par exemple définir un problème de régression avec quatre observations, avec chacune deux caractéristiques d’entrée et une réponse unique, de la manière suivante :

predictors = [0 1 0 1; 0 0 1 1];
responses = [0 0 0 1];

La section suivante indique comment entraîner un réseau pour l'adapter à un jeu de données avec l’application Neural Net Fitting. Cet exemple utilise un jeu de données fourni avec la toolbox.

Utiliser l’application Neural Net Fitting pour adapter le réseau aux données

Cet exemple indique comment entraîner un réseau de neurones peu profond pour l'adapter aux données avec l’application Neural Net Fitting.

Ouvrez l’application Neural Net Fitting avec nftool.

nftool

Sélectionner les données

L’application Neural Net Fitting comporte des exemples de données pour vous aider à commencer à entraîner un réseau de neurones.

Pour importer un exemple de données de graisse corporelle, sélectionnez Import > Import Body Fat Data Set. Vous pouvez utiliser ce jeu de données pour entraîner un réseau de neurones afin d’estimer la graisse corporelle d’une personne à partir de plusieurs mesures. Si vous importez vos propres données depuis un fichier ou l’espace de travail, vous devez spécifier les prédicteurs et les réponses et si les observations sont dans des lignes ou dans des colonnes.

Les informations sur les données importées apparaissent dans le Model Summary. Ce jeu de données contient 252 observations avec 13 caractéristiques chacune. Les réponses contiennent le pourcentage de graisse corporelle pour chaque observation.

Répartissez les données entre les jeux d’apprentissage, de validation et de test. Conservez les paramètres par défaut. Les données sont réparties en :

  • 70 % pour l’apprentissage.

  • 15 % pour valider que le réseau généralise et arrêter l’apprentissage avant un surajustement (overfitting).

  • 15 % pour tester la généralisation du réseau de manière indépendante.

Pour plus d’informations sur la division des données, veuillez consulter Divide Data for Optimal Neural Network Training.

Créer un réseau

Ce réseau est un réseau feedforward à deux couches, avec une fonction de transfert sigmoïde dans la couche cachée et une fonction de transfert linéaire dans la couche de sortie. La valeur Layer size définit le nombre de neurones cachés. Conservez la taille de couche par défaut, 10. Vous pouvez voir l’architecture du réseau dans le volet Network. La représentation du réseau est actualisée pour refléter les données d'entrée. Dans cet exemple, les données présentent 13 entrées (caractéristiques) et une sortie.

Entraîner le réseau

Pour entraîner le réseau, sélectionnez Train > Train with Levenberg-Marquardt. Il s'agit de l’algorithme d’apprentissage par défaut, qui équivaut à cliquer sur Train.

L’apprentissage avec Levenberg-Marquardt (trainlm) est recommandé pour la plupart des problèmes. Pour les problèmes avec un ensemble de données petit ou bruité, la régularisation bayésienne (trainbr) peut offrir une meilleure solution, bien que cela prenne plus de temps. Pour des problèmes de grande dimension, le gradient conjugué à l’échelle (SCG, Scaled Conjugate Gradient) (trainscg) est recommandé car il utilise des calculs de gradient qui consomment moins de mémoire que les calculs jacobiens utilisés par les deux autres algorithmes.

Vous pouvez voir la progression de l'apprentissage dans le volet Training. L'apprentissage se poursuit jusqu’à ce que l'un des critères d’arrêt soit rempli. Dans cet exemple, l’apprentissage continue jusqu’à ce que l’erreur de validation augmente consécutivement sur six itérations (« Critère de validation respecté »).

Analyser les résultats

Le Model Summary contient des informations sur l’algorithme d’apprentissage et sur les résultats de l’apprentissage pour chaque jeu de données.

Vous pouvez continuer à analyser les résultats en générant des tracés. Pour tracer la régression linéaire, dans la section Plots, cliquez sur Regression. Le tracé de régression affiche les prédictions (sortie) du réseau par rapport aux réponses (cible) pour les jeux d’apprentissage, de validation et de test.

Pour une adaptation parfaite, les données devraient se trouver le long d’une droite à 45 degrés, où les sorties du réseau sont égales aux réponses. Pour ce problème, l’adaptation est assez bonne pour tous les jeux de données. Si vous avez besoin de résultats plus précis, vous pouvez entraîner à nouveau le réseau en cliquant à nouveau sur Train. Pour chaque apprentissage le réseau aura des poids et des biais initiaux différents et offrira potentiellement une fois l'apprentissage terminé un meilleur réseau.

Regardez l’histogramme des erreurs d’entrée pour obtenir une vérification supplémentaire des performances du réseau. Dans la section Plots, cliquez sur Error Histogram.

Les barres bleues représentent les données d’apprentissage, les barres vertes représentent les données de validation et les barres rouges représentent les données de test. L’histogramme présente une indication des valeurs aberrantes, qui sont des points de données où l’adaptation est nettement moins bonne que pour la plupart des données. Il est recommandé de vérifier les valeurs aberrantes afin de déterminer si les données sont mauvaises ou si ces points de données diffèrent du reste du jeu de données. Si les valeurs aberrantes sont des points de données valides mais ne ressemblent pas au reste des données, le réseau réalise une extrapolation pour ces points. Il est alors préférable de collecter de nouvelles données qui ressemblent aux valeurs aberrantes et entraîner à nouveau le réseau.

Si vous n’êtes pas satisfait des performances du réseau, vous disposez des possibilités suivantes :

  • Entraîner à nouveau le réseau.

  • Augmenter le nombre de neurones cachés.

  • Utiliser un jeu de données d’apprentissage plus grand.

De bonnes performances sur le jeu d’apprentissage associées à de mauvaises performances sur le jeu de test pourraient indiquer un surajustement (overfitting) du modèle. Une réduction du nombre de neurones permet de réduire le surajustement.

Vous pouvez également évaluer les performances du réseau sur un jeu de test supplémentaire. Pour charger des données de test supplémentaires pour l'évaluation du réseau, dans la section Test, cliquez sur Test. Le Model Summary affiche les résultats des tests supplémentaires. Vous pouvez également générer des tracés afin d’analyser les résultats des données de test supplémentaires.

Générer du code

Sélectionnez Generate Code > Generate Simple Training Script afin de créer du code MATLAB pour reproduire les étapes précédentes en ligne de commande. Il peut être utile de créer du code MATLAB si vous voulez apprendre comment utiliser la fonctionnalité de ligne de commande de la toolbox pour personnaliser le processus d’apprentissage. Dans Utiliser les fonctions en ligne de commande pour adapter les données, vous étudierez les scripts générés de manière plus détaillée.

Exporter un réseau

Vous pouvez exporter votre réseau entraîné vers l’espace de travail ou Simulink®. Vous pouvez également déployer le réseau avec les outils MATLAB Compiler™ et d’autres outils de génération de code MATLAB. Pour exporter votre réseau entraîné et vos résultats, sélectionnez Export Model > Export to Workspace.

Utiliser les fonctions en ligne de commande pour adapter les données

La manière la plus facile d’apprendre à utiliser la fonctionnalité en ligne de commande de la toolbox consiste à générer des scripts à partir des applications, puis à les modifier afin de personnaliser l’apprentissage du réseau. À titre d’exemple, regardez le script simple qui a été créé dans la section précédente à l’aide de l'application Neural Net Fitting.

% Solve an Input-Output Fitting problem with a Neural Network
% Script generated by Neural Fitting app
% Created 15-Mar-2021 10:48:13
%
% This script assumes these variables are defined:
%
%   bodyfatInputs - input data.
%   bodyfatTargets - target data.

x = bodyfatInputs;
t = bodyfatTargets;

% Choose a Training Function
% For a list of all training functions type: help nntrain
% 'trainlm' is usually fastest.
% 'trainbr' takes longer but may be better for challenging problems.
% 'trainscg' uses less memory. Suitable in low memory situations.
trainFcn = 'trainlm';  % Levenberg-Marquardt backpropagation.

% Create a Fitting Network
hiddenLayerSize = 10;
net = fitnet(hiddenLayerSize,trainFcn);

% Setup Division of Data for Training, Validation, Testing
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

% Train the Network
[net,tr] = train(net,x,t);

% Test the Network
y = net(x);
e = gsubtract(t,y);
performance = perform(net,t,y)

% View the Network
view(net)

% Plots
% Uncomment these lines to enable various plots.
%figure, plotperform(tr)
%figure, plottrainstate(tr)
%figure, ploterrhist(e)
%figure, plotregression(t,y)
%figure, plotfit(net,x,t)

Vous pouvez enregistrer le script puis l’exécuter en ligne de commande afin de reproduire les résultats de la session d’apprentissage précédente. Vous pouvez également éditer le script pour personnaliser le processus d’apprentissage. Dans ce cas, suivez chaque étape du script.

Sélectionner les données

Ce script suppose que les vecteurs prédicteurs et réponses soient déjà chargés dans l’espace de travail. Si les données ne sont pas chargées, vous pouvez les charger de la manière suivante :

load bodyfat_dataset

Cette commande charge les prédicteurs bodyfatInputs et les réponses bodyfatTargets dans l’espace de travail.

Ce jeu de données est l’un des exemples de jeux de données de la toolbox. Pour des informations sur les jeux de données disponibles, veuillez consulter Exemples de jeux de données pour les réseaux de neurones peu profonds. Vous pouvez également voir une liste de tous les jeux de données disponibles en saisissant la commande help nndatasets. Vous pouvez charger les variables depuis n’importe lequel de ces jeux de données avec vos propres noms de variables. Par exemple, la commande

[x,t] = bodyfat_dataset;

permet de charger les prédicteurs de données de graisse corporelle dans le tableau x et les réponses dans le tableau t.

Choisir un algorithme d’apprentissage

Choisissez un algorithme d’apprentissage. Le réseau utilise l’algorithme Levenberg-Marquardt par défaut (trainlm) pour l’apprentissage.

trainFcn = 'trainlm';  % Levenberg-Marquardt backpropagation. 

Lorsque l’algorithme Levenberg-Marquardt ne produit pas de résultats aussi précis que vous le souhaitez ou pour les problèmes utilisant des données volumineuses, vous pouvez respectivement utiliser les fonctions d’apprentissage du réseau de la régularisation bayésienne (trainbr) ou du gradient conjugué à l’échelle (SCG) (trainscg)

net.trainFcn = 'trainbr';
net.trainFcn = 'trainscg';

Créer un réseau

Créez un réseau. Le réseau par défaut pour les problèmes d'ajustement (ou de régression) de fonction, fitnet, est un réseau feedforward, avec une fonction de transfert tan-sigmoïde par défaut dans la couche cachée et une fonction de transfert linéaire dans la couche de sortie. Le réseau a une couche cachée unique avec dix neurones (par défaut). Le réseau possède un unique neurone de sortie car il n'y a qu'une seule valeur de réponse associée à chaque vecteur d’entrée.

hiddenLayerSize = 10;
net = fitnet(hiddenLayerSize,trainFcn);

Remarque

L’augmentation du nombre de neurones nécessite plus de calcul, ce qui a tendance à provoquer un surajustement (overfitting) des données lorsque le nombre est trop élevé, mais cela permet au réseau de résoudre des problèmes plus compliqués. Un plus grand nombre de couches nécessite plus de calcul, mais cela peut permettre au réseau de résoudre des problèmes complexes plus efficacement. Pour utiliser plusieurs couches cachées, entrez les tailles des couches cachées comme éléments d’un tableau dans la commande fitnet.

Diviser les données

Définissez la division des données.

net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

Avec ces paramètres, les vecteurs prédicteurs et les vecteurs réponses seront divisés de manière aléatoire, 70 % des données étant utilisées pour l’apprentissage, 15 % pour la validation et 15 % pour les tests. Pour plus d’informations sur le processus de division des données, veuillez consulter Divide Data for Optimal Neural Network Training.

Entraîner le réseau

Entraînez le réseau.

[net,tr] = train(net,x,t);

Pendant l’apprentissage, la fenêtre de progression de l’apprentissage apparaît. Vous pouvez interrompre l’apprentissage n'importe quand en cliquant sur le bouton d’arrêt Stop button.

Neural network training progress window

L’apprentissage s’arrête lorsque l’erreur de validation augmente consécutivement sur six itérations. Si vous cliquez sur Performance dans la fenêtre d’apprentissage, un tracé des erreurs d’apprentissage, de validation et de test apparaît, comme illustré sur la figure suivante. Dans cet exemple, le résultat est raisonnable pour les raisons suivantes :

  • L’erreur quadratique moyenne finale est faible.

  • Les caractéristiques de l’erreur du jeu de test et du jeu de validation sont similaires.

  • Il n’y a pas eu de surajustement (overfitting) significatif jusqu'à l'epoch 13 (qui présente les meilleures performances de validation).

    Mean squared error against number of epochs for the training, validation, and test data. The best validation performance is 18.5252 at epoch 13.

Tester le réseau

Testez le réseau. Une fois que le réseau a été entraîné, vous pouvez l’utiliser pour calculer les sorties du réseau. Le code suivant calcule les sorties, les erreurs et la performance globale du réseau.

y = net(x);
e = gsubtract(t,y);
performance = perform(net,t,y)
performance =

   16.2815

Il est également possible de calculer les performances du réseau uniquement sur le jeu de test en utilisant les indices de test, qui sont situés dans l’enregistrement de l'apprentissage. Pour plus d’informations, veuillez consulter Analyze Shallow Neural Network Performance After Training.

tInd = tr.testInd;
tstOutputs = net(x(:,tInd));
tstPerform = perform(net,t(tInd),tstOutputs)
tstPerform =

   20.1698

Afficher le réseau

Affichez le schéma du réseau.

view(net)

Graphical representation of the function fitting network. The network has input size 13, output size 1, and a single hidden layer of size 10.

Analyser les résultats

Analysez les résultats. Pour réaliser une régression linéaire entre les prédictions (sorties) du réseau et les réponses (cibles) correspondantes, cliquez sur Regression dans la fenêtre d’apprentissage.

Output values against target values for the training, validation, test, and combined data.

La sortie suit bien les réponses pour les jeux d’apprentissage, de test et de validation et la valeur R est supérieure à 0,87 pour la totalité du jeu de données. Si vous aviez besoin de résultats encore plus précis, vous pourriez essayer l’une de ces approches :

  • Remplacer les valeurs de poids et de biais initiaux du réseau par de nouvelles valeurs avec init et réessayer.

  • Augmenter le nombre de neurones cachés.

  • Utiliser un jeu de données d’apprentissage plus grand.

  • Augmenter le nombre de valeurs d’entrée si des informations plus utiles sont disponibles.

  • Essayer un autre algorithme d’apprentissage (voir Training Algorithms).

Dans ce cas, la réponse du réseau est satisfaisante et vous pouvez maintenant utiliser le réseau avec de nouvelles données.

Étapes suivantes

Pour gagner en expérience dans les opérations en ligne de commande, essayez certaines de ces tâches :

  • Pendant l’apprentissage, ouvrez une fenêtre de tracé (telle que le tracé de régression) et regardez-la progresser.

  • Réalisez des tracés en ligne de commande avec des fonctions telles que plotfit, plotregression, plottrainstate et plotperform.

Consultez également le script avancé pour plus d’options lors de l’apprentissage en ligne de commande.

A chaque fois qu'un réseau de neurones est entraîné, il peut produire une solution différente en raison des valeurs initiales aléatoires de poids et de biais, et des différences de partition des données en jeux de données d’apprentissage, de validation et de test. Par conséquent, différents réseaux de neurones entraînés sur le même problème peuvent produire différentes sorties pour la même entrée. Pour s'assurer qu'un réseau de neurones est suffisamment précis, réalisez plusieurs apprentissages.

Il existe plusieurs autres techniques pour améliorer les résultats si vous voulez plus de précision. Pour plus d’informations, veuillez consulter Improve Shallow Neural Network Generalization and Avoid Overfitting.

Voir aussi

| | | | | |

Sujets associés