Contenuto principale

Addestramento della rete neurale convoluzionale per la regressione

Questo esempio mostra come addestrare una rete neurale convoluzionale per prevedere gli angoli di rotazione delle cifre scritte a mano.

Le attività di regressione implicano la previsione di valori numerici continui anziché di etichette discrete di classe. Questo esempio costruisce un'architettura di rete neurale convoluzionale per la regressione, addestra la rete e la utilizza per prevedere gli angoli delle cifre scritte a mano ruotate.

Questo diagramma illustra il flusso dei dati dell'immagine attraverso una rete neurale di regressione.

Diagram showing data flow of data through the neural network. The input data to the network is a collection of images of digits. The output of the neural network are numeric scalars.

Caricamento dei dati

Il set di dati contiene immagini sintetiche di cifre scritte a mano insieme agli angoli corrispondenti (in gradi) di rotazione di ciascuna immagine.

Caricare i dati di addestramento e di test rispettivamente dai file MAT DigitsDataTrain.mat e DigitsDataTest.mat. Le variabili anglesTrain e anglesTest sono gli angoli di rotazione in gradi. Gli insiemi di dati di addestramento e di test contengono ciascuno 5000 immagini.

load DigitsDataTrain
load DigitsDataTest

Visualizzare alcune immagini di addestramento.

numObservations = size(XTrain,4);
idx = randperm(numObservations,49);
I = imtile(XTrain(:,:,:,idx));
figure
imshow(I);

Figure contains an axes object. The hidden axes object contains an object of type image.

Suddividere XTrain e anglesTrain in partizioni di addestramento e di validazione utilizzando la funzione trainingPartitions, allegata a questo esempio come file di supporto. Per accedere a questa funzione, aprire l'esempio come script live. Riservare il 15% dei dati di addestramento per la validazione.

[idxTrain,idxValidation] = trainingPartitions(numObservations,[0.85 0.15]);

XValidation = XTrain(:,:,:,idxValidation);
anglesValidation = anglesTrain(idxValidation);

XTrain = XTrain(:,:,:,idxTrain);
anglesTrain = anglesTrain(idxTrain);

Definizione dell’architettura di una rete neurale

Definire l’architettura della rete neurale.

  • Per l'input dell'immagine, specificare un livello di input dell'immagine.

  • Specificare quattro blocchi convolution-batchnorm-ReLU con un numero crescente di filtri.

  • Specificare un livello di pooling medio con regioni di pooling e passo di grandezza 2 tra ciascun blocco.

  • Per la regressione, includere un livello completamente connesso con una dimensione di output che corrisponda al numero di risposte.

  • In questo esempio, il processo di addestramento normalizza automaticamente i target di addestramento utilizzando l'opzione di addestramento NormalizeTargets (introdotta nella release R2026a). Utilizzare target normalizzati contribuisce a stabilizzare l'addestramento e porta a previsioni di addestramento che corrispondono strettamente ai target normalizzati. Affinché la rete neurale generi previsioni nello spazio dei valori non normalizzati solo al momento della previsione, includere un livello di normalizzazione inversa (introdotto nella release R2026a).Prima della release R2026a: per stabilizzare l'addestramento, normalizzare manualmente i target prima di addestrare la rete neurale.

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];

Specificazione delle opzioni di addestramento

Specificare le opzioni di addestramento. La scelta tra le opzioni richiede un'analisi empirica. Per scoprire le diverse configurazioni delle opzioni di addestramento eseguendo esperimenti, è possibile utilizzare l'applicazione Experiment Manager.

  • Addestrare con una dimensione del mini-batch di 128.

  • Normalizzare automaticamente i target di addestramento utilizzando l'argomento NormalizeTargets (introdotto nella release R2026a). Prima della release R2026a: per stabilizzare l'addestramento, normalizzare manualmente i target prima di addestrare la rete neurale.

  • Utilizzare una velocità di apprendimento iniziale pari a 0,001 e ridurla utilizzando un programma della velocità di apprendimento a tratti che la riduca utilizzando un fattore pari a 0,1 ogni 20 epoche.

  • Validare la rete neurale utilizzando i dati di validazione a ogni epoca.

  • Visualizzare l'andamento dell'addestramento in un grafico.

  • Disattivare l’output verboso.

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);

Addestramento di reti neurali

Addestrare la rete neurale utilizzando la funzione trainnet. Per la regressione, utilizzare la perdita dell'errore quadratico medio. Per impostazione predefinita, la funzione trainnet utilizza una GPU, se disponibile. L'utilizzo di una GPU richiede una licenza Parallel Computing Toolbox™ e un dispositivo GPU supportato. Per informazioni sui dispositivi supportati, vedere GPU Computing Requirements (Parallel Computing Toolbox). In caso contrario, la funzione utilizza la CPU. Per specificare l'ambiente di esecuzione, utilizzare l'opzione di addestramento ExecutionEnvironment.

net = trainnet(XTrain,anglesTrain,layers,"mse",options);

Test della rete

Testare la rete neurale utilizzando la funzione testnet. Per la regressione, valutare l'errore quadratico medio (RMSE). Per impostazione predefinita, la funzione testnet utilizza una GPU, se disponibile. Per selezionare manualmente l'ambiente di esecuzione, utilizzare l'argomento ExecutionEnvironment della funzione testnet.

rmse = testnet(net,XTest,anglesTest,"rmse")
rmse = 
7.6861

Visualizzare la precisione in un grafico facendo previsioni con i dati del test e confrontando le previsioni con i target. Eseguire le previsioni utilizzando la funzione minibatchpredict. Per impostazione predefinita, la funzione minibatchpredict utilizza una GPU, se disponibile.

YTest = minibatchpredict(net,XTest);

Tracciare i valori previsti rispetto ai target.

figure
scatter(YTest,anglesTest,"+")
xlabel("Prediction")
ylabel("Target")

hold on
plot([-60 60], [-60 60],"r--")

Figure contains an axes object. The axes object with xlabel Prediction, ylabel Target contains 2 objects of type scatter, line.

Formulazione di previsioni con i nuovi dati

Utilizzare la rete neurale per fare una previsione con la prima immagine di prova. Per fare una previsione con una singola immagine, utilizzare la funzione predict. Per utilizzare una GPU, convertire prima i dati 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))

Figure contains an axes object. The hidden axes object with title Angle: 33.0647 contains an object of type image.

Vedi anche

| |

Argomenti