github: https://github.com/hzzhangqf0558/ECG_Nets
Baseline model collection of deep learning applied into ECGs. Those baseline models include 1D-ResNet, 1D-DenseNet, 1D-SE_ResNet, 1D-ResNext,1D-SE_ResNetV2, 1D-SE_ResNext and 1D-Top1Net(the champion model in Tianchi competition).
The F1-scores of those baseline models are in range of 0.83-0.90. you could fine-tune the parameters to reach a better level.
Step 1:
downloading datasets. The datasets from Tianchi competition includes dataset A and dataset B. The dataset A consists of 24106 ECGs, of which each has 8 leading records(I,II,V1,V2,V3,V4,V5, V6). while the dataset B consists of 20036 ECGs. Dataset can be downloaded from website.
https://pan.baidu.com/s/1fmCuV5i9oifnUNOsFhV0sA pwd: 8hs2
Please put the datasets into the fold: all_data.
Finally, unzip the data packages.
step 2: build environment
python 3.7 is required. And the requirements can be used directly.
pip install -r requirements.txt
step 3: create csv file.
config the dataset path in the data_preparing.py. Then
python data_preparing.py
step 4: choose a baseline model you like.
7 models are presented in the models fold and configs fold. Those
python main.py --config configs/ResNet50.yaml
if you want ensemble, please config the file configs/ensemble.
python ensemble.py --config configs/ensemble.yaml
https://tianchi.aliyun.com/competition/entrance/231754/information
https://www.hindawi.com/journals/cmmm/2019/7095137/
https://ieeexplore.ieee.org/abstract/document/9113436
前面的教程中说了有关1维卷积神经网络(CNN)在ECG算法中的应用,目前也有众多论文在该方面有所探讨。为什么在图像领域表现出色的CNN能够适用于ECG信号?原因我们前面也进行了一些分析,其实感性地说起来,就是ECG信号与2维图像存在诸多相似之处,使得CNN可以顺利从2维图像迁移到1维信号。那现在我们要思考一些两者的不同之处。
不知道大家有没有注意,在2维图像中,两个坐标往往被称为“空间”坐标,而在1维ECG信号中,唯一的坐标往往是“时间”坐标。在CNN的应用中,我们忽略两者的不同,仅关注两者相似的地方,即“局部相关性”和“平移不变性”,从而成功迁移CNN。但“时间”与“空间”概念终究是不同的,1维ECG信号,说到底,还是一个时间序列。时间序列中往往存在着复杂的因果关系,也是隐藏规律的所在。接触过深度学习领域的人都应该知道,处理时间序列,那就是循环神经网络(RNN)的长项了。理论上,RNN应该也可以处理1维ECG信号。但是,朴素的RNN有一个致命的问题:长程依赖问题。随后提出的RNN变种——长短时记忆网络(LSTM)可以良好的解决这个问题,因此成为了RNN应用的主要选择。
RNN的基本与展开结构如下图:
X0~Xt是我们所要输入的时间序列,h0~ht分别是各时刻的隐层状态。与CNN这种前馈网络不同,对于RNN来说,系统的输出会保留在网络里, 和系统下一刻的输入一起共同决定下一刻的输出。这种特性也使得RNN在处理语义方面非常突出,因为此刻的语义往往依赖于复杂的上文内容。但是,这样的简单RNN存在长程依赖问题,即最近输入的信息对结果影响是最大的,而最开始输入的信息已经被网络“遗忘”,很难再对结果产生较大影响。而后提出的LSTM引入了“输入门,输出门,遗忘门”的概念,可以解决这个问题,成为了RNN应用的主流,以下为朴素RNN与LSTM的比较:
RNN:
LSTM:
可以看到,LSTM的结构比朴素RNN复杂了不少。这里对RNN以及LSTM的原理不做讨论,有兴趣的可自行查阅 http://colah.github.io/posts/2015-08-Understanding-LSTMs/。而RNN(LSTM)的基本应用模式也可以分为以下几种,有“一对多”,“多对一”,两种“多对多”:
对于我们的ECG应用,我们采用最后一种方式,每个数据点是每个时刻的输入,把握每个时刻的网络输出。但是,我们最终输出的应该是目标信号的类别,而不是一个序列,所以得到每个时刻的网络输出组成的序列后,再送入一个全连接层,全连接层的输出就是One-hot类型的类别编码:
RNN系列网络的训练是BP算法的变种BPTT,同样我们在这里也不做过多展开。
这里我们的数据依然来源于我们在前面截取的心拍,基于TensorFlow深度学习框架。除了所用的网络有所不同,其他流程与前面教程中所述的CNN基本相同。可参考代码:https://github.com/Aiwiscal/ECG-ML-DL-Algorithm-Python/blob/master/Classification-DL_ULSTM.py 及所附注释。该代码中所用LSTM为单隐层,时间步数为250(与心拍长度一致),分4类。与前面的CNN一样,采用Adam方法训练。算法的评估方法也与前面教程相同,可自行查看代码输出。
这一节讲述了LSTM在ECG识别中的应用。因为基本框架未变,只是换了网络结构,所以这一篇没有太多的讲解,只是把大概思路说了一下。对RNN(LSTM)感兴趣的可自行查阅相关资料。
*代码下载:https://github.com/Aiwiscal/ECG-ML-DL-Algorithm-Python/blob/master/Classification-DL_ULSTM.py
*推荐阅读:http://colah.github.io/posts/2015-08-Understanding-LSTMs/
喜欢请点赞,github给颗星~~~~
https://github.com/Aiwiscal