{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\ncwd = os.getcwd()\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport torch\nimport torchvision\nimport torchvision.transforms as transforms\nimport torch.nn as nn\n\n\n\nimport seaborn as sns\nimport cv2\nfrom skimage import io\n\nfrom sklearn.model_selection import train_test_split\nimport tensorflow as tf\nfrom tensorflow.python.keras import Sequential\nfrom tensorflow.keras import layers, optimizers\nfrom tensorflow.keras.models import Model, load_model\nfrom tensorflow.keras.initializers import glorot_uniform\nfrom tensorflow.keras.utils import plot_model\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping, ModelCheckpoint, LearningRateScheduler\nimport tensorflow.keras.backend as K\n\nfrom tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Conv2DTranspose, concatenate, Input, Dropout\nfrom tensorflow.keras.applications import VGG19\nfrom tensorflow.keras.layers import (Dense, Dropout, Activation, Flatten, Input, Add,\n                                    BatchNormalization, LeakyReLU, Concatenate, GlobalAveragePooling2D,Conv2D, AveragePooling2D)\n\nfrom warnings import filterwarnings\nfilterwarnings('ignore')\n\nimport random\n\nimport glob\nfrom IPython.display import display\n\nfrom pathlib import Path\n\n# Set Color Palettes for the notebook\ncustom_colors = ['#74a09e','#86c1b2','#98e2c6','#f3c969','#f2a553', '#d96548', '#c14953']\nsns.palplot(sns.color_palette(custom_colors))\n\n# Set Style\nsns.set_style(\"whitegrid\")\nsns.despine(left=True, bottom=True)\n\nfrom scipy.stats import pearsonr\nimport pydicom\nimport re\nfrom sklearn.cluster import KMeans\nfrom skimage import morphology\nfrom skimage import measure\nfrom skimage.transform import resize\nfrom tensorflow.keras.utils import Sequence\nfrom tensorflow.keras.optimizers import Adam\nfrom PIL import Image\nimport h5py","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ROOT = Path('../input/osic-pulmonary-fibrosis-progression/')\n\ntrain = pd.read_csv(ROOT / 'train.csv')\ntest = pd.read_csv(ROOT / 'test.csv')\nsub = pd.read_csv(ROOT / 'sample_submission.csv')\n\nsub.info()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_tab(df):\n    ''' \n    This function gives an array wrt each patient containing\n    feature like age, gender and smoking status\n    '''\n    vector = [(df.Age.values[0]-30)/30]\n    \n    if df.Sex.values[0].lower() == 'male':\n        vector.append(0)\n    else:\n        vector.append(1)\n        \n    if df.SmokingStatus.values[0] == 'Never smoked':\n        vector.extend([0,0])\n    elif df.SmokingStatus.values[0] == 'Ex-smoker':\n        vector.extend([1,1])\n    elif df.SmokingStatus.values[0] == 'Currently smokes':\n        vector.extend([0,1])\n    else:\n        vector.extend([1,0])\n        \n    return np.array(vector)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_img(path):\n    d = pydicom.dcmread(path)\n    return cv2.resize(d.pixel_array/2**11 ,(512,512))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"A = {} #Stores slope value for each of the patient\nTAB = {} #Stores training data wrt each patient\nP = [] #Stores all unique patient id's\n\nfor i,p in enumerate(train.Patient.unique()):\n    sub = train.loc[train.Patient == p, :]\n    fvc = sub.FVC.values\n    week = sub.Weeks.values\n    #print(week)\n    c = np.vstack([week, np.ones(len(week))]).T\n    a, b = np.linalg.lstsq(c,fvc)[0]\n    #print(b)\n    \n    A[p] = a # Contains slope\n    TAB[p] = get_tab(sub) #Contains gender and smoking feature\n    P.append(p) #contains unique id\n   # print(TAB)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class IGenerator(Sequence):\n    \n    ''' \n    This is the generator class, which generates an input of batch size 32\n    i.e 32 patient's 2 dicom image, and features from tabular data is generated. As output \n    from his generator x and y contains pixel_data of a dicom image, tab conatins patient's meta\n    information, and 'a' is the coeffiecient wrt each patient. \n    '''\n    BAD_ID = ['ID00011637202177653955184', 'ID00052637202186188008618']\n    def __init__(self, keys, a, tab, batch_size=16):\n        self.keys = [k for k in keys if k not in self.BAD_ID]\n        self.a = a\n        self.tab = tab\n        self.batch_size = batch_size\n        \n        self.train_data = {}\n        for p in train.Patient.values:\n            self.train_data[p] = os.listdir(f'../input/osic-pulmonary-fibrosis-progression/train/{p}/')\n            #print(p)\n    def __len__(self):\n        return 1000\n    \n    def __getitem__(self, idx):\n        x = []\n        a, tab = [], [] \n        keys = np.random.choice(self.keys, size = self.batch_size)\n        \n        for k in keys:\n            try:\n                i = np.random.choice(self.train_data[k], size=1)[0]\n                img1 = get_img(f'../input/osic-pulmonary-fibrosis-progression/train/{k}/{i}')\n                x.append(img1)\n                a.append(self.a[k])\n                tab.append(self.tab[k])\n            except:\n                print(k, i)     \n        \n        x,a,tab = np.array(x), np.array(a), np.array(tab)\n        x = np.expand_dims(x, axis=-1)\n        \n        return [x,tab] , a","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_vgg16(input_img):\n   l1=Conv2D(filters=64,kernel_size=(3,3),padding=\"same\", activation=\"relu\")(input_img)\n   l2=Conv2D(filters=64, kernel_size=(3,3),padding=\"same\", activation=\"relu\")(l1)\n   l2_1=MaxPool2D(pool_size=(2,2),strides=(2,2))(l2)\n   l3=Conv2D(filters=128, kernel_size=(3,3), padding=\"same\", activation=\"relu\")(l2_1)\n   l4=Conv2D(filters=128, kernel_size=(3,3), padding=\"same\", activation=\"relu\")(l3)\n   l4_1=MaxPool2D(pool_size=(2,2),strides=(2,2))(l4)\n   l5=Conv2D(filters=256, kernel_size=(3,3), padding=\"same\", activation=\"relu\")(l4_1)\n   l6=Conv2D(filters=256, kernel_size=(3,3), padding=\"same\", activation=\"relu\")(l5)\n   l7=Conv2D(filters=256, kernel_size=(3,3), padding=\"same\", activation=\"relu\")(l6)\n   l7_1=MaxPool2D(pool_size=(2,2),strides=(2,2))(l7)\n   l8=Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\")(l7_1)\n   l9=Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\")(l8)\n   l10=Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\")(l9)\n   l10_1=MaxPool2D(pool_size=(2,2),strides=(2,2))(l10)\n   l11=Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\")(l10_1)\n   l12=Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\")(l11)\n   l13=Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\")(l12)\n   l13_1=MaxPool2D(pool_size=(2,2),strides=(2,2))(l13)\n   l13_2=Flatten()(l13_1)\n   l14=Dense(units=4096,activation=\"relu\")(l13_2)\n   l15=Dense(units=4096,activation=\"relu\")(l14)\n   l16=Dense(units=2, activation=\"softmax\")(l15)\n#Patient tabular data input\n   input3 = Input(shape=(4,))\n   z = tf.keras.layers.GaussianNoise(0.2)(input3)\n   xyz = Concatenate()([l16, z])\n   xyz = Dropout(0.6)(xyz) \n   xyz = Dense(1)(xyz)\n   return Model([input_img, input3] , xyz)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"im_height=512\nim_width=512","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"input_img = Input((im_height, im_width, 1), name='img')\nmodel = get_vgg16(input_img)\nmodel.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.001), loss=\"mae\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.load_weights('../input/vgg-16-5/model_5.h5', by_name=True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tr_p, vl_p = train_test_split(P, shuffle=True, train_size= 0.8)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"er = tf.keras.callbacks.EarlyStopping(\n    monitor=\"val_loss\",\n    min_delta=1e-3,\n    patience=5,\n    verbose=0,\n    mode=\"auto\",\n    baseline=None,\n    restore_best_weights=True,\n)\n\nhist1 = model.fit_generator(IGenerator(keys=tr_p, \n                               a = A, \n                               tab = TAB), \n                    steps_per_epoch = 200,\n                    validation_data=IGenerator(keys=vl_p, \n                               a = A, \n                               tab = TAB),\n                    validation_steps = 20,\n                    epochs=50)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save_weights('model_6.h5')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os, psutil  \n\ndef cpu_stats():\n    pid = os.getpid()\n    py = psutil.Process(pid)\n    memory_use = py.memory_info()[0] / 2. ** 30\n    return 'memory GB:' + str(np.round(memory_use, 2))\ncpu_stats()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(hist1.history['loss'])\nplt.plot(hist1.history['val_loss'])\nplt.title('model loss')\nplt.ylabel('loss')\nplt.xlabel('epoch')\nplt.legend(['train', 'validation'], loc='upper left')\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}