--- a
+++ b/4-Models/autoECG-tensorflow-keras/Transfer_Learning.py
@@ -0,0 +1,161 @@
+# -*- coding: utf-8 -*-
+
+
+# Commented out IPython magic to ensure Python compatibility.
+try:
+#   %tensorflow_version 2.x # enable TF 2.x in Colab
+except Exception:
+  pass
+
+import tensorflow as tf
+print(tf.__version__)
+
+# Commented out IPython magic to ensure Python compatibility.
+#Ccheck if using GPU
+# %tensorflow_version 2.x
+import tensorflow as tf
+print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))
+
+#predict
+# %% Import packages
+import numpy as np
+import warnings
+import argparse
+warnings.filterwarnings("ignore")
+from keras.models import load_model
+from keras.optimizers import Adam
+import h5py
+
+
+
+# %% Import
+# Import data
+#x = np.load('sim_ecg_data_new.npy')
+# Import model
+base_model = load_model("/content/gdrive/MyDrive/Colab Notebooks/model.hdf5",compile = False)
+base_model._name = 'nnnn'
+#model.compile(loss='binary_crossentropy', optimizer=Adam())
+#y_score = model.predict(x, batch_size=32, verbose=1)
+
+# Generate dataframe
+#np.save("dnn_output_paper.npy", y_score)
+
+###1. Model Building
+# Freeze the first 5 layers
+
+for i in range(5):
+    base_model.layers[i].trainable = False
+
+for i in range(5,50):
+    base_model.layers[i].trainable = True
+
+base_model.summary()
+
+inputs = base_model.inputs
+
+## Add 3 conv1d layers and three dense layers after the model structure
+
+from keras.models import Model
+from keras.layers import (Input, Conv1D, MaxPooling1D, Dropout,
+                          BatchNormalization, Activation, Add,
+                          Flatten, Dense)
+global_average_layer = tf.keras.layers.GlobalAveragePooling2D()
+ll = base_model.layers[45].output
+ll = tf.keras.layers.Conv1D(64, 2, activation='relu', input_shape=(16, 320))(ll)
+#ll = MaxPooling1D(pool_size=2)(ll)
+ll = tf.keras.layers.Conv1D(64, 2, activation='relu')(ll)
+ll = tf.keras.layers.Conv1D(64, 2, activation='relu')(ll)
+#ll = MaxPooling1D(pool_size=2)(ll)
+#ll = tf.keras.layers.Conv1D(32, 3, activation='relu', input_shape=(16, 320))(ll)
+#ll = MaxPooling1D(pool_size=2)(ll)
+ll = Flatten()(ll)
+ll = Dense(32,activation='relu')(ll)
+ll = Dense(64,activation='relu')(ll)
+ll = Dense(128,activation='relu')(ll)
+diagn = Dense(1,activation='sigmoid')(ll)
+'''
+ll = Flatten()(ll)
+ll = Dense(256,activation='sigmoid')(ll)
+ll = Dense(128,activation='sigmoid')(ll)
+ll = Dense(64,activation='sigmoid')(ll)
+ll = Dense(32,activation='sigmoid')(ll)
+diagn = Dense(1,activation='sigmoid')(ll)
+'''
+trans_model = Model(inputs,diagn)
+
+trans_model.summary()
+
+loss = tf.keras.losses.BinaryCrossentropy(from_logits=True, name='binary_crossentropy')
+lr = 0.0001 # lower
+
+batch_size = 64
+opt = Adam(lr)
+
+trans_model.compile(optimizer='adam',
+              loss='binary_crossentropy',
+              metrics=[tf.keras.metrics.BinaryAccuracy(), tf.keras.metrics.AUC(),
+                           tf.keras.metrics.Precision(), tf.keras.metrics.Recall()])
+
+### 2. Loading Data
+X_train= np.load('/data/Xtrain.npy')
+y_train=np.load('/data/ytrain.npy')
+X_test=np.load('/data/Xtest.npy')
+y_test=np.load('/data/ytest.npy')
+
+from autoecg_model_gpu import preprocess
+X_train=preprocess(X_train)
+X_test=preprocess(X_test)
+print(X_train.shape,X_test.shape)
+
+### 3. Fitting model
+import keras
+from datetime import datetime
+logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")
+tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)
+
+trans_model.load_weights('transfermodel.h5')
+
+history_2 = trans_model.fit(X_train,
+                          y_train,
+                          batch_size=64,
+                          epochs=50,
+                          validation_data=(X_test, y_test),
+                          callbacks=[tensorboard_callback]
+                         )
+
+### 4. Result plotting
+import matplotlib.pyplot as plt
+def plot(history):
+  
+  # The history object contains results on the training and test
+  # sets for each epoch
+  acc = history.history['binary_accuracy']
+  val_acc = history.history['val_binary_accuracy']
+  loss = history.history['loss']
+  val_loss = history.history['val_loss']
+
+  # Get the number of epochs
+  epochs = range(len(acc))
+
+  plt.title('Training and validation accuracy')
+  plt.plot(epochs, acc, color='blue', label='Train')
+  plt.plot(epochs, val_acc, color='orange', label='Val')
+  plt.xlabel('Epoch')
+  plt.ylabel('Accuracy')
+  plt.legend()
+
+  _ = plt.figure()
+  plt.title('Training and validation loss')
+  plt.plot(epochs, loss, color='blue', label='Train')
+  plt.plot(epochs, val_loss, color='orange', label='Val')
+  plt.xlabel('Epoch')
+  plt.ylabel('Loss')
+  plt.legend()
+
+plot(history_2)
+
+# Commented out IPython magic to ensure Python compatibility.
+# %load_ext tensorboard
+
+# Commented out IPython magic to ensure Python compatibility.
+# %tensorboard --logdir logs