Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Clasificar las señales de ECG utilizando redes de memoria a corto plazo largas

Este ejemplo muestra cómo clasificar los datos del electrocardiograma de latido (ECG) del desafío PhysioNet 2017 utilizando el aprendizaje profundo y el procesamiento de señales. En concreto, el ejemplo utiliza redes de memoria a corto plazo (LSTM) y análisis de frecuencia de tiempo prolongados.

Introducción

Los ECGs registran la actividad eléctrica del corazón de una persona durante un período de tiempo. Los médicos utilizan ECGs para detectar visualmente si el latido cardíaco del paciente es normal o irregular.

La fibrilación auricular (AFib) es un tipo de latido cardíaco irregular que se produce cuando las cavidades superiores del corazón, las aurículas, golpean fuera de la coordinación con las cavidades inferiores, los ventrículos.

Este ejemplo utiliza datos de ECG del desafío PhysioNet 2017 [1], [2], [3], que está disponible en.https://physionet.org/challenge/2017/ Los datos consisten en un conjunto de señales ECG muestreadas a 300 Hz y divididas por un grupo de expertos en cuatro clases diferentes: Normal (N), AFib (A), otro ritmo (O) y grabación ruidosa (~). Este ejemplo muestra cómo automatizar el proceso de clasificación mediante el aprendizaje profundo. El procedimiento explora un clasificador binario que puede diferenciar las señales normales de ECG de señales que muestran signos de AFib.

En este ejemplo se utilizan redes de memoria a corto plazo (LSTM) largas, un tipo de red neuronal recurrente (RNN) muy adecuada para el estudio de los datos de secuencias y series de tiempo. Una red LSTM puede aprender las dependencias a largo plazo entre los pasos de tiempo de una secuencia. La capa LSTM () puede mirar la secuencia de tiempo en la dirección hacia adelante, mientras que la capa bidireccional LSTM () puede mirar la secuencia de tiempo en las direcciones hacia adelante y hacia atrás.lstmLayerbilstmLayer En este ejemplo se utiliza una capa LSTM bidireccional.

Para acelerar el proceso de entrenamiento, ejecute este ejemplo en una máquina con una GPU. Si su máquina tiene una GPU y una caja de herramientas de computación paralela™, MATLAB® utiliza automáticamente la GPU para el entrenamiento; de lo contrario, utiliza la CPU.

Cargue y examine los datos

Ejecute el script para descargar los datos del sitio web de PhysioNet y genere un archivo MAT () que contenga las señales de ECG en el formato adecuado.ReadPhysionetDataPhysionetData.mat La descarga de los datos puede tardar unos minutos.

ReadPhysionetData load PhysionetData

La operación de carga agrega dos variables al espacio de trabajo: y. es una matriz celular que contiene las señales del ECG. es una matriz categórica que contiene las etiquetas de la verdad del terreno correspondientes de las señales.SignalsLabelsSignalsLabels

Signals(1:5)
ans = 5×1 cell array
    {1×9000  double}
    {1×9000  double}
    {1×18000 double}
    {1×9000  double}
    {1×18000 double}

Labels(1:5)
ans = 5×1 categorical array
     N 
     N 
     N 
     A 
     A 

Utilice la función para ver que hay 738 señales AFib y 5050 señales normales.summary

summary(Labels)
     A       738       N      5050  

Genere un histograma de longitudes de señal. Observe que la mayoría de las señales son 9000 muestras de largo.

L = cellfun(@length,Signals); h = histogram(L); xticks(0:3000:18000); xticklabels(0:3000:18000); title('Signal Lengths') xlabel('Length') ylabel('Count')

Visualice un segmento de una señal de cada clase. Los latidos del corazón de AFib se espacian a intervalos irregulares mientras que los latidos normales ocurren regularmente. Las señales de latido de AFib también carecen a menudo de una onda P, que late antes del complejo QRS en una señal de latido normal. La trama de la señal normal muestra una onda P y un complejo QRS.

normal = Signals{1}; aFib = Signals{4};  subplot(2,1,1) plot(normal) title('Normal Rhythm') xlim([4000,5200]) ylabel('Amplitude (mV)') text(4330,150,'P','HorizontalAlignment','center') text(4370,850,'QRS','HorizontalAlignment','center')  subplot(2,1,2) plot(aFib) title('Atrial Fibrillation') xlim([4000,5200]) xlabel('Samples') ylabel('Amplitude (mV)')

Prepare los datos para el entrenamiento

