{"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"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":29653,"databundleVersionId":2420395,"sourceType":"competition"},{"sourceId":2423144,"sourceType":"datasetVersion","datasetId":1466252},{"sourceId":2524081,"sourceType":"datasetVersion","datasetId":1529348},{"sourceId":2525517,"sourceType":"datasetVersion","datasetId":1530165},{"sourceId":2674202,"sourceType":"datasetVersion","datasetId":1627167},{"sourceId":2700493,"sourceType":"datasetVersion","datasetId":1607797}],"dockerImageVersionId":30121,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport sys \nimport json\nimport glob\nimport random\nimport re\nimport collections\nimport time\n\nimport numpy as np\nimport pandas as pd\nimport pydicom\nimport cv2\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom tqdm.notebook import tqdm\n\nimport torch\nfrom torch import nn\nfrom torch.utils import data as torch_data\nfrom sklearn import model_selection as sk_model_selection\nfrom torch.nn import functional as torch_functional\n\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import roc_auc_score","metadata":{"papermill":{"duration":1.048295,"end_time":"2021-07-14T20:26:46.309722","exception":false,"start_time":"2021-07-14T20:26:45.261427","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-10-15T02:48:04.93361Z","iopub.execute_input":"2021-10-15T02:48:04.934051Z","iopub.status.idle":"2021-10-15T02:48:07.288152Z","shell.execute_reply.started":"2021-10-15T02:48:04.933933Z","shell.execute_reply":"2021-10-15T02:48:07.287239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport zipfile\nimport numpy as np\nimport tensorflow as tf\nfrom pathlib import Path\nfrom sklearn import model_selection\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.utils import to_categorical\n\n\nfrom tensorflow import keras\nfrom tensorflow.keras import layers","metadata":{"execution":{"iopub.status.busy":"2021-10-15T02:48:07.289625Z","iopub.execute_input":"2021-10-15T02:48:07.290048Z","iopub.status.idle":"2021-10-15T02:48:11.772761Z","shell.execute_reply.started":"2021-10-15T02:48:07.289982Z","shell.execute_reply":"2021-10-15T02:48:11.771529Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_dir = Path('../input/rsna-miccai-brain-tumor-radiogenomic-classification/')\n\nmri_types = [\"FLAIR\", \"T1w\", \"T2w\", \"T1wCE\"]\nexcluded_images = [109, 123, 709] # Bad images\n\ntrain_df = pd.read_csv(data_dir / \"train_labels.csv\")\ntest_df = pd.read_csv(data_dir / \"sample_submission.csv\")\nsample_submission = pd.read_csv(data_dir / \"sample_submission.csv\")\n\ntrain_df = train_df[~train_df.BraTS21ID.isin(excluded_images)].reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2021-10-15T02:48:11.77791Z","iopub.execute_input":"2021-10-15T02:48:11.778241Z","iopub.status.idle":"2021-10-15T02:48:11.810165Z","shell.execute_reply.started":"2021-10-15T02:48:11.778208Z","shell.execute_reply":"2021-10-15T02:48:11.809272Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_directory = '../input/rsna-miccai-voxel-128-dataset/voxel'","metadata":{"execution":{"iopub.status.busy":"2021-10-15T02:48:11.811654Z","iopub.execute_input":"2021-10-15T02:48:11.812037Z","iopub.status.idle":"2021-10-15T02:48:11.818714Z","shell.execute_reply.started":"2021-10-15T02:48:11.811984Z","shell.execute_reply":"2021-10-15T02:48:11.817626Z"},"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')\n\ndf_train, df_valid = sk_model_selection.train_test_split(\n    train_df, \n    test_size=0.2, \n    random_state=24, \n    stratify=train_df[\"MGMT_value\"],\n)","metadata":{"execution":{"iopub.status.busy":"2021-10-15T02:48:11.820158Z","iopub.execute_input":"2021-10-15T02:48:11.820635Z","iopub.status.idle":"2021-10-15T02:48:11.834377Z","shell.execute_reply.started":"2021-10-15T02:48:11.82056Z","shell.execute_reply":"2021-10-15T02:48:11.833508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Functions to load images","metadata":{}},{"cell_type":"code","source":"def set_seed(seed):\n    random.seed(seed)\n    os.environ[\"PYTHONHASHSEED\"] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    if torch.cuda.is_available():\n        torch.cuda.manual_seed_all(seed)\n        torch.backends.cudnn.deterministic = True\n\nset_seed(127)","metadata":{"papermill":{"duration":0.668331,"end_time":"2021-07-14T20:27:48.114522","exception":false,"start_time":"2021-07-14T20:27:47.446191","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-10-15T02:48:13.377396Z","iopub.execute_input":"2021-10-15T02:48:13.377766Z","iopub.status.idle":"2021-10-15T02:48:13.43896Z","shell.execute_reply.started":"2021-10-15T02:48:13.377737Z","shell.execute_reply":"2021-10-15T02:48:13.438099Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## train / test splits","metadata":{}},{"cell_type":"code","source":"samples_to_exclude = [109, 123, 709]\n\ntrain_df = pd.read_csv('../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv')\nprint(\"original shape\", train_df.shape)\ntrain_df = train_df[~train_df.BraTS21ID.isin(samples_to_exclude)]\nprint(\"new shape\", train_df.shape)\n#display(train_df)\n\ndf_train, df_valid = sk_model_selection.train_test_split(\n    train_df, \n    test_size=0.2, \n    random_state=127, \n    stratify=train_df[\"MGMT_value\"],\n)","metadata":{"papermill":{"duration":0.633753,"end_time":"2021-07-14T20:27:49.350524","exception":false,"start_time":"2021-07-14T20:27:48.716771","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-10-15T02:48:14.771183Z","iopub.execute_input":"2021-10-15T02:48:14.77155Z","iopub.status.idle":"2021-10-15T02:48:14.786972Z","shell.execute_reply.started":"2021-10-15T02:48:14.771518Z","shell.execute_reply":"2021-10-15T02:48:14.785457Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''def load_dicom(path, size = 224):\n    \n    Reads a DICOM image, standardizes so that the pixel values are between 0 and 1, then rescales to 0 and 255\n    \n    Not super sure if this kind of scaling is appropriate, but everyone seems to do it. \n    \n    dicom = pydicom.read_file(path)\n    data = dicom.pixel_array\n    # transform data into black and white scale / grayscale\n#     data = data - np.min(data)\n    if np.max(data) != 0:\n        data = data / np.max(data)\n    data = (data * 255).astype(np.uint8)\n    return cv2.resize(data, (size, size))'''\n\ndef get_all_image_paths(brats21id, image_type, folder='train'): \n    '''\n    Returns an arry of all the images of a particular type for a particular patient ID\n    '''\n    assert(image_type in mri_types)\n    patient_path = os.path.join(\n        \"../input/rsna-miccai-brain-tumor-radiogenomic-classification/%s/\" % folder, \n        str(brats21id).zfill(5),\n    )\n\n    paths = sorted(\n        glob.glob(os.path.join(patient_path, image_type, \"*\")), \n        key=lambda x: int(x[:-4].split(\"-\")[-1]),\n    )\n    \n    num_images = len(paths)\n    \n    start = int(num_images * 0.25)\n    end = int(num_images * 0.75)\n\n    interval = 3\n    \n    if num_images < 10: \n        interval = 1\n    \n    return np.array(paths[start:end:interval])\n\ndef load_images_processed(scan_id, num_imgs=64, img_size=128, mri_type=\"FLAIR\", split=\"train\", rotate=0):\n  \n  if os.path.exists(f\"{data_directory}/{split}/{scan_id}/{mri_type}.npy\"):\n    file = f\"{data_directory}/{split}/{scan_id}/{mri_type}.npy\"\n    array = np.load(file) \n    data = array\n  else:\n        data =  np.zeros( (128,128,64) , dtype=int)\n  \n  return np.expand_dims(data,0)\n\ndef get_all_images(brats21id, image_type, folder='train', size=128):\n    \n    return [load_images_processed(path, size) for path in get_all_image_paths(brats21id, image_type, folder)]\n\ndef get_all_data_for_train(image_type, image_size=32):\n    global train_df\n    \n    X = []\n    y = []\n    train_ids = []\n\n    for i in tqdm(train_df.index):\n        x = train_df.loc[i]\n        images = get_all_images(int(x['BraTS21ID']), image_type, 'train', image_size)\n        label = x['MGMT_value']\n\n        X += images\n        y += [label] * len(images)\n        train_ids += [int(x['BraTS21ID'])] * len(images)\n        assert(len(X) == len(y))\n    return np.array(X), np.array(y), np.array(train_ids)\n\ndef get_all_data_for_test(image_type, image_size = 128):\n    global test_df\n    \n    X = []\n    test_ids = []\n\n    for i in tqdm(test_df.index):\n        x = test_df.loc[i]\n        images = get_all_images(int(x['BraTS21ID']), image_type, 'test', image_size)\n        X += images\n        test_ids += [int(x['BraTS21ID'])] * len(images)\n\n    return np.array(X), np.array(test_ids)","metadata":{"execution":{"iopub.status.busy":"2021-10-15T02:48:15.768225Z","iopub.execute_input":"2021-10-15T02:48:15.768563Z","iopub.status.idle":"2021-10-15T02:48:15.784426Z","shell.execute_reply.started":"2021-10-15T02:48:15.768534Z","shell.execute_reply":"2021-10-15T02:48:15.783337Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = []\ny = []\ntrain_ids = []\n\nfor i in tqdm(train_df.index):\n    x = train_df.loc[i]\n    images = get_all_images(int(x['BraTS21ID']), 'T1wCE', 'train', 128)\n    label = x['MGMT_value']\n\n    X += images\n    y += [label] * len(images)\n    train_ids += [int(x['BraTS21ID'])] * len(images)","metadata":{"execution":{"iopub.status.busy":"2021-10-15T02:48:16.672431Z","iopub.execute_input":"2021-10-15T02:48:16.672764Z","iopub.status.idle":"2021-10-15T02:48:27.008578Z","shell.execute_reply.started":"2021-10-15T02:48:16.672732Z","shell.execute_reply":"2021-10-15T02:48:27.007634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X, y, trainidt = X, y,train_ids","metadata":{"execution":{"iopub.status.busy":"2021-10-15T02:48:54.289771Z","iopub.execute_input":"2021-10-15T02:48:54.290224Z","iopub.status.idle":"2021-10-15T02:48:54.296359Z","shell.execute_reply.started":"2021-10-15T02:48:54.29018Z","shell.execute_reply":"2021-10-15T02:48:54.295323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#X, y, trainidt = get_all_data_for_train('T1wCE', image_size=128)\n#X_test, testidt = get_all_data_for_test('T1wCE', image_size=128)","metadata":{"execution":{"iopub.status.busy":"2021-10-15T02:25:16.356513Z","iopub.execute_input":"2021-10-15T02:25:16.356881Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_valid, y_train, y_valid, trainidt_train, trainidt_valid = train_test_split(X, y, trainidt, test_size=0.2, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2021-10-15T02:48:57.699765Z","iopub.execute_input":"2021-10-15T02:48:57.700144Z","iopub.status.idle":"2021-10-15T02:48:57.721156Z","shell.execute_reply.started":"2021-10-15T02:48:57.700108Z","shell.execute_reply":"2021-10-15T02:48:57.720169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_loader = tf.data.Dataset.from_tensor_slices((X_train, y_train))","metadata":{"execution":{"iopub.status.busy":"2021-10-15T02:49:00.768487Z","iopub.execute_input":"2021-10-15T02:49:00.76884Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"validation_loader = tf.data.Dataset.from_tensor_slices((x_valid, y_valid))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = (train_loader.shuffle(len(X_train)))\nvalidation_dataset = (validation_loader.shuffle(len(X_valid)))\ny_train = to_categorical(y_train)\ny_valid = to_categorical(y_valid)","metadata":{"execution":{"iopub.status.busy":"2021-10-15T02:22:29.576797Z","iopub.execute_input":"2021-10-15T02:22:29.577119Z","iopub.status.idle":"2021-10-15T02:22:29.595456Z","shell.execute_reply.started":"2021-10-15T02:22:29.577087Z","shell.execute_reply":"2021-10-15T02:22:29.593382Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model(width=128, height=128, depth=64):\n    \"\"\"Build a 3D convolutional neural network model.\"\"\"\n\n    inputs = keras.Input((width, height, depth, 1))\n\n    x = layers.Conv3D(filters=64, kernel_size=3, activation=\"relu\")(inputs)\n    x = layers.MaxPool3D(pool_size=2)(x)\n    x = layers.BatchNormalization()(x)\n\n    x = layers.Conv3D(filters=64, kernel_size=3, activation=\"relu\")(x)\n    x = layers.MaxPool3D(pool_size=2)(x)\n    x = layers.BatchNormalization()(x)\n\n    x = layers.Conv3D(filters=128, kernel_size=3, activation=\"relu\")(x)\n    x = layers.MaxPool3D(pool_size=2)(x)\n    x = layers.BatchNormalization()(x)\n\n    x = layers.Conv3D(filters=256, kernel_size=3, activation=\"relu\")(x)\n    x = layers.MaxPool3D(pool_size=2)(x)\n    x = layers.BatchNormalization()(x)\n\n    x = layers.GlobalAveragePooling3D()(x)\n    x = layers.Dense(units=512, activation=\"relu\")(x)\n    x = layers.Dropout(0.3)(x)\n\n    outputs = layers.Dense(units=1, activation=\"sigmoid\")(x)\n\n    # Define the model.\n    model = keras.Model(inputs, outputs, name=\"3dcnn\")\n    return model\n\n\n# Build model.\nmodel = get_model(width=128, height=128, depth=64)\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2021-10-15T02:45:35.009479Z","iopub.execute_input":"2021-10-15T02:45:35.009837Z","iopub.status.idle":"2021-10-15T02:45:40.922148Z","shell.execute_reply.started":"2021-10-15T02:45:35.009803Z","shell.execute_reply":"2021-10-15T02:45:40.921301Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Compile model.\ninitial_learning_rate = 0.0001\nlr_schedule = keras.optimizers.schedules.ExponentialDecay(\n    initial_learning_rate, decay_steps=100000, decay_rate=0.96, staircase=True\n)\nmodel.compile(\n    loss=\"binary_crossentropy\",\n    optimizer=keras.optimizers.Adam(learning_rate=lr_schedule),\n    metrics=[\"acc\"],\n)\n\n# Define callbacks.\ncheckpoint_cb = keras.callbacks.ModelCheckpoint(\n    \"3d_image_classification.h5\", save_best_only=True\n)\nearly_stopping_cb = keras.callbacks.EarlyStopping(monitor=\"val_acc\", patience=15)\n\n# Train the model, doing validation at the end of each epoch\nepochs = 100\nmodel.fit(\n    X_train,\n    y_train,\n    epochs=epochs,\n    shuffle=True,\n    verbose=2,\n    #callbacks=[checkpoint_cb, early_stopping_cb],\n    callbacks=[keras.callbacks.EarlyStopping(monitor='val_roc_acc', mode='max', patience=3, baseline=0.9)]\n\n)","metadata":{"execution":{"iopub.status.busy":"2021-10-15T02:45:40.923719Z","iopub.execute_input":"2021-10-15T02:45:40.92411Z","iopub.status.idle":"2021-10-15T02:45:41.097465Z","shell.execute_reply.started":"2021-10-15T02:45:40.924069Z","shell.execute_reply":"2021-10-15T02:45:41.095438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''def build_model():\n    model = resnet50()\n    return model '''   ","metadata":{"execution":{"iopub.status.busy":"2021-10-14T15:22:06.945662Z","iopub.status.idle":"2021-10-14T15:22:06.94626Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''class Trainer:\n    def __init__(\n        self, \n        model, \n        device, \n        optimizer, \n        criterion\n    ):\n        self.model = model\n        self.device = device\n        self.optimizer = optimizer\n        self.lr_scheduler = torch.optim.lr_scheduler.ExponentialLR(self.optimizer, gamma=LR_DECAY)\n        self.criterion = criterion\n\n        self.best_valid_score = .0\n        self.n_patience = 0\n        self.lastmodel = None\n        \n        self.val_losses = []\n        self.train_losses = []\n        self.val_auc = []\n        \n    def fit(self, epochs, train_loader, valid_loader, save_path, patience):      \n        for n_epoch in range(1, epochs + 1):\n            self.info_message(\"EPOCH: {}\", n_epoch)\n            \n            train_loss, train_time = self.train_epoch(train_loader)\n            valid_loss, valid_auc, valid_time = self.valid_epoch(valid_loader)\n            \n            self.train_losses.append(train_loss)\n            self.val_losses.append(valid_loss)\n            self.val_auc.append(valid_auc)\n            \n            self.info_message(\n                \"[Epoch Train: {}] loss: {:.4f}, time: {:.2f} s\",\n                n_epoch, train_loss, train_time\n            )\n            \n            self.info_message(\n                \"[Epoch Valid: {}] loss: {:.4f}, auc: {:.4f}, time: {:.2f} s\",\n                n_epoch, valid_loss, valid_auc, valid_time\n            )\n\n            if self.best_valid_score < valid_auc: \n                self.save_model(n_epoch, save_path, valid_loss, valid_auc)\n                self.info_message(\n                     \"auc improved from {:.4f} to {:.4f}. Saved model to '{}'\", \n                    self.best_valid_score, valid_auc, self.lastmodel\n                )\n                self.best_valid_score = valid_auc\n                self.n_patience = 0\n            else:\n                self.n_patience += 1\n            \n            if self.n_patience >= patience:\n                self.info_message(\"\\nValid auc didn't improve last {} epochs.\", patience)\n                break\n            \n    def train_epoch(self, train_loader):\n        self.model.train()\n        t = time.time()\n        sum_loss = 0\n\n        for step, batch in enumerate(train_loader, 1):\n            X = torch.tensor(batch[\"X\"]).float().to(self.device)\n            targets = batch[\"y\"].to(self.device)\n            self.optimizer.zero_grad()\n            outputs = self.model(X).squeeze(1)\n            loss = self.criterion(outputs, targets)\n                \n            loss.backward()\n\n            sum_loss += loss.detach().item()\n            \n            self.optimizer.step()\n            \n            message = 'Train Step {}/{}, train_loss: {:.4f}'\n            self.info_message(message, step, len(train_loader), sum_loss/step, end=\"\\r\")\n            \n        self.lr_scheduler.step()\n        \n        return sum_loss/len(train_loader), int(time.time() - t)\n    \n    def valid_epoch(self, valid_loader):\n        self.model.eval()\n        t = time.time()\n        sum_loss = 0\n        y_all = []\n        outputs_all = []\n\n        for step, batch in enumerate(valid_loader, 1):\n            with torch.no_grad():\n                targets = batch[\"y\"].to(self.device)\n\n                output = torch.sigmoid(self.model(torch.tensor(batch[\"X\"]).float().to(self.device)).squeeze(1))\n                loss = self.criterion(output, targets)\n                sum_loss += loss.detach().item()\n\n                y_all.extend(batch[\"y\"].tolist())\n                outputs_all.extend(output.tolist())\n\n            message = 'Valid Step {}/{}, valid_loss: {:.4f}'\n            self.info_message(message, step, len(valid_loader), sum_loss/step, end=\"\\r\")\n            \n        auc = roc_auc_score(y_all, outputs_all)\n        \n        return sum_loss/len(valid_loader), auc, int(time.time() - t)\n    \n    def save_model(self, n_epoch, save_path, loss, auc):\n        self.lastmodel = f\"{save_path}-e{n_epoch}-loss{loss:.3f}-auc{auc:.3f}.pth\"\n        torch.save(\n            {\n                \"model_state_dict\": self.model.state_dict(),\n                \"optimizer_state_dict\": self.optimizer.state_dict(),\n                \"best_valid_score\": self.best_valid_score,\n                \"n_epoch\": n_epoch,\n            },\n            self.lastmodel,\n        )\n        \n    def display_plots(self, mri_type):\n        plt.figure(figsize=(10,5))\n        plt.title(\"{}: Training and Validation Loss\")\n        plt.plot(self.val_losses,label=\"val\")\n        plt.plot(self.train_losses,label=\"train\")\n        plt.xlabel(\"iterations\")\n        plt.ylabel(\"Loss\")\n        plt.legend()\n        plt.show()\n        plt.close()\n        \n        plt.figure(figsize=(10,5))\n        plt.title(\"{}: Validation AUC-ROC\")\n        plt.plot(self.val_auc,label=\"val\")\n        plt.xlabel(\"iterations\")\n        plt.ylabel(\"AUC\")\n        plt.legend()\n        plt.show()\n        plt.close()\n    \n    @staticmethod\n    def info_message(message, *args, end=\"\\n\"):\n        print(message.format(*args), end=end)'''","metadata":{"papermill":{"duration":0.637077,"end_time":"2021-07-14T20:27:58.09407","exception":false,"start_time":"2021-07-14T20:27:57.456993","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-10-14T15:22:06.947722Z","iopub.status.idle":"2021-10-14T15:22:06.948295Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## train models","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\ndef train_mri_type(df_train, df_valid, mri_type):\n    if mri_type==\"all\":\n        train_list = []\n        valid_list = []\n        for mri_type in mri_types:\n            df_train.loc[:,\"MRI_Type\"] = mri_type\n            train_list.append(df_train.copy())\n            df_valid.loc[:,\"MRI_Type\"] = mri_type\n            valid_list.append(df_valid.copy())\n\n        df_train = pd.concat(train_list)\n        df_valid = pd.concat(valid_list)\n    else:\n        df_train.loc[:,\"MRI_Type\"] = mri_type\n        df_valid.loc[:,\"MRI_Type\"] = mri_type\n\n    print(df_train.shape, df_valid.shape)\n    display(df_train.head())\n    display(df_valid.head())\n    \n    train_data_retriever = Dataset(\n        df_train[\"BraTS21ID\"].values, \n        df_train[\"MGMT_value\"].values, \n        df_train[\"MRI_Type\"].values\n    )\n\n    valid_data_retriever = Dataset(\n        df_valid[\"BraTS21ID\"].values, \n        df_valid[\"MGMT_value\"].values,\n        df_valid[\"MRI_Type\"].values\n    )\n\n    train_loader = torch_data.DataLoader(\n        train_data_retriever,\n        batch_size=BATCH_SIZE,\n        shuffle=True,\n        num_workers=8,\n    )\n\n    valid_loader = torch_data.DataLoader(\n        valid_data_retriever, \n        batch_size=BATCH_SIZE,\n        shuffle=False,\n        num_workers=8,\n    )\n\n    model = get_model()\n    model.to(device)\n\n    optimizer = torch.optim.Adam(model.parameters(), lr=LEARNING_RATE)\n\n    criterion = torch_functional.binary_cross_entropy_with_logits\n\n    trainer = Trainer(\n        model, \n        device, \n        optimizer, \n        criterion\n    )\n\n    history = trainer.fit(\n        N_EPOCHS, \n        train_loader, \n        valid_loader, \n        f\"{mri_type}\", \n        N_EPOCHS,\n    )\n    \n    trainer.display_plots(mri_type)\n    \n    return trainer.lastmodel\n\nmodelfiles = None\n\nif not modelfiles:\n    modelfiles = [train_mri_type(df_train, df_valid, m) for m in mri_types]\n    print(modelfiles)","metadata":{"lines_to_next_cell":2,"papermill":{"duration":447.387602,"end_time":"2021-07-14T20:35:26.110421","exception":false,"start_time":"2021-07-14T20:27:58.722819","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2021-10-14T15:22:06.949886Z","iopub.status.idle":"2021-10-14T15:22:06.95069Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def absoluteFilePaths(directory):\n    files=[]\n    for dirpath,_,filenames in os.walk(directory):\n        for f in filenames:\n             files.append(os.path.abspath(os.path.join(dirpath, f)))\n    return files","metadata":{"execution":{"iopub.status.busy":"2021-10-14T15:22:06.952126Z","iopub.status.idle":"2021-10-14T15:22:06.95269Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"m= os.listdir('../input/monaitrain')\nm.sort(key=lambda x:x[:30])\nm","metadata":{"execution":{"iopub.status.busy":"2021-10-14T15:22:06.954154Z","iopub.status.idle":"2021-10-14T15:22:06.954741Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prediction","metadata":{}},{"cell_type":"code","source":"modelfiles=['../input/monaitrain/FLAIR-e2-loss0.691-auc0.625.pth',\n           '../input/monaitrain/T1w-e6-loss0.693-auc0.599.pth',\n            '../input/monaitrain/T1wCE-e12-loss0.706-auc0.599.pth',\n            '../input/monaitrain/T2w-e1-loss0.722-auc0.620.pth'\n           ]","metadata":{"execution":{"iopub.status.busy":"2021-10-14T15:22:06.956029Z","iopub.status.idle":"2021-10-14T15:22:06.956623Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict(modelfile, df, mri_type, split):\n    print(\"Predict:\", modelfile, mri_type, df.shape)\n    df.loc[:,\"MRI_Type\"] = mri_type\n    data_retriever = Dataset(\n        df.index.values, \n        mri_type=df[\"MRI_Type\"].values,\n        split=split\n    )\n\n    data_loader = torch_data.DataLoader(\n        data_retriever,\n        batch_size=1,\n        shuffle=False,\n        num_workers=8,\n    )\n   \n    model = build_model()\n    model.to(device)\n    \n    checkpoint = torch.load(modelfile)\n    model.load_state_dict(checkpoint[\"model_state_dict\"])\n    model.eval()\n    \n    y_pred = []\n    ids = []\n\n    for e, batch in enumerate(data_loader,1):\n        print(f\"{e}/{len(data_loader)}\", end=\"\\r\")\n        with torch.no_grad():\n            tmp_pred = torch.sigmoid(model(torch.tensor(batch[\"X\"]).float().to(device)).squeeze(1)).cpu().numpy().squeeze()\n            if tmp_pred.size == 1:\n                y_pred.append(tmp_pred)\n            else:\n                y_pred.extend(tmp_pred.tolist())\n            ids.extend(batch[\"id\"].numpy().tolist())\n            \n    preddf = pd.DataFrame({\"BraTS21ID\": ids, \"MGMT_value\": y_pred}) \n    preddf = preddf.set_index(\"BraTS21ID\")\n    return preddf","metadata":{"execution":{"iopub.status.busy":"2021-10-14T15:22:06.957991Z","iopub.status.idle":"2021-10-14T15:22:06.958611Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Validation**","metadata":{}},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")","metadata":{"execution":{"iopub.status.busy":"2021-10-14T15:22:07.01891Z","iopub.execute_input":"2021-10-14T15:22:07.019161Z","iopub.status.idle":"2021-10-14T15:22:07.022966Z","shell.execute_reply.started":"2021-10-14T15:22:07.019137Z","shell.execute_reply":"2021-10-14T15:22:07.022168Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''df_pred = df_valid.set_index(\"BraTS21ID\")\ndf_pred[\"MGMT_pred\"] = 0\nfor m, mtype in zip(modelfiles,  mri_types):\n    pred = predict(m, df_pred, mtype, \"train\")\n    df_pred[\"MGMT_pred\"] += pred[\"MGMT_value\"]\ndf_pred[\"MGMT_pred\"] /= len(modelfiles)\nauc = roc_auc_score(df_pred[\"MGMT_value\"], df_pred[\"MGMT_pred\"])\nprint(f\"Validation ensemble AUC: {auc:.4f}\")\nsns.displot(df_pred[\"MGMT_pred\"])'''","metadata":{"execution":{"iopub.status.busy":"2021-10-14T15:22:07.024243Z","iopub.execute_input":"2021-10-14T15:22:07.024754Z","iopub.status.idle":"2021-10-14T15:22:07.033686Z","shell.execute_reply.started":"2021-10-14T15:22:07.024718Z","shell.execute_reply":"2021-10-14T15:22:07.032652Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Submission**","metadata":{}},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.read_csv(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv\", index_col=\"BraTS21ID\")\n\nsubmission[\"MGMT_value\"] = 0\nfor m, mtype in zip(modelfiles, mri_types):\n    pred = predict(m, submission, mtype, split=\"test\")\n    submission[\"MGMT_value\"] += pred[\"MGMT_value\"]\n\nsubmission[\"MGMT_value\"] /= len(modelfiles)\nsubmission[\"MGMT_value\"].to_csv(\"submission.csv\")","metadata":{"execution":{"iopub.status.busy":"2021-10-14T15:22:07.035847Z","iopub.execute_input":"2021-10-14T15:22:07.036398Z","iopub.status.idle":"2021-10-14T15:22:07.081857Z","shell.execute_reply.started":"2021-10-14T15:22:07.036359Z","shell.execute_reply":"2021-10-14T15:22:07.080332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\nsubmission = pd.read_csv(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv\", index_col=\"BraTS21ID\")\nsubmission[\"MGMT_value\"] = 0\ndf1=submission\ndf2=submission\ndf1[\"MGMT_value\"]=0\ndf2[\"MGMT_value\"]\nfor m, mtype in zip(modelfiles1, mri_types):\n    pred = predict(m, submission, mtype, split=\"test\")\n    df1[\"MGMT_value\"] += pred[\"MGMT_value\"]\ndf1[\"MGMT_value\"] /= 4\n\nfor m, mtype in zip(modelfiles2, mri_types):\n    pred = predict(m, submission, mtype, split=\"test\")\n    df2[\"MGMT_value\"] += pred[\"MGMT_value\"]\ndf2[\"MGMT_value\"] /= 4\n\n'''","metadata":{"execution":{"iopub.status.busy":"2021-10-14T15:22:07.083219Z","iopub.status.idle":"2021-10-14T15:22:07.083925Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''submission = pd.read_csv(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv\", index_col=\"BraTS21ID\")\nlen(submission)'''","metadata":{"execution":{"iopub.status.busy":"2021-10-14T15:22:07.085334Z","iopub.status.idle":"2021-10-14T15:22:07.085903Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''submission = pd.read_csv(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv\", index_col=\"BraTS21ID\")\n\nsubmission[\"MGMT_value\"] = 0\nfor m, mtype in zip(modelfiles1, mri_types):\n    pred = predict(m, submission, mtype, split=\"test\")\n    submission[\"MGMT_value\"] += pred[\"MGMT_value\"]\n\nsubmission[\"MGMT_value\"] /= len(modelfiles1)\ns1 = submission[\"MGMT_value\"]'''","metadata":{"execution":{"iopub.status.busy":"2021-10-14T15:22:07.087356Z","iopub.status.idle":"2021-10-14T15:22:07.087951Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''submission = pd.read_csv(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv\", index_col=\"BraTS21ID\")\n\nsubmission[\"MGMT_value\"] = 0\nfor m, mtype in zip(modelfiles2, mri_types):\n    pred = predict(m, submission, mtype, split=\"test\")\n    submission[\"MGMT_value\"] += pred[\"MGMT_value\"]\n\nsubmission[\"MGMT_value\"] /= len(modelfiles1)\ns2 = submission[\"MGMT_value\"]\n'''","metadata":{"execution":{"iopub.status.busy":"2021-10-14T15:22:07.08946Z","iopub.status.idle":"2021-10-14T15:22:07.090163Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''df1 = s1.reset_index()\ndf2 = s2.reset_index()\nsubmission = pd.read_csv(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv\", index_col=\"BraTS21ID\")\nsubmission[\"MGMT_value\"] = 0\n\nMGMT_value=[]\nfor i in range(0,len(submission)):\n    value=(df1['MGMT_value'][i]+df2['MGMT_value'][i])/2\n    MGMT_value.append(value)\nsubmission[\"MGMT_value\"]=MGMT_value\nsubmission[\"MGMT_value\"].to_csv(\"submission.csv\")'''","metadata":{"execution":{"iopub.status.busy":"2021-10-14T15:22:07.091878Z","iopub.status.idle":"2021-10-14T15:22:07.092438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}