Main Content

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

Classificazione sequenza-sequenza utilizzando il Deep Learning

Questo esempio mostra come classificare ogni fase temporale dei dati sequenziali utilizzando una rete con memoria a breve e lungo termine (LSTM).

Per addestrare una rete neurale profonda a classificare ogni fase temporale dei dati sequenziali, è possibile utilizzare una rete LSTM sequenza-sequenza. Una rete LSTM sequenza-sequenza consente di fare previsioni diverse per ogni fase temporale dei dati sequenziali.

Questo esempio utilizza i dati del sensore ottenuti da uno smartphone tenuto sul corpo. L'esempio addestra una rete LSTM a riconoscere l'attività di chi indossa lo smartphone, data una serie di dati temporali che rappresentano le letture dell'accelerometro in tre diverse direzioni. I dati di addestramento contengono dati di serie temporali per sette persone. Ogni sequenza ha tre feature e varia in lunghezza. Il set di dati contiene sei osservazioni di addestramento e un’osservazione di prova.

Caricamento dei dati sequenziali

Caricare i dati di riconoscimento dell’attività umana. I dati di addestramento contengono sei sequenze di dati del sensore ottenuti da uno smartphone tenuto sul corpo. Ogni sequenza ha tre feature e varia in lunghezza. Le tre feature corrispondono alle letture dell'accelerometro in tre direzioni diverse.

load HumanActivityTrain
XTrain
XTrain=6×1 cell array
    {3×64480 double}
    {3×53696 double}
    {3×56416 double}
    {3×50688 double}
    {3×51888 double}
    {3×54256 double}

Visualizzare una sequenza di addestramento in un grafico. Tracciare la prima feature della prima sequenza di addestramento e colorare il grafico in base all’attività corrispondente.

X = XTrain{1}(1,:);
classes = categories(YTrain{1});

figure
for j = 1:numel(classes)
    label = classes(j);
    idx = find(YTrain{1} == label);
    hold on
    plot(idx,X(idx))
end
hold off

xlabel("Time Step")
ylabel("Acceleration")
title("Training Sequence 1, Feature 1")
legend(classes,'Location','northwest')

Definizione dell’architettura di rete LSTM

Definire l’architettura di rete LSTM. Specificare che l’input è costituito da sequenze di dimensione 3 (il numero di feature dei dati di input). Specificare un livello LSTM con 200 unità nascoste e generare la sequenza completa. Specificare infine cinque classi, includendo un livello completamente connesso di dimensione 5, seguito da un livello softmax e da un livello di classificazione.

numFeatures = 3;
numHiddenUnits = 200;
numClasses = 5;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','sequence')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

Specificare le opzioni di addestramento. Impostare il solver su 'adam'. Addestrare per 60 epoche. Per evitare che i gradienti esplodano, impostare la soglia del gradiente su 2.

options = trainingOptions('adam', ...
    'MaxEpochs',60, ...
    'GradientThreshold',2, ...
    'Verbose',0, ...
    'Plots','training-progress');

Addestrare la rete LSTM con le opzioni di addestramento specificate utilizzando trainNetwork. Ciascun mini-batch contiene l'intero set di addestramento, pertanto il grafico è aggiornato una volta per ciascuna epoca. Le sequenze sono molto lunghe, quindi l’elaborazione di ogni mini-batch e l’aggiornamento del grafico potrebbero richiedere un po’ di tempo.

net = trainNetwork(XTrain,YTrain,layers,options);

Test della rete LSTM

Caricare i dati di prova e classificare l'attività a ogni passo temporale.

Caricare i dati del test sull’attività umana. XTest contiene una singola sequenza di dimensione 3. YTest contiene una sequenza di etichette categoriali corrispondenti all’attività in ogni fase temporale.

load HumanActivityTest
figure
plot(XTest{1}')
xlabel("Time Step")
legend("Feature " + (1:numFeatures))
title("Test Data")

Classificare i dati di test utilizzando classify.

YPred = classify(net,XTest{1});

In alternativa, è possibile effettuare previsioni per ciascuna fase temporale alla volta, utilizzando classifyAndUpdateState. Questa alternativa è utile quando i valori delle fasi temporali arrivano in un flusso. Di solito, è più veloce fare previsioni su sequenze complete piuttosto che eseguirle su una fase temporale alla volta. Per un esempio che mostra come prevedere le fasi temporali future tramite l’aggiornamento della rete tra le previsioni delle singole fasi temporali, vedere Previsione delle serie temporali tramite il Deep Learning.

Calcolare la precisione delle previsioni.

acc = sum(YPred == YTest{1})./numel(YTest{1})
acc = 0.9998

Confrontare le previsioni con i dati di test utilizzando un grafico.

figure
plot(YPred,'.-')
hold on
plot(YTest{1})
hold off

xlabel("Time Step")
ylabel("Activity")
title("Predicted Activities")
legend(["Predicted" "Test Data"])

Vedi anche

| | |

Argomenti complementari