Durante el entrenamiento, la función divide los datos en mini-lotes.trainNetwork La función, a continuación, pads o trunca las señales en el mismo mini-lote por lo que todos tienen la misma longitud. Demasiada cantidad de relleno o truncamiento puede tener un efecto negativo en el rendimiento de la red, ya que la red podría interpretar una señal incorrectamente en función de la información agregada o eliminada.

Para evitar el exceso de relleno o truncamiento, aplique la función a las señales de ECG para que sean todas 9000 muestras de largo.segmentSignals La función ignora las señales con menos de 9000 muestras. Si una señal tiene más de 9000 muestras, la divide en tantos segmentos de 9000 muestras como sea posible e ignora las muestras restantes.segmentSignals Por ejemplo, una señal con 18500 muestras se convierte en señales de 2 9000 muestras, y las restantes 500 muestras se ignoran.

[Signals,Labels] = segmentSignals(Signals,Labels);

Ver los cinco primeros elementos de la matriz para comprobar que cada entrada es ahora 9000 muestras de largo.Signals

Signals(1:5)
ans = 5×1 cell array
    {1×9000 double}
    {1×9000 double}
    {1×9000 double}
    {1×9000 double}
    {1×9000 double}

Entrena el clasificador usando datos de señal RAW

Para diseñar el clasificador, utilice las señales RAW generadas en la sección anterior. Divida las señales en un conjunto de entrenamiento para entrenar el clasificador y un conjunto de pruebas para probar la precisión del clasificador en los nuevos datos.

Utilice la función para mostrar que hay 718 señales AFib y 4937 señales normales, una relación de 1:7.summary

summary(Labels)
     A       718       N      4937  

Debido a que el 87,3% de las señales son normales, el clasificador aprenderá que puede lograr una alta precisión simplemente clasificando todas las señales como normal. Para evitar este sesgo, aumente los datos de AFib duplicando las señales AFib en el DataSet para que exista el mismo número de señales normales y AFib. Esta duplicación, comúnmente llamada sobremuestreo, es una forma de aumento de datos utilizada en el aprendizaje profundo.

Divida las señales según su clase.

afibX = Signals(Labels=='A'); afibY = Labels(Labels=='A');  normalX = Signals(Labels=='N'); normalY = Labels(Labels=='N');

A continuación, utilice para dividir los objetivos de cada clase aleatoriamente en conjuntos de entrenamiento y pruebas.dividerand

[trainIndA,~,testIndA] = dividerand(718,0.9,0.0,0.1); [trainIndN,~,testIndN] = dividerand(4937,0.9,0.0,0.1);  XTrainA = afibX(trainIndA); YTrainA = afibY(trainIndA);  XTrainN = normalX(trainIndN); YTrainN = normalY(trainIndN);  XTestA = afibX(testIndA); YTestA = afibY(testIndA);  XTestN = normalX(testIndN); YTestN = normalY(testIndN);

Ahora hay 646 señales AFib y 4443 señales normales para el entrenamiento. Para lograr el mismo número de señales en cada clase, utilice las primeras 4438 señales normales, y luego use para repetir las primeras 634 señales AFib siete veces.repmat

Para las pruebas, hay 72 señales AFib y 494 señales normales. Utilice las primeras 490 señales normales, y luego utilice para repetir las primeras 70 señales AFib siete veces.repmat De forma predeterminada, la red neuronal baraja aleatoriamente los datos antes del entrenamiento, asegurando que las señales contiguas no tengan la misma etiqueta.

XTrain = [repmat(XTrainA(1:634),7,1); XTrainN(1:4438)]; YTrain = [repmat(YTrainA(1:634),7,1); YTrainN(1:4438)];  XTest = [repmat(XTestA(1:70),7,1); XTestN(1:490)]; YTest = [repmat(YTestA(1:70),7,1); YTestN(1:490);];

La distribución entre las señales normal y AFib ahora se equilibra uniformemente tanto en el conjunto de entrenamiento como en el conjunto de pruebas.

summary(YTrain)
     A      4438       N      4438  
summary(YTest)
     A      490       N      490  

Defina la arquitectura de red LSTM

Las redes LSTM pueden aprender las dependencias a largo plazo entre los pasos de tiempo de los datos de secuencia. En este ejemplo se utiliza la capa bidireccional LSTM, ya que examina la secuencia en direcciones tanto hacia delante como hacia atrás.bilstmLayer

