主要内容

基于长短时记忆网络的心电信号分类

此示例演示如何使用深度学习和信号处理对PhysioNet 2017挑战赛中的心跳心电图(ECG)数据进行分类。特别是,此示例使用长-短记忆网络和时频分析。

介绍

心电图记录一段时间内一个人心脏的电活动。医生使用心电图目视检测患者的心跳是否正常或不规则。

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

本例使用来自PhysioNet 2017挑战赛的ECG数据[1], [2], [3.],网址是https://physionet.org/challenge/2017/.数据由一组300 Hz采样的ECG信号组成,专家组将其分为四类:正常(N)、AFib(a)、其他节律(O)和噪声记录(~)。此示例显示了如何使用深度学习自动化分类过程。此过程探索了一种二进制分类器,可将正常ECG信号与显示AFib迹象的信号区分开来。

这个例子使用了长短期记忆(LSTM)网络,这是一种非常适合研究序列和时间序列数据的递归神经网络(RNN)。LSTM网络可以学习序列时间步长之间的长期依赖关系。LSTM层(第一层(深度学习工具箱))可以正向查看时间序列,而双向LSTM层(双层膜(深度学习工具箱))可以向前和向后查看时间序列。此示例使用双向LSTM层。

为了加速训练过程,请在带有GPU的机器上运行此示例。如果您的机器有GPU和并行计算工具箱™,那么MATLAB®自动使用GPU进行训练;否则,使用CPU。

加载并检查数据

运行ReadPhysionetData从PhysioNet网站下载数据并生成MAT文件的脚本(PhysionetData.mat)包含适当格式的ECG信号。下载数据可能需要几分钟。仅在以下情况下使用运行脚本的条件语句PhysionetData.mat当前文件夹中不存在。

如果~ isfile (“PhysionetData.mat”) ReadPhysionetData结束负载生理数据

加载操作将向工作区添加两个变量:信号标签信号是保存心电信号的细胞阵列。标签是一个分类数组,其中包含信号的相应基本真值标签。

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

使用总结函数查看数据中包含了多少AFib信号和Normal信号。

摘要(标签)
A 738 N 5050

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

