ECG分析:基于深度学习的ECG心律失常分类入门(4)
在搭建模型之前,讲一下本次任务需要区分的类别,MITAB根据心拍类型划分了14个小类:
也可以用wfdb查看:
wfdb.show_ann_labels()
label_store symbol description
0 0 Not an actual annotation
1 1 N Normal beat
2 2 L Left bundle branch block beat
3 3 R Right bundle branch block beat
4 4 a Aberrated atrial premature beat
5 5 V Premature ventricular contraction
6 6 F Fusion of ventricular and normal beat
7 7 J Nodal (junctional) premature beat
8 8 A Atrial premature contraction
9 9 S Premature or ectopic supraventricular beat
10 10 E Ventricular escape beat
11 11 j Nodal (junctional) escape beat
12 12 / Paced beat
13 13 Q Unclassifiable beat
14 14 ~ Signal quality change
16 16 | Isolated QRS-like artifact
18 18 s ST change
19 19 T T-wave change
20 20 * Systole
21 21 D Diastole
22 22 " Comment annotation
23 23 = Measurement annotation
24 24 p P-wave peak
25 25 B Left or right bundle branch block
26 26 ^ Non-conducted pacer spike
27 27 t T-wave peak
28 28 + Rhythm change
29 29 u U-wave peak
30 30 ? Learning
31 31 ! Ventricular flutter wave
32 32 [ Start of ventricular flutter/fibrillation
33 33 ] End of ventricular flutter/fibrillation
34 34 e Atrial escape beat
35 35 n Supraventricular escape beat
36 36 @ Link to external data (aux_note contains URL)
37 37 x Non-conducted P-wave (blocked APB)
38 38 f Fusion of paced and normal beat
39 39 ( Waveform onset
40 40 ) Waveform end
41 41 r R-on-T premature ventricular contraction
根据AAMI标准,这14个小类集成为5个大类(N, SVEB, VEB, F, Q):
我们的任务也是基于对这5个大类开展的,所以在截取心拍的时候,就要根据标签类型,将样本归类:
#这是截取中间步骤的代码块
if label[j]=='A' or label[j]=='a' or label[j]=='J' or label[j]=='S':Seg=record[label_index[j]-144:label_index[j]+180]segment=resample(Seg,251, axis=0) #根据文章要求,重采样到251个点SVEB_Seg.append(segment)
到这里,心拍截取好了,也归类了。下面就是模型的搭建(这里就不再专门介绍卷积神经网络了,需要很长篇幅)直接开始模型搭建吧:
模型搭建
这个模型其实没什么新意的,2层卷积2层池化和3个全连接层,算是最入门的了,不过这里作者用了一个“多头”输入(笑cry…)3个输入都是同一条数据,只不过每一个分支设置的卷积核参数不一样,例如第一层的三个通道的卷积核尺寸分别是4,6,8,个人觉得这里没有使用图像处理中的3x3,1x1等更小卷积核,是因为我们的ECG是一个基于幅值的低频数据,小的感受野不一定能够包含一个较大范围的幅值变化,也就是较小的局部区域,很难构成特征性较强的波形。而为什么没有使用诸如16,32之类的大卷积核呢?因为我们的心拍本身就是一个短时间数据,过度关注整体上的变化而忽略了局部,所谓“过犹不及”,所以选择了三个中等大小的卷积核。总的来说,调参是一部分,还有一部分是要基于问题本身,从数据层面的分析,再到模型层面的分析。
原本是324的心拍长度,看到这里的时候,输入是251,作者好像是没提,为了尽可能复现,在这里我就重采样到了251。
交叉验证
拿到文章的第一眼先看看作者做的是关于inter-patient,还是intra-patinet,(关于两种分类模式,推荐看我有一个师兄的博客inter-patient和intra-patienthttps://blog.csdn.net/qq_15746879/article/details/80487543,介绍得很清楚)
读到下面的流程图,一眼就看出来了(其实看最后的结果展示,也看得出来):
这里,作者是先截取心拍,然后数据集划分,采用了三个不同折的交叉验证:
基于intra-patient的分类,完全不考虑个体差异性问题,训练集和测试集可以来自同一个病人,个体差异性带来的消极影响最小,实现难度很小,
很容易就可以达到很高的性能。所以,这里我只采用了5折交叉验证的例子(即Experiment3)
总结
本篇就介绍到这里,如果存在错误和疏漏,欢迎提出批评指正!具体代码实现,我会上传到个人的GitHub上https://github.com/cay846545867上,记得给颗小星星鼓励一下哦(点个赞也行的)!!!笔芯笔芯~~~
下一篇笔记将会对实验结果做一个评估和分析。