用小波分析和深度学习对时间序列进行分类
这个例子展示了如何使用连续小波变换(CWT)和深度卷积神经网络(CNN)对人体心电图(ECG)信号进行分类。
从零开始训练一个深度CNN的计算成本很高,需要大量的训练数据。在各种应用中,没有足够的训练数据,合成新的现实训练样例是不可实现的。在这些情况下,利用已经在大型数据集上训练过的现有神经网络来完成概念上类似的任务是可取的。这种对现有神经网络的利用被称为转移学习。在本例中,我们采用了两个深度cnn, GoogLeNet和SqueezeNet,它们经过预先训练,用于图像识别,根据时频表示对心电波形进行分类。
GoogLeNet和SqueezeNet是深度cnn,最初设计用于将图像分类为1000个类别。我们重用CNN的网络架构,基于时间序列数据的CWT图像对心电信号进行分类。本例中使用的数据可从生理网.
数据描述
在本例中,您使用从三组人获得的心电图数据:心律失常(ARR)的人、充血性心力衰竭(CHF)的人和窦性心律正常(NSR)的人。总共使用了来自三个PhysioNet数据库的162个心电图记录:MIT-BIH心律失常数据库[3] [7],MIT-BIH正常窦性节律数据库[3]充血性心力衰竭数据库[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的复制策略所要求的,它提供了数据的源属性,以及应用于每个心电图记录的预处理步骤的描述。
解压缩ECGData.zip
在physionet-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
是一个包含两个字段的结构数组:数据
而且标签
.的数据
字段是一个162 × 65536的矩阵,其中每一行都是128赫兹采样的心电图记录。标签
是一个162 × 1的诊断标签单元阵列,每一行一个数据
.三个诊断类别是:“加勒比海盗”
,瑞士法郎的
,“签约”
.
为了存储每个类别的预处理数据,首先创建一个ECG数据目录dataDir
内部tempdir
.中创建三个子目录“数据”
以每个心电图类别命名。辅助函数helperCreateECGDirectories
这是否。helperCreateECGDirectories
接受ECGData
, ECG数据目录的名称和父目录的名称作为输入参数。你可以换tempdir
与具有写权限的另一个目录。您可以在本示例末尾的支持函数一节中找到该助手函数的源代码。
parentDir = tempdir;dataDir =“数据”;helperCreateECGDirectories (ECGData parentDir dataDir)
画出每个心电图类别的代表图。辅助函数helperPlotReps
这是否。helperPlotReps
接受ECGData
作为输入。您可以在本示例末尾的支持函数一节中找到该助手函数的源代码。
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,团体);t = (0:999)/Fs;figure;pcolor(t,frq,abs(cfs)) set(gca,“yscale”,“日志”);阴影插值函数;轴紧;标题(量图的),包含(“时间(s)”); ylabel (的频率(赫兹))
使用helper函数helperCreateRGBfromTF
创建作为RGB图像的规模图,并将其写入相应的子目录dataDir
.此助手函数的源代码在本示例末尾的支持函数一节中。为了与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网络支持包未安装时,该软件会在插件资源管理器中提供到所需支持包的链接。如果需要安装支持包,请单击链接,然后单击安装.
网= googlenet;
从网络中提取并显示层图。
lgraph = layerGraph(净);numberOfLayers =元素个数(lgraph.Layers);图(“单位”,“归一化”,“位置”,[0.1 0.1 0.8 0.8]);情节(lgraph)标题(“GoogLeNet图层图:”num2str (numberOfLayers),“层”]);
检查network Layers属性的第一个元素。确认GoogLeNet需要大小为224 * 224 * 3的RGB图像。
net.Layers (1)
名称:'data' InputSize: [224 224 3] Hyperparameters DataAugmentation: 'none'归一化:'zerocenter'含义:[224×224×3 single]
修改GoogLeNet网络参数
网络体系结构中的每一层都可以看作是一个过滤器。早期的层识别图像的更多常见特征,如斑点、边缘和颜色。接下来的层关注更具体的特性,以便区分类别。GoogLeNet经过预先训练,可以将图像分类为1000个对象类别。你必须重新训练GoogLeNet来解决我们的心电图分类问题。
为了防止过拟合,使用了一个退出层。dropout层以给定的概率将输入元素随机设置为零。看到dropoutLayer
(深度学习工具箱)为更多的信息。默认概率是0.5。替换网络中最后的退出层,“pool5-drop_7x7_s1”
,退出层的概率为0.6。
newDropoutLayer = dropoutLayer (0.6,“名字”,“new_Dropout”);lgraph = replaceLayer (lgraph,“pool5-drop_7x7_s1”, newDropoutLayer);
网络提取图像的卷积层特征是最后可学习层和最后分类层用于对输入图像进行分类。这两个层,“loss3-classifier”
而且“输出”
在GoogLeNet中,包含了如何将网络提取的特征组合成类概率、损失值和预测标签的信息。为了重新训练GoogLeNet对RGB图像进行分类,用适应数据的新层替换这两层。
更换全连通层“loss3-classifier”
使用一个新的完全连接层,其过滤器的数量等于类的数量。为了在新层中比在迁移层中学习更快,可以增加全连接层的学习速率因子。
numClasses =元素个数(类别(imgsTrain.Labels));newConnectedLayer = fullyConnectedLayer (numClasses,“名字”,“new_fc”,...“WeightLearnRateFactor”5,“BiasLearnRateFactor”5);lgraph = replaceLayer (lgraph,“loss3-classifier”, newConnectedLayer);
分类层指定网络的输出类。用一个新的没有类标签的分类层替换分类层。trainNetwork
在训练时自动设置层的输出类。
newClassLayer = classificationLayer (“名字”,“new_classoutput”);lgraph = replaceLayer (lgraph,“输出”, newClassLayer);
设置训练选项和训练GoogLeNet
训练一个神经网络是一个迭代的过程,包括最小化损失函数。为了使损失函数最小化,采用了梯度下降算法。在每次迭代中,计算损失函数的梯度,更新下降算法的权重。
可以通过设置各种选项来调整训练。InitialLearnRate
指定损失函数负梯度方向上的初始步长。MiniBatchSize
指定在每次迭代中使用的训练集子集的大小。一个时代是训练算法在整个训练集上的一次完整的传递。MaxEpochs
指定用于训练的最大时数。选择正确的时代数量不是一件小事。减少期数会导致模型欠拟合,而增加期数会导致模型过拟合。
使用trainingOptions
(深度学习工具箱)函数指定培训选项。集MiniBatchSize
10,MaxEpochs
10,InitialLearnRate
到0.0001。通过设置可视化训练进度情节
来训练进步
.使用随机梯度下降与动量优化。默认情况下,训练是在可用的GPU上进行的。使用GPU需要并行计算工具箱™。要查看支持哪些gpu,请参见GPU计算的需求(并行计算工具箱).为了再现性的目的,设置ExecutionEnvironment
来cpu
这trainNetwork
CPU使用。将随机种子设置为默认值。如果你能够使用GPU,运行时间将会更快。
选择= trainingOptions (“个”,...“MiniBatchSize”15岁的...“MaxEpochs”, 20岁,...“InitialLearnRate”1的军医,...“ValidationData”imgsValidation,...“ValidationFrequency”10...“详细”, 1...“ExecutionEnvironment”,“cpu”,...“阴谋”,“训练进步”);rng默认的
培训网络。在桌面CPU上,训练过程通常需要1-5分钟。命令窗口显示运行过程中的训练信息。结果包括历元数、迭代次数、时间流逝、小批量精度、验证精度和验证数据的损失函数值。
trainedGN = trainNetwork (imgsTrain、lgraph选项);
初始化输入数据规范化。|======================================================================================================================| | 时代| |迭代时间| 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(结束)
类:[ARR CHF NSR] OutputSize: 3 Hyperparameters LossFunction: 'crossentropyex'
评估GoogLeNet准确性
使用验证数据评估网络。
(YPred,聚合氯化铝)= (trainedGN imgsValidation)进行分类;精度=意味着(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);图蒙太奇(wghts)标题(“第一卷积层权值”)
您可以检查激活,并通过将激活区域与原始图像进行比较,发现GoogLeNet学习了哪些特征。有关更多信息,请参见卷积神经网络的可视化激活(深度学习工具箱)而且卷积神经网络的可视化特征(深度学习工具箱).
检查卷积层中的哪些区域在图像上激活加勒比海盗
类。与原始图像中相应区域进行比较。卷积神经网络的每一层都由许多称为渠道.将图像通过网络,并检查第一卷积层的输出激活,“conv1-7x7_s2”
.
convLayer =“conv1-7x7_s2”;imgClass =“加勒比海盗”;imgName =“ARR_10.jpg”;imarr = imread (fullfile (parentDir、dataDir imgClass, imgName));trainingFeaturesARR =激活(trainedGN imarr convLayer);深圳=大小(trainingFeaturesARR);trainingFeaturesARR = remodeling (trainingFeaturesARR,[sz(1) sz(2) 1 sz(3)]);图蒙太奇(重新调节(trainingFeaturesARR),“大小”[8])标题([imgClass,“激活”])
为这个图像找到最强的通道。将最强通道与原始图像进行比较。
imgSize =大小(imarr);imgSize = imgSize (1:2);[~, maxValueIndex] = max (max (max (trainingFeaturesARR)));arrMax = trainingFeaturesARR (:,:,:, maxValueIndex);arrMax =重新调节(arrMax);arrMax = imresize (arrMax imgSize);图;imshowpair (imarr arrMax,“蒙太奇”)标题(“最强”imgClass,的渠道:num2str (maxValueIndex)])
SqueezeNet
SqueezeNet是一个深度CNN,其架构支持大小为227 × 227 × 3的图像。即使图像尺寸对于GoogLeNet是不同的,您也不必在SqueezeNet尺寸上生成新的RGB图像。您可以使用原始的RGB图像。
负载
加载预训练的SqueezeNet神经网络。如果深度学习工具箱™模型SqueezeNet网络支持包未安装时,该软件会在插件资源管理器中提供到所需支持包的链接。如果需要安装支持包,请单击链接,然后单击安装.
sqz = squeezenet;
从网络中提取层图。确认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 Layer array with layers: 1 'drop9' Dropout 50% Dropout 2 'conv10' Convolution 1000 1x1x512 convolutions with stride [1 1] and padding [0 000] 3 'relu_conv10' ReLU ReLU 4 'pool10' Average Pooling 14x14 Average Pooling with stride [1 1] and padding [0 000] 5 'prob' Softmax Softmax 6 ' classificationlayer_predictive 'Classification Output crossentropyex with 'tench' and 999 other classes
取代“drop9”
层,网络中的最后一个退出层,退出层的概率为0.6。
tmpLayer = lgraphSqz.Layers(录得5个);newDropoutLayer = dropoutLayer (0.6,“名字”,“new_dropout”);lgraphSqz = replaceLayer (lgraphSqz tmpLayer.Name newDropoutLayer);
与GoogLeNet不同的是,SqueezeNet的最后一个可学习层是1乘1的卷积层,“conv10”
,而不是一个完全连接的层。取代“conv10”
一个新的卷积层,过滤器的数量等于类的数量。和GoogLeNet一样,增加新层的学习率因子。
numClasses =元素个数(类别(imgsTrain.Labels));tmpLayer = lgraphSqz.Layers (end-4);numClasses newLearnableLayer = convolution2dLayer (1,...“名字”,“new_conv”,...“WeightLearnRateFactor”10...“BiasLearnRateFactor”10);lgraphSqz = replaceLayer (lgraphSqz tmpLayer.Name newLearnableLayer);
用一个新的没有类标签的分类层替换分类层。
tmpLayer = lgraphSqz.Layers(结束);newClassLayer = classificationLayer (“名字”,“new_classoutput”);lgraphSqz = replaceLayer (lgraphSqz tmpLayer.Name newClassLayer);
检查网络的最后六层。确认dropout层、卷积层和输出层已经更改。
lgraphSqz.Layers (63:68)
ans = 6x1 Layer array with layers: 1 'new_dropout' Dropout 60% Dropout 2 'new_conv' Convolution 3 1x1 convolutions with stride [1 1] and padding [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] 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分钟。
劳工关系= 3的军医;miniBatchSize = 10;maxEpochs = 15;valFreq =地板(元素个数(augimgsTrain.Files) / miniBatchSize);选择= trainingOptions (“个”,...“MiniBatchSize”miniBatchSize,...“MaxEpochs”maxEpochs,...“InitialLearnRate”劳工关系,...“ValidationData”augimgsValidation,...“ValidationFrequency”valFreq,...“详细”, 1...“ExecutionEnvironment”,“cpu”,...“阴谋”,“训练进步”);rng默认的trainedSN = trainNetwork (augimgsTrain lgraphSqz,选择);
初始化输入数据规范化。|======================================================================================================================| | 时代| |迭代时间| 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(结束)
类:[ARR CHF NSR] OutputSize: 3 Hyperparameters LossFunction: 'crossentropyex'
评估SqueezeNet准确性
使用验证数据评估网络。
(YPred,聚合氯化铝)= (trainedSN augimgsValidation)进行分类;精度=意味着(YPred = = imgsValidation.Labels);disp ([“SqueezeNet精度:”num2str(100 *准确性),“%”])
SqueezeNet精度:93.75%
结论
本例展示了如何利用预先训练的cnn GoogLeNet和SqueezeNet,使用迁移学习和连续小波分析对三类心电信号进行分类。基于小波的心电信号时频表示被用来创建尺度图。生成尺度图的RGB图像。这些图像用于微调两个深度cnn。对不同网络层的激活也进行了探讨。
这个例子说明了一个可能的工作流程,您可以使用预先训练的CNN模型对信号进行分类。其他工作流也是可能的。利用小波分析和深度学习在NVIDIA Jetson上部署信号分类器而且利用小波和深度学习在树莓派上部署信号分类器演示如何将代码部署到硬件上进行信号分类。GoogLeNet和SqueezeNet是在ImageNet数据库[10]的子集上预训练的模型,该数据库用于ImageNet大规模视觉识别挑战(ILSVRC)[8]。ImageNet集合包含现实世界对象的图像,如鱼、鸟、器具和真菌。尺度图不属于真实世界对象的类别。为了适应GoogLeNet和SqueezeNet架构,尺度图也进行了数据缩减。与其对预先训练的CNN进行微调以区分不同类别的尺度图,不如在原始的尺度图维度上从头开始训练CNN。
参考文献
拜姆、D. S.、W. S.科鲁奇、E. S.蒙拉德、H. S.史密斯、R. F.赖特、A.拉努、D. F.戈捷、B. J.兰希尔、W.格罗斯曼和E.布劳沃尔德。口服米力农治疗严重充血性心力衰竭患者的生存率美国心脏病学会杂志.1986年第7卷第3期,第661-670页。
M。"利用神经模糊网络进行心电搏动分类"模式识别的字母.2004年第25卷第15期,1715 - 1722页。
戈德伯格、l.a.n.阿马拉尔、l.g lass、j.m.豪斯多夫、p.ch Ivanov、r.g. Mark、j.e.m ietus、g.b. Moody、c.k.。彭和h·e·斯坦利。PhysioBank, PhysioToolkit和PhysioNet:复杂生理信号新研究资源的组成部分。循环。第101卷第23期:e215-e220。(循环电子页;
http://circ.ahajournals.org/content/101/23/e215.full
];2000(6月13日)。cir.101.23.e215 doi: 10.1161/01.。列奥纳道兹,R. F., G.施洛托尔和M. E.托雷斯。基于小波导联的心肌缺血时心率变异性多重分形分析。在医学生物工程学会(EMBC),IEEE年度国际会议, 110 - 113。布宜诺斯艾利斯,阿根廷:IEEE, 2010。
李涛,周明。“用小波包熵和随机森林进行心电分类。”熵.2016年第8期第18卷第285页。
马哈拉杰,e。A。和A。m。阿隆索。多变量时间序列的判别分析:在心电信号诊断中的应用。计算统计和数据分析“,.2014年第70卷第67-87页。
穆迪,G. B.和R. G.马克。“麻省理工-波黑心律失常数据库的影响。”IEEE医学和生物学工程杂志.20卷。第三期,2001年5月至6月,第45-50页。(PMID: 11446209)
邓杰,苏浩等。"ImageNet大规模视觉识别挑战"国际计算机视觉杂志.2015年第3期第115卷第211-252页。
赵庆和张磊。基于小波变换和支持向量机的心电特征提取和分类。在IEEE神经网络与大脑国际会议, 1089 - 1092。北京:IEEE, 2005。
ImageNet.
http://www.image-net.org
支持功能
helperCreateECGDataDirectories在父目录中创建一个数据目录,然后在数据目录中创建三个子目录。子目录以每一类心电信号命名ECGData
.
函数helperCreateECGDirectories (ECGData parentFolder dataFolder)此函数仅用于支持ECGAndDeepLearningExample。它可能会在未来的版本中更改或删除。。rootFolder = parentFolder;localFolder = dataFolder;mkdir(fullfile(rootFolder,localFolder)) folderLabels = unique(ECGData.Labels);为i = 1:numel(folderLabels) mkdir(fullfile(rootFolder,localFolder,char(folderLabels(i))));结束结束
helperPlotReps画出每一类心电信号的代表性的前1000个样本ECGData
.
函数helperPlotReps (ECGData)此函数仅用于支持ECGAndDeepLearningExample。它可能会在未来的版本中更改或删除。。folderLabels =独特(ECGData.Labels);为ecgType = folderLabels{k};印第安纳州=找到(ismember (ECGData.Labels ecgType));次要情节(3 1 k)情节(ECGData.Data(印第安纳州(1)1:1000));网格在标题(ecgType)结束结束
helperCreateRGBfromTF使用cwtfilterbank
对心电信号进行连续小波变换,由小波系数生成尺度图。helper函数调整刻度图的大小,并将它们作为jpeg图像写入磁盘。
函数helperCreateRGBfromTF (ECGData parentFolder childFolder)此函数仅用于支持ECGAndDeepLearningExample。它可能会在未来的版本中更改或删除。。imageRoot = fullfile (parentFolder childFolder);数据= ECGData.Data;标签= ECGData.Labels;[~, signalLength] =大小(数据);fb = cwtfilterbank (“SignalLength”signalLength,“VoicesPerOctave”12);r =大小(数据,1);为Ii = 1:r CFS = abs(fb.wt(data(Ii,:)));我= ind2rgb (im2uint8(重新调节(cfs)),飞机(128);imgLoc = fullfile (imageRoot char(标签(ii)));imFileName = strcat (char(标签(ii)),“_”num2str (ii),“jpg”);imwrite (imresize (im, 224年[224]),fullfile (imgLoc imFileName));结束结束
另请参阅
cwtfilterbank
|googlenet
(深度学习工具箱)|squeezenet
(深度学习工具箱)|trainNetwork
(深度学习工具箱)|trainingOptions
(深度学习工具箱)|imageDatastore
|augmentedImageDatastore
(深度学习工具箱)