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 da una serie di dati temporali che rappresentano le letture dell'accelerometro in tre diverse direzioni.
Caricamento dei dati sequenziali
Caricare i dati di riconoscimento dell’attività umana. I dati di addestramento contengono dati di serie temporali di sei persone. I dati di test contengono una singola serie temporale di una settima persona. Ogni sequenza ha tre feature e varia in lunghezza. Le tre feature corrispondono alle letture dell'accelerometro in tre direzioni diverse.
load HumanActivityTrain
XTrainXTrain=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.
numFeatures = 3; numHiddenUnits = 200; numClasses = 5; layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,OutputMode="sequence") fullyConnectedLayer(numClasses) softmaxLayer];
Specificare le opzioni di addestramento.
Addestrare utilizzando il solver Adam.
Addestrare per 60 epoche.
Poiché i dati di addestramento presentano sequenze con righe e colonne corrispondenti rispettivamente ai canali e alle fasi temporali, specificare il formato dei dati di input
"CTB"(canale, tempo, batch).Per evitare che i gradienti esplodano, impostare la soglia del gradiente su 2.
Visualizzare l'andamento dell'addestramento in un grafico e disattivare l'output verboso.
Monitorare la precisione della rete durante l'addestramento.
options = trainingOptions("adam", ... MaxEpochs=60, ... InputDataFormats="CTB", ... GradientThreshold=2, ... Plots="training-progress", ... Verbose=false, ... Metrics="accuracy");
Addestrare la rete LSTM utilizzando la funzione trainnet. Per la classificazione, utilizzare la perdita di entropia incrociata. Per impostazione predefinita, la funzione trainnet utilizza una GPU, se disponibile. L'addestramento su GPU richiede una licenza Parallel Computing Toolbox™ e un dispositivo GPU supportato. Per informazioni sui dispositivi supportati, vedere GPU Computing Requirements (Requisiti di calcolo su GPU). In caso contrario, la funzione trainnet utilizza la CPU. Per selezionare manualmente l'ambiente di esecuzione, utilizzare l'opzione di addestramento ExecutionEnvironment. 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 = trainnet(XTrain,YTrain,layers,"crossentropy",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 XTest = XTest{1}'; plot(XTest) xlabel("Time Step") ylabel("Acceleration") legend("Feature " + (1:numFeatures)) title("Test Data")

Per un input di osservazione singolo, effettuare le previsioni utilizzando la funzione predict. Per effettuare previsioni utilizzando la GPU, convertire innanzitutto i dati in gpuArray.
if canUseGPU XTest = gpuArray(XTest); end scores = predict(net,XTest);
Per convertire i punteggi di previsione in etichette, utilizzare la funzione scores2label.
Y = scores2label(scores,classes);
In alternativa, è possibile effettuare previsioni per ciascuna fase temporale alla volta, utilizzando la funzione predict e restituendo lo stato aggiornato della rete come output. È quindi possibile utilizzare l'output dello stato per aggiornare la proprietà State della rete. 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(Y == YTest{1}')./numel(YTest{1})acc = 0.9983
Confrontare le previsioni con i dati di test utilizzando un grafico.
figure plot(Y,".-") hold on plot(YTest{1}) hold off xlabel("Time Step") ylabel("Activity") title("Predicted Activities") legend(["Predicted" "Test Data"])

Vedi anche
trainnet | trainingOptions | dlnetwork | lstmLayer | sequenceInputLayer
Argomenti
- Classificazione di sequenze utilizzando il Deep Learning
- Train Sequence Classification Network Using Data with Imbalanced Classes
- Compare Deep Learning and ARMA Models for Time Series Modeling
- Previsione delle serie temporali tramite il Deep Learning
- Sequence-to-Sequence Regression Using Deep Learning
- Sequence-to-One Regression Using Deep Learning
- Reti neurali con memoria a breve e lungo termine
- Deep Learning in MATLAB