主要内容

使用长短期记忆网络的ECG信号进行分类

这个例子展示了如何分类心跳心电图(ECG)数据从生理网2017年挑战使用深度学习和信号处理。特别是,示例使用长短期记忆网络和时频分析。

介绍

ecg记录一个人的心脏的电活动在一段时间内。医生使用ecg来检测视力如果病人的心跳是正常的或不规则。

心房纤颤(AFib)是一种不规则的心跳,发生在心脏的心房,心房,击败的配合下室,心室。

这个示例使用心电图数据从生理网2017年的挑战1]、[2]、[3),这是可用的https://physionet.org/challenge/2017/。心电图信号采样的数据由一组在300赫兹,由一群专家分为四个不同的类:正常(N), AFib (a),其他节奏(O),和嘈杂的记录(~)。这个例子展示了如何使用深度学习自动化分类过程。的过程探讨了二元分类器可以区分正常心电图信号信号AFib的迹象。

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

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

加载和检查数据

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

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

加载操作向工作区添加两个变量:信号标签信号是一个单元阵列,心电图信号。标签真实是一个分类数组保存相应的标签的信号。

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

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

总结(标签)
738 N 5050

生成一个信号长度的柱状图。大部分的信号是长9000样品。

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

想象一段每个类的一个信号。AFib心跳间隔以不规则的间隔而正常心跳定期发生。AFib心跳信号也常常缺乏一个P波,脉冲在QRS波群的正常心跳信号。正常信号的情节显示P波、QRS波群。

正常={1}信号;aFib ={4}信号;次要情节(2,1,1)情节(正常的)标题(“正常的节奏”)xlim ((4000、5200)) ylabel (“振幅(mV)”)文本(4330、150、“P”,“HorizontalAlignment”,“中心”)文本(4370、850、“QRS”,“HorizontalAlignment”,“中心”次要情节(2,1,2)情节(aFib)标题(心房纤维性颤动的)xlim((4000、5200))包含(“样本”)ylabel (“振幅(mV)”)

数据准备培训

在培训期间,trainNetwork将数据分为mini-batches函数。函数然后垫或截断信号在同一mini-batch所以他们都具有相同的长度。过多的填充或删除可以对网络的性能有负面影响,因为网络可能会解释一个信号不正确的基础上添加或删除信息。

为了避免过度填充或删除,应用segmentSignals函数的ECG信号所以他们都长9000样品。少于9000个样本函数忽略了信号。如果一个信号有超过9000个样本,segmentSignals休息到尽可能多的样本9000 -段,而忽略了剩余的样品。例如,信号变成了两个9000 - 18500份样本信号,剩下的500个样本将被忽略。

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

查看前5的元素信号数组来验证每个条目现在长9000样品。

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

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

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

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

总结(标签)
718 N 4937

是正常的,因为7/8的信号分类器学习,都可以通过分类来实现高精度信号正常。为了避免这种偏见,增强AFib数据通过复制AFib信号在数据集,以便有相同数量的正常和AFib信号。通常称为采样过密,这种重复是一种形式的数据增加用于深度学习。

分裂的信号根据他们的类。

afibX(标签= = =信号“一个”);afibY =标签(标签= =“一个”);normalX(标签= = =信号“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)];欧美= [repmat (YTestA(1:70), 7日,1);YTestN (1:490);];

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

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

定义LSTM网络体系结构

LSTM网络可以学习长期之间的依赖关系的时间序列数据的步骤。下面的例子使用了双向LSTM层bilstmLayer序列的,因为它看起来都向前和向后的方向。

因为各有一维输入信号,指定输入尺寸大小为1的序列。指定一个双向LSTM层和一个输出大小为100和输出序列的最后一个元素。这个命令指示双向LSTM层输入时间序列映射到100,然后准备输出特性完全连接层。最后,指定两类包括一个完全连接规模为2层,其次是softmax层和一层分类。

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

下一个指定的培训选项分类器。设置“MaxEpochs”10让网络10通过训练数据。一个“MiniBatchSize”150年指导网络看150训练信号。一个“InitialLearnRate”0.01有助于加快训练过程。指定一个“SequenceLength”1000信号分解成小块,这样机器不耗尽内存通过观察太多数据。设置”GradientThreshold1稳定训练过程通过阻止梯度太大。指定“阴谋”作为“训练进步”生成图显示一个图形的培训进展随着迭代次数的增加。集“详细”抑制表输出对应于图中所示的数据。如果你想看这个表,设置“详细”真正的

下面的例子使用了自适应时刻估计(亚当)解算器。亚当执行像LSTMs RNNs比默认随机梯度下降法与动量(个)解算器。

选择= trainingOptions (“亚当”,“MaxEpochs”10“MiniBatchSize”,150,“InitialLearnRate”,0.01,“SequenceLength”,1000,“GradientThreshold”,1“ExecutionEnvironment”,“汽车”,“阴谋”,“训练进步”,“详细”、假);

火车LSTM网络

火车与指定的培训选项LSTM网络和利用层体系结构trainNetwork。因为训练集很大,培训过程可能需要几分钟时间。

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

顶部的次要情节训练进步情节代表训练精度,这是每个mini-batch的分类精度。当成功培训进展,这个值通常增加到100%。次要情节底部显示培训损失,这是每个mini-batch叉损失。当成功培训进展,通常这个值降低为零。

如果培训没有收敛,情节可能振动值之间没有趋势在一定向上或向下的方向。这种振荡意味着训练精度不改善,培训不是减少损失。这种情况可能发生从一开始的训练,或者一些初步改善后的情节可能高原训练精度。在许多情况下,改变训练选项可以帮助网络实现收敛。减少MiniBatchSize或减少InitialLearnRate可能导致较长的训练时间,但它可以帮助网络学习更好。

