分类心电信号使用长短期记忆网络

此示例示出了如何分类心跳心电图(ECG)由使用深学习和信号处理的PhysioNet 2017挑战数据。特别地,该示例使用长短时记忆网络和时频分析。

介绍

心电图记录过一段时间的人的心脏的电活动。医生用心电图直观地发现如果患者的心跳是正常的或不规则。

心房颤动(AFib)是一种不规则的心跳,当心脏的上腔,即心房,与下腔,即心室跳动不协调时就会发生。

本例使用了2017年生理学网挑战赛的心电数据[1],[2],[3],它可在https://physionet.org/challenge/2017/。该数据由一组采集于300hz的心电信号组成,并由一组专家将其分为四个不同的类别:正常(N)、AFib (a)、其他节律(O)和噪声记录(~)。这个例子展示了如何使用深度学习来自动化分类过程。该程序探索了一个二元分类器,可以区分正常的心电信号和显示有AFib症状的信号。

此示例使用长短期存储器(LSTM)网络,一个型回归神经网络(RNN)的非常适合于研究的顺序和时间序列数据。一个LSTM网络可以学到序列的时间步长之间的长期依赖。所述LSTM层(lstmLayer)可以看一下在正向方向的时间顺序,而双向LSTM层(bilstmLayer)可以看到时间序列在向前和向后两个方向。本例使用了一个双向LSTM层。

为了加快训练过程中,一台机器上运行了GPU这个例子。如果你的机器有一个GPU和并行计算工具箱™,然后MATLAB®自动使用训练的GPU;否则,它使用的CPU。

加载并检查数据

运行ReadPhysionetData脚本从PhysioNet网站下载数据并生成MAT文件(PhysionetData.mat),包括适当格式的心电信号。下载数据可能需要几分钟。

ReadPhysionetData负荷PhysionetData

装载操作增加了两个变量到工作区:信号标签信号是保持ECG信号的单元阵列。标签是一个包含相应的信号基真值标签的分类数组。

信号(1:5)
ans =5×1单元阵列{1×9000双}{1×9000双}{1×18000双}{1×9000双}{1×18000双}
标签(1:5)
ANS =5×1分类N N N A A

使用总结功能检查是否有738个AFib信号和5050个正常信号。

总结(标签)
A 738 N 5050

生成信号长度的直方图。注意,大多数信号都有9000个样本长。

