文件帮助中心文件
此示例使用:
这个例子展示了如何使用循环深度学习网络和时频分析分割人体心电图信号。
在人的心脏的电活性可如振幅的从基线信号远的顺序进行测定。对于单一的正常心跳周期,所述ECG信号可以分为以下节拍形态[1]:
P波 - 复合物中的QRS前一个小偏转表示心房除极
QRS复合体-心跳的最大振幅部分
T波- QRS复合体后的小偏转,代表心室复极
心电波形这些区域的分割可以为评估人类心脏整体健康状况和是否存在异常提供有用的测量依据[2].手工标注心电信号的每个区域可能是一项乏味和耗时的任务。信号处理和深度学习方法可能有助于简化和自动化感兴趣的区域注释。
此示例使用从可公开获得的QT数据库的心电信号[3.] [4.]。数据包括大约15分钟的ECG记录,采样率为250 Hz,从总共105名患者中测量。为了获得每次记录,检查人员将两个电极放置在患者胸部的不同位置,从而产生双通道信号。数据库提供了由自动化专家生成的信号区域标签系统[2].本例的目的是使用深度学习解决方案,根据样本所在的区域为每个心电信号样本提供一个标签。这种在信号中标记感兴趣区域的过程通常被称为波形分割.
要训练深层神经网络对信号区域进行分类,可以使用长短时记忆(LSTM)网络。本例展示了如何使用信号预处理技术和时频分析来提高LSTM分割性能。特别是,该示例使用傅里叶同步压缩变换来表示ECG信号的非平稳行为。
105个双通道心电信号由自动化专家系统独立标记并独立处理,共210个心电信号与区域标签一起存储在210个mat -文件中。这些档案可在以下地点获得://www.tianjin-qmedu.com/万博1manbetxsupportfiles/SPT/data/QTDatabaseECGData.zip.
将数据文件下载到临时目录中,其位置由MATLAB®指定tempdir命令。如果你想将数据文件放在一个文件夹中不同tempdir,请在后续说明中修改目录名称。
tempdir
%下载数据dataURL =“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/SPT/data/QTDatabaseECGData1.zip”;datasetFolder =完整文件(TEMPDIR,“QTDataset”);zipFile = fullfile (tempdir,“QTDatabaseECGData.zip”);如果~存在(datasetFolder“dir”)websave(zipFile,dataURL);解压(zipFile,tempdir);终止
这解压操作创建QTDatabaseECGData文件夹中有210个mat文件。每个文件包含一个可变的心电信号ecgSignal以及变量中的区域标签表signalRegionLabels.每个文件还包含信号的采样率变量财政司司长.在这个例子中所有的信号具有250赫兹的采样速率。
解压
QTDatabaseECGData
ecgSignal
signalRegionLabels
财政司司长
创建一个信号数据存储以访问文件中的数据。此示例假定数据集已存储在QTDatabaseECGData文件夹中。如果不是这样,请更改下面代码中数据的路径。属性指定要从每个文件读取的信号变量名信号变量名称参数。
信号变量名称
sds=信号数据存储(数据集文件夹,“SignalVariableNames”,[“ECG信号”那“signalRegionLabels”])
/tmp/QTDataset/ecg1.mat'; /tmp/QTDataset/ecg1.mat';“/ tmp / QTDataset / ecg10.mat”;“/ tmp / QTDataset / ecg100。垫”……} AlternateFileSystemRoots: [0×0 string] ReadSize: 1 SignalVariableNames: ["ecgSignal" "signalRegionLabels"]
每次调用时,该数据存储都会返回一个带有心电信号和区域标签表的双元素单元阵列读函数。使用预览数据存储的函数,以查看第一个文件的内容是225000个样本长的ECG信号和包含3385个区域标签的表格。
读
预览
data =预览(sds)
数据=2×1单元阵列{225000×1 double} {3385×2 table}
查看区域标签表的前几行,观察每一行包含区域限制索引和区域类值(P、T或QRS)。
{2}(数据)
ans=8×2表ROILimits值__________ _____ 83个117第130个153 QRS 201 246 285个Ť319 P 332个357 412 QRS 457Ť477个507 P 524个547 QRS
使用图形显示前1000个样本的标签signalMask对象。
signalMask
M = signalMask数据({2});plotsigroi (M,数据{1}(1:1000))
通常的机器学习分类过程如下:
将数据库划分为训练和测试数据集。
使用培训训练数据集的网络。
使用经过训练的网络对测试数据集进行预测。
用70%的数据训练网络,用剩下的30%进行测试。
对于可再现的结果,请重置随机数生成器。使用dividerand函数获取随机索引来洗牌文件,以及子集功能signalDatastore将数据划分为培训和测试数据存储区。
dividerand
子集
signalDatastore
rng默认的[trainIdx,~,testIdx]=dividerand(numel(sds.Files),0.7,0,0.3);trainDs=子集(sds,trainIdx);testDs=子集(sds,testIdx);
在该分割的问题,在输入到LSTM网络是ECG信号和所述输出是具有相同的长度,输入信号的标签的序列或掩模。网络的任务是标记每个信号样品与它所属的区域的名称。出于这个原因,有必要对数据集变换的区域的标签到包含每个信号样本一个标签序列。使用转化数据存储和getmask转换区域标签的辅助函数。这getmask功能增加了一个标签类,“n / a”,以标记不属于任何感兴趣区域的样本。
getmask
“n / a”
类型getmask.m
函数outputCell=getmask(inputCell)%GETMASK将区域标签转换为标签掩码,其大小等于输入ECG信号的%size。%%inputCell是包含ECG信号向量%和区域标签表的两元素单元格数组。%%outputCell是包含ECG信号向量%的两元素单元格数组,以及与输入ECG信号相同长度的分类标签向量掩码信号。%2020 MathWorks,Inc.sig=inputCell{1};roiTable=inputCell{2};L=length(sig);M=signalMask(roiTable);%当存在重叠掩码=catmask(M,L,'OverlappAction','PriorityList',[2 1 3])时,获取分类掩码并优先考虑QRS区域;%将缺失值设置为“n/a”掩码(ismissing(mask))=“n/a”;outputCell={sig,mask};结束
预览数据存储变换来观察它返回一个信号矢量和相等的长度的标记矢量。画出分类掩模向量的第一元件1000。
trainDs=转换(trainDs,@getmask);testDs=转换(testDs,@getmask);transformedData=预览(trainDs)
transformedData =1×2单元阵列{224993×1 double} {224993×1 categorical}
情节(transformedData {2} (1:1000))
将很长的输入信号传递到LSTM网络会导致估计性能下降和内存占用过多。为了避免这些影响,使用转换后的数据存储和resizeData助手功能。辅助函数创建多达5000个采样分段尽可能和丢弃剩余的样品。的转化数据存储示出了第一ECG信号和它的标签掩模被分成5000采样分段的输出的预览。需要注意的转化数据存储只能说明预览的,否则第一个8种元素楼层(224993/5000)= 44元素单元格数组,如果调用数据存储将会得到这个数组读函数。
resizeData
楼层(224993/5000)
trainDs =变换(trainDs @resizeData);testDs =变换(testDs @resizeData);预览(trainDs)
ans=8×2单元阵列{1×5000双}{1×5000双}{1×5000双}{1×5000双}{1×5000双}{1×5000双}{1×5000双}{1×5000双}{1×5000双}{1×5000双}{1×5000双}{1×5000双}{1×5000双}{1×5000双{1×5000双}{1×5000双}
本例的下一部分将比较三种训练LSTM网络的不同方法。由于数据集大,每个网络的训练过程可能需要几分钟。如果你的机器有GPU和并行计算工具箱™,那么MATLAB会自动使用GPU进行更快的训练。否则,使用CPU。
您可以跳过训练步骤,使用下面的选择器下载预先训练过的网络。如果您想在示例运行时训练网络,请选择“训练网络”。如果你想跳过训练步骤,选择“下载网络”和一个包含所有三个预先训练网络的文件rawNet那过滤网,fsstNet -将下载到您的临时目录中,其位置由MATLAB®指定tempdir命令。如果你想下载的文件放在一个文件夹中不同tempdir,请在后续说明中修改目录名称。
rawNet
过滤网
fsstNet -
行动旗=“火车网”;如果actionFlag = =“下载网络”%下载预先训练的网络dataURL =“https://ssd.mathworks.com/万博1manbetxsupportfiles/SPT/data/QTDatabaseECGSegmentationNetworks.zip”;% #好< * UNRCH >modelsFolder =完整文件(TEMPDIR,“QTDatabaseEcgSegmentationNetwork”);modelsFile =完整文件(modelsFolder,'trainedNetworks.mat');zipFile = fullfile (tempdir,'QTDatabaseECGSegmentationNetworks.zip');如果〜存在(modelsFolder,“dir”)websave(zipFile,dataURL);解压(zipFile,fullfile)(tempdir,“QTDatabaseEcgSegmentationNetwork”));终止负载(modelsFile)终止
下载的网络和新训练的网络之间的结果可能略有不同,因为网络是使用随机初始权值训练的。
首先,利用训练数据集的原始心电信号训练LSTM网络。
在培训前定义网络架构。指定一个sequenceInputLayer大小为1以接受一维时间序列。使用“顺序”输出模式为信号中的每个样本提供分类。使用200个隐藏节点以获得最佳性能。指定一个fullyConnectedLayer输出大小为4,每个波形类别一个。添加一个软MaxLayer和一个classificationLayer以输出估计的标签。
sequenceInputLayer
“顺序”
fullyConnectedLayer
软MaxLayer
classificationLayer
层=[...sequenceInputLayer(1)lstmLayer(200,“OutputMode”那“顺序”) fulllyconnectedlayer (4) softmaxLayer classificationLayer;
为培训过程选择可确保良好网络性能的选项。参考trainingOptions(深度学习工具箱)每个参数的描述文档。
trainingOptions
选择= trainingOptions (“亚当”那...“MaxEpochs”10...“MiniBatchSize”,50,...“初始学习率”,0.01,...“LearnRateDropPeriod”3....“LearnRateSchedule”那“分段”那...“梯度阈值”1....“情节”那“训练进步”那...“洗牌”那“every-epoch”那...“冗长”,0,...“DispatchInBackground”,真正的);
因为整个训练数据集都在内存中,所以可以使用高数据存储的函数,用于并行转换数据(如果是并行计算工具箱)™ ,然后将其收集到工作区中。神经网络训练是迭代的。在每次迭代中,数据存储从文件中读取数据,并在更新网络系数之前转换数据。如果数据适合计算机内存,则将数据导入工作区可以更快地进行训练,因为数据是真实的请注意,如果数据不适合内存,则必须将数据存储传递到训练函数中,并在每个训练阶段执行转换。
高
为训练集和测试集创建高数组。根据您的系统,MATLAB创建的并行池中的工作线程数可能不同。
tallTrainSet =高(trainDs);
使用“local”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:8)。
tallTestSet =高(testDs);
现在所说的收集高数组的函数,用于计算整个数据集的转换,并获得具有训练和测试信号和标签的单元数组。
收集
trainData =收集(tallTrainSet);
使用Parallel Pool 'local'计算tall表达式:- Pass 1 of 1: Completed in 11 sec
列车数据(1,:)
ans=1×2单元阵列{1×5000双} {1×5000分类}
testData=gather(tallTestSet);
使用并行池“local”评估tall表达式:-通过1/1:在2.9秒内完成评估在3.1秒内完成
使用列车网络训练LSTM网络的命令。
列车网络
如果actionFlag = =“火车网”rawNet=列车网络(列车数据(:,1)、列车数据(:,2)、层、选项);终止
图中的训练精度和损失子图跟踪了所有迭代的训练进度。利用原始信号数据,该网络正确地将大约77%的样本分类为P波、QRS复波、T波或未标记区域“n / a”.
用训练LSTM网络和分类的测试数据分类命令。指定的50小批量大小相匹配的培训方案。
分类
predTest=分类(rawNet,testData(:,1),“MiniBatchSize”, 50);
混淆矩阵为可视化分类性能提供了直观和翔实的手段。使用confusionchart命令来计算测试数据预测的总体分类精度。对于每个输入,将类别标签的单元格数组转换为行向量。指定列规范化显示,以查看每个类的样本百分比的结果。
confusionchart
confusionchart([{predTest:}],[TESTDATA {:,2}],“正常化”那“列归一化”);
使用原始ECG信号作为网络的输入,只有约60%的T波样本、40%的P波样本和60%的QRS波群样本是正确的。为了提高性能,在输入深度学习网络之前,应用ECG信号特征的一些知识,例如患者呼吸运动引起的基线漂移离子。
三种拍形态占据不同的频段。QRS复相频谱的中心频率通常在10-25 Hz左右,其分量在40 Hz以下。P波和T波的频率更低:P波分量低于20 Hz, T波分量低于10 Hz [5.].
基线漂移是由患者呼吸运动引起的低频(<0.5 Hz)振荡。该振荡独立于节拍形态,不提供有意义的信息[6.].
设计通带频率范围为[0.5,40]Hz的带通滤波器,以消除漂移和任何高频噪声。移除这些组件可改进LSTM训练,因为网络不会学习不相关的功能。使用赛尔芬在高数据单元格数组上并行筛选数据集。
赛尔芬
%带通滤波器的设计hFilt=设计过滤器(“bandpassiir”那“StopbandFrequency1”,0.4215,“通带频率1”,0.5%,...“通带频率2”现年40岁的“阻带频率2”,53.345,...“StopbandAttenuation1”,60,'PassbandRipple',0.1%,'StopbandAttenuation2',60,...“SampleRate”,250,“DesignMethod”那“ellip”);%从已转换的数据存储创建高数组并过滤信号tallTrainSet =高(trainDs);tallTestSet =高(testDs);filteredTrainSignals =收集(cellfun (@ (x)过滤器(hFilt x), tallTrainSet (: 1),“UniformOutput”、假));
使用并行池“local”计算tall表达式:-通过1次/1次:0%完成计算0%完成
1中通过1:13秒内完成评估14秒内完成
trainLabels =收集(tallTrainSet (:, 2));
评估使用并行池“本地”高表达: - 的1遍1:在3.6秒评价完成在4秒完成
filteredTestSignals =收集(cellfun (@ (x)过滤器(hFilt x), tallTestSet (: 1),“UniformOutput”、假));
评估使用并行池“本地”高表达: - 的1遍1:在2.4秒评价完成在2.5秒完成
testLabels =收集(tallTestSet (:, 2));
评估使用并行池“本地”高表达: - 的1遍1:在1.9秒评价完成在2秒完成
绘制的原始和滤波的信号为一个典型例子。
使用Parallel Pool 'local'计算tall表达式:- Pass 1 of 1: Completed in 4 sec
图副区(2,1,1)图(trainData {} 95,1(2001:3000))标题(“生的”)网格子地块(2,1,2)图(filteredTrainSignals{95}(2001:3000))标题(“过滤”)网格
即使经过滤波的信号的基线可能会混淆,其用于医疗设备上传统的ECG测量医师,网络将实际从徘徊去除受益。
使用与之前相同的网络结构对滤波后的心电信号训练LSTM网络。
如果actionFlag = =“火车网”filteredNet = trainNetwork (filteredTrainSignals、trainLabels层,选择);终止
对信号进行预处理,使训练精度提高到80%以上。
分类与更新的LSTM网络预处理后的测试数据。
predFilteredTest=分类(filteredNet,filteredTestSignals,“MiniBatchSize”, 50);
将分类性能可视化为混淆矩阵。
图confusionchart ([predFilteredTest {:}], [testLabels {}):,“正常化”那“列归一化”);
简单的预处理可使t波分类提高约15%,QRS-complex和p波分类提高约10%。
成功分类时间序列数据的一种常用方法是提取时频特征,并将其提供给网络而不是原始数据。然后,该网络同时学习跨时间和频率的模式[7.].
傅里叶同步压缩变换(FSST)计算每个信号样本的频谱,因此它非常适合于我们需要保持与原始信号相同的时间分辨率的手头分割问题fsst函数来检查其中一个训练信号的变换。指定长度为128的Kaiser窗口以提供足够的频率分辨率。
fsst
数据=预览(trainDs);图FSST(数据{1,1},250,凯瑟(128),“桠溪”)
在感兴趣的频率范围内,计算训练数据集中每个信号的FSST,[0.5,40]Hz.将FSST的实部和虚部视为单独的特征,并将这两个分量输入到网络中。此外,通过减去平均值并除以标准偏差来标准化训练特征。使用转换后的数据存储extractFSSTFeatures辅助函数,以及高函数以并行方式处理数据。
extractFSSTFeatures
fsstTrainDs =变换(trainDs @ (x) extractFSSTFeatures (x, 250));fsstTallTrainSet =高(fsstTrainDs);fsstTrainData =收集(fsstTallTrainSet);
-通过第1次(共1次):在2分钟35秒内完成评估在2分钟35秒内完成
对测试数据重复此步骤。
fsstTTestDs =变换(testDs @ (x) extractFSSTFeatures (x, 250));fsstTallTestSet =高(fsstTTestDs);fsstTestData =收集(fsstTallTestSet);
评估使用并行池“本地”高表达: - 1通过1:已完成将在1分钟4秒评价在1分钟内4秒完成
修改LSTM架构,使网络接受每个样本的频谱,而不是单个值。检查FSST的大小,看看频率的数量。
大小(fsstTrainData {1})
ans=1×240 5000
指定一个sequenceInputLayer40个输入功能。保持其余网络参数不变。
层=[...sequenceInputLayer (40) lstmLayer (200,“OutputMode”那“顺序”) fulllyconnectedlayer (4) softmaxLayer classificationLayer;
用转换后的数据集训练更新后的LSTM网络。
如果actionFlag = =“火车网”fsstNet=列车网络(fsstTrainData(:,1),fsstTrainData(:,2),层,选项);终止
使用时频特性提高了训练精度,目前已经超过90%。
利用更新后的LSTM网络,提取FSST特征,对测试数据进行分类。
predFsstTest =分类(fsstNet,fsstTestData(:,1),“MiniBatchSize”, 50);
confusionchart ([predFsstTest{:}]、[fsstTestData {: 2}),“正常化”那“列归一化”);
与原始数据结果相比,使用时频表示可将T波分类提高约25%,P波分类提高约40%,QRS波群分类提高30%。
使用signalMask对象,用于比较网络预测到地面实况标签单个ECG信号。忽略“n / a”在绘制感兴趣的区域时使用标签。
testData =收集(高(testDs));
37秒内完成评估
Mtest=信号掩码(testData{1,2}(3000:4000));Mtest.SpecifySelectedCategories=true;Mtest.SelectedCategories=find(Mtest.Categories~=“n / a”);图subplot(2,1,1) plotsigroi(Mtest,testData{1,1}(3000:4000)) title(“地面实况”) Mpred = signalMask(predFsstTest{1}(3000:4000));mpr。SpecifySelectedCategories = true;mpr。SelectedCategories =找到(mpr)。类别~ =“n / a”); 子地块(2,1,2)plotsigroi(Mpred,testData{1,1}(3000:4000))标题(“预测”)
该实例说明了信号预处理和时频分析如何提高LSTM波形分割性能。带通滤波和基于傅里叶的同步压缩使所有输出类的平均性能从55%提高到大约85%。
[1] Patrick E.McSharry等人,“生成合成心电图信号的动力学模型。”IEEE®生物医学工程学报。第50卷,第3期,2003年,第289-294页。
[2] 多导联ECG信号中波边界的自动检测:CSE数据库验证计算机和生物医学研究。1994年第27卷第1期,第45-60页。
[3]戈德伯格,阿雷L.,路易斯A. N.阿马拉尔,莱昂玻璃,杰弗里M.豪斯多夫,普拉门章。伊万诺夫,罗杰G.马克·约瑟夫·Mietus,乔治·B·穆迪,众康鹏和H.尤金·斯坦利。“PhysioBank,PhysioToolkit和PhysioNet:的组件的新研究资源的复杂生理信号。”循环Vol. 21, No. 2, 2000, pp. e215-e220。(循环电子页;http://circ.ahajournals.org/content/101/23/e215.full].
[4]丽,巴勃罗,罗杰G.马克,里·L·戈尔德贝格和乔治B.穆迪。“用于评估心电图中QT和其他波形间隔测量算法的数据库。“心脏病学中的计算机。Vol.24, 1997, pp. 673-676。
[5] 心电图(ECG)信号处理怀利生物医学工程百科全书,2006
[6]科勒,B-U。那Carsten Hennig, and Reinhold Orglmeister. "The principles of software QRS detection."医学与生物工程杂志.卷。21,第1号,2002年,第42-57。
[7] 环境声音分类的深层卷积神经网络和数据增强IEEE信号处理信。卷。24,第3号,2017年,第279-283。
labeledSignalSet
第一层
您拥有此示例的修改版本。是否要用编辑打开此示例?
您单击了与此MATLAB命令对应的链接:
通过在MATLAB命令窗口中输入命令来运行命令。Web浏览器不支持MATLAB命令。万博1manbetx
选择一个网站,在那里获得翻译的内容,并看到当地的活动和优惠。根据您的位置,我们建议您选择:.
你也可以从以下列表中选择一个网站:
选择中国网站(以中文或英文)以获取最佳网站性能。其他MathWorks国家网站未优化您的位置。
联系当地办事处