主要内容

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

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

介绍

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

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

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

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

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

加载并检查数据

运行读取物理网络数据脚本从PhysioNet网站下载数据,并生成一个MAT-file (PhysionetData.mat),其中包含适当格式的心电信号。下载数据可能需要几分钟。使用条件语句,仅当PhysionetData.mat当前文件夹中不存在。

如果~isfile(“PhysionetData.mat”)读取物理网络数据终止负载PhysionetData

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

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

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

总结(标签)
A 738 n 5050

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

L=cellfun(@length,Signals);h=histogram(L);xticks(0:3000:18000);xticklabels(0:3000:18000);标题(“信号长度”)xlabel(“长度”)伊拉贝尔(“伯爵”)

可视化来自每个类的一个信号的片段。AFib的心跳间隔是不规则的,而正常的心跳是有规律的。AFib心跳信号也经常缺乏P波,它在正常心跳信号的QRS复合体之前跳动。正常信号的图显示了P波和QRS波复合体。

正常=信号{1};aFib=信号{4};子地块(2,1,1)绘图(正常)标题(“正常节奏”)xlim([40005200])ylabel(‘振幅(mV)’)文本(4330150,“P”,“水平对齐”,“中心”)文本(4370850,“QRS”,“水平对齐”,“中心”)子地块(2,1,2)地块(aFib)名称(心房纤维性颤动的)xlim([40005200])xlabel(“样本”)伊拉贝尔(‘振幅(mV)’)

准备培训数据

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

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

[信号,标签]=分段信号(信号,标签);

查看的前五个元素信号数组来验证每个条目现在是否有9000个样本长。

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

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

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

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

总结(标签)
A 718 n 4937

因为大约7/8的信号是正常的,分类器就会知道,只要把所有信号都分类为正常,就可以达到很高的精度。为了避免这种偏差,通过在数据集中复制AFib信号来增加AFib数据,使正常信号和AFib信号的数量相同。这种重复,通常称为过采样,是深度学习中使用的数据增强的一种形式。

根据信号的类别来划分。

afibX=信号(标签==“A”);afibY =标签(标签= =“A”);normalX=信号(标签==“不”);= = =饱和标签(标签“不”);

下一步,使用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信号重复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);];

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

摘要(YTrain)
A 4438 n 4438
摘要(YTest)
A 490 N 490

定义LSTM网络架构

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

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

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

接下来指定分类器的训练选项“MaxEpochs”到10,以允许网络通过训练数据进行10次。A“MiniBatchSize”其中150个信号指示网络一次查看150个训练信号。一个“初始学习率”0.01帮助加速训练过程。指定一个“SequenceLength”将信号分成更小的部分,这样机器不会因为一次查看太多数据而耗尽内存。设定梯度阈值'为1,以防止梯度变得过大,从而稳定训练过程。指定“情节”“培训进度”生成随着迭代次数增加而显示训练进度的图形。集“详细”错误的禁止与图中显示的数据对应的表输出。如果你想看这张桌子,就去“详细”真正的

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

选择= trainingOptions (“亚当”,...“MaxEpochs”,10,...“MiniBatchSize”, 150,...“初始学习率”, 0.01,...“SequenceLength”, 1000,...“梯度阈值”, 1...“执行环境”,“汽车”,...“情节”,“培训进度”,...“详细”、假);

培训LSTM网络

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

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

培训进度图的顶部子批次表示培训精度,即每个小批次的分类精度。当培训成功进行时,该值通常会增加到100%。底部子批次显示培训损失,即每个小批次的交叉熵损失。当培训成功进行时不幸的是,该值通常会朝着零的方向减小。

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

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

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

计算训练准确率,它表示分类器对所训练信号的准确率。首先,对训练数据进行分类。

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

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

使用混淆图用于计算测试数据预测的总体分类精度的命令。指定“RowSummary”“row-normalized”在行汇总中显示真实阳性率和假阳性率。同时,指定“ColumnSummary”“列规格化”在列摘要中显示阳性预测值和错误发现率。

LSTMAccuracy=sum(trainPred==YTrain)/numel(YTrain)*100
LSTMAccuracy=61.7283
图2:混乱图(YTrain、trainPred、,“ColumnSummary”,“列规格化”,...“RowSummary”,“row-normalized”,“标题”,“LSTM混淆图”);

现在用同一个网络对测试数据进行分类。

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

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

LSTMAccuracy = sum(testPred == YTest)/numel(YTest)*100
LSTMAccuracy = 66.2245
图confusionchart(欧美、testPred“ColumnSummary”,“列规格化”,...“RowSummary”,“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矩:

  • 瞬时频率(英斯特弗尔)

  • 谱熵(pentropy)

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

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

[instreqa,tA]=instreq(aFib,fs);[instreqn,tN]=instreq(normal,fs);地物子地块(2,1,1);地块(tN,instreqn)标题(“正常信号”)xlabel(“时间(s)”)伊拉贝尔(瞬时频率的)子地块(2,1,2);地块(tA、INSTREFRA)名称(“AFib信号”)xlabel(“时间(s)”)伊拉贝尔(瞬时频率的)

使用cellfun应用英斯特弗尔功能分配到训练和测试集中的每个单元。

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) title(“正常信号”)伊拉贝尔(“光谱熵”)子地块(2,1,2)地块(tA2,pentropyA)名称(“AFib信号”)xlabel(“时间(s)”)伊拉贝尔(“光谱熵”)

使用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”,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.].

意思是(instFreqN)
ans=5.5615
意思是(pentropyN)
ans = 0.6326

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

十五= [XTrain2 {}):;μ=意味着(十五,2);sg =性病(十五,[],2);XTrainSD = XTrain2;XTrainSD = cellfun (@ (x)(即xμ)。/ sg, XTrainSD,“UniformOutput”,false);XTestSD=XTest2;XTestSD=cellfun(@(x)(x-mu)。/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]
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

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

选择= trainingOptions (“亚当”,...“MaxEpochs”,30,...“MiniBatchSize”, 150,...“初始学习率”, 0.01,...“梯度阈值”, 1...“执行环境”,“汽车”,...“情节”,“培训进度”,...“详细”、假);

用时频特征训练LSTM网络

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

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

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

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

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

trainPred2 =分类(net2 XTrainSD);LSTMAccuracy = sum(trainPred2 == YTrain)/numel(YTrain)*100
LSTMAccuracy = 83.5962
图2混乱图(YTrain,trainPred2,“ColumnSummary”,“列规格化”,...“RowSummary”,“row-normalized”,“标题”,“LSTM混淆图”);

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

testPred2 =分类(net2 XTestSD);LSTMAccuracy = sum(testPred2 == YTest)/numel(YTest)*100
LSTMAccuracy=80.1020
图confusionchart(欧美、testPred2“ColumnSummary”,“列规格化”,...“RowSummary”,“row-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页。

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卷,第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/。

另见

功能

相关话题