Contenuto principale

La traduzione di questa pagina non è aggiornata. Fai clic qui per vedere l'ultima versione in inglese.

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.

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

Controllo della normalizzazione dei dati

Quando si addestrano le reti neurali, spesso è utile assicurarsi che i dati siano normalizzati in tutte le fasi della rete. La normalizzazione aiuta a stabilizzare e velocizzare l'addestramento della rete utilizzando la discesa del gradiente. Se i dati non sono adeguatamente ridimensionati, la perdita può diventare NaN e i parametri della rete possono divergere durante l'addestramento. I modi più comuni per normalizzare i dati includono il ridimensionamento dei dati in modo che il loro intervallo diventi [0,1] o che abbiano una media di zero e una deviazione standard di uno. È possibile normalizzare i seguenti dati:

  • Dati di input. Normalizzare i predittori prima di inserirli nella rete. In questo esempio, le immagini di input sono già normalizzate sull'intervallo [0,1].

  • Output del livello. È possibile normalizzare gli output di ogni livello convoluzionale e completamente connesso utilizzando un livello di normalizzazione in batch.

  • Risposte. Se si utilizzano i livelli di normalizzazione in batch per normalizzare gli output dei livelli alla fine della rete, le previsioni della rete vengono normalizzate all'inizio dell'addestramento. Se la scala della risposta è molto diversa da queste previsioni, l'addestramento della rete potrebbe non convergere. Se la risposta non è ben ridimensionata, provare a normalizzarla e verificare se l'addestramento della rete migliora. Se si normalizza la risposta prima dell'addestramento, è necessario trasformare le previsioni della rete addestrata per ottenere le previsioni della risposta originale.

Tracciare la distribuzione della risposta. La risposta (l'angolo di rotazione in gradi) è distribuita in modo approssimativamente uniforme tra -45 e 45, condizione che funziona correttamente senza necessità di normalizzazione. Nei problemi di classificazione, gli output sono le probabilità delle classi, che sono sempre normalizzate.

figure
histogram(anglesTrain)
axis tight
ylabel("Counts")
xlabel("Rotation Angle")

Figure contains an axes object. The axes object with xlabel Rotation Angle, ylabel Counts contains an object of type histogram.

In generale, i dati non devono essere necessariamente normalizzati in modo esatto. Tuttavia, se si addestra la rete di questo esempio in modo che preveda 100*anglesTrain o anglesTrain+500 piuttosto che anglesTrain, la perdita diventa NaN e i parametri della rete divergono all'inizio dell'addestramento. Questi risultati si verificano anche se l'unica differenza tra una rete che prevede aY+b e una rete che prevede Y è un semplice ridimensionamento dei pesi e dei bias del livello finale completamente connesso.

Se la distribuzione dell'input o della risposta è molto irregolare o distorta, è anche possibile eseguire trasformazioni non lineari (ad esempio, l'applicazione di logaritmi) ai dati prima dell'addestramento della rete.

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.

  • Alla fine della rete, includere un livello completamente connesso con una grandezza di output che corrisponda al numero di risposte.

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

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.

  • Impostare la velocità di apprendimento iniziale a 0,001 e ridurla dopo 20 epoche.

  • Monitorare la precisione della rete durante l'addestramento specificando i dati di convalida e la frequenza di convalida. Il software addestra la rete sui dati di addestramento e calcola la precisione sui dati di convalida a intervalli regolari durante l'addestramento. I dati di convalida non sono utilizzati per aggiornare i pesi della rete.

  • Visualizzare l'andamento dell'addestramento in un grafico e monitorare l'errore quadratico medio.

  • Disattivare l’output verboso.

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

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 = 
4.9274

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

34.7356
figure
imshow(X)
title("Angle: " + gather(Y))

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

Vedi anche

| |

Argomenti