主要内容

利用长、短期记忆网络对心电信号进行分类

这个例子展示了如何使用深度学习和信号处理对来自PhysioNet 2017挑战赛的心跳心电图数据进行分类。特别地,这个例子使用长短期记忆网络和时频分析。

介绍

心电图记录了一段时间内一个人心脏的电活动。医生用心电图来直观地检测病人的心跳是正常还是不规则。

心房颤动(AFIB)是一种不规则的心跳,当心脏的上腔室,Atria,与下腔室,心室的心脏的上室发生搏动。

此示例使用来自PhysioIonet 2017挑战的ECG数据[1], [2], [3.],可用https://physionet.org/challenge/2017/.该数据包括一组以300 Hz采样的一组ECG信号,并将一组专家分为四种不同的类:正常(N),AFIB(A),其他节奏(O)和嘈杂的录制(〜)。此示例显示如何使用深度学习自动化分类过程。该过程探索了二进制分类器,其可以区分来自显示AFIB迹象的信号的正常的ECG信号。

此示例使用长期短期内存(LSTM)网络,一种复发性神经网络(RNN)非常适合研究序列和时间序列数据。LSTM网络可以在序列的时间步长之间学习长期依赖性。LSTM层(lstmlayer.(深度学习工具箱))可以在向前方向上查看时间序列,而双向LSTM层(Bilstmlayer.(深度学习工具箱))可以查看向前和向后方向的时间序列。此示例使用双向LSTM层。

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

加载并检查数据

跑过reckphysionetdata.脚本从PhysioNet网站下载数据,并生成一个MAT-file (physionetdata.mat.)包含以适当格式的ECG信号。下载数据可能需要几分钟。仅使用运行脚本的条件语句physionetdata.mat.当前文件夹中尚未存在。

如果〜ISFILE(“PhysionetData.mat”)recotphysionetdata.结尾加载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

使用概括可以查看数据中包含多少个AFIB信号和正常信号。

摘要(标签)
一个738 n 5050

生成信号长度的直方图。大多数信号长度为9000个样品。