L = cellfun(@长度,信号);H =直方图(L);xticks(0:3000:18000);xticklabels(0:3000:18000);标题(“信号长度”)包含(“长度”)ylabel('计数'

将每个类的一个信号片段形象化。AFib的心跳是不规则间隔的,而正常的心跳是有规律的。非ib心跳信号通常也缺少P波,而P波在正常心跳信号中比QRS波早出现。正常信号的曲线显示一个P波和一个QRS波。

正常={1}信号;aFib ={4}信号;次要情节(2,1,1)情节(正常的)标题(“正常节奏”)xlim ((4000、5200)) ylabel (“振幅(毫伏)”)文本(4330、150、'P'“HorizontalAlignment”“中心”)文本(4370、850、“QRS”“HorizontalAlignment”“中心”)副区(2,1,2)图(AFIB)称号(心房纤维性颤动的)XLIM([4000,5200])xlabel(“样本”)ylabel(“振幅(毫伏)”

准备培训资料

在训练期间,该trainNetwork函数将数据分成小批。然后,该函数在相同的小批处理中填充或截断信号,使它们具有相同的长度。过多的填充或截断会对网络性能产生负面影响,因为网络可能会根据添加或删除的信息错误地解释信号。

为了避免过多的填充或截断,应用segmentSignals功能,心电图信号,所以他们都是9000个样本长。的函数忽略信号少于9000个样本。如果信号有超过9000米的样品,segmentSignals断裂成许多9000样本段尽可能并忽略其余的试样。例如,用18500个样本的信号变成两个9000-采样信号,其余500个样本将被忽略。

[信号,标签] = segmentSignals(信号,标签);

的前五个元素信号阵列,以验证每个条目现在9000个样本长。

信号(1:5)
ans =5×1单元阵列{1×9000双}{1×9000双}{1×9000双}{1×9000双}{1×9000双}

训练分类使用原始信号数据

要设计分类器,请使用前一节中生成的原始信号。将信号分解为训练分类器的训练集和测试分类器对新数据准确性的测试集。

使用总结函数来显示,有718个AFIB信号和4937个正常信号,比例为1:7。

总结(标签)
阿718Ñ4937

由于信号的87.3%都正常,分类会学习,它可以简单地通过所有信号正常进行分类达到较高的精度。为了避免这种偏差,通过在数据集中复制AFIB信号,使得有相同数目的正常和AFIB信号的增强的数据AFIB。这种重复,俗称过采样,在深学习使用的数据增强的一种形式。

根据他们的阶级分裂的信号。

afibX =信号(标签==“一个”);afibY =标签(标签= =“一个”);normalX(标签= = =信号'N');normalY =标签(标签=='N');

接下来,使用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);

现在有646个AFIB信号和用于培训4443个普通信号。为了实现在每个类别的相同数目的信号,使用所述第一4438点正常的信号,然后使用repmat重复前634次AFib信号7次。

为了测试,有72个AFIB信号和494点正常的信号。使用第一个490个正常信号,然后使用repmat重复前70次AFib信号7次。默认情况下,神经网络在训练前随机打乱数据,以确保连续信号不都有相同的标签。

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)];欧美= [repmat (YTestA(1:70), 7日,1);YTestN (1:490);];

正常和AFIB信号之间的分布是均匀的,现在在训练组和测试组中的两个平衡。

摘要(YTrain)
A 4438 N 4438
摘要(YTest)
甲490 490Ñ

定义LSTM网络架构

LSTM网络可以学习序列数据时间步长的相关性。本例使用了双向LSTM层bilstmLayer,因为它看起来在向前和向后方向的顺序。

由于输入信号具有每一个维度,指定输入大小为大小的序列1与100的输出大小和输出该序列的最后一个元素指定一个双向LSTM层。此命令指示双向LSTM层映射的输入时间系列为100点的特征,然后准备下完全连接层的输出。最后,通过包括大小2的完全连接层,接着是SOFTMAX层和分类层指定两个类。

层= [...sequenceInputLayer(1)bilstmLayer(100,“OutputMode”'持续')fullyConnectedLayer(2)softmaxLayer classificationLayer]
层= 5X1层阵列层:1“”序列的输入序列输入与1名维2“” BiLSTM BiLSTM用100个隐藏单元3“”完全连接2完全连接层4“”使用SoftMax SOFTMAX 5“”分类输出crossentropyex

接下来指定分类器的训练选项。设置“MaxEpochs”10允许网络通过训练数据作出10次。一个“MiniBatchSize”引导网络一次查看150个训练信号。一个'InitialLearnRate'0.01有助于加快培养过程。指定'SequenceLength'1000打破信号成小块,使机器不会通过一次看太多数据的内存用完。设置“GradientThreshold1来稳定训练过程,防止梯度变得太大。指定“情节”“训练进步”随着迭代次数的增加,生成显示培训进度图形的图。集“详细”以抑制表输出在图中示出对应于数据。如果你想看到这个表,集“详细”真正

本例使用自适应矩估计(ADAM)求解器。ADAM使用LSTMs这样的rns比默认的使用动量随机梯度下降(SGDM)求解器的性能更好。

选项= trainingOptions(“亚当”...“MaxEpochs”10...“MiniBatchSize”,150,...'InitialLearnRate',0.01,...'SequenceLength',1000,...'GradientThreshold',1...“执行环境”“汽车”...“阴谋”“训练进步”...“详细”、假);

培训LSTM网络

