52matlab技术网站,matlab教程,matlab安装教程,matlab下载

标题: ECG ×AI: 机器/深度学习的ECG应用入门(5) [打印本页]

作者: Aiwiscal    时间: 2018-6-10 05:26
标题: ECG ×AI: 机器/深度学习的ECG应用入门(5)
本帖最后由 Aiwiscal 于 2018-6-11 03:47 编辑

深度学习:卷积神经网络(CNN)
1.引言
上一部分简单介绍了传统机器学习框架在ECG分类领域的基本应用。传统机器学习框架对于人工特征非常依赖,如果算法设计者没有足够经验,很难提取出高质量的特征,这也是传统机器学习框架的局限性。近几年来以卷积神经网络(Convolutional Neural Network,CNN)为代表的深度学习技术蓬勃兴起,其优势在于可以从大数据中自动习得特征而无需人工设计特征,其在多种任务,例如图像分类与定位,语音识别等领域都展现出了十分强大的性能。这一部分讲解如何使用CNN来完成与上一节同样的任务。如果不熟悉CNN,网上有很多的资料可以参考。

[attach]200[/attach]
2.CNN可用的原因
根据大量的文献,我们可以知道,CNN非常适合处理图像,以至于基于传统机器学习的算法完全不能相比。图像这样的数据形式,存在局部与整体的关系,由低层次特征经组合可形成高层次特征,并可以得到不同特征间的空间相关性。仔细想想,我们的ECG信号似乎也存在这样的特性,局部的一些波形与整体结果息息相关,而诊断,实质上就是由一些低层次的,可见的波形变化抽象成一些疾病的概念,即高层次的特征。而波形的空间关系也往往蕴含了丰富的信息。这样看起来,ECG与图像有很大的相似之处,而CNN通过以下几点可有效利用上述特点:
1)局部连接:CNN网络可提取数据局部特征。
2)权值共享:大大降低了网络训练难度,每个卷积层有多个filter,可提取多种特征。
3)池化操作和多层次结构:实现数据的降维,将低层次局部特征组合无为较高层次特征。
由于我们处理的ECG心拍是一维信号,因此需要使用1维CNN处理。

3.示例:1维CNN的ECG心拍分类
该部分的CNN内部代码改编自:https://github.com/rasmusbergpalm/DeepLearnToolbox,以Matlab写成,目前放在了本人github上。而CNN的内部代码比较复杂,初学者很难短时间内看懂领会。因此这一部分主要讲解如何使用。如果对代码的具体实现感兴趣,可以参照https://blog.csdn.net/zouxy09/article/details/9993743 关于2维版本CNN的代码解释,本部分中所使用的1维CNN代码架构与其基本相同。
与前面一样,解压1DCNN.zip将名为“1DCNN”的文件夹复制到Matlab安装目录toolbox文件夹下,然后在Matlab中设置路径(Set path),将1DCNN文件夹添加到Matlab可检索的目录中,就可以调用了。前几步,有关数据的载入,标签的生成,数据的划分和处理等与前一部分一致,但是,这里我们不再提取特征。而是要搭建CNN结构,建议参照放在github上该部分的代码:Classification-CNN.m。
1)CNN结构设计
直接上代码:
                                                        cnn.layers = {
                                                            struct('type', 'i') %input layer
                                                            struct('type', 'c', 'outputmaps', 4, 'kernelsize', 31,'actv','relu') %convolution layer
                                                            struct('type', 's', 'scale', 5,'pool','mean') %sub sampling layer
                                                            struct('type', 'c', 'outputmaps', 8, 'kernelsize', 6,'actv','relu') %convolution layer
                                                            struct('type', 's', 'scale', 3,'pool','mean') %subsampling layer
                                                        };
                                                        cnn.output = 'softmax';  %确定cnn结构;


这里,我们要设计一个具有2个卷积层,2个池化层,和1个全连接层的1维CNN。这个CNN工具箱比较简单,目前只支持卷积层和池化层互相交错放置。网络层的类型由‘type’指定,后接‘i’,‘c’,‘s’分别指输入层,卷积层和池化层。“outputmaps”设定该层有多少输出特征图,从而决定卷积核的数目;“kernelsize”后的数字指定1维卷积核的大小;“scale”后数字指定池化步长;“pool”后的字符串指定池化类型,“mean”:平均池化,“max”:最大池化;“actv”后的字符串指定激活函数类型,“relu”:ReLU,“sigm”:Sigmoid,“tanh”:Tanh。cnn.output="softmax"指后面的全连接层要进行softmax操作,另外还可以指定为“sigm”:使用sigmoid函数映射,“linear”:线性映射。
以上这些参数或选择需要人工指定,可自行模仿调整。另外值得一提的是,这个工具箱比较简单,因此限制也比较多:
(1)只支持卷积层和池化层互相交错放置。(2)卷积层不会对特征图外围进行零填充,也就是每次卷积后特征图长度会减少kernelsize-1.(3)池化层的每一步池化区域不重叠,即池化区域长度等于步长。(4)池化层的输入特征图长度必须能被池化步长整除。
因此参数的调整必须考虑和满足以上的限制,否则就会报错。