l = cellfun(@长度,信号);H =直方图(L);XTICKS(0:3000:18000);XTicklabels(0:3000:18000);标题('信号长度')Xlabel('长度')ylabel('数数'

从每个类中可视化一个信号的段。AFIB心跳以不规则的间隔间隔开,而正常心跳定期发生。AFIB心跳信号也经常缺乏P波,在QRS复合物中脉冲在正常的心跳信号之前。正常信号的曲线显示P波和QRS复合物。

normal =信号{1};afib =信号{4};子图(2,1,1)绘图(正常)标题('正常节奏')XLIM([4000,5200])Ylabel('幅度(mv)')文本(4330,150,'P''水平对齐''中央')文本(4370,850,'qrs''水平对齐''中央')子图(2,1,2)绘图(AFIB)标题('心房颤动')XLIM([4000,5200])Xlabel('样品')ylabel('幅度(mv)'

准备培训数据

在培训期间,Trainnetwork.函数将数据分成迷你批次。该功能然后焊接或截断相同的百分之批次的信号,使得它们都具有相同的长度。填充或截断可能对网络性能产生负面影响,因为网络可以基于添加或删除的信息不正确地解释信号。

为避免过度填充或截断,请应用SEGMESSIGNALS.功能到ECG信号,因此它们是全部9000个样本。该功能忽略具有少于9000个样本的信号。如果信号有超过9000个样本,SEGMESSIGNALS.将其分解成尽可能多的9000个样本片段,并忽略其余的样本。例如,一个有18500个样本的信号变成了两个有9000个样本的信号,剩下的500个样本被忽略。

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

查看前五个元素信号阵列以验证每个条目现在是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 =信号(标签=='一种');afiby =标签(标签=='一种');IrmanicX =信号(标签=='n');= = =饱和标签(标签'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 =饱和(trainIndN);XTestA = afibX (testIndA);YTestA = afibY (testIndA);XTestN = normalX (testIndN);YTestN =饱和(testIndN);

现在有646个AFIB信号和4443个正常信号进行训练。要在每个类中实现相同数量的信号,请使用前4438正常信号,然后使用repmat重复前634个AFIB信号七次。

用于测试,有72个AFIB信号和494正常信号。使用前490个正常信号,然后使用repmat重复前70个AFIB信号七次。默认情况下,神经网络在训练前随机随机洗牌,确保连续信号并非所有标签都具有相同的标签。

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);];

在训练集中和测试集中,Normal和AFib信号之间的分布现在是均匀平衡的。

摘要(Ytrain)
一个4438 n 4438
摘要(ytest)
490 n 490

定义LSTM网络架构

LSTM网络可以在序列数据的时间步长之间学习长期依赖性。此示例使用双向LSTM层Bilstmlayer.,因为它在向前和向后方向上看序列。

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

层= [......sequenceInputLayer(1)BilstMlayer(100,'OutputMode''最后的')全连接层(2)SoftMaxLayer ClassificationLayer]
图层= 5x1层阵列,带有图层:1''序列输入序列输入用1尺寸2''Bilstm Bilstm,具有100个隐藏单元3''完全连接的2完全连接的第4层''Softmax Softmax 5''分类输出CrossentRopyex

接下来为分类器指定培训选项。设定'maxepochs'到10以允许网络通过培训数据进行10。一种'minibatchsize'150指示网络一次查看150个训练信号。一个'italllearnrate'0.01帮助加速训练过程。指定一个“SequenceLength”将信号分解成更小的片段,这样机器就不会因为一次查看过多的数据而耗尽内存。设置”毕业生察列人'为1,以防止梯度变得过大,从而稳定训练过程。指定'plots'作为'培训 - 进步'生成随着迭代次数增加而显示训练进度的图形。集'verbose'错误的禁止与图中显示的数据对应的表输出。如果你想看这张桌子,就去'verbose'真正的

此示例使用自适应时刻估计(ADAM)求解器。adam与lstms比LSTM相同的RNN比具有动量(SGDM)求解器的默认随机梯度下降更好。

选择= trainingOptions ('亚当'......'maxepochs'10,......'minibatchsize',150,......'italllearnrate',0.01,......“SequenceLength”,1000,......'gradientthreshold',1,......'executionenvironment'“汽车”......'plots''培训 - 进步'......'verbose',错误的);

训练LSTM网络

使用指定的培训选项和图层架构列车LSTM网络Trainnetwork..由于训练集很大,训练过程可能需要几分钟。

网= trainNetwork (XTrain、YTrain层,选择);

训练进度图的顶部子图表示训练准确性,这是每个迷你批处理上的分类准确性。当培训成功进行时,该值通常会增加100%。底部子图显示训练丢失,这是每个迷你批处理上的跨熵丢失。当培训成功进行时,该值通常会降低零。

如果训练不收敛,图可能会在值之间振荡,而不会朝着某个向上或向下的方向。这种振荡意味着训练精度没有提高,训练损失没有减少。这种情况可能在训练开始时就出现,或者在训练准确性初步提高后,情节可能会趋于平稳。在许多情况下,改变训练选项可以帮助网络实现收敛。减少MiniBatchSize或减少InitialLearnRate可能导致更长的培训时间,但它可以帮助网络了解更好。

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

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

计算培训准确性,这表示分类器对培训的信号的准确性。首先,分类培训数据。

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

在分类问题中,混淆矩阵用于可视化对真实值的一组数据上的分类器的性能。目标类是信号的地面真值标签,输出类是网络被网络分配给信号的标签。轴标签代表类标签,AFIB(A)和正常(n)。

使用困惑的园林命令计算测试数据预测的整体分类准确性。指定'rowsmumary'作为“row-normalized”在行汇总中显示真实阳性率和假阳性率。同时,指定“ColumnSummary”作为'列 - 归一化'在列摘要中显示阳性预测值和错误发现率。

lstmaccuracy = sum(trainpred == ytrain)/ numel(ytrain)* 100
lstmaccuracy = 61.7283.
图杂志(Ytrain,TrainPred,“ColumnSummary”'列 - 归一化'......'rowsmumary'“row-normalized”“标题”'LSTM的混乱图');

现在将测试数据分类为同一网络。

testpred =分类(net,xtest,“SequenceLength”,1000);

计算测试准确性并将分类性能视为混淆矩阵。

lstmaccuracy = sum(testpred == ytest)/ numel(ytest)* 100
LSTMAccuracy = 66.2245
Figure ConfusionChart(ytest,testpred,“ColumnSummary”'列 - 归一化'......'rowsmumary'“row-normalized”“标题”'LSTM的混乱图');

提高特征提取性能

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

可视化每种信号的谱图。

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

因为本例使用LSTM而不是CNN,所以将该方法转换为适用于一维信号是很重要的。时频矩从谱图中提取信息。每个时刻都可以作为一维特征输入到LSTM中。

在时域中探索两个TF矩:

  • 瞬时频率(instfreq.

  • 谱熵(pentropy

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

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

[instfreqa,ta] = instfreq(afib,fs);[instfreqn,tn] = instfreq(正常,fs);图次要情节(2,1,1);绘制(TN,Instfreqn)标题(“正常信号”)Xlabel(“时间(s)”)ylabel('瞬时频率')子图(2,1,2);绘制(TA,Instfreqa)标题('afib信号')Xlabel(“时间(s)”)ylabel('瞬时频率'

使用cellfun申请instfreq.在培训和测试集中的每个单元格功能。

instfreqtrain = cellfun(@(x)instfreq(x,fs)',xtrain,'统一输出',错误的);instfreqtest = cellfun(@(x)instfreq(x,fs)',xtest,'统一输出',错误的);

谱熵测量信号的谱有多平坦。一个具有尖峰频谱的信号,就像一个正弦信号的和,具有低的谱熵。频谱平坦的信号,比如白噪声,具有高的频谱熵。这pentropy功能估计基于功率谱图的光谱熵。与瞬时频率估计箱一样,pentropy使用255窗口来计算频谱图。函数的时间输出对应于时间窗口的中心。

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

[Pentropea,Ta2] = Pentropy(AFIB,FS);[Pentropyn,TN2] = Pentropy(正常,FS);图形子图(2,1,1)绘图(TN2,Pentropyn)标题(“正常信号”)ylabel('光谱熵')子图(2,1,2)绘图(TA2,PENTROPYA)标题('afib信号')Xlabel(“时间(s)”)ylabel('光谱熵'

使用cellfun申请pentropy在培训和测试集中的每个单元格功能。

pentropytrain = cellfun(@(x)pentropy(x,fs)',xtrain,'统一输出',错误的);pentropytest = cellfun(@(x)pentropy(x,fs)',xtest,'统一输出',错误的);

连接功能,使得新培训和测试集中的每个单元具有两个维度或两个功能。

xtrain2 = cellfun(@(x,y)[x; y],instfreqtrain,pentropytrain,'统一输出',错误的);xtest2 = cellfun(@(x,y)[x; y],instfreqtest,pentropytest,'统一输出',错误的);

可视化新输入的格式。每个单元格不再包含一个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.].

意思是(instFreqN)
ANS = 5.5615.
意思(pentropyn)
ans = 0.6326.

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

xv = [xtrain2 {:}];mu =平均值(xv,2);sg = std(xv,[],2);XTrainsd = XTrain2;xtrainsd = cellfun(@(x)(x-mu)./ sg,xtrainsd,'统一输出',错误的);xtestsd = xtest2;xtestsd = cellfun(@(x)(x-mu)./ sg,xtestsd,'统一输出',错误的);

显示标准瞬时频率和光谱熵的手段。

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''最后的')全连接层(2)SoftMaxLayer ClassificationLayer]
Layer = 5x1 Layer array with layers: 1 " Sequence Input Sequence Input with two dimensions 2 " BiLSTM BiLSTM with 100 hidden units 3 " Fully Connected 2 Fully Connected Layer 4 " Softmax Softmax 5 " Classification Output crossentropyex

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

选择= trainingOptions ('亚当'......'maxepochs',30,......'minibatchsize',150,......'italllearnrate',0.01,......'gradientthreshold',1,......'executionenvironment'“汽车”......'plots''培训 - 进步'......'verbose',错误的);

用时频功能列车LSTM网络

使用指定的培训选项和图层架构列车LSTM网络Trainnetwork.

net2 = trainNetwork (XTrainSD、YTrain层,选择);

训练准确性有很大的改善。跨熵损失趋势朝向0.此外,培训所需的时间降低,因为TF矩比原始序列短。

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

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

trainpred2 =分类(net2,xtrainsd);lstmaccuracy = sum(trainpred2 == ytrain)/ numel(ytrain)* 100
LSTMAccuracy = 83.5962
图杂志(Ytrain,TrainPred2,“ColumnSummary”'列 - 归一化'......'rowsmumary'“row-normalized”“标题”'LSTM的混乱图');

将测试数据与更新的网络进行分类。绘制混淆矩阵以检查测试的准确性。

testPred2 =分类(net2 XTestSD);LSTMAccuracy = sum(testPred2 == YTest)/numel(YTest)*100
lstmaccuracy = 80.1020
图困惑派(ytest,testpred2,“ColumnSummary”'列 - 归一化'......'rowsmumary'“row-normalized”“标题”'LSTM的混乱图');

结论

此示例显示如何构建分类器以使用LSTM网络检测心电图信号中的心房颤动。该程序使用过采样来避免当一个人试图检测主要是健康患者组成的种群的异常条件时发生的分类偏差。使用原始信号数据训练LSTM网络导致分类准确性差。使用两个时间频率时刻的网络训练网络对于每个信号显着提高了分类性能,并且还降低了训练时间。

参考文献

[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页。

A. L. Goldberger, A. L. A. N. Amaral, L. Glass, J. M. Hausdorff, P. Ch. Ivanov, R. G. Mark, J. E. miietus, G. B. Moody, C.-K。彭,还有h·e·斯坦利。“PhysioBank, PhysioToolkit和PhysioNet:复杂生理信号新研究资源的组成部分”。循环.第101卷,第23卷,2000年6月13日,页e215-e220。http://circ.ahajournals.org/content/101/23/e215.full.

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

[5], D。“深度学习彻底改造了助听器,”IEEE频谱,卷。54,2017年3月3日,第32-37页。DOI:10.1109 / MSPEC.2017.7864754。

[6]棕褐色,杰森。如何在Python中缩放长期内存网络的数据.2017年7月7日。https://machinelearningmastery.com/how-to-scale-data-for-nong-short-term-memory-networks-in-python/。

也可以看看

职能

相关话题