训练LSTM网络与指定的训练选项和层结构,通过使用trainNetwork。由于训练集很大,训练过程可能需要几分钟。

净= trainNetwork(XTrain,YTrain,层,选项);

培训正在进行图顶部插曲表示训练精度,这是每个小批量的分类精度。当训练进展顺利,这个值通常会增加对100%。底部副区显示训练损失,这是在每个小批量的交叉熵损失。当训练成功的进行,这个值通常接近零减小。

如果训练不收敛,该地块可能没有在一定的向上或向下的方向趋势值之间振荡。这种振荡的手段,训练精度没有改善,训练的损失并没有减少。这种情况可以从训练开始发生,或者在之后的训练精度一些初步的改善,这些图形可能高原。在许多情况下,改变培训选项可以帮助网络实现融合。降低MiniBatchSize或减少InitialLearnRate可能会导致较长的训练时间,但它可以帮助网络学习得更好。

50%和60%之间,并在10个时代结束该分类的训练精度振荡,它已经采取了若干分钟的火车。

可视化的培训和测试精度

计算训练精度,表示分类器对所训练的信号的精度。首先,对培训数据进行分类。

trainPred =分类(净,XTrain,'SequenceLength',1000);

在分类问题中,混淆矩阵被用来可视化一个分类器在一组已知真实值的数据上的性能。目标类是信号的ground-truth标签,输出类是网络分配给信号的标签。轴标签代表类标签,AFib (A)和Normal (N)。

使用confusionchart命令计算测试数据预测的总体分类精度。指定“RowSummary”“行标准化”显示在该行总结的真阳性率和假阳性率。同时,指定'ColumnSummary'“列归一化”列摘要中显示阳性预测值和错误发现率。

LSTMAccuracy =总和(trainPred == YTrain)/ numel(YTrain)* 100
LSTMAccuracy = 61.7283
图confusionchart(YTrain,trainPred,'ColumnSummary'“列归一化”...“RowSummary”“行标准化”'标题'“LSTM的混乱图表”);

混淆矩阵显示,地面实况AFIB信号被正确地分类为AFIB,而地面实况正常信号的31.1%被正确地分类为正常的81.7%。此外,归类为AFIB的信号的54.2%,实际上AFIB,并且被分类为正常的信号的63.0%实际上是普通。总的训练精度为56.4%。

对同一网络下的测试数据进行分类。

XTest testPred =分类(净,'SequenceLength',1000);

计算测试精度,并将分类性能可视化为混淆矩阵。

LSTMAccuracy = sum(testPred == YTest)/numel(YTest)*100
LSTMAccuracy = 66.2245
图confusionchart(欧美、testPred'ColumnSummary'“列归一化”...“RowSummary”“行标准化”'标题'“LSTM的混乱图表”);

这种混乱矩阵是类似的培训混淆矩阵。整体测试精度是50%至60%至%。

通过特征提取来提高性能

从数据可以帮助特征提取提高了分类器的训练和测试精度。为了决定哪些功能来提取,该实施例中适应的方法,其计算时间 - 频率的图像,例如频谱,并使用它们来训练卷积神经网络(细胞神经网络)4],[]。

设想每一种信号的光谱图。

