主要内容

基于小波分析和深度学习的时间序列分类

这个例子展示了如何使用连续小波变换(CWT)和深度卷积神经网络(CNN)对人体心电图(ECG)信号进行分类。

从零开始训练深度CNN的计算成本很高,需要大量的训练数据。在各种应用中,没有足够的训练数据,合成新的现实训练样例是不可行的。在这些情况下,利用在大型数据集上训练过的现有神经网络来完成概念上类似的任务是可取的。这种对现有神经网络的利用被称为迁移学习。在这个例子中,我们采用了两个深度cnn, GoogLeNet和SqueezeNet,它们被预先训练用于图像识别,以基于时频表示对ECG波形进行分类。

GoogLeNet和SqueezeNet是深度cnn,最初设计用于将图像分类为1000个类别。我们重新使用CNN的网络架构,根据时间序列数据的CWT图像对心电信号进行分类。本例中使用的数据可以从生理网

数据描述

在本例中,您使用了三组人的ECG数据:心律失常(ARR)者、充血性心力衰竭(CHF)者和窦性心律正常(NSR)者。您总共使用了来自三个PhysioNet数据库的162个ECG记录:MIT-BIH心律失常数据库[3] [7],MIT-BIH正常窦性心律数据库[3]BIDMC充血性心力衰竭数据库[1][3]。更具体地说,来自心律失常患者的96次录音,来自充血性心力衰竭患者的30次录音,来自正常窦性心律患者的36次录音。目标是训练一个分类器来区分ARR, CHF和NSR。

下载数据

第一步是从GitHub库.如需从网站下载数据,请单击代码并选择下载ZIP.保存文件physionet_ECG_data-main.zip在您有写权限的文件夹中。本例的说明假设您已经将文件下载到临时目录,tempdir,在MATLAB中。如果选择在不同的文件夹中下载数据,请修改解压缩和加载数据的后续说明tempdir

从GitHub下载数据后,在临时目录中解压缩文件。

解压缩(fullfile (tempdir,“physionet_ECG_data-main.zip”), tempdir)

解压缩将创建文件夹physionet-ECG_data-main在临时目录中。此文件夹包含文本文件README.md而且ECGData.zip.的ECGData.zip文件包含

  • ECGData.mat

  • Modified_physionet_data.txt

  • License.txt

ECGData.mat保存本例中使用的数据。文本文件,Modified_physionet_data.txt,是PhysioNet的复制策略所要求的,并提供了数据的源属性以及应用于每个ECG记录的预处理步骤的描述。

解压缩ECGData.zipphysionet-ECG_data-main.将数据文件加载到MATLAB工作区中。