2)超参数的确定
                                                                  %确定超参数;
                                                        opts.alpha = 0.01;       %学习率;
                                                        opts.batchsize = 16;     %batch块大小;
                                                        opts.numepochs = 30;     %迭代epoch
接下来我们要使用随机梯度下降法(SGD)法训练,因此需要指定学习率,batch块大小,以及需要迭代的epoch数。这些参数的取值,尤其是学习率,可能会对结果产生较大的影响。
3)建立,训练,测试CNN
                                                        cnn = cnnsetup1d(cnn, train_x, train_y);      %建立1D CNN;
                                                        cnn = cnntrain1d(cnn, train_x, train_y,opts); %训练1D CNN;
                                                        [er,bad,out] = cnntest1d(cnn, test_x, test_y);%测试1D CNN;
                                                        
cnnsetup1d会根据我们前面设定的cnn结构和训练数据的结构生成一个CNN网络;cnntrain1d会使用训练数据和我们设定的学习率等参数训练已经建立好的网络,这一步也是最耗时的;cnntest1d会测试训练好的网络,输出错误率(er),分错的样本索引(bad),以及实际的输出值(out)。工作空间中,名为cnn的结构体保存了所有的权值和偏置等关键信息,内涵多级结构体,可双击打开查看。也可保存为.mat文件以备后续使用。
4)结果统计与展示

这一步的流程与上一节传统框架实验相同,可参照开源代码。根据我们设定的参数进行训练和测试,得到的结果:

[attach]201[/attach]

使用CNN(总体准确率98.79%)貌似得到了比人工特征+SVM(总体准确率96.69%)更好的结果。当然两者还都有优化空间,尤其是在超参数的选取上。混淆矩阵仍然保存于工作空间名为“Conf_Mat”的矩阵中,可双击打开查看:

[attach]202[/attach]

综上,我们搭建了1维CNN实现了心拍的基本分类. 相比传统机器学习框架,上手更容易,无需显式提取特征. 至于缺点,如果你亲自运行一下就知道, 模型的训练过程比较耗时,而我们的CNN结构也只是简单的5层. 另外, 模型中需要确定的超参数也远多于前面所提及的SVM,想要调到一个理想状态也不是太容易,没有具体的理论指导, 需要大量的实验. 这也是目前深度学习饱受诟病的问题之一.

4.小结这一部分简单讲述了如何使用深度学习算法——1维CNN进行基本的心拍分类。除去特征提取,其他的数据处理和效果评估与前面一部分基本一致。这里用到的CNN工具箱支持功能不是很全面,只能满足一些基本需求。如果想在深度学习CNN方面深挖,建议使用Tensorflow,Pytorch等流行的深度学习框架,支持功能全面,速度更快。不过这就需要一些Python及其第三方库的使用基础了。目前1维CNN用于心拍的分类的文章已经比较多了,下面也推荐了几篇。这一部分涉及到的代码可以从下面的网址中看到。

** 相关代码文件下载:https://github.com/Aiwiscal/ECG-ML-DL-Algorithm-Matlab
** 推荐文献:[1] Kiranyaz S, Ince T, Gabbouj M. Real-time patient-specific ECG classification by 1-D convolutional neural networks[J]. IEEE Transactions on Biomedical Engineering, 2016, 63(3): 664-675.
                         [2] 刘明, 李国军, 郝华青, 等. 基于卷积神经网络的 T 波形态分类[J]. 自动化学报, 2016, 42(9): 1339-1346.
                         [3] Zubair M, Kim J, Yoon C. An automated ECG beat classification system using convolutional neural networks[C]//IT Convergence and Security (ICITCS), 2016 6th International Conference on. IEEE, 2016: 1-5.
                         [4] Acharya U R, Oh S L, Hagiwara Y, et al. A deep convolutional neural network model to classify heartbeats[J]. Computers in biology and medicine, 2017, 89: 389-396.







欢迎光临 52matlab技术网站,matlab教程,matlab安装教程,matlab下载 (http://www.52matlab.com/) Powered by Discuz! X3.2