基于Tensorflow深度学习的ECG身份识别方法(一)
基于Tensorflow深度学习的ECG身份识别方法(二)
基于Tensorflow深度学习的ECG身份识别方法(三)
上一篇粗略展示了训练结果以及开发环境的搭建流程,本篇将介绍数据获取以及数据处理过程。
首先贴一下数据来源 https://www.physionet.org/cgi-bin/atm/ATM,该网站上 MIT-BIH Arrhythmia Database 数据库有 48 条双导联 ECG 数据,采样频率为 360hz(1 秒采样 360 个点)。但是由于其数据结构比较复杂,仔细琢磨其中的读取方法无疑增加了本次小项目的难度。所以本着拿来主义的原则,在网上找到了大神们写好的 matlab 代码,经过小小的修改,将数据库中第一导联的数据转换成文本格式分别存下来,这样方便后续在 python 中处理。保存的文件已上传,点此下载,设置了1积分下载,若是没积分的童鞋可留下邮箱发给你。
经过第二步的数据处理,得到了48个文件,每个文件中包含648000个数据。但是显然我们并不需要这么多数据。我在前面几次训练时,每个样本中取的数据是1080x500,然后在神经网络中将输入数据1080变成360x3,迭代大概30次,这样训练的准确率其实很高,印象中有97%左右,但是比较耗时(CPU跑深度学习的速度真是不敢恭维,建议有条件的童鞋还是装GPU版本的tensorflow)。后来就干脆取少一点数据,每个样本取360x60个数据,要迭代50次左右,准确率大概93%。反正是按需处理数据吧,如果只是像我一样简单研究下可以取少量数据去做,如果是要做实际项目或者是其他对准确度要求比较高的东西还需要考虑很多问题,比如去噪、采样时间等问题。
好了,步入正题,上面讲了ECG数据库被我用Matlab读取并存放成了文本格式,这里讲一下这个保存的文件在python中怎么处理。先贴代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re
data_len = 360 * 1#每个样本个数
data_num = 60
Name_whole = [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 111, 112, 113, 114, 115,
116, 117, 118, 119, 121, 122, 123, 124, 200, 201, 202, 203, 205, 207, 208, 209,
210, 212, 213, 214, 215, 217, 219, 220, 221, 222, 223, 228, 230, 231, 232, 233, 234]
class EcgHandle(object):
def __init__(self):
pass
def read_from_matlab(self):
pass
def read_from_uart(self):
pass
def read_from_file(self, file_name):
self.ecg = list()
with open(file_name, 'r') as f:
file_list = f.readline()
aList = re.findall('([-+]?\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?', file_list) # 使用正规表达式搜索字符串
for ss in aList:
aNum = float((ss[0] + ss[2]))
self.ecg.append(aNum)
index = []
data = []
for i in range(len(self.ecg) - 1):
X = float(i)
Y = float(self.ecg[i])
index.append(X)
data.append(Y)
mintime = 0
maxtime = mintime + len(data) + 1
return (index[mintime:maxtime], data[mintime:maxtime])
def Pywt_methord(self):
pass
if __name__ == '__main__':
Ecg_object = EcgHandle()
train_x = []
train_y = []
lable = 0
for i in Name_whole:
(x, y) = Ecg_object.read_from_file(PATH + str(i))
for j in range(data_num):
train_x.append(y[j * data_len:(j + 1) * data_len])#将数据存入train_x中
train_y.append(lable)#将标签存入train_y中
lable = lable + 1
代码就是将matlab中保存的文件读取一部分出来,存放在 train_x 这个 list 中,train_y是数据对应的标签,每一个文件对应一个唯一数字,一个文件取 60 组数据,这 60 组数据就有 60 个相同的标签。
如果你说数据读取你也不想读,也行,我有上传读取出来序列化保存的文件。点此下载,同样是1积分,没积分的留邮箱。文件下载后几行代码就搞定了。代码如下,记得修改下PATH
为文件存放路径,PATH最后的斜杠要多加一个转义。
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import pickle
PATH = r'D:\VM\share\workspace\tensorflow_learn\train_file\\'
with open(PATH + 'train_x', 'rb') as f:
train_x = pickle.load(f)
with open(PATH + 'train_y', 'rb') as f:
train_y = pickle.load(f)
做那么多事才把数据终于把心心念念的数据读出来了,共 60 x 48 = 2880 组数据,接下来要把这些数据划分为训练集和测试集。先贴代码。
train_num = 2700#训练数据大小
Indices = np.arange(len(train_x)) # 随机打乱索引
np.random.shuffle(Indices)
Data_x = train_x
Data_y = train_y
train_x = np.array(Data_x)[Indices[:train_num ]]
train_y = np.array(Data_y)[Indices[:train_num ]]
test_x = np.array(Data_x)[Indices[train_num :]]
test_y = np.array(Data_y)[Indices[train_num :]]
代码很简单,把 2880 组数据先随机打乱索引,然后取2700组数据当做训练集,剩下的180组当做测试集,用于后续模型评估。
本篇介绍了数据读取、转换、划分,下一篇会介绍一维cnn网络搭建。至此米已经准备好了,煮成熟饭也不远了。
——>下一篇