Dado que las señales de entrada tienen una dimensión cada una, especifique el tamaño de entrada para que sean secuencias de tamaño 1. Especifique una capa LSTM bidireccional con un tamaño de salida de 100 y la salida del último elemento de la secuencia. Este comando indica a la capa bidireccional LSTM que asigne la serie de tiempo de entrada a las características 100 y, a continuación, prepara la salida para la capa completamente conectada. Por último, especifique dos clases incluyendo una capa completamente conectada de tamaño 2, seguida de una capa softmax y una capa de clasificación.

layers = [ ...     sequenceInputLayer(1)     bilstmLayer(100,'OutputMode','last')     fullyConnectedLayer(2)     softmaxLayer     classificationLayer     ]
layers =    5x1 Layer array with layers:       1   ''   Sequence Input          Sequence input with 1 dimensions      2   ''   BiLSTM                  BiLSTM with 100 hidden units      3   ''   Fully Connected         2 fully connected layer      4   ''   Softmax                 softmax      5   ''   Classification Output   crossentropyex 

A continuación, especifique las opciones de entrenamiento para el clasificador. Fije el a 10 para permitir que la red haga 10 pases a través de los datos de entrenamiento.'MaxEpochs' A de 150 dirige la red para mirar 150 las señales de entrenamiento a la vez.'MiniBatchSize' Una de 0,01 ayuda a acelerar el proceso de entrenamiento.'InitialLearnRate' Especifique una de 1000 para dividir la señal en piezas más pequeñas para que la máquina no se ejecute sin memoria mirando demasiados datos al mismo tiempo.'SequenceLength' Ajuste ' ' a 1 para estabilizar el proceso de entrenamiento evitando que los degradados se hagan demasiado grandes.GradientThreshold Especifique como para generar trazados que muestren un gráfico del progreso del entrenamiento a medida que aumente el número de iteraciones.'Plots''training-progress' Se establece en para suprimir la salida de tabla que corresponde a los datos mostrados en la gráfica.'Verbose'false Si desea ver esta tabla, establezca.'Verbose'true

Este ejemplo utiliza el solucionador de estimación de momento adaptativo (ADAM). ADAM funciona mejor con las redes neuronales recurrentes (RNS) como LSTMs que el Solver predeterminado del degradado del descenso con el momentum del estocástico (SGDM).

options = trainingOptions('adam', ...     'MaxEpochs',10, ...     'MiniBatchSize', 150, ...     'InitialLearnRate', 0.01, ...     'SequenceLength', 1000, ...     'GradientThreshold', 1, ...     'ExecutionEnvironment',"auto",...     'plots','training-progress', ...     'Verbose',false);

Entrena la red LSTM

Entrenar la red LSTM con las opciones de entrenamiento especificadas y la arquitectura de capas mediante el uso.trainNetwork Dado que el conjunto de entrenamiento es grande, el proceso de entrenamiento puede tardar varios minutos.

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

El subgráfico superior del diagrama de progreso de la formación representa la precisión de la formación, que es la precisión de clasificación en cada minilote. Cuando el entrenamiento progresa exitosamente, este valor típicamente aumenta hacia el 100%. El subgráfico inferior muestra la pérdida de formación, que es la pérdida de entropía cruzada en cada minilote. Cuando el entrenamiento avanza con éxito, este valor suele disminuir hacia cero.

Si el entrenamiento no está convergiendo, las parcelas pueden oscilar entre los valores sin tendencia en una cierta dirección ascendente o descendente. Esta oscilación significa que la precisión del entrenamiento no está mejorando y la pérdida de entrenamiento no está disminuyendo. Esta situación puede ocurrir desde el inicio de la formación, o las parcelas podrían meseta después de alguna mejora preliminar en la precisión del entrenamiento. En muchos casos, cambiar las opciones de entrenamiento puede ayudar a la red a lograr la convergencia. Disminuir o disminuir puede resultar en un tiempo de entrenamiento más largo, pero puede ayudar a la red a aprender mejor.MiniBatchSizeInitialLearnRate

La precisión del entrenamiento del clasificador oscila entre el 50% y el 60%, y al final de las 10 epochs, ya ha tardado varios minutos en formarse.

Visualice la precisión de entrenamiento y pruebas

Calcule la precisión del entrenamiento, que representa la precisión del clasificador en las señales en las que fue entrenado. Primero, clasifique los datos de entrenamiento.

trainPred = classify(net,XTrain,'SequenceLength',1000);

En los problemas de clasificación, las matrices de confusión se utilizan para visualizar el rendimiento de un clasificador en un conjunto de datos para los que se conocen los valores verdaderos. La clase de destino es la etiqueta de la verdad del suelo de la señal, y la clase de salida es la etiqueta asignada a la señal por la red. Las etiquetas de los ejes representan las etiquetas de clase, AFib (A) y normal (N).