L = cellfun (@length,信号);h =直方图(左);xticks (0:3000:18000);xticklabels (0:3000:18000);标题(“信号长度”)xlabel(“长度”)伊拉贝尔(“数”

将每个类别的一个信号片段可视化。AFib心跳间隔不规则,而正常心跳有规律地出现。AFib心跳信号也通常缺少P波,在正常心跳信号中,P波在QRS波群之前脉冲。正常信号的曲线图显示P波和QRS波群。

正常=信号{1};aFib=信号{4};子地块(2,1,1)绘图(正常)标题(“正常节奏”)xlim([40005200])ylabel(“振幅(mV)”)文本(4330150,“P”“水平对齐”“中心”)文本(4370850,“QRS”“水平对齐”“中心”) subplot(2,1,2) plot(aFib) title(“心房颤动”) xlim((4000、5200))包含(“样本”)伊拉贝尔(“振幅(mV)”

为培训准备数据

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

为避免过度填充或截断,请应用分段信号功能,所以它们都是9000个样本长。该功能忽略小于9000个样本的信号。如果一个信号有超过9000个样本,分段信号将其拆分为尽可能多的9000个采样段,并忽略剩余的采样。例如,具有18500个样本的信号变为两个9000个样本信号,其余500个样本将被忽略。

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

查看文档的前五个元素信号数组,以验证每个条目现在是9000个样本长。

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

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

要设计分类器,请使用上一节中生成的原始信号。将信号分成训练集以训练分类器,以及测试集以测试分类器在新数据上的准确性。

使用总结函数显示AFib信号与正常信号的比率为718:4937,或约为1:7。

摘要(标签)
A 718 N 4937

因为大约有7/8的信号是正常的,所以分类器会发现,只要将所有信号分类为正常信号,就可以实现高精度。为了避免这种偏差,可以通过复制数据集中的AFib信号来增加AFib数据,以便有相同数量的正常和AFib信号。这种复制通常称为过采样,是深度学习中使用的一种数据扩充形式。

根据信号的类别将其拆分。

afibX(标签= = =信号“A”);afibY=标签(标签==“A”);normalX=信号(标签==“N”);normalY=标签(标签==“N”);

接下来,使用分割将每个班级的目标随机划分为训练集和测试集。

[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);xteststa=afibX(testIndA);ytistta=afibY(testIndN);stn=normalY(testIndN);

目前训练有646个AFib信号,4443个Normal信号。要在每个类中实现相同数量的信号,首先使用4438个Normal信号,然后使用雷普马特重复前634个AFib信号七次。

用于测试的有72个AFib信号和494个Normal信号。先用490正常信号,再用雷普马特将前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)];YTest=[repmat(YTestA(YTestA(1:70),7,1);YTestN(1:490);];

正常信号和AFib信号之间的分布现在在训练集和测试集中都是均衡的。

总结(YTrain)
A 4438 N 4438
总结(欧美)
A 490 n 490

定义LSTM网络体系结构

LSTM网络可以学习序列数据的时间步长之间的长期依赖关系。此示例使用双向LSTM层双层膜,因为它可以向前和向后查看序列。

因为每个输入信号都有一个维度,所以将输入大小指定为大小为1的序列。指定输出大小为100的双向LSTM层,并输出序列的最后一个元素。此命令指示双向LSTM层将输入时间序列映射为100个特征,然后为完整的输入准备输出连接层。最后,通过包括大小为2的完全连接层,然后是softmax层和分类层来指定两个类。

层=[...sequenceInputLayer (1) bilstmLayer (100“输出模式”“最后一次”(2) softmaxLayer classificationLayer
Layer = 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

接下来指定分类器的训练选项“MaxEpochs”到10,允许网络10次通过训练数据。一个“MiniBatchSize”of 150指示网络一次查看150个训练信号“InitialLearnRate”0.01有助于加快培训过程。指定一个“SequenceLength”1000,将信号分成更小的部分,这样机器不会因为一次查看太多数据而耗尽内存。设置'梯度阈值“1,通过防止坡度过大来稳定训练过程。具体说明“阴谋”作为“培训进度”生成随迭代次数增加而显示训练进度图形的绘图。设置“冗长”抑制与绘图中显示的数据对应的表格输出。如果要查看此表,请设置“冗长”符合事实的

本例使用自适应矩估计(ADAM)解算器。ADAM使用类似RNN的LSTM解算器的性能优于默认的随机梯度下降动量解算器(SGDM)。

选项=培训选项(“亚当”...“MaxEpochs”,10,...“MiniBatchSize”, 150,...“InitialLearnRate”, 0.01,...“SequenceLength”, 1000,...“GradientThreshold”1....“ExecutionEnvironment”“自动”...“情节”“培训进度”...“冗长”、假);

培训LSTM网络

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

net=列车网络(XTrain、YTrain、图层、选项);

训练进度图的顶部子图表示训练准确率,即每个小批上的分类准确率。当培训成功进行时,这个值通常会增加到100%。底部的子图显示了训练损失,这是每个小批上的交叉熵损失。当训练成功进行时,这个值通常会降至零。

如果训练不收敛,曲线图可能会在值之间振荡,而不会朝某个向上或向下的方向发展。这种振荡意味着训练精度没有提高,训练损失也没有减少。这种情况可能从训练开始就出现,或者曲线图可能在一些初步的im后趋于平稳提高训练精度。在许多情况下,改变训练选项可以帮助网络实现收敛。减少小批量或减少初始学习率可能会导致更长的训练时间,但它可以帮助网络更好地学习。

分类器的训练精度在大约50%到大约60%之间波动,在10个时代结束时,训练已经花费了几分钟。

将培训和测试的准确性可视化

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

trainPred=分类(净、XTrain、,“SequenceLength”, 1000);

在分类问题中,混淆矩阵用于可视化分类器在一组已知真值的数据上的性能。目标类是信号的基本真值标签,输出类是网络分配给信号的标签。轴标签表示类标签AFib(a)正常(N)。

使用混淆图用于计算测试数据预测的总体分类精度的命令。指定“行摘要”作为“行规范化”在行摘要中显示真阳性率和假阳性率。另外,请指定“专栏摘要”作为“column-normalized”在列摘要中显示阳性预测值和错误发现率。

LSTMAccuracy = sum(trainPred == YTrain)/numel(YTrain)*100
LSTMAccuracy=61.7283
图confusionchart (YTrain trainPred,“专栏摘要”“column-normalized”...“行摘要”“行规范化”“头衔”“LSTM的混淆图”);

现在使用相同的网络对测试数据进行分类。

testPred=分类(净、XTest、,“SequenceLength”, 1000);

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

LSTMAccuracy=sum(testPred==YTest)/numel(YTest)*100
LSTMAccuracy=66.2245
图2:混淆图(YTest、testPred、,“专栏摘要”“column-normalized”...“行摘要”“行规范化”“头衔”“LSTM的混淆图”);

通过特征提取提高性能

从数据中提取特征有助于提高分类器的训练和测试精度。为了决定提取哪些特征,本例采用了一种计算时频图像(如频谱图)的方法,并使用它们来训练卷积神经网络(CNN)[4], [5].

可视化每种类型信号的频谱图。

fs=300;图形子批次(2,1,1);pspectrum(正常,fs,“光谱图”“时间分辨率”,0.5)标题(“正常信号”)子批次(2,1,2);pspectrum(aFib,fs,“光谱图”“时间分辨率”,0.5)标题(“AFib信号”

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

探索时域中的两个TF时刻:

  • 瞬时频率(instfreq

  • 谱熵(戊酸

instfreq函数将信号的时间相关频率估计为功率谱图的第一个矩。函数使用时间窗口上的短时傅里叶变换计算谱图。在本例中,函数使用255个时间窗口。函数的时间输出对应于时间窗口的中心。

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

[instFreqA, tA] = instfreq (aFib fs);[instFreqN, tN] = instfreq(正常,fs);图次要情节(2,1,1);情节(tN, instFreqN)标题(“正常信号”)xlabel(‘时间’)伊拉贝尔(“瞬时频率”)子地块(2,1,2);地块(tA、INSTREFRA)名称(“AFib信号”)xlabel(‘时间’)伊拉贝尔(“瞬时频率”

使用赛尔芬应用instfreq功能分配到训练和测试集中的每个单元。

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

谱熵衡量信号频谱的尖峰平坦程度。尖峰频谱的信号(如正弦曲线之和)具有较低的谱熵。平坦频谱的信号(如白噪声)具有较高的谱熵戊酸函数根据功率谱图估计谱熵。与瞬时频率估计情况一样,戊酸使用255个时间窗口计算频谱图。函数的时间输出对应于时间窗口的中心。

可视化每一种信号的谱熵。

[pentropyA,tA2]=pentropy(aFib,fs);[戊丙炔,tN2]=戊丙炔(正常,fs);图子地块(2,1,1)图(tN2,戊丙炔)标题(“正常信号”)伊拉贝尔(“谱熵”)子地块(2,1,2)地块(tA2,pentropyA)名称(“AFib信号”)xlabel(‘时间’)伊拉贝尔(“谱熵”

使用赛尔芬应用戊酸功能分配到训练和测试集中的每个单元。

pentropyTrain = cellfun (@ (x) pentropy (x, fs), XTrain“UniformOutput”、假);pentropyTest = cellfun (@ (x) pentropy (x, fs), XTest“UniformOutput”、假);

连接特征,使新训练集和测试集中的每个单元具有两个维度或两个特征。

XTrain2=cellfun(@(x,y)[x;y],instreqtrain,pentropyTrain,“UniformOutput”,false);XTest2=cellfun(@(x,y)[x;y],instreqtest,pentropyTest,“UniformOutput”、假);

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

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

数据标准化

瞬时频率和谱熵的平均值相差近一个数量级。此外,瞬时频率平均值可能太高,LSTM无法有效学习。当网络适合于具有较大均值和较大值范围的数据时,较大的输入可能会减慢网络的学习和收敛速度[6].

平均值(单位:N)
ans = 5.5615
平均值(戊丙炔)
ans=0.6326

使用训练集均值和标准差来标准化训练集和测试集。标准化或z评分是在培训期间提高网络性能的常用方法。

XV=[XTrain2{:}];mu=均值(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”、假);

显示标准化瞬时频率和谱熵的平均值。

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

修改LSTM网络体系结构

既然每个信号都有两个维度,那么有必要通过将输入序列大小指定为2来修改网络架构。指定输出大小为100的双向LSTM层,并输出序列的最后一个元素。通过包含大小为2的完全连接层,然后是softmax层和分类层,指定两个类别。

层=[...sequenceInputLayer (2) bilstmLayer (100“输出模式”“最后一次”(2) softmaxLayer classificationLayer
layers=5x1层阵列和层:1''序列输入序列输入2维2''BiLSTM BiLSTM带100个隐藏单元3''完全连接2''完全连接层4''Softmax Softmax 5''分类输出crossentropyex

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

选项=培训选项(“亚当”...“MaxEpochs”,30,...“MiniBatchSize”, 150,...“InitialLearnRate”, 0.01,...“GradientThreshold”1....“ExecutionEnvironment”“自动”...“情节”“培训进度”...“冗长”、假);

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

使用指定的训练选项和层架构对LSTM网络进行训练trainNetwork

net2=列车网络(XTrainSD、YTrain、图层、选项);

训练精度有了很大的提高,交叉熵损失趋于0。此外,由于TF矩比原始序列短,训练所需的时间减少。

将培训和测试的准确性可视化

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

trainPred2=分类(net2,XTrainSD);LSTMAccuracy=总和(trainPred2==YTrain)/numel(YTrain)*100
LSTMAccuracy=83.5962
图confusionchart (YTrain trainPred2,“专栏摘要”“column-normalized”...“行摘要”“行规范化”“头衔”“LSTM的混淆图”);

使用更新的网络对测试数据进行分类。绘制混淆矩阵以检查测试精度。

testPred2=classify(net2,XTestSD);LSTMAccuracy=sum(testPred2==YTest)/numel(YTest)*100
LSTMAccuracy = 80.1020
图2:混淆图(YTest、testPred2、,“专栏摘要”“column-normalized”...“行摘要”“行规范化”“头衔”“LSTM的混淆图”);

结论

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

工具书类

[1]短单导联心电图记录的房颤分类:心脏病学挑战赛中的生理网络/计算,2017年。https://physionet.org/challenge/2017/

[2] Clifford,Gari,Chengyu Liu,Benjamin Moody,Li wei H.Lehman,Ikaro Silva,Qiao Li,Alistair Johnson和Roger G.Mark.“短单导联心电图记录的房颤分类:2017年心脏病学挑战赛中的生理网络计算。”心脏病学中的计算机(雷恩:IEEE),2017年第44卷,第1-4页。

[3] Goldberger,A.L.,L.A.N.Amaral,L.Glass,J.M.Hausdorff,P.C.Ivanov,R.G.Mark,J.E.Mietus,G.B.Moody,C.-K.Peng和H.E.Stanley.“生理银行,生理工具包和生理网:复杂生理信号新研究资源的组成部分”。循环第101卷,第23期,2000年6月13日,第e215-e220页。http://circ.ahajournals.org/content/101/23/e215.full

[4] Pons Jordi Thomas Lidy和Xavier Serra。“实验音乐驱动的卷积神经网络”。第十四届基于内容的多媒体索引(CBMI)国际研讨会2016年6月。

[5] 深度学习重塑了助听器IEEE频谱,第54卷,第3期,2017年3月,第32-37页。内政部:10.1109/MSPEC.2017.7864754。

[6] 布朗利,杰森。如何在Python中扩展长短期内存网络的数据2017年7月7日。https://machinelearningmastery.com/how-to-scale-data-for-long-short-term-memory-networks-in-python/.

另请参阅

功能

相关话题