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);
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 für Regression eine vollständig verbundene Schicht mit einer Ausgangsgröße, die der Anzahl Antworten entspricht, hinzu.
In diesem Beispiel normalisiert der Trainingsprozess automatisch mithilfe der Trainingsoption
NormalizeTargets(in R2026a eingeführt) die Trainingsziele. Normalisierte Ziele helfen dabei, das Training zu stabilisieren und führen zu Trainingsvorhersagen, die den normalisierten Zielen stark entsprechen. Um die Ausgaben-Vorhersagen des neuronalen Netzes nur zur Vorhersagezeit im Raum der nicht normalisierten Werte zu treffen, fügen Sie eine inverse Normalisierungsschicht (eingeführt in R2026a) hinzu. Vor R2026a: Um das Training zu stabilisieren, normalisieren Sie die Ziele manuell, bevor Sie das neuronale Netz trainieren.
numResponses = size(anglesTrain,2);
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)
inverseNormalizationLayer];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.
Trainieren Sie mit einer Minibatch-Größe von 128.
Normalisieren Sie die Trainingsziele automatisch mithilfe des Arguments
NormalizeTargets(eingeführt in R2026a). Vor R2026a: Um das Training zu stabilisieren, normalisieren Sie die Ziele manuell, bevor Sie das neuronale Netz trainieren.Verwenden Sie eine anfängliche Lerngeschwindigkeit von 0,001 und senken Sie die Lerngeschwindigkeit mit einem schrittweisen Lerngeschwindigkeitsplan, der die Lerngeschwindigkeit alle 20 Epochen um einen Faktor von 0,1 senkt.
Validieren Sie das neuronale Netz jede Epoche mithilfe der Validierungsdaten.
Zeigen Sie den Trainingsfortschritt in einem Diagramm an.
Deaktivieren Sie die ausführliche Ausgabe.
miniBatchSize = 128; schedule = piecewiseLearnRate( ... DropFactor=0.1, ... Period=20); numIterationsPerEpoch = floor(numel(anglesTrain)/miniBatchSize); options = trainingOptions("sgdm", ... NormalizeTargets=true, ... MiniBatchSize=miniBatchSize, ... InitialLearnRate=1e-3, ... LearnRateSchedule=schedule, ... Shuffle="every-epoch", ... ValidationData={XValidation,anglesValidation}, ... ValidationFrequency=numIterationsPerEpoch, ... Plots="training-progress", ... 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 = 7.6861
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
33.0647
figure
imshow(X)
title("Angle: " + gather(Y))
Siehe auch
trainnet | trainingOptions | dlnetwork