Utilice el comando para calcular la precisión de clasificación general para las predicciones de datos de prueba.confusionchart Especifique como mostrar las tasas positivas verdaderas y las tasas de falsos positivos en el Resumen de filas.'RowSummary''row-normalized' Además, especifique cómo mostrar los valores predictivos positivos y las tasas de detección falsas en el Resumen de columna.'ColumnSummary''column-normalized'

LSTMAccuracy = sum(trainPred == YTrain)/numel(YTrain)*100
LSTMAccuracy = 61.2100 
 figure ccLSTM = confusionchart(YTrain,trainPred); ccLSTM.Title = 'Confusion Chart for LSTM'; ccLSTM.ColumnSummary = 'column-normalized'; ccLSTM.RowSummary = 'row-normalized';

La matriz de confusión muestra que el 81,7% de las señales AFib de la verdad del suelo se clasifican correctamente como AFib, mientras que el 31,1% de las señales normales de la verdad del suelo se clasifican correctamente como normal. Además, el 54,2% de las señales clasificadas como AFib son en realidad AFib, y el 63,0% de las señales clasificadas como normales son realmente normales. La precisión total del entrenamiento es del 56,4%.

Ahora clasifique los datos de prueba con la misma red.

testPred = classify(net,XTest,'SequenceLength',1000);

Calcule la precisión de la prueba y visualice el rendimiento de la clasificación como una matriz de confusión.

LSTMAccuracy = sum(testPred == YTest)/numel(YTest)*100
LSTMAccuracy = 61.4286 
 figure ccLSTM = confusionchart(YTest,testPred); ccLSTM.Title = 'Confusion Chart for LSTM'; ccLSTM.ColumnSummary = 'column-normalized'; ccLSTM.RowSummary = 'row-normalized';

Esta matriz de confusión es similar a la matriz de confusión de entrenamiento. La precisión total de las pruebas es del 55,8%.

Mejore el rendimiento con la extracción de características

La extracción de características de los datos puede ayudar a mejorar el entrenamiento y las precisiones de prueba del clasificador. Para decidir qué características se extraen, este ejemplo sigue un enfoque que calcula las imágenes de frecuencia de tiempo, como los espectrogramas, y las utiliza para entrenar redes neuronales convolucionales (CNN). Vea [4] y [5] para obtener más información sobre estas aplicaciones.

Visualice el espectrograma de cada tipo de señal.

fs = 300;  figure subplot(2,1,1); pspectrum(normal,fs,'spectrogram','TimeResolution',0.5) title('Normal Signal')  subplot(2,1,2); pspectrum(aFib,fs,'spectrogram','TimeResolution',0.5) title('AFib Signal')

Dado que este ejemplo utiliza un LSTM en lugar de una CNN, es importante traducir el enfoque para que se aplique a las señales unidimensionales. Los momentos de frecuencia de tiempo (TF) extraen información de los espectrogramas. Cada momento se puede utilizar como una característica unidimensional para la entrada a la LSTM.

Explore dos momentos TF en el dominio del tiempo:

  • Frecuencia instantánea ()instfreq

  • Entropía espectral ()pentropy

La función estima la frecuencia dependiente del tiempo de una señal como el primer momento del espectrograma de potencia.instfreq La función calcula un espectrograma utilizando Fourier de tiempo corto se transforma en ventanas de tiempo. En este ejemplo, la función utiliza 255 ventanas de tiempo. Las salidas de tiempo de la función corresponden a los centros de las ventanas de tiempo.

Visualice la frecuencia instantánea para cada tipo de señal.

[instFreqA,tA] = instfreq(aFib,fs); [instFreqN,tN] = instfreq(normal,fs);  figure subplot(2,1,1); plot(tN,instFreqN) title('Normal Signal') xlabel('Time (s)') ylabel('Instantaneous Frequency')  subplot(2,1,2); plot(tA,instFreqA) title('AFib Signal') xlabel('Time (s)') ylabel('Instantaneous Frequency')

Utilícelas para aplicar la función a cada celda de los conjuntos de entrenamiento y prueba.cellfun instfreq

instfreqTrain = cellfun(@(x)instfreq(x,fs)',XTrain,'UniformOutput',false); instfreqTest = cellfun(@(x)instfreq(x,fs)',XTest,'UniformOutput',false);

