{"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 numpy as np\nimport pandas as pd\nimport pydicom as dicom\nimport cv2\nimport os \nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom keras_preprocessing.image.dataframe_iterator import DataFrameIterator\nimport matplotlib.pylab as plt\nfrom tensorflow.keras.utils import Sequence\nfrom keras.utils import data_utils\nfrom keras.applications.vgg19 import VGG19\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten\nimport tensorflow as tf\nfrom keras.layers.convolutional import Conv2D\nfrom keras.layers.core import Activation\nfrom keras.layers import Conv2D, MaxPooling2D, BatchNormalization\nimport pandas as pd\nfrom glob import glob\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nimport tensorflow_addons as tfa","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:14:15.880874Z","iopub.execute_input":"2021-11-08T20:14:15.881419Z","iopub.status.idle":"2021-11-08T20:14:15.89034Z","shell.execute_reply.started":"2021-11-08T20:14:15.881363Z","shell.execute_reply":"2021-11-08T20:14:15.889332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv('../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv')\ntest_df = pd.read_csv('../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv')\ntrain_array = np.array(train_df['BraTS21ID'])\ntrain_label =  np.array(train_df['MGMT_value'])\ntest_array = np.array(test_df['BraTS21ID'])\ntest_label =  np.array(test_df['MGMT_value'])\nDIM = 224\nNB_CHANNELS = 1\ni = 0\nBATCH_SIZE = 32\na = 0\ntrain_ds = pd.DataFrame(columns = ['path','label'] )\ntest_ds = pd.DataFrame(columns = ['path','label'] )","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:02:28.277547Z","iopub.execute_input":"2021-11-08T20:02:28.27786Z","iopub.status.idle":"2021-11-08T20:02:28.295074Z","shell.execute_reply.started":"2021-11-08T20:02:28.277832Z","shell.execute_reply":"2021-11-08T20:02:28.294292Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train_df)","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:02:29.33863Z","iopub.execute_input":"2021-11-08T20:02:29.338983Z","iopub.status.idle":"2021-11-08T20:02:29.344646Z","shell.execute_reply.started":"2021-11-08T20:02:29.338949Z","shell.execute_reply":"2021-11-08T20:02:29.343624Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:02:30.193684Z","iopub.execute_input":"2021-11-08T20:02:30.194063Z","iopub.status.idle":"2021-11-08T20:02:30.214685Z","shell.execute_reply.started":"2021-11-08T20:02:30.194021Z","shell.execute_reply":"2021-11-08T20:02:30.213813Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(str(10).zfill(5))","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:02:30.262399Z","iopub.execute_input":"2021-11-08T20:02:30.2627Z","iopub.status.idle":"2021-11-08T20:02:30.267294Z","shell.execute_reply.started":"2021-11-08T20:02:30.262665Z","shell.execute_reply":"2021-11-08T20:02:30.266268Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataframe_values = []\nfor a,b in zip(train_df['BraTS21ID'],train_df['MGMT_value']):\n    folders_list = os.listdir(f'../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/{str(a).zfill(5)}')\n    for folder in folders_list :  \n        img_list = os.listdir(f'../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/{str(a).zfill(5)}/{folder}')\n        for img in img_list : \n            dataframe_values.append({'path' : f'../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/{str(a).zfill(5)}/{folder}/{img}','label' : b})\ntrain_ds  = pd.DataFrame.from_dict(dataframe_values)\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_ds = train_ds[300000:].reset_index()\ntrain_ds = train_ds[:300000]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"eval_ds","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:45:21.112865Z","iopub.execute_input":"2021-11-08T20:45:21.11329Z","iopub.status.idle":"2021-11-08T20:45:21.131669Z","shell.execute_reply.started":"2021-11-08T20:45:21.113255Z","shell.execute_reply":"2021-11-08T20:45:21.130528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_ds","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:03:35.472276Z","iopub.execute_input":"2021-11-08T20:03:35.472783Z","iopub.status.idle":"2021-11-08T20:03:35.493489Z","shell.execute_reply.started":"2021-11-08T20:03:35.472744Z","shell.execute_reply":"2021-11-08T20:03:35.492431Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# unlabeled Data","metadata":{}},{"cell_type":"code","source":"dataframe_values = []\nfor a,b in zip(test_df['BraTS21ID'],test_df['MGMT_value']):\n    folders_list = os.listdir(f'../input/rsna-miccai-brain-tumor-radiogenomic-classification/test/{str(a).zfill(5)}')\n    for folder in folders_list :    \n        img_list = os.listdir(f'../input/rsna-miccai-brain-tumor-radiogenomic-classification/test/{str(a).zfill(5)}/{folder}')\n        for img in img_list : \n            dataframe_values.append({'path' : f'../input/rsna-miccai-brain-tumor-radiogenomic-classification/test/{str(a).zfill(5)}/{folder}/{img}','label' : b})\ntest_ds  = pd.DataFrame.from_dict(dataframe_values)\n","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:03:35.495651Z","iopub.execute_input":"2021-11-08T20:03:35.496489Z","iopub.status.idle":"2021-11-08T20:03:45.171179Z","shell.execute_reply.started":"2021-11-08T20:03:35.496445Z","shell.execute_reply":"2021-11-08T20:03:45.170303Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_ds","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:03:45.172539Z","iopub.execute_input":"2021-11-08T20:03:45.172901Z","iopub.status.idle":"2021-11-08T20:03:45.186269Z","shell.execute_reply.started":"2021-11-08T20:03:45.172865Z","shell.execute_reply":"2021-11-08T20:03:45.185294Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_augmentation_parameters = dict(\n    rescale=1.0/255.0,\n    rotation_range=10,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    fill_mode='nearest',\n    brightness_range = [0.8, 1.2])\n\nvalid_augmentation_parameters = dict(\n    rescale=1.0/255.0)\n\n# Using the training phase generators \ntrain_augmenter = ImageDataGenerator(**train_augmentation_parameters)\nvalid_augmenter = ImageDataGenerator(**valid_augmentation_parameters)","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:03:45.187822Z","iopub.execute_input":"2021-11-08T20:03:45.188504Z","iopub.status.idle":"2021-11-08T20:03:45.19721Z","shell.execute_reply.started":"2021-11-08T20:03:45.188461Z","shell.execute_reply":"2021-11-08T20:03:45.196213Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# in this part of code , i will use keras dataGenerator  ,the problem here is that it generates the whole folder, so the first layer input for example is [900,512,512,1] which is going to give an OOM Error , so the solution here is to make a 16 (just an example ) FramesDatagenerator","metadata":{}},{"cell_type":"code","source":"\"\"\"class Frames_Generator(data_utils.Sequence):\n    'Generates data for Keras'\n    def __init__(self,Sample_array, batch_size=1, dim=(512,512), shuffle=True,  train = True ):\n        'Initialization'\n        self.batch_size = batch_size\n        self.Sample_array = Sample_array \n        self.shuffle = shuffle\n        self.dim = dim\n        self.train = train\n        self.on_epoch_end()\n    def __len__(self):\n        'Denotes the number of batches per epoch'\n        return int(np.floor(len(self.Sample_array) / self.batch_size))\n\n    def __getitem__(self, index):\n        'Generate one batch of data'\n        # Generate indexes of the batch\n        indexes = self.indexes[index*self.batch_size:(index+1)*self.batch_size]\n\n        # Find list of IDs\n        list_IDs_temp = [str(self.Sample_array[k]).zfill(5) for k in indexes]\n        #list_IDs_temp = [20]\n        # Generate data\n        X, y = self.__data_generation(list_IDs_temp, index)\n        X =  np.array([X])[0]\n        y =  np.array([y])\n        y = y.reshape(y.shape[1])\n        randomize = np.arange(y.shape[0])\n        np.random.shuffle(randomize)\n        X = X[randomize]\n        y = y[randomize]\n        #train_generator = train_augmenter.flow(X ,y,batch_size = 32 )\n        return X, y\n    def on_epoch_end(self):\n        'Updates indexes after each epoch'\n        self.indexes = np.arange(len(self.Sample_array))\n        if self.shuffle == True:\n            np.random.shuffle(self.indexes)\n\n    def __data_generation(self, list_IDs_temp,index):\n        label_train  = []\n        Frame_train = [] \n        global a \n        global b\n        print(list_IDs_temp[0])\n        if self.train :\n            folders_list = os.listdir(f'../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/{list_IDs_temp[0]}')\n            for folder in folders_list : \n                img_list = os.listdir(f'../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/{list_IDs_temp[0]}/{folder}')\n                for img in img_list :\n                    ds = dicom.dcmread(f'../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/{list_IDs_temp[0]}/{folder}/{img}').pixel_array\n                    img = cv2.resize(ds,self.dim)\n                    img = img.reshape(self.dim[0],self.dim[1],1)\n                    label_train.append(train_label[index])\n                    Frame_train.append(img)\n        else : \n            folders_list = os.listdir(f'../input/rsna-miccai-brain-tumor-radiogenomic-classification/test/{list_IDs_temp[0]}')\n            for folder in folders_list : \n                img_list = os.listdir(f'../input/rsna-miccai-brain-tumor-radiogenomic-classification/test/{list_IDs_temp[0]}/{folder}')\n                for img in img_list :\n                    ds = dicom.dcmread(f'../input/rsna-miccai-brain-tumor-radiogenomic-classification/test/{list_IDs_temp[0]}/{folder}/{img}').pixel_array\n                    img = cv2.resize(ds,self.dim)\n                    img = img.reshape(dim[0],dim[1],1)\n                    label_train.append(test_label[index])\n                    Frame_train.append(img)    \n        return Frame_train, label_train\"\"\"","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:13:10.282084Z","iopub.execute_input":"2021-10-01T13:13:10.282593Z","iopub.status.idle":"2021-10-01T13:13:10.295071Z","shell.execute_reply.started":"2021-10-01T13:13:10.282531Z","shell.execute_reply":"2021-10-01T13:13:10.293679Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"# Parameters\nparams = {'dim': (512,512),\n          'batch_size': 1,\n          'shuffle': True, \n           'train' : True }\nvalid_params = {'dim': (512,512),\n          'batch_size': 1,\n          'shuffle': True,\n          'train':False}\ntraining_generator = Frames_Generator(train_array, **params)\nvalidation_generator = Frames_Generator(test_array, **valid_params)\"\"\"\n","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:13:10.299632Z","iopub.execute_input":"2021-10-01T13:13:10.300266Z","iopub.status.idle":"2021-10-01T13:13:10.308593Z","shell.execute_reply.started":"2021-10-01T13:13:10.300158Z","shell.execute_reply":"2021-10-01T13:13:10.307183Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# part2 ","metadata":{}},{"cell_type":"code","source":"class Frames_Generator(data_utils.Sequence):\n    'Generates data for Keras'\n    def __init__(self,Sample_df = np.arange(len(train_ds)//BATCH_SIZE-8) , batch_size=1, dim=(224,224), shuffle=True ,train_ds = train_ds,nb_steps = 0 ):\n        'Initialization'\n        self.batch_size = batch_size\n        self.Sample_df = Sample_df\n        self.shuffle = shuffle\n        self.dim = dim\n        self.train_ds = train_ds\n        self.nb_steps = nb_steps\n        self.on_epoch_end()\n    def __len__(self):\n        'Denotes the number of batches per epoch'\n        return int(np.floor(len(self.Sample_df) / self.batch_size))\n\n    def __getitem__(self, index):\n        'Generate one batch of data'\n        # Generate indexes of the batch\n        indexes = self.indexes[index*self.batch_size:(index+1)*self.batch_size]\n\n        # Find list of IDs\n        list_IDs_temp = [str(self.Sample_df[k]).zfill(5) for k in indexes]\n        #list_IDs_temp = [20]\n        # Generate data\n        X, y = self.__data_generation(list_IDs_temp)\n        X =  np.array([X])[0]\n        y =  np.array([y])\n        y = y.reshape(y.shape[1])\n        randomize = np.arange(y.shape[0])\n        np.random.shuffle(randomize)\n        X = X[randomize]\n        y = y[randomize]\n        #train_generator = train_augmenter.flow(X ,y,batch_size = 32 )\n        return X/255, y\n    def on_epoch_end(self):\n        'Updates indexes after each epoch'\n        self.indexes = np.arange(len(self.Sample_df))\n        if self.shuffle == True:\n            np.random.shuffle(self.indexes)\n\n    def __data_generation(self, list_IDs_temp):\n        label_train  = []\n        Frame_train = [] \n        i = 0\n        while(i<8) : \n            ds = dicom.dcmread(self.train_ds['path'][self.nb_steps]).pixel_array\n            img = cv2.resize(ds,self.dim)\n            img = img.reshape(self.dim[0],self.dim[1],1)\n            \n            label = self.train_ds['label'][self.nb_steps]\n            label_train.append(self.train_ds['label'][self.nb_steps])\n            Frame_train.append(img)\n            self.nb_steps += 1 \n            i +=1\n            if  self.nb_steps == len(self.train_ds) :\n                self.nb_steps = 0\n        return Frame_train, label_train","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:03:45.198828Z","iopub.execute_input":"2021-11-08T20:03:45.199397Z","iopub.status.idle":"2021-11-08T20:03:45.215883Z","shell.execute_reply.started":"2021-11-08T20:03:45.199359Z","shell.execute_reply":"2021-11-08T20:03:45.214948Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train_ds)//BATCH_SIZE-8","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:03:45.218952Z","iopub.execute_input":"2021-11-08T20:03:45.219489Z","iopub.status.idle":"2021-11-08T20:03:45.230242Z","shell.execute_reply.started":"2021-11-08T20:03:45.219449Z","shell.execute_reply":"2021-11-08T20:03:45.22901Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Parameters\ntrain_params = {'Sample_df':np.arange(len(train_ds)//BATCH_SIZE-8),\n          'dim': (224,224),\n          'batch_size': 1,\n          'shuffle': True, \n           'train_ds' : train_ds,\n         'nb_steps': 0}\ntest_params = {'Sample_df':np.arange(len(test_ds)//BATCH_SIZE-8),\n          'dim': (224,224),\n          'batch_size': 1,\n          'shuffle': True, \n           'train_ds' : test_ds,\n         'nb_steps': 0}\nval_params = {'Sample_df':np.arange(len(val_ds)//BATCH_SIZE-8),\n          'dim': (224,224),\n          'batch_size': 1,\n          'shuffle': True, \n           'train_ds' : val_ds,\n         'nb_steps': 0}\neval_params = {'Sample_df':np.arange(len(val_ds)//BATCH_SIZE-8),\n          'dim': (224,224),\n          'batch_size': 1,\n          'shuffle': True, \n           'train_ds' : eval_ds,\n         'nb_steps': 0}\n\ntraining_generator = Frames_Generator(**train_params)\ntest_generator = Frames_Generator(**val_params)\nvalidation_generator = Frames_Generator(**test_params)\nevaluation_generator = Frames_Generator(**eval_params)","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:38:29.686922Z","iopub.execute_input":"2021-11-08T20:38:29.687368Z","iopub.status.idle":"2021-11-08T20:38:29.697702Z","shell.execute_reply.started":"2021-11-08T20:38:29.687326Z","shell.execute_reply":"2021-11-08T20:38:29.696798Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"x , y = validation_generator.__getitem__(0)\"\"\"","metadata":{"execution":{"iopub.status.busy":"2021-11-08T15:30:46.017565Z","iopub.execute_input":"2021-11-08T15:30:46.018266Z","iopub.status.idle":"2021-11-08T15:30:46.035996Z","shell.execute_reply.started":"2021-11-08T15:30:46.018222Z","shell.execute_reply":"2021-11-08T15:30:46.034795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"arr = np.arange(len(train_ds)//BATCH_SIZE)\nlen(arr)","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:03:45.24219Z","iopub.execute_input":"2021-11-08T20:03:45.242814Z","iopub.status.idle":"2021-11-08T20:03:45.252055Z","shell.execute_reply.started":"2021-11-08T20:03:45.242775Z","shell.execute_reply":"2021-11-08T20:03:45.251054Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Baseline model","metadata":{}},{"cell_type":"code","source":"\nmodel = Sequential()\nmodel.add(Conv2D(32, (3, 3), padding=\"same\",input_shape = (DIM , DIM , NB_CHANNELS)))\nmodel.add(Conv2D(32, (3, 3), padding=\"same\"))\nmodel.add(Activation(\"relu\"))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization(axis=1))\nmodel.add(MaxPooling2D(pool_size=(3, 3)))\nmodel.add(Conv2D(64, (3, 3), padding=\"same\"))\nmodel.add(Conv2D(64, (3, 3), padding=\"same\"))\nmodel.add(Activation(\"relu\"))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization(axis=1))\nmodel.add(Conv2D(64, (3, 3), padding=\"same\"))\nmodel.add(Conv2D(64, (3, 3), padding=\"same\"))\nmodel.add(Activation(\"relu\"))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization(axis=1))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Conv2D(128, (3, 3), padding=\"same\"))\nmodel.add(Activation(\"relu\"))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization(axis=1))\nmodel.add(Conv2D(128, (3, 3), padding=\"same\"))\nmodel.add(Conv2D(128, (3, 3), padding=\"same\"))\nmodel.add(Activation(\"relu\"))\nmodel.add(Dropout(0.2))\nmodel.add(BatchNormalization(axis=1))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Flatten())\nmodel.add(Dense(1024))\nmodel.add(Dropout(0.2))\nmodel.add(Activation(\"relu\"))\nmodel.add(BatchNormalization())\nmodel.add(Dense(512))\nmodel.add(Dropout(0.2))\nmodel.add(Activation(\"relu\"))\nmodel.add(BatchNormalization())\nmodel.add(Dense(64))\nmodel.add(Dropout(0.2))\nmodel.add(Activation(\"relu\"))\nmodel.add(BatchNormalization())\nmodel.add(Dense(16))\nmodel.add(Dropout(0.2))\nmodel.add(Activation(\"relu\"))\nmodel.add(BatchNormalization())\nmodel.add(Dense(1))\nmodel.add(Activation(\"sigmoid\"))\nmodel.build((0,512,512,1))\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:03:45.25366Z","iopub.execute_input":"2021-11-08T20:03:45.254076Z","iopub.status.idle":"2021-11-08T20:03:47.692732Z","shell.execute_reply.started":"2021-11-08T20:03:45.254038Z","shell.execute_reply":"2021-11-08T20:03:47.691794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# VGG19 Model ","metadata":{}},{"cell_type":"code","source":"\n# Create the base model of VGG19\nvgg19 = VGG19( include_top=False, input_shape = (512, 512, 3) , weights = 'imagenet')","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:16:21.419151Z","iopub.execute_input":"2021-10-01T13:16:21.419489Z","iopub.status.idle":"2021-10-01T13:16:22.085066Z","shell.execute_reply.started":"2021-10-01T13:16:21.419452Z","shell.execute_reply":"2021-10-01T13:16:22.084164Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vgg19.summary()\n","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:16:24.775911Z","iopub.execute_input":"2021-10-01T13:16:24.776255Z","iopub.status.idle":"2021-10-01T13:16:24.792435Z","shell.execute_reply.started":"2021-10-01T13:16:24.776225Z","shell.execute_reply":"2021-10-01T13:16:24.791565Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vgg = Sequential()\nvgg.add(Conv2D(3, (3, 3), padding=\"same\",input_shape = (DIM , DIM , NB_CHANNELS)))\nfor layer in vgg19.layers[1:-1]: # this is where I changed your code\n    vgg.add(layer)    \n# Freeze the layers \n#for layer in model.layers:\n#    layer.trainable = False","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:16:25.401601Z","iopub.execute_input":"2021-10-01T13:16:25.401961Z","iopub.status.idle":"2021-10-01T13:16:25.503347Z","shell.execute_reply.started":"2021-10-01T13:16:25.401932Z","shell.execute_reply":"2021-10-01T13:16:25.502523Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nvgg.add(Flatten())\nvgg.add(Dense(64 , activation = 'relu'))\nvgg.add(Dense(32 , activation = 'relu'))\nvgg.add(Dense(1, activation='sigmoid'))","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:16:26.053129Z","iopub.execute_input":"2021-10-01T13:16:26.053473Z","iopub.status.idle":"2021-10-01T13:16:26.088601Z","shell.execute_reply.started":"2021-10-01T13:16:26.053438Z","shell.execute_reply":"2021-10-01T13:16:26.08779Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vgg.summary()\n","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:16:27.121503Z","iopub.execute_input":"2021-10-01T13:16:27.121908Z","iopub.status.idle":"2021-10-01T13:16:27.142522Z","shell.execute_reply.started":"2021-10-01T13:16:27.121877Z","shell.execute_reply":"2021-10-01T13:16:27.141743Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.callbacks import ReduceLROnPlateau\n\nlearning_rate_reduction = ReduceLROnPlateau(monitor='accuracy',\n                                            patience = 1,\n                                            verbose=1,\n                                            factor=0.1,\n                                            min_lr=0.000001)\n\nopt = tf.keras.optimizers.Adam(learning_rate=0.99)\n\nmodel.compile(optimizer = opt, loss='binary_crossentropy', metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:16:27.88488Z","iopub.execute_input":"2021-10-01T13:16:27.885202Z","iopub.status.idle":"2021-10-01T13:16:27.90263Z","shell.execute_reply.started":"2021-10-01T13:16:27.88517Z","shell.execute_reply":"2021-10-01T13:16:27.901732Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(training_generator,validation_data = test_generator , epochs = 5 ,callbacks = [learning_rate_reduction])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save(\"./model.h5\")\n","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:13:33.241043Z","iopub.status.idle":"2021-10-01T13:13:33.241609Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# # VIT model","metadata":{}},{"cell_type":"code","source":"num_classes = 1\ninput_shape = (224, 224, 1)\nlearning_rate = 0.001\nweight_decay = 0.0001\nbatch_size = 64\nnum_epochs = 100\nimage_size = 224  # We'll resize input images to this size\npatch_size = 6  # Size of the patches to be extract from the input images\nnum_patches = (image_size // patch_size) ** 2\nprojection_dim = 64\nnum_heads = 4\ntransformer_units = [\n    projection_dim * 2,\n    projection_dim,\n]  # Size of the transformer layers\ntransformer_layers = 2\nmlp_head_units = [512, 256]  # Size of the dense layers of the final classifier","metadata":{"execution":{"iopub.status.busy":"2021-10-18T22:38:10.6839Z","iopub.execute_input":"2021-10-18T22:38:10.684233Z","iopub.status.idle":"2021-10-18T22:38:10.689716Z","shell.execute_reply.started":"2021-10-18T22:38:10.68419Z","shell.execute_reply":"2021-10-18T22:38:10.688768Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def mlp(x, hidden_units, dropout_rate):\n    for units in hidden_units:\n        x = layers.Dense(units, activation=tf.nn.gelu)(x)\n        x = layers.Dropout(dropout_rate)(x)\n    return x","metadata":{"execution":{"iopub.status.busy":"2021-10-18T22:38:11.555754Z","iopub.execute_input":"2021-10-18T22:38:11.55606Z","iopub.status.idle":"2021-10-18T22:38:11.56122Z","shell.execute_reply.started":"2021-10-18T22:38:11.556031Z","shell.execute_reply":"2021-10-18T22:38:11.560294Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Patches(layers.Layer):\n    def __init__(self, patch_size):\n        super(Patches, self).__init__()\n        self.patch_size = patch_size\n\n    def call(self, images):\n        batch_size = tf.shape(images)[0]\n        patches = tf.image.extract_patches(\n            images=images,\n            sizes=[1, self.patch_size, self.patch_size, 1],\n            strides=[1, self.patch_size, self.patch_size, 1],\n            rates=[1, 1, 1, 1],\n            padding=\"VALID\",\n        )\n        patch_dims = patches.shape[-1]\n        patches = tf.reshape(patches, [batch_size, -1, patch_dims])\n        return patches","metadata":{"execution":{"iopub.status.busy":"2021-10-18T22:38:12.436532Z","iopub.execute_input":"2021-10-18T22:38:12.436853Z","iopub.status.idle":"2021-10-18T22:38:12.444202Z","shell.execute_reply.started":"2021-10-18T22:38:12.436825Z","shell.execute_reply":"2021-10-18T22:38:12.442984Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class PatchEncoder(layers.Layer):\n    def __init__(self, num_patches, projection_dim):\n        super(PatchEncoder, self).__init__()\n        self.num_patches = num_patches\n        self.projection = layers.Dense(units=projection_dim)\n        self.position_embedding = layers.Embedding(\n            input_dim=num_patches, output_dim=projection_dim\n        )\n\n    def call(self, patch):\n        positions = tf.range(start=0, limit=self.num_patches, delta=1)\n        encoded = self.projection(patch) + self.position_embedding(positions)\n        return encoded","metadata":{"execution":{"iopub.status.busy":"2021-10-18T22:38:13.320167Z","iopub.execute_input":"2021-10-18T22:38:13.320497Z","iopub.status.idle":"2021-10-18T22:38:13.326506Z","shell.execute_reply.started":"2021-10-18T22:38:13.320446Z","shell.execute_reply":"2021-10-18T22:38:13.325492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_vit_classifier():\n    inputs = layers.Input(shape=input_shape)\n    # Create patches.\n    patches = Patches(patch_size)(inputs)\n    # Encode patches.\n    encoded_patches = PatchEncoder(num_patches, projection_dim)(patches)\n\n    # Create multiple layers of the Transformer block.\n    for _ in range(transformer_layers):\n        # Layer normalization 1.\n        x1 = layers.LayerNormalization(epsilon=1e-6)(encoded_patches)\n        # Create a multi-head attention layer.\n        attention_output = layers.MultiHeadAttention(\n            num_heads=num_heads, key_dim=projection_dim, dropout=0.1\n        )(x1, x1)\n        # Skip connection 1.\n        x2 = layers.Add()([attention_output, encoded_patches])\n        # Layer normalization 2.\n        x3 = layers.LayerNormalization(epsilon=1e-6)(x2)\n        # MLP.\n        x3 = mlp(x3, hidden_units=transformer_units, dropout_rate=0.1)\n        # Skip connection 2.\n        encoded_patches = layers.Add()([x3, x2])\n\n    # Create a [batch_size, projection_dim] tensor.\n    representation = layers.LayerNormalization(epsilon=1e-6)(encoded_patches)\n    representation = layers.Flatten()(representation)\n    representation = layers.Dropout(0.5)(representation)\n    # Add MLP.\n    features = mlp(representation, hidden_units=mlp_head_units, dropout_rate=0.5)\n    # Classify outputs.\n    logits = layers.Dense(1, activation='sigmoid')(features)\n    # Create the Keras model.\n    model = keras.Model(inputs=inputs, outputs=logits)\n    \n    return model","metadata":{"execution":{"iopub.status.busy":"2021-10-18T22:38:14.576413Z","iopub.execute_input":"2021-10-18T22:38:14.576778Z","iopub.status.idle":"2021-10-18T22:38:14.585737Z","shell.execute_reply.started":"2021-10-18T22:38:14.576747Z","shell.execute_reply":"2021-10-18T22:38:14.584917Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def run_experiment(model):\n    opt = tf.keras.optimizers.Adam(learning_rate=1e-4)\n\n    model.compile(\n        optimizer=opt,\n        loss='binary_crossentropy',\n        metrics=[ 'accuracy' ],\n    )\n\n    checkpoint_filepath = \"/tmp/checkpoint\"\n    checkpoint_callback = keras.callbacks.ModelCheckpoint(\n        checkpoint_filepath,\n        monitor=\"val_accuracy\",\n        save_best_only=True,\n        save_weights_only=True,\n    )\n\n    history = model.fit(training_generator,validation_data = test_generator ,epochs = 5 ,callbacks=[checkpoint_callback])\n    model.load_weights(checkpoint_filepath)\n    model.save(\"./model.h5\")\n    \n    return history\n\n\n#vit_classifier = create_vit_classifier()\n#print(vit_classifier.summary())\n","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:03:47.693895Z","iopub.execute_input":"2021-11-08T20:03:47.694282Z","iopub.status.idle":"2021-11-08T20:03:47.700209Z","shell.execute_reply.started":"2021-11-08T20:03:47.694251Z","shell.execute_reply":"2021-11-08T20:03:47.699343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = run_experiment(model)","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:03:47.701472Z","iopub.execute_input":"2021-11-08T20:03:47.701823Z","iopub.status.idle":"2021-11-08T20:14:15.878247Z","shell.execute_reply.started":"2021-11-08T20:03:47.701788Z","shell.execute_reply":"2021-11-08T20:14:15.877113Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"type(model)","metadata":{"execution":{"iopub.status.busy":"2021-11-08T20:36:22.974577Z","iopub.execute_input":"2021-11-08T20:36:22.974952Z","iopub.status.idle":"2021-11-08T20:36:22.980561Z","shell.execute_reply.started":"2021-11-08T20:36:22.974917Z","shell.execute_reply":"2021-11-08T20:36:22.979496Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.evaluate(evaluation_generator , batch_size = 54)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#model = tf.keras.models.load_model('../input/tumor-model/model.h5')","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:13:33.242989Z","iopub.status.idle":"2021-10-01T13:13:33.243585Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save(\"./model.h5\")","metadata":{"execution":{"iopub.status.busy":"2021-10-02T17:01:41.464683Z","iopub.execute_input":"2021-10-02T17:01:41.465024Z","iopub.status.idle":"2021-10-02T17:01:41.489303Z","shell.execute_reply.started":"2021-10-02T17:01:41.464994Z","shell.execute_reply":"2021-10-02T17:01:41.487901Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result = model.predict(validation_generator, verbose = True, workers = 2)\n","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:13:33.244804Z","iopub.status.idle":"2021-10-01T13:13:33.245373Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result.shape","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:13:33.246666Z","iopub.status.idle":"2021-10-01T13:13:33.247234Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_dir = '../input/rsna-miccai-brain-tumor-radiogenomic-classification/test'\npatients_test = sorted(os.listdir(data_dir))","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:13:33.248693Z","iopub.status.idle":"2021-10-01T13:13:33.24926Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"patients_test","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:13:33.250617Z","iopub.status.idle":"2021-10-01T13:13:33.251186Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_result = []\ni = 0\nfor patient in patients_test:\n    arr = os.listdir('../input/rsna-miccai-brain-tumor-radiogenomic-classification/test/' + patient)\n    length = 0\n    for j in arr : \n        lenn = len(glob('../input/rsna-miccai-brain-tumor-radiogenomic-classification/test/' + patient +'/'+j+'/*.dcm'))\n        length = lenn + length \n    final_result.append(result[i:i+length].sum()/length)\n    i += length\n    \n","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:13:33.252459Z","iopub.status.idle":"2021-10-01T13:13:33.253022Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_result","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:13:33.254342Z","iopub.status.idle":"2021-10-01T13:13:33.254946Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = pd.read_csv('../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv')\n","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:13:33.256268Z","iopub.status.idle":"2021-10-01T13:13:33.256838Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.DataFrame({\"BraTS21ID\": test['BraTS21ID'].apply(lambda x: str(x).zfill(5)), \"MGMT_value\": final_result})\nsubmission\n","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:13:33.258289Z","iopub.status.idle":"2021-10-01T13:13:33.258869Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv', index = 0)","metadata":{"execution":{"iopub.status.busy":"2021-10-01T13:13:33.260284Z","iopub.status.idle":"2021-10-01T13:13:33.260855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}