Diff of /train.py [000000] .. [56ff0f]

Switch to side-by-side view

--- a
+++ b/train.py
@@ -0,0 +1,154 @@
+
+import matplotlib.pyplot as plt
+import numpy as np
+import time
+import tensorflow as tf
+import pickle
+import wfdb
+from sklearn.utils import class_weight
+from sklearn.model_selection import train_test_split
+
+# Hyper-parameters
+sequence_length = 240
+epochs = 1000#int(input('Enter Number of Epochs (or enter default 1000): '))
+FS = 100.0
+
+def z_norm(result):
+    result_mean = np.mean(result)
+    result_std = np.std(result)
+    result = (result - result_mean) / result_std
+    return result
+
+def split_data(X):
+    X1 = []
+    X2 = []
+    for index in range(len(X)):
+        X1.append([X[index][0], X[index][1]])
+        X2.append([X[index][2], X[index][3]])
+
+    return np.array(X1).astype('float64'), np.array(X2).astype('float64')
+
+def get_data():
+    with open('train_input.pickle','rb') as f: 
+        X_train = np.asarray(pickle.load(f))
+    with open('train_label.pickle','rb') as f: 
+        y_train = np.asarray(pickle.load(f))
+    with open('val_input.pickle','rb') as f: 
+        X_val = np.asarray(pickle.load(f))
+    with open('val_label.pickle','rb') as f: 
+        y_val = np.asarray(pickle.load(f))
+    with open('test_input.pickle','rb') as f: 
+        X_test = np.asarray(pickle.load(f))
+    with open('test_label.pickle','rb') as f: 
+        y_test = np.asarray(pickle.load(f))
+
+
+    #X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42)
+    '''
+    X_train = X_train[:, 0, :]
+    X_test = X_test[:, 0, :]
+    X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
+    X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
+    '''
+    X_train1, X_train2 = split_data(X_train)
+    X_val1, X_val2 = split_data(X_val)
+    X_test1, X_test2 = split_data(X_test)
+
+    X_train1 = np.transpose(X_train1, (0, 2, 1))
+    #X_train2 = np.reshape(X_train2, (X_train2.shape[0], X_train2.shape[1], 1))
+    X_test1 = np.transpose(X_test1, (0, 2, 1))
+    #X_test2 = np.reshape(X_test2, (X_test2.shape[0], X_test2.shape[1], 1))
+    X_val1 = np.transpose(X_val1, (0, 2, 1))
+    return X_train1, X_train2, y_train, X_val1, X_val2, y_val, X_test1, X_test2, y_test
+
+
+
+def build_model():
+    
+    layers = {'input': 2, 'hidden1': 256, 'hidden2': 256, 'hidden3': 256, 'output': 1}
+    x1 = tf.keras.layers.Input(shape=(sequence_length, layers['input']))
+    m1 = tf.keras.layers.LSTM(layers['hidden1'],                   
+                    recurrent_dropout=0.5,
+                   return_sequences=True)(x1)
+    m1 = tf.keras.layers.LSTM(
+            layers['hidden2'],
+            recurrent_dropout=0.5,
+            return_sequences=True)(m1)
+
+    m1 = tf.keras.layers.LSTM(
+            layers['hidden3'],
+            recurrent_dropout=0.5,
+            return_sequences=False)(m1)
+
+    x2 = tf.keras.layers.Input(shape=(2,))
+    m2 = tf.keras.layers.Dense(32)(x2)
+
+    #merged = Merge([model1, model2], mode='concat')
+    merged = tf.keras.layers.Concatenate(axis=1)([m1, m2])
+
+    out = tf.keras.layers.Dense(8)(merged)
+    out = tf.keras.layers.Dense(layers['output'], kernel_initializer='normal')(out)
+    out = tf.keras.layers.Activation("sigmoid")(out)
+    
+    model = tf.keras.models.Model(inputs=[x1, x2], outputs=[out])
+
+    start = time.time()
+    model.compile(loss="binary_crossentropy", optimizer="adam",
+                  metrics = ['accuracy'])
+    print ("Compilation Time : ", time.time() - start)
+
+    model.summary()
+    return model
+
+
+def run_network(model=None, data=None):
+    global_start_time = time.time()
+
+    print ('\nData Loaded. Compiling...\n')
+    print('Loading data... ')
+    X_train1, X_train2, y_train, X_val1, X_val2, y_val, X_test1, X_test2, y_test = get_data()
+
+    class_w = class_weight.compute_class_weight(class_weight='balanced',
+                                                     classes=np.unique(y_train),
+                                                     y=y_train)
+
+    print (class_w)
+
+    if model is None:
+        model = build_model()
+
+    try:
+        print("Training")
+
+        class_w = {i : class_w[i] for i in range(2)}
+        callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3)
+        history = model.fit([X_train1, X_train2], y_train, 
+                            validation_data=([X_val1, X_val2], y_val),
+                            callbacks=[callback],
+                             epochs=epochs, batch_size=256, class_weight=class_w)
+
+        import matplotlib.pyplot as plt
+        '''
+        plt.plot(history.losses)
+        plt.ylabel('loss')
+        plt.xlabel('epoch')
+        plt.legend(['train'], loc='upper left')
+        plt.show()
+        '''
+        # Evaluate Model
+        y_pred = model.predict([X_test1, X_test2])
+        scores = model.evaluate([X_test1, X_test2], y_test)
+        print("%s: %.2f%%" % (model.metrics_names[1], scores[1] * 100))
+
+
+    except KeyboardInterrupt:
+        print("prediction exception")
+        print ('Training duration (s) : ', time.time() - global_start_time)
+        return model
+
+
+    print ('Training duration (s) : ', time.time() - global_start_time)
+
+    return model
+
+run_network()
\ No newline at end of file