基于Tensorflow深度学习的ECG身份识别方法(二)
一、前言
二、数据获取
三、数据处理
经过第二步的数据处理,得到了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 = rD:VMshareworkspace ensorflow_learn rain_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组当做测试集,用于后续模型评估。
五、小结
下一篇:
使用Redis实现关注好友的功能
