主要内容

利用小波分析和深度学习对时间序列进行分类

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

从头开始训练一个深度CNN在计算上非常昂贵,并且需要大量的训练数据。在各种应用中,缺乏足够数量的训练数据,合成新的现实的训练实例是不可行的。在这些情况下,利用在大数据集上训练过的现有神经网络来完成概念上类似的任务是可取的。这种对现有神经网络的利用被称为迁移学习。在这个例子中,我们采用两个深度cnn, GoogLeNet和SqueezeNet,预先训练图像识别,根据时频表示对心电波形进行分类。

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

数据描述

在本例中,您使用的是三组人的心电图数据:心律失常(ARR)、充血性心力衰竭(CHF)和窦性节律正常(NSR)。您总共使用了来自三个PhysioNet数据库的162个心电记录: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在临时目录中。此文件夹包含文本文件自述文件ECGData.zip.的ECGData.zip文件包含

  • ECGData.mat

  • Modified_physionet_data.txt

  • 最终用户许可协议

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

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

解压缩(fullfile (tempdir,“physionet_ECG_data-main”,“ECGData.zip”),...完整文件(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使用具有写权限的另一个目录。您可以在本例末尾的支持函数一节中找到这个帮助函数的源代码。金宝app

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

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

helperPlotReps (ECGData)

创建时间频率表示

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

要创建标量图,需要预先计算CWT滤波器组。预计算连续小波滤波器组是获取多个信号用相同参数进行连续小波变换时的首选方法。

在生成标量图之前,检查其中一个。使用。创建CWT滤波器组cwtfilterbank对于一个有1000个样本的信号。利用滤波器组对信号的前1000个样本进行CWT,由系数得到尺度图。

Fs = 128;fb = cwtfilterbank (“信号长度”, 1000,...“SamplingFrequency”Fs,...“VoicesPerOctave”12);sig = ECGData.Data(1、1:1000);[cfs, frq] = wt (fb,团体);pcolor(t,frq,abs(cfs)) set(gca, cfs))“yscale”,“日志”);阴影插值函数;轴;头衔(量图的),包含(“时间(s)”); ylabel (的频率(赫兹)

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

helperCreateRGBfromTF (ECGData parentDir dataDir)

分为培训和验证数据

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

allImages = imageDatastore (fullfile (parentDir dataDir),...“包含子文件夹”,真的,...“标签源”,“foldernames”);

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

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

水壶

负载

加载预先训练好的GoogLeNet神经网络。深度学习工具箱™模型GoogLeNet网络金宝app未安装支持包,软件在附加模块资源管理器中提供了指向所需支持包的链接。若要安装支持包,请单击该链接,然后单击安装

网= googlenet;

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

lgraph = layerGraph(净);numberOfLayers =元素个数(lgraph.Layers);图(“单位”,“归一化”,“位置”,[0.1 0.1 0.8 0.8]);情节(lgraph)标题('谷歌网图层图:'num2str (numberOfLayers),“层”]);

检查网络层属性的第一个元素。确认GoogLeNet需要大小为224 × 224 × 3的RGB图像。

net.Layers (1)
ans = ImageInputLayer with properties: Name: 'data' InputSize: [224 224 3] Hyperparameters DataAugmentation: 'none' Normalization: 'zerocenter' Mean: [224×224×3 single]

修改google网络参数

网络体系结构中的每一层都可以看作是一个过滤器。早期的图层识别图像的更多常见特征,如斑点、边缘和颜色。为了区分类别,随后的层关注更具体的特性。GoogLeNet经过预先训练,可以将图像分类为1000个对象类别。你必须为我们的心电图分类问题重新培训谷歌网。

为了防止过拟合,使用了一个退合层。dropout层以给定的概率将输入元素随机设置为零。看到落花人(深度学习工具箱)为更多的信息。违约概率为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指定用于培训的最大纪元数。选择合适的纪元数量并非易事。减少周期数会导致模型拟合不足,增加周期数会导致模型拟合过。

使用培训选项(深度学习工具箱)函数指定培训选项。集MiniBatchSize10,MaxEpochs10,InitialLearnRate至0.0001。通过设置情节培训进度.使用带有动量优化器的随机梯度下降。默认情况下,如果GPU可用,训练将在GPU上进行。使用GPU需要并行计算工具箱™。要查看支持的图形处理器,请参见金宝appGPU支金宝app持情况(并行计算工具箱). 为了再现性的目的,设置ExecutionEnvironment中央处理器trainNetworkCPU使用。将随机种子设置为默认值。如果你能够使用GPU,运行时间会更快。

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

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

