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
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
trainnet
| trainingOptions
| dlnetwork
| lstmLayer
| sequenceInputLayer
Argomenti complementari
- Classificazione di sequenze utilizzando il Deep Learning
- Train Sequence Classification Network Using Data With Imbalanced Classes
- Previsione delle serie temporali tramite il Deep Learning
- Sequence-to-Sequence Regression Using Deep Learning
- Sequence-to-One Regression Using Deep Learning
- Long Short-Term Memory Neural Networks
- Deep Learning in MATLAB