mirror of
https://github.com/This-weiyuqing/ECG_by_Diffenert_CNN_Test.git
synced 2026-10-17 19:05:30 +08:00
take 51 conv kernel size test
this test prove in 101 kernel size the Degradation has occurred
This commit is contained in:
1 parent
9e65327579
commit
ba1ccb8a83
10 files changed
+254
No files matched your search
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
@@ -0,0 +1,82 @@
|
||||
import datetime
|
||||
import os
|
||||
|
||||
import numpy as np
|
||||
import pywt
|
||||
import wfdb
|
||||
import tensorflow as tf
|
||||
from tensorflow import keras
|
||||
from utils_fiftyone_of_ConvCNN import loadData, plot_history_tf, plot_heat_map
|
||||
|
||||
#from ECG_read_weiyuqing_without_wfdb import ECGDATAPATH
|
||||
#PATH of this test
|
||||
Project_PATH = "../Number-Of-Conv-Structure/FiftyOne/"
|
||||
#PICTUREPATH= Project_PATH + "picture/"
|
||||
log_dir = Project_PATH + "logs/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
|
||||
model_Path_one = Project_PATH + "model/ecg_model_fiftyone_conv.h5"
|
||||
#model_Path_one = Project_PATH + "ecg_model_one_layer.h5"
|
||||
|
||||
RATIO = 0.3
|
||||
RANDOM_SEED = 42
|
||||
BATCH_SIZE = 128
|
||||
#迭代次数
|
||||
NUM_EPOCHS = 10
|
||||
|
||||
|
||||
def CNN_model_level_one():
|
||||
leavlOneModel = tf.keras.models.Sequential([
|
||||
|
||||
#take test for one CNN layers model
|
||||
|
||||
tf.keras.layers.InputLayer(input_shape=(300,)),
|
||||
tf.keras.layers.Reshape(target_shape=(300, 1)),
|
||||
|
||||
tf.keras.layers.Conv1D(filters=15, kernel_size=101, strides=2, padding='same', activation='relu'),
|
||||
tf.keras.layers.MaxPool1D(pool_size=1, strides=2, padding='same'),
|
||||
|
||||
|
||||
|
||||
tf.keras.layers.Flatten(),
|
||||
tf.keras.layers.Dense(5, activation='softmax'),
|
||||
# add dropout layer, dropout rate = 0.2
|
||||
# tf.keras.layers.Dropout(rate=0.2),
|
||||
# tf.keras.layers.Dense(5, activation='softmax')
|
||||
])
|
||||
return leavlOneModel
|
||||
|
||||
|
||||
def main():
|
||||
# get traxin test
|
||||
X_train, X_test, y_train, y_test = loadData(RATIO, RANDOM_SEED)
|
||||
|
||||
# get model or create model
|
||||
if os.path.exists(model_Path_one):
|
||||
print(' get model in h5 file')
|
||||
model = tf.keras.models.load_model(filepath=model_Path_one)
|
||||
else:
|
||||
# create new model(if model unexists)
|
||||
model = CNN_model_level_one()
|
||||
model.compile(optimizer='adam',
|
||||
loss='sparse_categorical_crossentropy',
|
||||
metrics=['accuracy'])
|
||||
model.summary()
|
||||
# TB make
|
||||
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir,
|
||||
histogram_freq=1,
|
||||
)
|
||||
# Training and validation
|
||||
history = model.fit(X_train, y_train, epochs=NUM_EPOCHS,
|
||||
batch_size=BATCH_SIZE,
|
||||
validation_data=(X_test, y_test),
|
||||
callbacks=[tensorboard_callback])
|
||||
# validation_split=RATIO,
|
||||
model.save(filepath=model_Path_one)
|
||||
plot_history_tf(history)
|
||||
|
||||
y_pred = np.argmax(model.predict(X_test), axis=-1)
|
||||
plot_heat_map(y_test, y_pred)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
|
||||
main()
|
||||
@@ -0,0 +1,172 @@
|
||||
# this file give
|
||||
import os
|
||||
|
||||
import wfdb
|
||||
import pywt
|
||||
import seaborn
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from sklearn.metrics import confusion_matrix
|
||||
from sklearn.model_selection import train_test_split
|
||||
|
||||
# from _mian_tensorflow import Project_PATH
|
||||
Project_PATH = '../Number-Of-Conv-Structure/FiftyOne/'
|
||||
|
||||
PICTUREPATH = Project_PATH + 'picture/'
|
||||
|
||||
# from ECG_read_weiyuqing_without_wfdb import ECGDATAPATH
|
||||
MITBITECGDATAPATH = '../MIT-BIT/'
|
||||
|
||||
|
||||
# wavelet denoise preprocess using mallat algorithm
|
||||
|
||||
def denoise(date):
|
||||
# Wavelet db5 level9
|
||||
coeffs = pywt.wavedec(data=date, wavelet='db5', level=9)
|
||||
cA9, cD9, cD8, cD7, cD6, cD5, cD4, cD3, cD2, cD1 = coeffs
|
||||
# noice del
|
||||
threshold = (np.median(np.abs(cD1)) / 0.6745) * (np.sqrt(2 * np.log(len(cD1))))
|
||||
# take cD 1,2 turn 0 to denoise
|
||||
cD1.fill(0)
|
||||
cD2.fill(0)
|
||||
for i in range(1, len(coeffs) - 2):
|
||||
coeffs[i] = pywt.threshold(coeffs[i], threshold)
|
||||
# get signal that before wavelet
|
||||
rdata = pywt.waverec(coeffs=coeffs, wavelet='db5')
|
||||
return rdata
|
||||
|
||||
|
||||
# get ECG data,date type and denoise
|
||||
# this function without return
|
||||
# use append take return data to pass data
|
||||
def getDataSet(number, X_data, Y_data):
|
||||
ecgClassSet = ['N', 'A', 'V', 'L', 'R']
|
||||
print('get' + number + ' ECG data')
|
||||
record = wfdb.rdrecord(MITBITECGDATAPATH + number, channel_names=['MLII'])
|
||||
data = record.p_signal.flatten()
|
||||
# use def denoise
|
||||
rdata = denoise(date=data)
|
||||
|
||||
# get type of ECG data
|
||||
annotation = wfdb.rdann(MITBITECGDATAPATH + number, 'atr')
|
||||
Rlocation = annotation.sample # annotation.sample:get R
|
||||
Rclass = annotation.symbol
|
||||
|
||||
# delete stable date near R
|
||||
start = 10
|
||||
end = 5
|
||||
i = start
|
||||
j = len(annotation.symbol) - end
|
||||
|
||||
# get NAVLR type data
|
||||
while i < j:
|
||||
try:
|
||||
lable = ecgClassSet.index(Rclass[i])
|
||||
x_train = rdata[Rlocation[i] - 99:Rlocation[i] + 201]
|
||||
X_data.append(x_train)
|
||||
Y_data.append(lable)
|
||||
i += 1
|
||||
except ValueError:
|
||||
i += 1
|
||||
return
|
||||
|
||||
|
||||
# RATIO=The ratio of the training set to the test set,usually is 0.3
|
||||
def loadData(ratio, random_seed):
|
||||
numberSet = ['100', '101', '103', '105', '106', '107', '108', '109', '111', '112', '113', '114', '115',
|
||||
'116', '117', '119', '121', '122', '123', '124', '200', '201', '202', '203', '205', '208',
|
||||
'210', '212', '213', '214', '215', '217', '219', '220', '221', '222', '223', '228', '230',
|
||||
'231', '232', '233', '234']
|
||||
dataSet = []
|
||||
labelSet = []
|
||||
for n in numberSet:
|
||||
getDataSet(n, dataSet, labelSet)
|
||||
|
||||
# dataSet = np.array(dataSet).reshape(-1, 300)
|
||||
# labelSet = np.array(labelSet).reshape(-1, 1)
|
||||
|
||||
# reshape the data and split the dataset
|
||||
dataSet = np.array(dataSet).reshape(-1, 300)
|
||||
lableSet = np.array(labelSet).reshape(-1)
|
||||
X_train, X_test, y_train, y_test = train_test_split(dataSet, lableSet, test_size=ratio, random_state=random_seed)
|
||||
# print(X_train, X_test, y_train, y_test)
|
||||
return X_train, X_test, y_train, y_test
|
||||
|
||||
# train_ds = np.hstack((dataSet, labelSet))
|
||||
# np.random.shuffle(train_ds)
|
||||
#
|
||||
# X = train_ds[:, :300].reshape(-1, 300, 1)
|
||||
# Y = train_ds[:, 300]
|
||||
# # cut test and train data from ECG data
|
||||
# shuffle_index = np.random.permutation(len(X))
|
||||
# test_length = int(RATIO * len(shuffle_index))
|
||||
# test_index = shuffle_index[:test_length]
|
||||
# train_index = shuffle_index[test_index:]
|
||||
# X_test, Y_test = X[test_index:], Y[test_index]
|
||||
# X_train, Y_train = X[train_index], Y[train_index]
|
||||
# return X_train, Y_test, X_test, Y_train
|
||||
|
||||
|
||||
# confusion matrix
|
||||
def plot_heat_map(y_test, y_pred):
|
||||
con_mat = confusion_matrix(y_test, y_pred)
|
||||
# normalize
|
||||
# con_mat_norm = con_mat.astype('float') / con_mat.sum(axis=1)[:, np.newaxis]
|
||||
# con_mat_norm = np.around(con_mat_norm, decimals=2)
|
||||
# os.remove(PICTUREPATH+'confusion_matrix.png')
|
||||
# plot
|
||||
plt.figure(figsize=(8, 8))
|
||||
seaborn.heatmap(con_mat, annot=True, fmt='.20g', cmap='Blues')
|
||||
plt.ylim(0, 5)
|
||||
plt.xlabel('Predicted labels')
|
||||
plt.ylabel('True labels')
|
||||
plt.title('Confusion Matrix')
|
||||
plt.savefig(PICTUREPATH + 'confusion_matrix.png')
|
||||
plt.show()
|
||||
|
||||
|
||||
def plot_history_tf(history):
|
||||
# os.remove(PICTUREPATH+'accuracy.png')
|
||||
# os.remove(PICTUREPATH+'loss.png')
|
||||
|
||||
plt.figure(figsize=(8, 8))
|
||||
plt.plot(history.history['accuracy'])
|
||||
plt.plot(history.history['val_accuracy'])
|
||||
plt.title('Model Accuracy')
|
||||
plt.ylabel('Accuracy')
|
||||
plt.xlabel('Epoch')
|
||||
plt.legend(['Train', 'Test'], loc='upper left')
|
||||
plt.savefig(PICTUREPATH + 'accuracy.png')
|
||||
plt.show()
|
||||
|
||||
plt.figure(figsize=(8, 8))
|
||||
plt.plot(history.history['loss'])
|
||||
plt.plot(history.history['val_loss'])
|
||||
plt.title('Model Loss')
|
||||
plt.ylabel('Loss')
|
||||
plt.xlabel('Epoch')
|
||||
plt.legend(['Train', 'Test'], loc='upper left')
|
||||
plt.savefig(PICTUREPATH + 'loss.png')
|
||||
plt.show()
|
||||
|
||||
|
||||
def plot_history_torch(history):
|
||||
plt.figure(figsize=(8, 8))
|
||||
plt.plot(history['train_acc'])
|
||||
plt.plot(history['test_acc'])
|
||||
plt.title('Model Accuracy')
|
||||
plt.ylabel('Accuracy')
|
||||
plt.xlabel('Epoch')
|
||||
plt.legend(['Train', 'Test'], loc='upper left')
|
||||
plt.savefig(PICTUREPATH + 'accuracy.png')
|
||||
plt.show()
|
||||
|
||||
plt.figure(figsize=(8, 8))
|
||||
plt.plot(history['train_loss'])
|
||||
plt.plot(history['test_loss'])
|
||||
plt.title('Model Loss')
|
||||
plt.ylabel('Loss')
|
||||
plt.xlabel('Epoch')
|
||||
plt.legend(['Train', 'Test'], loc='upper left')
|
||||
plt.savefig(PICTUREPATH + 'loss.png')
|
||||
plt.show()
|
||||
Reference in new issue
Block a user