分类器的训练精度约50%至约60%,振荡和10年底的时代,它已经花了几分钟的火车。

可视化培训和测试精度

计算训练精度,代表的分类器对信号的准确性是训练有素的。首先,训练数据进行分类。

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

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

使用confusionchart命令来计算的总体分类精度测试数据预测。指定“RowSummary”作为“row-normalized”显示的真阳性和假阳性的比例行总结。同时,指定“ColumnSummary”作为“column-normalized”显示阳性预测值和错误发现率列总结。

LSTMAccuracy = (trainPred = = YTrain) /元素个数之和(YTrain) * 100
LSTMAccuracy = 61.7283
图confusionchart (YTrain trainPred,“ColumnSummary”,“column-normalized”,“RowSummary”,“row-normalized”,“标题”,“LSTM混乱图”);

现在同一网络的测试数据进行分类。

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

计算测试准确性和可视化分类性能的混淆矩阵。

LSTMAccuracy = (testPred = =次)/元素个数之和(欧美)* 100
LSTMAccuracy = 66.2245
图confusionchart(欧美、testPred“ColumnSummary”,“column-normalized”,“RowSummary”,“row-normalized”,“标题”,“LSTM混乱图”);

提高性能和特征提取

特征提取的数据可以帮助提高分类器的训练和测试精度。决定哪些特性提取,本例中适应这种方法计算时频图像,如谱图,并使用它们来训练卷积神经网络(cnn) [4]、[5]。

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

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函数估计的时间频率信号的一阶矩功率谱图。函数计算使用短时傅里叶变换光谱图随时间窗口。在这个例子中,函数使用windows 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使用windows 255时间计算光谱图。时间函数的输出对应于时间窗口的中心。

想象每个类型的信号的谱熵。

[pentropyA, tA2] = pentropy (aFib fs);[pentropyN, tN2] = pentropy(正常,fs);图次要情节(2,1,1)情节(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双}{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。指定一个双向LSTM层和一个输出大小为100,和输出序列的最后一个元素。指定两个类,包括一个完全连接大小为2层,其次是softmax层和一层分类。

层= [sequenceInputLayer (2) bilstmLayer (100“OutputMode”,“最后一次”)fullyConnectedLayer (2) softmaxLayer classificationLayer]
层x1 = 5层阵列层:1“序列输入序列与二维输入2”BiLSTM BiLSTM 100隐藏单位3“完全连接2完全连接层4”Softmax Softmax crossentropyex 5”分类输出

指定培训选项。时代的最大数量设置为30到让网络30通过训练数据。

选择= trainingOptions (“亚当”,“MaxEpochs”30岁的“MiniBatchSize”,150,“InitialLearnRate”,0.01,“GradientThreshold”,1“ExecutionEnvironment”,“汽车”,“阴谋”,“训练进步”,“详细”、假);

火车LSTM网络与时频特性

火车与指定的培训选项LSTM网络和利用层体系结构trainNetwork

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

训练精度有很大提高。叉损失趋势0。此外,培训所需的时间减少,因为TF时刻比原始的短序列。

可视化培训和测试精度

使用更新的LSTM分类训练数据网络。想象作为一个混淆矩阵的分类性能。

trainPred2 =分类(net2 XTrainSD);LSTMAccuracy = (trainPred2 = = YTrain) /元素个数之和(YTrain) * 100
LSTMAccuracy = 83.5962
图confusionchart (YTrain trainPred2,“ColumnSummary”,“column-normalized”,“RowSummary”,“row-normalized”,“标题”,“LSTM混乱图”);

测试数据与更新的网络进行分类。情节混淆矩阵检查测试精度。

testPred2 =分类(net2 XTestSD);LSTMAccuracy = (testPred2 = =次)/元素个数之和(欧美)* 100
LSTMAccuracy = 80.1020
图confusionchart(欧美、testPred2“ColumnSummary”,“column-normalized”,“RowSummary”,“row-normalized”,“标题”,“LSTM混乱图”);

结论

这个例子展示了如何构建一个分类器来检测心房颤动心电图信号使用LSTM网络。程序使用过采样,以避免分类偏误,发生在一个试图检测异常条件的人口主要由健康的病人。培训LSTM网络使用原始信号数据的结果在一个贫穷的分类精度。培训每个信号的网络使用两个time-frequency-moment特性大大提高了分类性能和减少训练时间。

引用

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

[2]克利福德,粗毛,渝刘、本杰明·穆迪李伟h .雷曼Ikaro Silva,乔,Alistair约翰逊和罗杰·g·马克。“AF分类从短的单一导致心电图记录:生理网计算2017年心脏病的挑战。”计算在心脏病学(雷恩:IEEE)。44卷,2017年,页1 - 4。

[3]Goldberger, a . L。,L. A. N. Amaral, L. Glass, J. M. Hausdorff, P. Ch. Ivanov, R. G. Mark, J. E. Mietus, G. B. Moody, C.-K. Peng, and H. E. Stanley. "PhysioBank, PhysioToolkit, and PhysioNet: Components of a New Research Resource for Complex Physiologic Signals".循环。23号卷。101年,2000年6月13日,pp. e215-e220。http://circ.ahajournals.org/content/101/23/e215.full

[4]脑桥,乔迪,托马斯•Lidy和泽维尔塞拉。“尝试音乐动机的卷积神经网络”。在基于内容的多媒体检索第14届国际研讨会(CBMI)。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/

另请参阅

功能

相关的话题