Trainieren eines Convolutional Neural Network für Regression
Dieses Beispiel zeigt, wie Sie ein Convolutional Neural Network darauf trainieren können, die Drehwinkel handgeschriebener Ziffern vorherzusagen.
Bei Regressionsaufgaben werden kontinuierliche numerische Werte statt diskreter Klassen-Kennzeichnungen vorhergesagt. Bei diesem Beispiel wird eine Convolutional Neural Network-Architektur für Regression konstruiert, das Netz trainiert und das trainierte Netz zur Vorhersage der Winkel rotierter handgeschriebener Ziffern verwendet.
Dieses Diagramm stellt den Fluss von Bilddaten durch ein neuronales Regressionsnetz dar.
Laden der Daten
Der Datensatz umfasst synthetische Bilder handgeschriebener Ziffern und die jeweiligen Winkel (in Grad), um den jedes Bild gedreht ist.
Laden Sie die Trainings- und Testdaten jeweils aus den MAT-Dateien DigitsDataTrain.mat
und DigitsDataTest.mat
. Die Variablen anglesTrain
und anglesTest
sind die Drehwinkel in Grad. Die Trainings- und Testdatensätze enthalten jeweils 5000 Bilder.
load DigitsDataTrain load DigitsDataTest
Zeigen Sie einige der Trainingsbilder an.
numObservations = size(XTrain,4); idx = randperm(numObservations,49); I = imtile(XTrain(:,:,:,idx)); figure imshow(I);
Teilen Sie XTrain
und anglesTrain
mithilfe der trainingPartitions
-Funktion (diesem Beispiel als unterstützende Datei angehängt) in Trainings- und Validierungspartitionen auf. Um auf diese Funktion zuzugreifen, öffnen Sie das Beispiel als Live-Skript. Reservieren Sie 15 % der Trainingsdaten für die Validierung.
[idxTrain,idxValidation] = trainingPartitions(numObservations,[0.85 0.15]); XValidation = XTrain(:,:,:,idxValidation); anglesValidation = anglesTrain(idxValidation); XTrain = XTrain(:,:,:,idxTrain); anglesTrain = anglesTrain(idxTrain);
Überprüfen der Datennormalisierung
Beim Training neuronaler Netze ist es oft nützlich, sicherzustellen, dass Ihre Daten in allen Stufen des Netzes normalisiert sind. Eine Normalisierung stabilisiert und beschleunigt das Training des Netzes mit Gradientenabstieg. Wenn Ihre Daten schlecht skaliert sind, kann der Verlust NaN
sein und die Netzparameter können während des Trainings divergieren. Übliche Methoden zur Normalisierung von Daten umfassen ein Neuskalieren der Daten, sodass ihr Bereich [0,1] ist bzw. der Mittelwert Null und die Standardabweichung 1 beträgt. Sie können die folgenden Daten normalisieren:
Eingangsdaten. Normalisieren Sie die Prädiktoren, bevor Sie diese dem Netz übergeben. In diesem Beispiel wurden die Eingangsbilder bereits auf den Bereich [0,1] normalisiert.
Ausgänge von Schichten. Sie können die Ausgänge jeder gefalteten, vollständig verbundenen Schicht mithilfe einer Batch-Normalisierungsschicht normalisieren.
Antworten. Wenn Sie Batch-Normalisierungsschichten verwenden, um die Ausgänge von Schichten am Ende des Netzes zu normalisieren, werden die Vorhersagen des Netzes normalisiert, wenn das Training beginnt. Wenn die Skalierung der Antwort sich stark von diesen Vorhersagen unterscheidet, ist es möglich, dass das Netztraining keine Konvergenz erreichen kann. Wenn Ihre Antwort schlecht skaliert ist, versuchen Sie, sie zu normalisieren und überprüfen Sie, ob sich das Netztraining verbessert. Wenn Sie die Antwort vor dem Training normalisieren, müssen Sie die Vorhersagen des trainierten Netzes transformieren, um die Vorhersagen der ursprünglichen Antwort zu erhalten.
Stellen Sie die Verteilung der Antwort dar. Die Antwort (der Drehwinkel in Grad) ist ungefähr gleichmäßig zwischen -45 und +45 verteilt; in diesem Fall ist keine Normalisierung erforderlich. Bei Klassifizierungsproblemen sind die Ausgaben Klassenwahrscheinlichkeiten, die immer normalisiert sind.
figure histogram(anglesTrain) axis tight ylabel("Counts") xlabel("Rotation Angle")
Im Allgemeinen müssen die Daten nicht exakt normalisiert sein. Wenn Sie das Netz in diesem Beispiel jedoch auf die Vorhersage von 100*anglesTrain
oder anglesTrain+500
statt anglesTrain
trainieren, wird der Verlust NaN
und die Netzparameter divergieren, wenn das Training startet. Zu diesen Ergebnissen kommt es, obwohl der einzige Unterschied zwischen einem Netz zur Vorhersage von und zur Vorhersage von eine einfache Neuskalierung der Gewichtungen und Verzerrungen der letzten vollständig verbundenen Schicht ist.
Wenn die Verteilung des Eingangs oder der Antwort sehr ungleichmäßig oder verzerrt ist, können Sie zudem nichtlineare Transformationen (beispielsweise Logarithmen) auf die Daten anwenden, bevor Sie das Netz trainieren.
Definieren der Architektur des neuronalen Netzes
Definieren Sie die Architektur des neuronalen Netzes.
Legen Sie für jeden Bildeingang eine Bild-Eingangsschicht fest.
Legen Sie vier Faltungs-Batchnorm-ReLU-Blöcke mit einer wachsenden Anzahl von Filtern fest.
Legen Sie zwischen jedem Block eine Durchschnitts-Pooling-Schicht mit Pooling-Regionen und Schrittweite 2 fest.
Fügen Sie am Ende des Netzes eine vollständig verbundene Schicht mit einer Ausgangsgröße, die der Anzahl Antworten entspricht, hinzu.
numResponses = 1; layers = [ imageInputLayer([28 28 1]) convolution2dLayer(3,8,Padding="same") batchNormalizationLayer reluLayer averagePooling2dLayer(2,Stride=2) convolution2dLayer(3,16,Padding="same") batchNormalizationLayer reluLayer averagePooling2dLayer(2,Stride=2) convolution2dLayer(3,32,Padding="same") batchNormalizationLayer reluLayer convolution2dLayer(3,32,Padding="same") batchNormalizationLayer reluLayer fullyConnectedLayer(numResponses)];
Festlegen von Trainingsoptionen
Legen Sie die Trainingsoptionen fest. Die Auswahl aus diesen Optionen erfordert eine empirische Analyse. Um verschiedene Konfigurationen von Trainingsoptionen durch Experimente zu untersuchen, können Sie die App Experiment Manager verwenden.
Setzen Sie die anfängliche Lerngeschwindigkeit auf 0,001 und senken Sie die Lerngeschwindigkeit nach 20 Epochen.
Geben Sie Validierungsdaten und Validierungsfrequenz an, um die Netzgenauigkeit während des Trainings zu überwachen. Die Software trainiert das Netz mit den Trainingsdaten und berechnet die Genauigkeit der Validierungsdaten während des Trainings in regelmäßigen Intervallen. Die Validierungsdaten werden nicht zur Aktualisierung der Netzgewichtungen verwendet.
Zeigen Sie den Trainingsfortschritt in einem Diagramm an und überwachen Sie die Wurzel der mittleren quadratischen Abweichung.
Deaktivieren Sie die ausführliche Ausgabe.
miniBatchSize = 128; validationFrequency = floor(numel(anglesTrain)/miniBatchSize); options = trainingOptions("sgdm", ... MiniBatchSize=miniBatchSize, ... InitialLearnRate=1e-3, ... LearnRateSchedule="piecewise", ... LearnRateDropFactor=0.1, ... LearnRateDropPeriod=20, ... Shuffle="every-epoch", ... ValidationData={XValidation,anglesValidation}, ... ValidationFrequency=validationFrequency, ... Plots="training-progress", ... Metrics="rmse", ... Verbose=false);
Trainieren von neuronalen Netzen
Trainieren Sie das neuronale Netz mit der Funktion trainnet
. Verwenden Sie für die Regression den mittleren quadratischen Abweichungsverlust. Standardmäßig verwendet die trainnet
-Funktion eine GPU, sofern vorhanden. Die Verwendung einer GPU erfordert eine Parallel Computing Toolbox™-Lizenz und ein unterstütztes GPU-Gerät. Informationen zu unterstützten Geräten finden Sie unter GPU Computing Requirements (Parallel Computing Toolbox). Andernfalls verwendet die Funktion die CPU. Um die Ausführungsumgebung festzulegen, verwenden Sie die Trainingsoption ExecutionEnvironment
.
net = trainnet(XTrain,anglesTrain,layers,"mse",options);
Testen des Netzes
Testen Sie das neuronale Netz mit der Funktion testnet
. Evaluieren Sie für die Regression die Wurzel der mittleren quadratischen Abweichung. Standardmäßig verwendet die testnet
-Funktion eine GPU, sofern vorhanden. Um die Ausführungsumgebung manuell auszuwählen, verwenden Sie das Argument ExecutionEnvironment
der testnet
-Funktion.
rmse = testnet(net,XTest,anglesTest,"rmse")
rmse = 4.9274
Visualisieren Sie die Genauigkeit in einem Diagramm, indem Sie anhand der Testdaten Vorhersagen vornehmen und die Vorhersagen mit den Zielen vergleichen. Treffen Sie Vorhersagen mit der Funktion minibatchpredict
. Standardmäßig verwendet die minibatchpredict
-Funktion eine GPU, sofern vorhanden.
YTest = minibatchpredict(net,XTest);
Stellen Sie die vorhergesagten Werte gegenüber den Zielen dar.
figure scatter(YTest,anglesTest,"+") xlabel("Prediction") ylabel("Target") hold on plot([-60 60], [-60 60],"r--")
Vorhersagen mit neuen Daten treffen
Verwenden Sie das neuronale Netz, um eine Vorhersage für das erste Testbild zu treffen. Um eine Vorhersage mit einem einzelnen Bild zu treffen, verwenden Sie die Funktion predict
. Um eine GPU zu verwenden, konvertieren Sie die Daten zunächst in gpuArray
.
X = XTest(:,:,:,1); if canUseGPU X = gpuArray(X); end Y = predict(net,X)
Y = single
34.7356
figure
imshow(X)
title("Angle: " + gather(Y))
Siehe auch
trainnet
| trainingOptions
| dlnetwork