使用小波分析和深度学习对心电图 (ECG) 进行分类
使用小波分析和深度学习对心电图 (ECG) 进行分类
本文介绍了一种使用小波分析和深度学习对心电图(ECG)信号进行分类的方法。通过结合连续小波变换(CWT)和深度卷积神经网络(CNN),特别是利用预训练的GoogLeNet模型进行迁移学习,可以有效地对心电图信号进行分类。这种方法避免了从头开始训练深度CNN所需的大量计算资源和数据,具有较高的实用价值。
数据集与预处理
本示例使用了开源的ECG数据集,具体来自PhysioNet,包含三类人群的ECG数据:心律失常者(ARR)、充血性心力衰竭者(CHF)和正常窦性心律者(NSR)。数据集包含162份ECG录音,其中:
- 心律失常者:96份录音
- 充血性心力衰竭者:30份录音
- 正常窦性心律者:36份录音
数据集可以从PhysioNet公开获取,也可以从GitHub仓库下载。下载后,需要解压缩并加载到MATLAB工作区中。
特征提取:连续小波变换(CWT)
为了将时间序列数据转换为适合CNN处理的图像形式,我们使用连续小波变换(CWT)生成尺度图。尺度图是信号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","log")
shading interp
axis tight
title("Scalogram")
xlabel("Time (s)")
ylabel("Frequency (Hz)")
生成的尺度图如下所示:
迁移学习:使用预训练的GoogLeNet
由于从头开始训练深度CNN需要大量的计算资源和数据,本示例采用迁移学习的方法,使用预训练的GoogLeNet模型。GoogLeNet最初是用于将图像分类至1000个类别,我们重用其网络架构,以基于时间序列数据的CWT图像对ECG信号进行分类。
网络结构调整
- 替换丢弃层:将网络中的最终丢弃层
pool5-drop_7x7_s1
替换为概率为0.6的丢弃层。 - 替换全连接层:将全连接层
loss3-classifier
替换为新的全连接层,其中滤波器的数量等于类的数量。 - 替换分类层:将分类层替换为没有类标签的新分类层。
训练网络
使用随机梯度下降(SGDM)算法进行训练,设置以下参数:
- 批次大小:15
- 最大轮次:20
- 初始学习率:1e-4
- 验证数据:imgsValidation
- 验证频率:10
- 显示训练进度
options = trainingOptions("sgdm", ...
MiniBatchSize=15, ...
MaxEpochs=20, ...
InitialLearnRate=1e-4, ...
ValidationData=imgsValidation, ...
ValidationFrequency=10, ...
Verbose=1, ...
Plots="training-progress");
模型评估
使用验证数据评估网络的分类性能:
[YPred,~] = classify(trainedGN,imgsValidation);
accuracy = mean(YPred==imgsValidation.Labels);
disp("GoogLeNet Accuracy: "+num2str(100*accuracy)+"%");
实验结果表明,使用迁移学习的GoogLeNet模型在ECG信号分类任务上取得了93.75%的准确率。
总结
本文介绍了一种使用小波分析和深度学习对心电图信号进行分类的方法。通过结合连续小波变换(CWT)和深度卷积神经网络(CNN),特别是利用预训练的GoogLeNet模型进行迁移学习,可以有效地对心电图信号进行分类。这种方法避免了从头开始训练深度CNN所需的大量计算资源和数据,具有较高的实用价值。
本文原文来自cnblogs.com