FS = 300;图副区(2,1,1);pspectrum(正常,FS,的谱图'TimeResolution',0.5)标题(“正常信号”次要情节(2,1,2);pspectrum (aFib fs,的谱图'TimeResolution',0.5)标题(“AFIB信号”

由于本例使用的是LSTM而不是CNN,因此将该方法转换为适用于一维信号非常重要。时间-频率(TF)矩从光谱图中提取信息。每个矩可以作为一维特征输入到LSTM中。

探讨在时域中包括两个TF时刻:

  • 瞬时频率(instfreq

  • 谱熵(pentropy

instfreq函数估计的信号作为功率谱的第一时刻的依赖于时间的频率。该函数计算使用短时傅立叶变换在时间窗口的频谱。在这个例子中,该函数使用255个的时间窗口。时间输出功能对应于时间窗口的中心。

可视化对于每种类型的信号的瞬时频率。

[instFreqA,TA] = instfreq(AFIB,FS);[instFreqN,TN] = instfreq(正常,FS);图副区(2,1,1);图(TN,instFreqN)称号(“正常信号”)包含('时间(s)')ylabel(瞬时频率的次要情节(2,1,2);instFreqA情节(tA)标题(“AFIB信号”)包含('时间(s)')ylabel(瞬时频率的

cellfun应用instfreq作用于训练和测试集中的每个单元。

instfreqTrain = cellfun(@(X)instfreq(X,FS)”,XTrain,“UniformOutput”、假);instfreqTest = cellfun (@ (x) instfreq (x, fs), XTest“UniformOutput”、假);

频谱熵度量如何高低不平平的信号的频谱是。具有高低不平光谱的信号,如正弦曲线的和,具有低的频谱熵。具有平坦的频谱的信号,像白噪声,具有高的频谱熵。该pentropy函数根据功率谱图估计谱熵。和瞬时频率估计的情况一样,pentropy使用255个时间窗口来计算光谱图。函数的时间输出对应于时间窗口的中心。

可视化对于每种类型的信号的频谱熵。

[pentropyA, tA2] = pentropy (aFib fs);[pentropyN, tN2] = pentropy(正常,fs);图subplot(2,1,1) plot(tN2,pentropyN)“正常信号”)ylabel(“谱熵”)次情节(2,1,2)情节(tA2,pentropyA)“AFIB信号”)包含('时间(s)')ylabel(“谱熵”

cellfun应用pentropy作用于训练和测试集中的每个单元。

pentropyTrain = cellfun(@(X)pentropy(X,FS)”,XTrain,“UniformOutput”、假);pentropyTest = cellfun(@(X)pentropy(X,FS)”,XTEST,“UniformOutput”、假);

将这些特性连接起来,使新训练和测试集中的每个单元都具有两个维度,或者两个特性。

XTrain2 = cellfun (@ (x, y) (x, y), instfreqTrain, pentropyTrain,“UniformOutput”、假);XTest2 = cellfun (@ (x, y) (x, y), instfreqTest, pentropyTest,“UniformOutput”、假);

可视化新输入的格式。每个细胞不再包含一个9000样本长的信号;现在它包含两个255个样本长的特性。

XTrain2 (1:5)
ans =5×1单元阵列{2×255双}{2×255双}{2×255双}{2×255双}

标准化的数据

瞬时频率和频谱熵具有装置,其由几乎一个数量级的差异。此外,对于LSTM有效地学习瞬时频率均值可能太高。当网络是适合于数据具有大的平均和大的值的范围,大的投入可以在网络的学习和收敛[减缓6]。

平均(instFreqN)
ANS = 5.5615
意思是(pentropyN)
ans = 0.6326

使用训练集平均值和标准偏差来标准化训练和测试集。标准化,或z分数,是一种流行的方法来提高网络性能的训练。

十五= [XTrain2 {}):;μ=意味着(十五,2);sg =性病(十五,[],2);XTrainSD = XTrain2;XTrainSD = cellfun (@ (x)(即xμ)。/ sg, XTrainSD,“UniformOutput”、假);XTestSD = XTest2;XTestSD = cellfun (@ (x)(即xμ)。/ sg, XTestSD,“UniformOutput”、假);

给出了标准化瞬时频率和谱熵的计算方法。

instFreqNSD = XTrainSD {1}(1,:);pentropyNSD = XTrainSD {1}(2,:);平均(instFreqNSD)
ANS = -0.3211
平均(pentropyNSD)
ans = -0.2416

修改LSTM网络架构

现在,每个信号具有两个维度,需要通过指定输入序列大小2.以100的输出的大小,和输出该序列的最后一个元素指定一个双向LSTM层来修改网络架构。通过包括大小2的完全连接层,接着是SOFTMAX层和分类层指定两个类。

层= [...sequenceInputLayer(2)bilstmLayer(100,“OutputMode”'持续')fullyConnectedLayer(2)softmaxLayer classificationLayer]
层= 5X1层阵列层:1“”序列的输入序列输入与2个维度2“” BiLSTM BiLSTM用100个隐藏单元3“”完全连接2完全连接层4“”使用SoftMax SOFTMAX 5“”分类输出crossentropyex

指定培训选项。将epochs的最大数量设置为30,以允许网络通过训练数据30次。

选项= trainingOptions(“亚当”...“MaxEpochs”30岁的...“MiniBatchSize”,150,...'InitialLearnRate',0.01,...'GradientThreshold',1...“执行环境”“汽车”...“阴谋”“训练进步”...“详细”、假);

训练具有时频特性的LSTM网络

训练LSTM网络与指定的训练选项和层结构,通过使用trainNetwork

NET2 = trainNetwork(XTrainSD,YTrain,层,选项);

有一个在训练精度,这是目前大于90%有很大的改进。向0交叉熵损失的趋势。此外,训练所需的时间降低,因为TF时刻是比原始序列短。

可视化的培训和测试精度

使用更新后的LSTM网络对训练数据进行分类。将分类性能可视化为混淆矩阵。

trainPred2 =分类(net2 XTrainSD);LSTMAccuracy = sum(trainPred2 == YTrain)/numel(YTrain)*100
LSTMAccuracy = 83.5962
图confusionchart(YTrain,trainPred2,'ColumnSummary'“列归一化”...“RowSummary”“行标准化”'标题'“LSTM的混乱图表”);

分类与更新后的网络测试数据。画出混淆矩阵检验测试精度。

testPred2 =分类(NET2,XTestSD);LSTMAccuracy =总和(testPred2 == YTest)/ numel(YTest)* 100
LSTMAccuracy = 80.1020
图confusionchart(欧美、testPred2'ColumnSummary'“列归一化”...“RowSummary”“行标准化”'标题'“LSTM的混乱图表”);

结论

这个例子展示了如何使用LSTM网络建立一个分类器来检测心电信号中的房颤。该程序使用过采样来避免在试图检测主要由健康患者组成的人群中的异常情况时出现的分类偏差。使用原始信号数据训练LSTM网络导致分类精度较差。针对每个信号使用两个时频矩特征对网络进行训练,可以显著提高分类性能,减少训练时间。

参考

[1]AF分类:短单导联心电图记录:《生理学/计算挑战》(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, and Roger G. Mark。《短导联心电图的AF分类:2017年心脏病学挑战中的生理学计算》计算在心脏病学(雷恩:IEEE)。卷。44,2017年,第1-4页。

[3]戈德伯格,A. L.,L。A. N.阿马拉尔,L.玻璃,J.M.豪斯多夫,P.章。诺夫,R. G.马克,J.E Mietus,G. B.穆迪,C.-K.彭和H. E.斯坦利。“PhysioBank,PhysioToolkit和PhysioNet:一个新的研究资源的复杂生理信号的分量”。循环。卷。101,第23号,2000 6月13日,第E215-E220。http://circ.ahajournals.org/content/101/23/e215.full

[4]脑桥,霍尔迪阿,托马斯Lidy,和Xavier塞拉。“有音乐上的启发卷积神经网络进行实验”。第14届国际研讨会基于内容的多媒体索引(中材)。2016年6月。

[5]王D.“深度学习重创助听器”IEEE频谱,第54卷,第3期,2017年3月,第32-37页。doi: 10.1109 / MSPEC.2017.7864754。

[6]Brownlee,杰森。如何在Python中对长、短期内存网络进行数据伸缩。2017年7月7日。https://machinelearningmastery.com/how-to-scale-data-for-long-short-term-memory-networks-in-python/。

也可以看看

职能

相关的话题