Main Content

Clasificación de secuencias mediante convoluciones 1D

En este ejemplo se muestra cómo clasificar datos secuenciales mediante una red neuronal convolucional 1D.

Para entrenar una red neuronal profunda con la que clasificar datos secuenciales, se puede utilizar una red neuronal convolucional 1D. Una capa convolucional 1D aprende características aplicando filtros convolucionales deslizantes a la entrada 1D. El uso de capas convolucionales 1D puede ser más rápido que el uso de capas recurrentes porque las capas convolucionales pueden procesar la entrada con una sola operación. En cambio, las capas recurrentes deben iterar sobre las unidades de tiempo de la entrada. No obstante, según la arquitectura de la red y los tamaños de los filtros, las capas convolucionales 1D podrían no rendir tan bien como las capas recurrentes, que pueden aprender dependencias a largo plazo entre las unidades de tiempo.

Cargar datos secuenciales

Cargue los datos de ejemplo de WaveformData.mat. Los datos son un arreglo de celdas de numObservations por 1 de secuencias, donde numObservations es el número de secuencias. Cada secuencia es un arreglo numérico de numTimeSteps por -numChannels, donde numTimeSteps es el número de unidades de tiempo y numChannels es el número de canales de la secuencia.

load WaveformData

Visualice algunas de las secuencias en una gráfica.

numChannels = size(data{1},2);

idx = [3 4 5 12];
figure
tiledlayout(2,2)
for i = 1:4
    nexttile
    stackedplot(data{idx(i)},DisplayLabels="Channel "+string(1:numChannels))
    
    xlabel("Time Step")
    title("Class: " + string(labels(idx(i))))
end

Reserve datos para validación y pruebas. Divida los datos en un conjunto de entrenamiento que contenga el 80% de los datos, un conjunto de validación que contenga el 10% de los datos y un conjunto de prueba que contenga el 10% restante de los datos. Para dividir los datos, use la función trainingPartitions, incluida en este ejemplo como un archivo de soporte. Para acceder al archivo, abra el ejemplo como un script en vivo.

numObservations = numel(data);
[idxTrain,idxValidation,idxTest] = trainingPartitions(numObservations, [0.8 0.1 0.1]);
XTrain = data(idxTrain);
TTrain = labels(idxTrain);

XValidation = data(idxValidation);
TValidation = labels(idxValidation);

XTest = data(idxTest);
TTest = labels(idxTest);

Definir la arquitectura de la red convolucional 1D

Defina la arquitectura de la red neuronal convolucional 1D.

  • Especifique el tamaño de la entrada como el número de canales de los datos de entrada.

  • Especifique dos bloques de capas convolucionales 1D, ReLU y normalización de capas, donde la capa convolucional tiene un tamaño de filtro de 5. Especifique 32 y 64 filtros para la primera y la segunda capa convolucional, respectivamente. Para ambas capas convolucionales, rellene la parte izquierda de las entradas de manera que las salidas tengan la misma longitud (causal padding).

  • Para reducir la salida de las capas convolucionales a un solo vector, utilice una capa de agrupación media global 1D.

  • Para asignar la salida a un vector de probabilidades, especifique una capa totalmente conectada con un tamaño de salida que coincida con el número de clases, seguida de una capa softmax.

filterSize = 5;
numFilters = 32;

classNames = categories(TTrain);
numClasses = numel(classNames);

layers = [ ...
    sequenceInputLayer(numChannels)
    convolution1dLayer(filterSize,numFilters,Padding="causal")
    reluLayer
    layerNormalizationLayer
    convolution1dLayer(filterSize,2*numFilters,Padding="causal")
    reluLayer
    layerNormalizationLayer
    globalAveragePooling1dLayer
    fullyConnectedLayer(numClasses)
    softmaxLayer];

Especificar las opciones de entrenamiento

Especifique las opciones de entrenamiento. Para escoger entre las opciones se requiere un análisis empírico. Para explorar diferentes configuraciones de opciones de entrenamiento mediante la ejecución de experimentos, puede utilizar la app Experiment Manager.

  • Entrene durante 60 épocas usando el optimizador Adam con una tasa de aprendizaje de 0.01.

  • Rellenar la parte izquierda de las secuencias.

  • Validar la red usando los datos de validación.

  • Monitorizar el progreso del entrenamiento en una gráfica y omitir la salida detallada.

options = trainingOptions("adam", ...
    MaxEpochs=60, ...
    InitialLearnRate=0.01, ...
    SequencePaddingDirection="left", ...
    ValidationData={XValidation,TValidation}, ...
    Plots="training-progress", ...
    Metrics="accuracy", ...
    Verbose=false);

Entrenar redes neuronales

Entrene la red neuronal con la función trainnet. Para la clasificación, utilice la pérdida de entropía cruzada. De forma predeterminada, la función trainnet usa una GPU en caso de que esté disponible. Para entrenar en una GPU se requiere una licencia de Parallel Computing Toolbox™ y un dispositivo GPU compatible. Para obtener información sobre los dispositivos compatibles, consulte GPU Computing Requirements (Parallel Computing Toolbox). De lo contrario, la función trainnet usa la CPU. Para especificar el entorno de ejecución, utilice la opción de entrenamiento ExecutionEnvironment.

net = trainnet(XTrain,TTrain,layers,"crossentropy",options);

Probar una red neuronal

Clasifique los datos de prueba mediante las mismas opciones de relleno de secuencias utilizadas para el entrenamiento. Para hacer predicciones con varias observaciones, utilice la función minibatchpredict. Para convertir las puntuaciones de predicción en etiquetas, utilice la función scores2label. La función minibatchpredict usa automáticamente una GPU en caso de que esté disponible. Para utilizar una GPU se requiere una licencia de Parallel Computing Toolbox™ y un dispositivo GPU compatible. Para obtener información sobre los dispositivos compatibles, consulte GPU Computing Requirements (Parallel Computing Toolbox). De lo contrario, la función usa la CPU.

scores = minibatchpredict(net,XTest,SequencePaddingDirection="left");
YTest = scores2label(scores, classNames);

Calcule la precisión de clasificación de las predicciones.

acc = mean(YTest == TTest)
acc = 0.8800

Visualice las predicciones en una matriz de confusión.

figure
confusionchart(TTest,YTest)

Consulte también

| | | | | | | |

Temas relacionados