trainedGN = trainNetwork (imgsTrain、lgraph选项);

正在初始化输入数据规范化。|历元|迭代|经过的时间|小批量|验证|小批量|验证|基础学习| | | |(hh:mm:ss)第二方第第二方第第第二方第第二方第第第二方第第第二方第第第第第第第二方第第第第第二方第第第第第第第二方第第第第第第第第第二方第第第二方第第第第二方第第第二方第二方第第二方第第二方第第第第第第二方第=========================================================第第第第第第第第==============================第第第第第第第第第第第第第第第第第第第第第=======================================第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第9207 | 2.4141 | 1.0000e-04 | 2 | 10 | 00:00:23 | 66.67%| 62.50%| 0.9589 | 1.3191 | 1.0000e-04 | 3 | 20 | 00:00:43 | 46.67%| 75.00%|1.7 0.7 7 0.7 7 7 0.7 7 7 0.7 7 7 0.7 7 7 0.7 7 7 0.7 7 7 0.7 7 7 0.7 7 7 0.7 7 7 7 0.7 7 7 7 0.7 7 7 7 7 7 7 7 7 0.7 7 7 7 7 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 7 7 7 7 7 7 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0.7 7 7 7 7 7 7 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 0.2892 | 1.0000e-04 | 8 | 60 | 00:02:07 | 80.00%| 87.50%| 0.3617 | 0.2433 | 1.0000e-04 | 9 | 70 | 00:02:29 | 86.67%|0.50%0.50%1240.50%0.50%0.0 0 0.50 0 0.5012400.0 0 0.0 0 0 0 0.50%0.50 0 0.50 0 0 0 0.50 0 0.50 0 0 0 0 0.50%0.50 0 0 0 0.50 0 0 0 0 0 0.50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.88%0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.88%0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.88%0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.| 0.4160 | 0.1607 | 1.0000e-04 | 14 | 110 | 00:03:53 | 86.67%| 96.88%| 0.3237 | 0.1565 | 1.0000e-04 | 15 | 120 |00:04:04:00:04:00:04:00 00:04:00:00:00:00:00:00:00:00:00:00:00:00:00:04:00:00:00:00:00:00:00:00:00:00 00:00:00:00:351240.33%93.33%1240.33%1240.33%12400.18 0 0 0 0 0 0 0 0 0 0 0-0 0 0 0 012400 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0-0 0 0 0 0 0 0 0 0 0 0 0-0 0 0 0 0 0 0-0 0 0 0 0 0 0 0 0 0 0 0-04\周四周四周四周四周四周四周四周四\\124周四周四周四周四周四周四周四周四周四周四周四周四周四周四周四周四周四周四周四周四周四周四周四18 \周四周四18 | 93.33%| 93.75%| 0.1666 | 0.1325 | 1.0000e-04 | 20 | 160 | 00:05:39 | 93.33%| 96.88%| 0.0873 | 0.1164 |1.0000e-04||======================================================================================================================|

检查训练网络的最后一层。确认分类输出层包括三个类。

培训层(结束)
ans = ClassificationOutputLayer with properties: Name: 'new_classoutput' Classes: [ARR CHF NSR] OutputSize: 3 Hyperparameters LossFunction: 'crossentropyex'

评估GoogLeNet准确性

使用验证数据评估网络。

(YPred,聚合氯化铝)= (trainedGN imgsValidation)进行分类;精度=意味着(YPred = = imgsValidation.Labels);disp ([“GoogLeNet精度:”num2str(100 *准确性),“%”])
GoogLeNet精度:96.875%