La entropía espectral mide cuán puntilloso es el espectro de una señal. Una señal con un espectro puntilloso, como una suma de sinusoides, tiene una entropía espectral baja. Una señal con un espectro plano, como el ruido blanco, tiene una alta entropía espectral. La función estima la entropía espectral basada en un espectrograma de potencia.pentropy Al igual que con el caso de estimación de frecuencia instantánea, utiliza 255 ventanas de tiempo para calcular el espectrograma.pentropy Las salidas de tiempo de la función corresponden al centro de las ventanas de tiempo.

Visualice la entropía espectral para cada tipo de señal.

[pentropyA,tA2] = pentropy(aFib,fs); [pentropyN,tN2] = pentropy(normal,fs);  figure  subplot(2,1,1) plot(tN2,pentropyN) title('Normal Signal') ylabel('Spectral Entropy')  subplot(2,1,2) plot(tA2,pentropyA) title('AFib Signal') xlabel('Time (s)') ylabel('Spectral Entropy')

Utilícelas para aplicar la función a cada celda de los conjuntos de entrenamiento y prueba.cellfunpentropy

pentropyTrain = cellfun(@(x)pentropy(x,fs)',XTrain,'UniformOutput',false); pentropyTest = cellfun(@(x)pentropy(x,fs)',XTest,'UniformOutput',false);

Concatenar las entidades de manera que cada celda de los nuevos conjuntos de entrenamiento y prueba tenga dos dimensiones o dos entidades.

XTrain2 = cellfun(@(x,y)[x;y],instfreqTrain,pentropyTrain,'UniformOutput',false); XTest2 = cellfun(@(x,y)[x;y],instfreqTest,pentropyTest,'UniformOutput',false);

Visualice el formato de las nuevas entradas. Cada célula ya no contiene 1 9000-muestra-señal larga; ahora contiene características de 2 255-Sample-Long.

XTrain2(1:5)
ans = 5×1 cell array
    {2×255 double}
    {2×255 double}
    {2×255 double}
    {2×255 double}
    {2×255 double}

Estandarizar los datos

La frecuencia instantánea y la entropía espectral tienen medios que difieren en casi una orden o magnitud. Además, la media de frecuencia instantánea podría ser demasiado alta para que la LSTM aprendiera eficazmente. Cuando una red se ajusta a los datos con una media grande y una amplia gama de valores, las entradas grandes podrían ralentizar el aprendizaje y la convergencia de la red [6].

mean(instFreqN)
ans = 5.5615 
mean(pentropyN)
ans = 0.6326 

Utilice la media del conjunto de entrenamiento y la desviación estándar para estandarizar los conjuntos de entrenamiento y pruebas. La estandarización, o puntuación z, es una forma popular de mejorar el rendimiento de la red durante el entrenamiento.

XV = [XTrain2{:}]; mu = mean(XV,2); sg = std(XV,[],2);  XTrainSD = XTrain2; XTrainSD = cellfun(@(x)(x-mu)./sg,XTrainSD,'UniformOutput',false);  XTestSD = XTest2; XTestSD = cellfun(@(x)(x-mu)./sg,XTestSD,'UniformOutput',false);

Mostrar los medios de la frecuencia instantánea estandarizada y la entropía espectral.

instFreqNSD = XTrainSD{1}(1,:); pentropyNSD = XTrainSD{1}(2,:);  mean(instFreqNSD)
ans = -0.3210 
mean(pentropyNSD)
ans = -0.2416 

Modifique la arquitectura de red LSTM

Ahora que las señales tienen dos dimensiones, es necesario modificar la arquitectura de red especificando el tamaño de la secuencia de entrada como 2. Especifique una capa LSTM bidireccional con un tamaño de salida de 100 y la salida del último elemento de la secuencia. Especifique dos clases mediante la inclusión de una capa completamente conectada de tamaño 2, seguida de una capa softmax y una capa de clasificación.

layers = [ ...     sequenceInputLayer(2)     bilstmLayer(100,'OutputMode','last')     fullyConnectedLayer(2)     softmaxLayer     classificationLayer     ]
layers =    5x1 Layer array with layers:       1   ''   Sequence Input          Sequence input with 2 dimensions      2   ''   BiLSTM                  BiLSTM with 100 hidden units      3   ''   Fully Connected         2 fully connected layer      4   ''   Softmax                 softmax      5   ''   Classification Output   crossentropyex 

Especifique las opciones de formación. Establezca el número máximo de épocas en 30 para permitir que la red realice 30 pasadas a través de los datos de entrenamiento.

