基于Tensorflow深度学习的ECG身份识别方法(二)
基于Tensorflow深度學(xué)習(xí)的ECG身份識(shí)別方法(一)
基于Tensorflow深度學(xué)習(xí)的ECG身份識(shí)別方法(二)
基于Tensorflow深度學(xué)習(xí)的ECG身份識(shí)別方法(三)
一、前言
????上一篇粗略展示了訓(xùn)練結(jié)果以及開發(fā)環(huán)境的搭建流程,本篇將介紹數(shù)據(jù)獲取以及數(shù)據(jù)處理過程。
二、數(shù)據(jù)獲取
????首先貼一下數(shù)據(jù)來源 https://www.physionet.org/cgi-bin/atm/ATM,該網(wǎng)站上 MIT-BIH Arrhythmia Database 數(shù)據(jù)庫有 48 條雙導(dǎo)聯(lián) ECG 數(shù)據(jù),采樣頻率為 360hz(1 秒采樣 360 個(gè)點(diǎn))。但是由于其數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜,仔細(xì)琢磨其中的讀取方法無疑增加了本次小項(xiàng)目的難度。所以本著拿來主義的原則,在網(wǎng)上找到了大神們寫好的 matlab 代碼,經(jīng)過小小的修改,將數(shù)據(jù)庫中第一導(dǎo)聯(lián)的數(shù)據(jù)轉(zhuǎn)換成文本格式分別存下來,這樣方便后續(xù)在 python 中處理。保存的文件已上傳,點(diǎn)此下載,設(shè)置了1積分下載,若是沒積分的童鞋可留下郵箱發(fā)給你。
三、數(shù)據(jù)處理
????經(jīng)過第二步的數(shù)據(jù)處理,得到了48個(gè)文件,每個(gè)文件中包含648000個(gè)數(shù)據(jù)。但是顯然我們并不需要這么多數(shù)據(jù)。我在前面幾次訓(xùn)練時(shí),每個(gè)樣本中取的數(shù)據(jù)是1080x500,然后在神經(jīng)網(wǎng)絡(luò)中將輸入數(shù)據(jù)1080變成360x3,迭代大概30次,這樣訓(xùn)練的準(zhǔn)確率其實(shí)很高,印象中有97%左右,但是比較耗時(shí)(CPU跑深度學(xué)習(xí)的速度真是不敢恭維,建議有條件的童鞋還是裝GPU版本的tensorflow)。后來就干脆取少一點(diǎn)數(shù)據(jù),每個(gè)樣本取360x60個(gè)數(shù)據(jù),要迭代50次左右,準(zhǔn)確率大概93%。反正是按需處理數(shù)據(jù)吧,如果只是像我一樣簡(jiǎn)單研究下可以取少量數(shù)據(jù)去做,如果是要做實(shí)際項(xiàng)目或者是其他對(duì)準(zhǔn)確度要求比較高的東西還需要考慮很多問題,比如去噪、采樣時(shí)間等問題。
????好了,步入正題,上面講了ECG數(shù)據(jù)庫被我用Matlab讀取并存放成了文本格式,這里講一下這個(gè)保存的文件在python中怎么處理。先貼代碼
#!/usr/bin/env python3 # -*- coding: utf-8 -*-import redata_len = 360 * 1#每個(gè)樣本個(gè)數(shù) 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):passdef read_from_matlab(self):passdef read_from_uart(self):passdef 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) # 使用正規(guī)表達(dá)式搜索字符串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 = 0maxtime = mintime + len(data) + 1return (index[mintime:maxtime], data[mintime:maxtime])def Pywt_methord(self):passif __name__ == '__main__':Ecg_object = EcgHandle()train_x = []train_y = []lable = 0for 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])#將數(shù)據(jù)存入train_x中train_y.append(lable)#將標(biāo)簽存入train_y中l(wèi)able = lable + 1????代碼就是將matlab中保存的文件讀取一部分出來,存放在 train_x 這個(gè) list 中,train_y是數(shù)據(jù)對(duì)應(yīng)的標(biāo)簽,每一個(gè)文件對(duì)應(yīng)一個(gè)唯一數(shù)字,一個(gè)文件取 60 組數(shù)據(jù),這 60 組數(shù)據(jù)就有 60 個(gè)相同的標(biāo)簽。
如果你說數(shù)據(jù)讀取你也不想讀,也行,我有上傳讀取出來序列化保存的文件。點(diǎn)此下載,同樣是1積分,沒積分的留郵箱。文件下載后幾行代碼就搞定了。代碼如下,記得修改下PATH為文件存放路徑,PATH最后的斜杠要多加一個(gè)轉(zhuǎn)義。
四、數(shù)據(jù)劃分
????做那么多事才把數(shù)據(jù)終于把心心念念的數(shù)據(jù)讀出來了,共 60 x 48 = 2880 組數(shù)據(jù),接下來要把這些數(shù)據(jù)劃分為訓(xùn)練集和測(cè)試集。先貼代碼。
train_num = 2700#訓(xùn)練數(shù)據(jù)大小Indices = np.arange(len(train_x)) # 隨機(jī)打亂索引 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 :]]????代碼很簡(jiǎn)單,把 2880 組數(shù)據(jù)先隨機(jī)打亂索引,然后取2700組數(shù)據(jù)當(dāng)做訓(xùn)練集,剩下的180組當(dāng)做測(cè)試集,用于后續(xù)模型評(píng)估。
五、小結(jié)
????本篇介紹了數(shù)據(jù)讀取、轉(zhuǎn)換、劃分,下一篇會(huì)介紹一維cnn網(wǎng)絡(luò)搭建。至此米已經(jīng)準(zhǔn)備好了,煮成熟飯也不遠(yuǎn)了。
——>下一篇
總結(jié)
以上是生活随笔為你收集整理的基于Tensorflow深度学习的ECG身份识别方法(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10系统cpu内核或逻辑核心缺少缺
- 下一篇: 六州歌头 本周(1216-1220)部