精度与培训可视化图上报告的验证精度相同。量表分为训练和验证收集。这两个系列都被用来训练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 =重塑(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的图像。金宝app尽管GoogLeNet的图像尺寸不同,但您不必在SqueezeNet的尺寸上生成新的RGB图像。你可以使用原始的RGB图像。

负载

加载预先训练的SqueezeNet神经网络。深度学习工具箱™模型SqueezeNet网络金宝app未安装支持包,软件在附加模块资源管理器中提供了指向所需支持包的链接。若要安装支持包,请单击该链接,然后单击安装

sqz = squeezenet;

从网络中提取层图。确认SqueezeNet的层数比GoogLeNet少。还要确认一下,SqueezeNet的尺寸是227 × 227 × 3

lgraphSqz=图层图形(sqz);显示([“层数:”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”卷积1000 1x512卷积带跨距[1]和填充[0 0 0 0 0]3“relu_conv10”relu relu relu 4“pool10”平均池14x14平均池带跨距[1]和填充[0 0 0 0]5“prob”Softmax Softmax 6“ClassificationLayer_predictions”分类输出crossentropyex与“tench”和999其他类别

取代“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, convolutional, and output layers have been changed。

lgraphSqz.Layers (63:68)
ans = 6x1 Layer array with layers:1“new_dropout”辍学60%辍学2 new_conv的卷积3 1 x1旋转步[1]和填充[0 0 0 0]3‘relu_conv10 ReLU ReLU 4“pool10”池平均14 x14平均池与步幅[1]和填充[0 0 0 0]5“概率”Softmax Softmax 6 new_classoutput crossentropyex分类输出

为SqueezeNet准备RGB数据

RGB图像具有适合于GoogLeNet架构的尺寸。创建增强的图像数据存储,自动调整现有的RGB图像的大小为SqueezeNet架构。有关更多信息,请参见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,...“验证频率”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 | | | 1500.0003 0.2394 90.00% | 00:01:52 | | | | | | | 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% 93.75% | 0.0016 | 0.3414 | 0.0003 ||======================================================================================================================|

检查网络的最后一层。确认分类输出层包括三个类。

trainedSN.Layers(结束)
ans = ClassificationOutputLayer with properties: Name: 'new_classoutput' Classes: [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。

参考文献

  1. Baim, D. S., W. S. Colucci, E. S. Monrad, H. S. Smith, R. F. Wright, A. Lanoue, D. F. Gauthier, B. J. Ransil, W. Grossman, E. Braunwald。口服米力农治疗严重充血性心力衰竭患者的生存率美国心脏病学院杂志.1986年第7卷第3期,第661-670页。

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

  3. Goldberger A. L., 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:e215-e220。(循环电子页;http://circ.ahajournals.org/content/101/23/e215.full];2000年(6月13日)。内政部:10.1161/01.CIR.101.23.e215。

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

  5. 李涛,周敏。“基于小波包熵和随机森林的心电分类”。.2016年第18卷第8期第285页。

  6. 多元时间序列的判别分析:基于ECG信号的诊断应用计算统计和数据分析.2014年第70卷,第67-87页。

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

  8. 等。ImageNet大型视觉识别挑战国际计算机视觉杂志.第115卷第3期,2015年,211-252页。

  9. 赵强,张磊。基于小波变换和支持向量机的心电特征提取与分类。金宝app在神经网络与大脑国际会议, 1089 - 1092。北京:电子科技大学,2005。

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

金宝app支持功能

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

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

helperPlotReps图中发现的每一类心电信号的代表的前一千个样本ECGData

作用helperPlotReps (ECGData)%此函数仅支持ECGAndDeepLearningExample。金宝app%它可能会在未来的版本中改变或被删除。folderLabels =独特(ECGData.Labels);k=1:3 ecgType = folderLabels{k};印第安纳州=找到(ismember (ECGData.Labels ecgType));次要情节(3 1 k)情节(ECGData.Data(印第安纳州(1)1:1000));网格在…上标题(ecgType)结束结束

helperCreateRGBfromTF使用cwtfilterbank对心电信号进行连续小波变换,由小波系数生成尺度图。助手函数调整缩放图的大小,并将其作为jpeg图像写入磁盘。

作用helperCreateRGBfromTF (ECGData parentFolder childFolder)%此函数仅支持ECGAndDeepLearningExample。金宝app%它可能会在未来的版本中改变或被删除。imageRoot = fullfile (parentFolder childFolder);数据= ECGData.Data;标签= ECGData.Labels;[~, signalLength] =大小(数据);fb = cwtfilterbank (“信号长度”signalLength,“VoicesPerOctave”12);r =大小(数据,1);Ii = 1:r CFS = abs(fb.wt(数据(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));结束结束

另请参阅

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

相关话题