Main Content

Clasificación secuencia a secuencia mediante deep learning

Este ejemplo muestra cómo clasificar cada unidad de tiempo de datos secuenciales mediante una red de memoria de corto-largo plazo (LSTM).

Para entrenar una red neuronal profunda con la que clasificar cada unidad de tiempo de datos secuenciales, se puede utilizar una red de LSTM de secuencia a secuencia. Una red de LSTM de secuencia a secuencia permite realizar diferentes predicciones para cada unidad de tiempo individual de los datos secuenciales.

En este ejemplo se utilizan datos de sensor obtenidos con un smartphone que se lleva en el cuerpo. En el ejemplo se entrena una red de LSTM para reconocer la actividad de la persona que lo lleva, dados los datos de series de tiempo que representan lecturas del acelerómetro en tres direcciones diferentes. Los datos de entrenamiento contienen datos de series de tiempo para siete personas. Cada secuencia cuenta con tres características y diferentes longitudes. El conjunto de datos contiene seis observaciones de entrenamiento y una observación de prueba.

Cargar datos secuenciales

Cargue los datos de reconocimiento de actividad humana. Los datos de entrenamiento están formados por seis secuencias de datos de sensor obtenidos con un smartphone que se lleva en el cuerpo. Cada secuencia cuenta con tres características y diferentes longitudes. Las tres características se corresponden con las lecturas del acelerómetro en tres direcciones diferentes.

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}

Visualice una secuencia de entrenamiento en una gráfica. Represente la primera característica de la secuencia de entrenamiento y coloree la gráfica de acuerdo con la actividad correspondiente.

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

Definir la arquitectura de red de LSTM

Defina la arquitectura de la red de LSTM. Especifique la entrada en secuencias de tamaño 3 (el número de características de los datos de entrada). Especifique una capa de LSTM con 200 unidades ocultas y genere la secuencia completa. Por último, especifique cinco clases incluyendo una capa totalmente conectada de tamaño 5, seguida de una capa softmax y una capa de clasificación.

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

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

Especifique las opciones de entrenamiento. Establezca el solver en 'adam'. Entrene durante 60 épocas. Para evitar que los gradientes exploten, establezca el umbral del gradiente en 2.

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

Entrene la red de LSTM con las opciones de entrenamiento especificadas mediante trainNetwork. Cada minilote contiene el conjunto de entrenamiento completo, de manera que la gráfica se actualiza una vez por época. Las secuencias son muy largas, por lo que se puede llevar un tiempo en procesar cada minilote y actualizar la gráfica.

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

Probar la red de LSTM

Cargue los datos de prueba y clasifique la actividad en cada unidad de tiempo.

Cargue los datos de prueba de actividad humana. XTest contiene una única secuencia de dimensión 3. YTest contiene secuencias de etiquetas categóricas que se corresponden con la actividad en cada unidad de tiempo.

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

Clasifique los datos de prueba con classify.

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

Como alternativa, puede hacer predicciones de una unidad de tiempo cada vez con classifyAndUpdateState. Esta opción resulta útil cuando se tienen los valores de las unidades de tiempo que llegan a un flujo. Por lo general, es más rápido hacer predicciones sobre secuencias completas en comparación con hacer predicciones de una unidad de tiempo cada vez. Para ver un ejemplo que muestra cómo pronosticar unidades de tiempo futuras actualizando la red entre predicciones de una sola unidad, consulte Pronóstico de series de tiempo mediante deep learning.

Calcule la precisión de las predicciones.

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

Compare las predicciones con los datos de prueba usando una gráfica.

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

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

Consulte también

| | |

Temas relacionados