options = trainingOptions('adam', ...     'MaxEpochs',30, ...     'MiniBatchSize', 150, ...     'InitialLearnRate', 0.01, ...     'GradientThreshold', 1, ...     'ExecutionEnvironment',"auto",...     'plots','training-progress', ...     'Verbose',false);

Entrena la red LSTM con funciones de frecuencia de tiempo

Entrenar la red LSTM con las opciones de entrenamiento especificadas y la arquitectura de capas mediante el uso.trainNetwork

net2 = trainNetwork(XTrainSD,YTrain,layers,options);

Hay una gran mejora en la precisión del entrenamiento, que ahora es mayor que 90%. Las tendencias de pérdida de entropía cruzada hacia 0. Además, el tiempo necesario para el entrenamiento disminuye porque los momentos TF son más cortos que las secuencias sin procesar.

Visualice la precisión de entrenamiento y pruebas

Clasifique los datos de entrenamiento utilizando la red LSTM actualizada. Visualice el rendimiento de la clasificación como una matriz de confusión.

trainPred2 = classify(net2,XTrainSD); LSTMAccuracy = sum(trainPred2 == YTrain)/numel(YTrain)*100
LSTMAccuracy = 83.5174 
 figure ccLSTM = confusionchart(YTrain,trainPred2); ccLSTM.Title = 'Confusion Chart for LSTM'; ccLSTM.ColumnSummary = 'column-normalized'; ccLSTM.RowSummary = 'row-normalized';

Clasifique los datos de prueba con la red actualizada. Trace la matriz de confusión para examinar la precisión de la prueba.

testPred2 = classify(net2,XTestSD);  LSTMAccuracy = sum(testPred2 == YTest)/numel(YTest)*100
LSTMAccuracy = 82.5510 
 figure ccLSTM = confusionchart(YTest,testPred2); ccLSTM.Title = 'Confusion Chart for LSTM'; ccLSTM.ColumnSummary = 'column-normalized'; ccLSTM.RowSummary = 'row-normalized';

Conclusión

Este ejemplo muestra cómo crear un clasificador para detectar la fibrilación auricular en señales ECG utilizando una red LSTM. El procedimiento utiliza sobremuestreo para evitar el sesgo de clasificación que se produce cuando se intenta detectar condiciones anormales en las poblaciones compuestas principalmente de pacientes sanos. El entrenamiento de la red LSTM utilizando datos de señal RAW da como resultado una mala precisión de clasificación. Entrenar la red utilizando dos características de tiempo-frecuencia-momento para cada señal mejora significativamente el rendimiento de la clasificación y también disminuye el tiempo de entrenamiento.

Referencias

1AF Classification from a Short Single Lead ECG Recording: the PhysioNet/Computing in Cardiology Challenge, 2017.https://physionet.org/challenge/2017/

[2] Clifford, Gari, Chengyu Liu, Benjamin Moody, Li-Wei H. Lehman, IKARO Silva, Qiao Li, Alistair Johnson y Roger G. Mark. "Clasificación AF de una grabación de ECG de una sola pista corta: La computación PhysioNet en cardiología Challenge 2017. " RennesComputing in Cardiology IEEE). Vol. 44, 2017, PP. 1 – 4.

[3] Goldberger, l. l., l. n. Amaral, L. Glass, j. m. Hausdorff, P. ch. Ivanov, r. g. Mark, j. e. Mietus, g. b. Moody, C.-K. Peng, y h. e. Stanley. "PhysioBank, PhysioToolkit y PhysioNet: Componentes de un nuevo recurso de investigación para señales fisiológicas complejas ". .Circulation Vol. 101, no. 23, 13 de junio de 2000, págs. e215 – E220.http://circ.ahajournals.org/content/101/23/e215.full

[4] Pons, Jordi, Thomas Lidy, y Xavier Serra. "Experimentando con redes neuronales convolucionales motivadas musicalmente". .14th International Workshop on Content-Based Multimedia Indexing (CBMI) Junio 2016.

[5] Wang, D. "El aprendizaje profundo reinventa el audífono", Vol. 54, no. 3, marzo 2017, págs. 32 – 37. Doi:IEEE Spectrum 10.1109/MSPEC. 2017.7864754.

[6] Brownlee, Jason. .How to Scale Data for Long Short-Term Memory Networks in Python 7 de julio de 2017.https://machinelearningmastery.com/how-to-scale-data-for-long-short-term-memory-networks-in-python/.

Consulte también

Funciones

Temas relacionados