解压缩(fullfile (tempdir,“physionet_ECG_data-main”“ECGData.zip”),...fullfile (tempdir“physionet_ECG_data-main”)加载(fullfile (tempdir“physionet_ECG_data-main”“ECGData.mat”))

ECGData是具有两个字段的结构数组:数据而且标签.的数据field是一个162 × 65536的矩阵,其中每一行都是一个以128赫兹采样的ECG记录。标签是一个162 × 1单元阵列的诊断标签,每行一个数据.这三个诊断类别是:“加勒比海盗”瑞士法郎的,“签约”

为了存储每个类别的预处理数据,首先创建一个心电数据目录dataDir内部tempdir.然后在中创建三个子目录“数据”以每个ECG类别命名。辅助函数helperCreateECGDirectories这是否。helperCreateECGDirectories接受ECGData, ECG数据目录的名称,以及父目录的名称作为输入参数。你可以替换tempdir您有写权限的另一个目录。您可以在本示例末尾的支持函数一节中找到这个helper函数的源代码。万博1manbetx

parentDir = tempdir;dataDir =“数据”;helperCreateECGDirectories (ECGData parentDir dataDir)

绘制每个ECG类别的代表图。辅助函数helperPlotReps这是否。helperPlotReps接受ECGData作为输入。您可以在本示例末尾的支持函数一节中找到这个helper函数的源代码。万博1manbetx

helperPlotReps (ECGData)

创建时间-频率表示

制作文件夹后,创建心电信号的时频表示。这些表示称为尺度图。标量图是一个信号的CWT系数的绝对值。

要创建标量图,请预先计算CWT滤波器组。当使用相同的参数获得多个信号的CWT时,预计算CWT滤波器组是首选的方法。

在生成标量图之前,检查其中一个。使用创建一个CWT滤波器组cwtfilterbank对于1000个样本的信号。使用滤波器组取信号的前1000个样本的CWT,并从系数中获得标量图。

Fs = 128;Fb = cwtfilterbank(“SignalLength”, 1000,...“SamplingFrequency”Fs,...“VoicesPerOctave”12);sig = ECGData.Data(1,1:1000);[cfs,frq] = wt(fb,sig);t = (0:999)/Fs;figure;pcolor(t,frq,abs(cfs)) set(gca,“yscale”“日志”);阴影插值函数;轴;标题(量图的),包含(“时间(s)”); ylabel (的频率(赫兹)

使用helper函数helperCreateRGBfromTF来创建RGB图像的标度图,并将它们写入相应的子目录dataDir.这个助手函数的源代码在本例末尾的支持函数部分中。万博1manbetx为了与GoogLeNet架构兼容,每个RGB图像都是一个大小为224 × 224 × 3的数组。

helperCreateRGBfromTF (ECGData parentDir dataDir)

分为训练数据和验证数据

将标量图图像加载为图像数据存储。的imageDatastore函数根据文件夹名称自动标记图像,并将数据存储为ImageDatastore对象。图像数据存储使您能够存储大量图像数据,包括不适合内存的数据,并在CNN训练期间有效地读取批量图像。

allImages = imageDatastore(fullfile(parentDir,dataDir),...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

将图像随机分为两组,一组用于训练,另一组用于验证。使用80%的图像进行训练,其余图像用于验证。为了重现性,我们将随机种子设置为默认值。

rng默认的[imgsTrain,imgsValidation] = splitEachLabel(allImages,0.8,“随机”);disp (['训练图像数量:'num2str(元素个数(imgsTrain.Files))));
训练图像数量:130张
disp ([验证图像的数量:num2str(元素个数(imgsValidation.Files))));
验证图像数量:32

GoogLeNet

负载

加载预先训练好的GoogLeNet神经网络。如果深度学习工具箱™模型为GoogLeNet网络万博1manbetx支持包未安装时,软件会在插件资源管理器中提供到所需支持包的链接。要安装支持包,请单击链接,然后万博1manbetx单击安装

Net = googlenet;

从网络中提取并显示层图。

lgraph = layerGraph(net);numberOfLayers = number (lgraph.Layers);图(“单位”“归一化”“位置”,[0.1 0.1 0.8 0.8]);情节(lgraph)标题(“GoogLeNet层图:”num2str (numberOfLayers),“层”]);

检查network Layers属性的第一个元素。确认GoogLeNet需要大小为224 * 224 * 3的RGB图像。

net.Layers (1)
ans = ImageInputLayer with properties: Name: 'data' InputSize:[224 224 3]超参数DataAugmentation: 'none'归一化:'zerocenter' Mean: [224×224×3 single]

修改GoogLeNet网络参数

网络体系结构中的每一层都可以被认为是一个过滤器。早期的层识别图像的更常见的特征,如斑点、边缘和颜色。随后的层将重点放在更具体的功能上,以便区分类别。GoogLeNet经过预先训练,可以将图像分类为1000个对象类别。你必须重新训练GoogLeNet来解决我们的心电分类问题。

为了防止过拟合,使用了dropout层。dropout层以给定的概率随机地将输入元素设置为零。看到dropoutLayer(深度学习工具箱)获取更多信息。默认概率是0.5。替换网络中的最后一层退出层,“pool5-drop_7x7_s1”,退出层的概率为0.6。

newDropoutLayer = dropoutLayer(0.6,“名字”“new_Dropout”);lgraph =替换层(lgraph,“pool5-drop_7x7_s1”, newDropoutLayer);

网络的卷积层提取图像特征,最后的可学习层和最终的分类层使用这些特征对输入图像进行分类。这两层,“loss3-classifier”而且“输出”在GoogLeNet中,包含关于如何将网络提取的特征组合成类概率、损失值和预测标签的信息。为了重新训练GoogLeNet对RGB图像进行分类,用适应数据的新层替换这两个层。

更换全连接层“loss3-classifier”使用一个新的全连接层,过滤器的数量等于类的数量。为了使新层的学习速度快于转移层,可以增加全连接层的学习率因子。

numClasses = numel(categories(imgsTrain.Labels));newConnectedLayer = fullyConnectedLayer“名字”“new_fc”...“WeightLearnRateFactor”5,“BiasLearnRateFactor”5);lgraph =替换层(lgraph,“loss3-classifier”, newConnectedLayer);

分类层指定网络的输出类。用一个没有类标签的新层替换分类层。trainNetwork在训练时自动设置层的输出类。

newClassLayer = classificationLayer(“名字”“new_classoutput”);lgraph =替换层(lgraph,“输出”, newClassLayer);

设置训练选项和训练GoogLeNet

训练神经网络是一个迭代的过程,包括最小化损失函数。为了使损失函数最小,采用了梯度下降算法。在每次迭代中,评估损失函数的梯度,并更新下降算法的权重。

培训可以通过设置各种选项进行调优。InitialLearnRate指定损失函数负梯度方向上的初始步长。MiniBatchSize指定在每次迭代中使用的训练集子集的大小。一个epoch是训练算法对整个训练集的完整传递。MaxEpochs指定用于训练的最大epoch数。选择正确的epoch数并不是一件简单的任务。减少周期数会导致模型欠拟合,而增加周期数会导致模型过拟合。

使用trainingOptions(深度学习工具箱)函数指定培训选项。集MiniBatchSize10,MaxEpochs到10,和InitialLearnRate到0.0001。通过设置可视化训练进度情节训练进步.使用动量优化器的随机梯度下降。默认情况下,训练是在可用的GPU上进行的。使用GPU需要并行计算工具箱™。要查看支持哪些gpu,请参见万博1manbetxGPU计算要求(并行计算工具箱).为了重现性的目的,设置ExecutionEnvironmentcputrainNetwork使用CPU。将随机种子设置为默认值。如果你能够使用GPU,运行时间将会更快。

选项= trainingOptions(“个”...“MiniBatchSize”15岁的...“MaxEpochs”, 20岁,...“InitialLearnRate”1的军医,...“ValidationData”imgsValidation,...“ValidationFrequency”10...“详细”,1,...“ExecutionEnvironment”“cpu”...“阴谋”“训练进步”);rng默认的

培训网络。在桌面CPU上,训练过程通常需要1 ~ 5分钟。命令窗口显示运行过程中的训练信息。结果包括历元数、迭代数、时间流逝、小批精度、验证精度和验证数据的损失函数值。

trainedGN = trainNetwork(imgsTrain,lgraph,options);

初始化输入数据规范化。|======================================================================================================================| | 时代| |迭代时间| Mini-batch | |验证Mini-batch | |验证基地学习  | | | | ( hh: mm: ss) | | | | |损失损失精度精度  | |======================================================================================================================| | 1 | 1 | 00:00:03 | | 6.67% 18.75% | 4.9207 | 2.4141 | 1.0000 e-04 | | 2 | 10 | 00:00:23 |66.67% | 62.50% | 0.9589 | 1.3191 | 1.0000 e-04 | | 3 | 20 | 00:00:43 | | 46.67% 75.00% | 1.2973 | 0.5928 | 1.0000 e-04 | | 4 | 30 | 00:01:04 | | 60.00% 78.13% | 0.7219 | 0.4576 | 1.0000 e-04 | | 5 | 40 | 00:01:25 | | 73.33% 84.38% | 0.4750 | 0.3367 | 1.0000 e-04 | | 7 | 50 | 00:01:46 | | 93.33% 84.38% | 0.2714 | 0.2892 | 1.0000 e-04 | | 8 | | 60 00:02:07 | | 80.00% 87.50% | 0.3617 | 0.2433 | 1.0000 e-04 | | 70 | | 00:02:29 | | 86.67% 87.50% | 0.3246 | 0.2526 | 1.0000 e-04 | | 80 | | 00:02:50 |100.00% | 96.88% | 0.0701 | 0.1876 | 1.0000 e-04 | | 90 | | 00:03:11 | | 86.67% 100.00% | 0.2836 | 0.1681 | 1.0000 e-04 | | 100 | | 00:03:32 | | 86.67% 96.88% | 0.4160 | 0.1607 | 1.0000 e-04 | | 110 | | 00:03:53 | | 86.67% 96.88% | 0.3237 | 0.1565 | 1.0000 e-04 | | 120 | | 00:04:14 | | 93.33% 96.88% | 0.1646 | 0.1476 | 1.0000 e-04 | | 130 | | 00:04:35 | | 100.00% 96.88% | 0.0551 | 0.1330 | 1.0000 e-04 | | 140 | | 00:04:57 | | 93.33% 96.88% | 0.0927 | 0.1347 | 1.0000 e-04 | | | 19日150年| | | 00:05:18 | 93.33% 93.75% 0.1666 | 0.1325 | 1.0000 e-04 | | 160 | | 00:05:39 | | 93.33% 96.88% | 0.0873 | 0.1164 | 1.0000 e-04  | |======================================================================================================================|

检查训练网络的最后一层。确认Classification Output层包含三个类。

trainedGN.Layers(结束)
ans = ClassificationOutputLayer与属性:名称:'new_classoutput'类:[ARR CHF NSR] OutputSize: 3超参数LossFunction: 'crossentropyex'

评估GoogLeNet的准确性

使用验证数据评估网络。

[YPred,probs] = category (trainedGN,imgsValidation);accuracy = mean(YPred==imgsValidation.Labels);disp ([“GoogLeNet准确率:”num2str(100 *准确性),“%”])
GoogLeNet准确率:96.875%

精度与训练可视化图上报告的验证精度相同。标度图被分成训练集合和验证集合。这两个集合都被用来训练GoogLeNet。评估训练结果的理想方法是让网络对它未见过的数据进行分类。由于没有足够的数据量来划分为训练、验证和测试,我们将计算得到的验证精度视为网络精度。

探索GoogLeNet激活

CNN的每一层都对输入图像产生响应或激活。然而,CNN中只有少数几个层适合图像特征提取。网络开始的层捕获基本图像特征,如边缘和斑点。为了看到这一点,可视化第一卷积层的网络过滤器权重。在第一层中有64组独立的权重。

wghts = trainedGN.Layers(2).Weights;WGHTS =重新缩放(WGHTS);WGHTS = imresize(WGHTS,5);图蒙太奇(重量)标题(“第一卷积层权值”

你可以检查激活区域,并通过将激活区域与原始图像进行比较来发现GoogLeNet学习了哪些特征。有关更多信息,请参见卷积神经网络的可视化激活(深度学习工具箱)而且卷积神经网络的可视化特征(深度学习工具箱)

检查卷积层中的哪些区域在图像上激活加勒比海盗类。与原图像中相应区域进行比较。卷积神经网络的每一层都由许多称为渠道.将图像通过网络,并检查第一卷积层的输出激活,“conv1-7x7_s2”

convLayer =“conv1-7x7_s2”;imgClass =“加勒比海盗”;imgName =“ARR_10.jpg”;imarr = imread(fullfile(parentDir,dataDir,imgClass,imgName));trainingFeaturesARR =激活(trainedGN,imarr,convLayer);sz = size(trainingFeaturesARR);trainingFeaturesARR =重塑(trainingFeaturesARR,[sz(1) sz(2) 1 sz(3)]);图蒙太奇(重新调节(trainingFeaturesARR),“大小”,[8 8]) title([imgClass,“激活”])

找到这个图像最强的通道。将最强的通道与原始图像进行比较。

imgSize = size(imarr);imgSize = imgSize(1:2);[~,maxValueIndex] = max(max(max(trainingFeaturesARR)));arrMax = trainingFeaturesARR(:,:,:,maxValueIndex);arrMax = rescale(arrMax);arrMax = imresize(arrMax,imgSize);图;imshowpair (imarr arrMax,“蒙太奇”)标题(“最强”imgClass,“频道:”num2str (maxValueIndex)])

SqueezeNet

SqueezeNet是一个深度CNN,其架构支持227 * 227 * 3大小的图像。万博1manbetx即使图像尺寸对于GoogLeNet是不同的,你不需要在SqueezeNet尺寸上生成新的RGB图像。您可以使用原始的RGB图像。

负载

加载预训练的SqueezeNet神经网络。如果深度学习工具箱™模型为SqueezeNet网络万博1manbetx支持包未安装时,软件会在插件资源管理器中提供到所需支持包的链接。要安装支持包,请单击链接,然后万博1manbetx单击安装

SQZ =挤压板;

从网络中提取层图。确认SqueezeNet的层数比GoogLeNet少。还要确认为大小为227 × 227 × 3的图像配置了SqueezeNet

lgraphSqz = layerGraph(sqz);disp ([“层数:”num2str(元素个数(lgraphSqz.Layers))))
层数:68层
disp (lgraphSqz.Layers (1) .InputSize)
227 227 3

修改SqueezeNet网络参数

要重新训练SqueezeNet对新图像进行分类,请进行类似于GoogLeNet的更改。

检查最后六个网络层。

lgraphSqz.Layers(录得5个:结束)
ans = 6x1带有层的层数组:1 'drop9' Dropout 50% Dropout 2 'conv10' Convolution 1000 1x1x512 convolutions with stride[1 1]和padding [0 000 0] 3 'relu_conv10' ReLU ReLU 4 'pool10' Average Pooling 14x14 Average Pooling with stride[1 1]和padding [0 000 0] 5 'prob' Softmax Softmax 6 'ClassificationLayer_predictions' Classification Output crossentropyex with 'tench'和999其他类

取代“drop9”层,网络中的最后一个退出层,退出层的概率为0.6。

tmpLayer = lgraphSqz.Layers(end-5);newDropoutLayer = dropoutLayer(0.6,“名字”“new_dropout”);lgraphSqz = replaceLayer(lgraphSqz,tmpLayer.Name,newDropoutLayer);

与GoogLeNet不同,SqueezeNet的最后一个可学习层是一个1乘1的卷积层,“conv10”,而不是完全连接的层。取代“conv10”层,用一个新的卷积层,过滤器的数量等于类的数量。正如GoogLeNet所做的,增加新层的学习率因子。

numClasses = numel(categories(imgsTrain.Labels));tmpLayer = lgraphSqz.Layers(end-4);newLearnableLayer = convolution2dLayer(1,numClasses,...“名字”“new_conv”...“WeightLearnRateFactor”10...“BiasLearnRateFactor”10);lgraphSqz = replaceLayer(lgraphSqz,tmpLayer.Name,newLearnableLayer);

用一个没有类标签的新层替换分类层。

tmpLayer = lgraphSqz.Layers(end);newClassLayer = classificationLayer(“名字”“new_classoutput”);lgraphSqz = replaceLayer(lgraphSqz,tmpLayer.Name,newClassLayer);

检查网络的最后六层。确认删除层、卷积层和输出层已经更改。

lgraphSqz.Layers (63:68)
ans = 6x1带有层的层数组:1 'new_dropout' Dropout 60% Dropout 2 'new_conv' Convolution 3 1x1 convolutions with stride [1 1] and padding [0 0 0 0 0] 3 'relu_conv10' ReLU ReLU 4 'pool10' Average Pooling 14x14 Average Pooling with stride [1 1] and padding [0 0 0 0 0] 5 'prob' Softmax Softmax 6 'new_classoutput' Classification Output crossentropyex

为SqueezeNet准备RGB数据

RGB图像具有适合GoogLeNet架构的尺寸。为SqueezeNet架构创建可自动调整现有RGB图像大小的增强图像数据存储。有关更多信息,请参见augmentedImageDatastore(深度学习工具箱)

augimgsTrain = augmentedImageDatastore([227 227],imgsTrain);augimgsValidation = augmentedImageDatastore([227 227],imgsValidation);

设置训练选项和训练挤压

创建一套新的训练选项来使用SqueezeNet。将随机种子设置为默认值,训练网络。在桌面CPU上,训练过程通常需要1 ~ 5分钟。

Ilr = 3e-4;miniBatchSize = 10;maxEpochs = 15;valFreq = floor(numel(augimgsTrain.Files)/miniBatchSize);opts = trainingOptions(“个”...“MiniBatchSize”miniBatchSize,...“MaxEpochs”maxEpochs,...“InitialLearnRate”劳工关系,...“ValidationData”augimgsValidation,...“ValidationFrequency”valFreq,...“详细”,1,...“ExecutionEnvironment”“cpu”...“阴谋”“训练进步”);rng默认的trainedSN = trainNetwork(augimgsTrain,lgraphSqz,opts);

初始化输入数据规范化。|======================================================================================================================| | 时代| |迭代时间| Mini-batch | |验证Mini-batch | |验证基地学习  | | | | ( hh: mm: ss) | | | | |损失损失精度精度  | |======================================================================================================================| | 1 | 1 | 00:00:01 | | 20.00% 43.75% | 5.2508 | 1.2540 | 0.0003 | | 1 | 13 | 00:00:11 |60.00% | 50.00% | 0.9912 | 1.0519 | 0.0003 | | 2 | 26 | 00:00:20 | | 60.00% 59.38% | 0.8554 | 0.8497 | 0.0003 | | 3 | 39 | 00:00:30 | | 60.00% 59.38% | 0.8120 | 0.8328 | 0.0003 | | 4 | 50 | 00:00:38 50.00% | | | 0.7885 | 0.0003 | | | 4 | 52 | 00:00:40 | | 60.00% 65.63% | 0.7091 | 0.7314 | 0.0003 | | 65 | | 00:00:49 | | 90.00% 87.50% | 0.4639 | 0.5893 | 0.0003 | | 6 | 78 | 00:00:59 | | 70.00% 87.50% | 0.6021 | 0.4355 | 0.0003 | | 91 | | 00:01:08 | | 90.00% 90.63% | 0.2307 | 0.2945 | 0.0003 || 100 | | 00:01:15 90.00% | | | 0.1827 | 0.0003 | | | 104 | | 00:01:18 | | 90.00% 93.75% | 0.2139 | 0.2153 | 0.0003 | | 117 | | 00:01:28 | | 100.00% 90.63% | 0.0521 | 0.1964 | 0.0003 | | 130 | | 00:01:38 | | 90.00% 90.63% | 0.1134 | 0.2214 | 0.0003 | | 143 | | 00:01:47 | | 100.00% 90.63% | 0.0855 | 0.2095 | 0.0003 | | 150 | | 00:01:52 90.00% | | | 0.2394 | 0.0003 | | | 156 | | 00:01:57 | | 100.00% 90.63% | 0.0606 | 0.1849 | 0.0003 | | 169 | | 00:02:06 | | | 100.00% 90.63%0.0090 | 0.2071 | 0.0003 | | 182 | | 00:02:16 | | 100.00% 93.75% | 0.0127 | 0.3597 | 0.0003 | | 195 | | 00:02:25 100.00% | | | 0.0016 | 0.3414 | 0.0003 93.75%  | |======================================================================================================================|

检查网络的最后一层。确认Classification Output层包含三个类。

trainedSN.Layers(结束)
ans = ClassificationOutputLayer与属性:名称:'new_classoutput'类:[ARR CHF NSR] OutputSize: 3超参数LossFunction: 'crossentropyex'

评估挤压网精度

使用验证数据评估网络。

[YPred,probs] = classid (trainedSN,augimgsValidation);accuracy = mean(YPred==imgsValidation.Labels);disp ([“SqueezeNet精度:”num2str(100 *准确性),“%”])
挤压精度:93.75%

结论

该示例展示了如何利用预先训练好的cnn GoogLeNet和SqueezeNet,使用迁移学习和连续小波分析对三类心电信号进行分类。心电信号的基于小波的时频表示被用于创建尺度图。生成尺度图的RGB图像。这些图像用于微调两个深度cnn。对不同网络层的激活也进行了探讨。

这个例子说明了一个可能的工作流,您可以使用预先训练好的CNN模型对信号进行分类。其他工作流程也是可能的。利用小波分析和深度学习在NVIDIA Jetson上部署信号分类器而且在树莓派上使用小波和深度学习部署信号分类器演示如何将代码部署到硬件上进行信号分类。GoogLeNet和SqueezeNet是在ImageNet数据库[10]的子集上预训练的模型,该数据库用于ImageNet大规模视觉识别挑战(ILSVRC)[8]。ImageNet集合包含现实世界对象的图像,如鱼、鸟、电器和真菌。标量不属于现实世界对象的类别。为了适应GoogLeNet和SqueezeNet架构,尺度图也进行了数据缩减。与微调预训练的CNN以区分不同类别的标量图不同,从头开始在原始标量图维度上训练CNN是一种选择。

参考文献

  1. 拜姆,D. S.科鲁奇,E. S.蒙拉德,H. S.史密斯,R. F.赖特,A.拉努,D. F.戈蒂耶,B. J.兰西尔,W.格罗斯曼和E.布劳恩瓦尔德。"口服米力农治疗严重充血性心力衰竭患者的存活率"美国心脏病学会杂志.第7卷,第3期,1986,第661-670页。

  2. M。“利用神经模糊网络进行心电搏动分类。”模式识别信.第25卷,第15期,2004年,第1715 - 1722页。

  3. 戈德伯格A. L, L. A. N.阿马拉尔,L.格拉斯,J. M.豪斯多夫,P. Ch.伊万诺夫,R. G.马克,J. E.米耶图斯,G. B.穆迪,c . k。彭先生和斯坦利先生。“PhysioBank, PhysioToolkit,和PhysioNet:复杂生理信号新研究资源的组成部分。”循环。卷101,第23号:e215-e220。[流通电子页;http://circ.ahajournals.org/content/101/23/e215.full];二年(六月十三日)。cir.101.23.e215 doi: 10.1161/01.。

  4. 列奥纳道齐,r.f., G.施洛特豪尔和M. E.托雷斯。“基于小波导频的心肌缺血时心率变异性的多重分形分析。”在医学与生物工程学会IEEE年度国际会议, 110 - 113。布宜诺斯艾利斯,阿根廷:IEEE, 2010。

  5. 李,T.和M.周。“用小波包熵和随机森林进行心电分类。”.Vol. 18, no . 8, 2016, p.285。

  6. 马哈拉杰,e。A。和A。m。阿隆索。多变量时间序列的判别分析:基于心电信号的诊断应用计算统计与数据分析“,.Vol. 70, 2014, pp. 67-87。

  7. 穆迪,g。B。和r。g。马克。“MIT-BIH心律失常数据库的影响。”IEEE医学与生物工程杂志.20卷。第三期,2001年5月至6月,第45-50页。(PMID: 11446209)

  8. 邓俊杰,苏红华等。ImageNet大规模视觉识别挑战赛国际计算机视觉杂志.Vol. 115, no . 3, 2015, pp. 211-252。

  9. 赵,Q.和L.张。“使用小波变换和支持向量机的心电特征提取和分类。”万博1manbetx在IEEE神经网络与大脑国际会议, 1089 - 1092。北京:IEEE, 2005。

  10. ImageNethttp://www.image-net.org

万博1manbetx支持功能

helperCreateECGDataDirectories在父目录中创建一个数据目录,然后在数据目录中创建三个子目录。子目录以在中找到的每一类心电信号命名ECGData

函数helperCreateECGDirectories (ECGData parentFolder dataFolder)此函数仅用于支持ECGAndDeepLearningExample。万博1manbetx它可能会在未来的版本中被更改或删除。。rootFolder = parentFolder;localFolder = dataFolder;mkdir(fullfile(rootFolder,localFolder)) folderLabels = unique(ECGData.Labels);i = 1:numel(folderLabels) mkdir(fullfile(rootFolder,localFolder,char(folderLabels(i))));结束结束

helperPlotReps图中发现的每一类ECG信号的代表的前1000个样本ECGData

函数helperPlotReps (ECGData)此函数仅用于支持ECGAndDeepLearningExample。万博1manbetx它可能会在未来的版本中被更改或删除。。folderLabels =唯一的(ECGData.Labels);k=1:3 ecgType = folderLabels{k};ind = find(ismember(ECGData.Labels,ecgType));次要情节(3 1 k)情节(ECGData.Data(印第安纳州(1)1:1000));网格标题(ecgType)结束结束

helperCreateRGBfromTF使用cwtfilterbank得到心电信号的连续小波变换,并由小波系数生成尺度图。helper函数调整标度图的大小,并将它们作为jpeg图像写入磁盘。

函数helperCreateRGBfromTF (ECGData parentFolder childFolder)此函数仅用于支持ECGAndDeepLearningExample。万博1manbetx它可能会在未来的版本中被更改或删除。。imageRoot = fullfile(parentFolder,childFolder);data = ECGData.Data;labels = ECGData.Labels;[~,signalLength] = size(data);Fb = cwtfilterbank(“SignalLength”signalLength,“VoicesPerOctave”12);R = size(data,1);Ii = 1:r CFS = abs(fb.wt(data(Ii,:)));Im = ind2rgb(im2uint8(rescale(cfs)),jet(128));imgLoc = fullfile(imageRoot,char(labels(ii)));imFileName = strcat(char(labels(ii)),“_”num2str (ii),“jpg”);imwrite (imresize (im, 224年[224]),fullfile (imgLoc imFileName));结束结束

另请参阅

|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)||(深度学习工具箱)

相关的话题