{"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":"markdown","source":"# **Intro code**","metadata":{}},{"cell_type":"markdown","source":"# RSNA-MICCAI Brain Tumor Radiogenomic Classificationn - Exploratory Data Analysis and Modeling\n\n\n### Predict the status of a genetic biomarker important for brain cancer treatment\n\nQuick Exploratory Data Analysis for [RSNA-MICCAI Brain Tumor Radiogenomic Classification](https://www.kaggle.com/c/rsna-miccai-brain-tumor-radiogenomic-classification) challenge    \n\n\n","metadata":{}},{"cell_type":"markdown","source":"![](https://storage.googleapis.com/kaggle-competitions/kaggle/29653/logos/header.png)","metadata":{}},{"cell_type":"markdown","source":"<a id=\"top\"></a>\n\n<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h3 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='color:white; background:darkviolet; border:0' role=\"tab\" aria-controls=\"home\"><center>Quick Navigation</center></h3>\n\n* [Overview](#1)\n* [Data Visualization](#2)\n    \n\n* [Competition Metric](#10)\n* [Sample Submission](#20)\n    \n\n* [Modeling](#100)","metadata":{}},{"cell_type":"markdown","source":"<a id=\"1\"></a>\n<h2 style='background:darkviolet; border:0; color:white'><center>Overview<center><h2>","metadata":{}},{"cell_type":"code","source":"# # Visualize\nimport os\nimport json\nimport glob\nimport random\nimport collections\n\nimport numpy as np\nimport pandas as pd\nimport pydicom\nimport cv2\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# # Display csv dataset\n# train_df = pd.read_csv(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv\")\n# train_df","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:38.094125Z","iopub.execute_input":"2021-07-29T03:08:38.094537Z","iopub.status.idle":"2021-07-29T03:08:39.142918Z","shell.execute_reply.started":"2021-07-29T03:08:38.094444Z","shell.execute_reply":"2021-07-29T03:08:39.142117Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**train/** - folder containing the training files, with each top-level folder representing a subject  \n**train_labels.csv** - file containing the target MGMT_value for each subject in the training data (e.g. the presence of MGMT promoter methylation)   \n**test/** - the test files, which use the same structure as train/; your task is to predict the MGMT_value for each subject in the test data. NOTE: the total size of the rerun test set (Public and Private) is ~5x the size of the Public test set   \n**sample_submission.csv** - a sample submission file in the correct format","metadata":{}},{"cell_type":"markdown","source":"<a id=\"2\"></a>\n<h2 style='background:darkviolet; border:0; color:white'><center>Data Visualization<center><h2>","metadata":{"execution":{"iopub.status.busy":"2021-07-14T06:41:32.077425Z","iopub.execute_input":"2021-07-14T06:41:32.077767Z","iopub.status.idle":"2021-07-14T06:41:32.0845Z","shell.execute_reply.started":"2021-07-14T06:41:32.077737Z","shell.execute_reply":"2021-07-14T06:41:32.082683Z"}}},{"cell_type":"code","source":"# train_df = pd.read_csv(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv\")\n# train_df","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.144478Z","iopub.execute_input":"2021-07-29T03:08:39.144828Z","iopub.status.idle":"2021-07-29T03:08:39.148649Z","shell.execute_reply.started":"2021-07-29T03:08:39.144792Z","shell.execute_reply":"2021-07-29T03:08:39.147617Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plt.figure(figsize=(5, 5))\n# sns.countplot(data=train_df, x=\"MGMT_value\");","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.150787Z","iopub.execute_input":"2021-07-29T03:08:39.151157Z","iopub.status.idle":"2021-07-29T03:08:39.158136Z","shell.execute_reply.started":"2021-07-29T03:08:39.151120Z","shell.execute_reply":"2021-07-29T03:08:39.157242Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# dicom = pydicom.read_file(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/00006/T2w/Image-125.dcm\")","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.159795Z","iopub.execute_input":"2021-07-29T03:08:39.160131Z","iopub.status.idle":"2021-07-29T03:08:39.167308Z","shell.execute_reply.started":"2021-07-29T03:08:39.160098Z","shell.execute_reply":"2021-07-29T03:08:39.166559Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#     data = dicom.pixel_array\n# #     data = data - np.min(data)\n# #     data = data / np.max(data)\n#     data = data.astype(np.uint8)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.168318Z","iopub.execute_input":"2021-07-29T03:08:39.168609Z","iopub.status.idle":"2021-07-29T03:08:39.176131Z","shell.execute_reply.started":"2021-07-29T03:08:39.168584Z","shell.execute_reply":"2021-07-29T03:08:39.175373Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# np.max(data)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.178531Z","iopub.execute_input":"2021-07-29T03:08:39.178775Z","iopub.status.idle":"2021-07-29T03:08:39.185549Z","shell.execute_reply.started":"2021-07-29T03:08:39.178753Z","shell.execute_reply":"2021-07-29T03:08:39.184766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def load_dicom(path):\n#     dicom = pydicom.read_file(path)\n#     data = dicom.pixel_array\n#     data = data - np.min(data)\n#     data = data / np.max(data)\n#     data = (data * 255).astype(np.uint8)\n#     return data\n\n\n# def visualize_sample(\n#     brats21id, \n#     slice_i,\n#     mgmt_value,\n#     types=(\"FLAIR\", \"T1w\", \"T1wCE\", \"T2w\")\n# ):\n#     plt.figure(figsize=(16, 5))\n#     patient_path = os.path.join(\n#         \"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/\", \n#         str(brats21id).zfill(5),\n#     )\n#     for i, t in enumerate(types, 1):\n#         t_paths = sorted(\n#             glob.glob(os.path.join(patient_path, t, \"*\")), \n#             key=lambda x: int(x[:-4].split(\"-\")[-1]),\n#         )\n#         data = load_dicom(t_paths[int(len(t_paths) * slice_i)])\n#         plt.subplot(1, 4, i)\n#         plt.imshow(data, cmap=\"gray\")\n#         plt.title(f\"{t}\", fontsize=16)\n#         plt.axis(\"off\")\n\n#     plt.suptitle(f\"MGMT_value: {mgmt_value}\", fontsize=16)\n#     plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.187478Z","iopub.execute_input":"2021-07-29T03:08:39.187715Z","iopub.status.idle":"2021-07-29T03:08:39.194609Z","shell.execute_reply.started":"2021-07-29T03:08:39.187693Z","shell.execute_reply":"2021-07-29T03:08:39.193713Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for i in range(10):\n#     _brats21id = train_df.iloc[i][\"BraTS21ID\"]\n#     _mgmt_value = train_df.iloc[i][\"MGMT_value\"]\n#     visualize_sample(brats21id=_brats21id, mgmt_value=_mgmt_value, slice_i=0.5)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.195655Z","iopub.execute_input":"2021-07-29T03:08:39.195931Z","iopub.status.idle":"2021-07-29T03:08:39.203148Z","shell.execute_reply.started":"2021-07-29T03:08:39.195887Z","shell.execute_reply":"2021-07-29T03:08:39.202372Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Idea from https://www.kaggle.com/avloss/eda-with-animation","metadata":{}},{"cell_type":"code","source":"# from matplotlib import animation, rc\n# rc('animation', html='jshtml')\n\n\n# def create_animation(ims):\n#     fig = plt.figure(figsize=(6, 6))\n#     plt.axis('off')\n#     print(ims[0].shape)\n#     im = plt.imshow(ims[0], cmap=\"gray\")\n\n#     def animate_func(i):\n#         im.set_array(ims[i])\n#         return [im]\n\n#     return animation.FuncAnimation(fig, animate_func, frames = len(ims), interval = 1000//24)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.206579Z","iopub.execute_input":"2021-07-29T03:08:39.206878Z","iopub.status.idle":"2021-07-29T03:08:39.216042Z","shell.execute_reply.started":"2021-07-29T03:08:39.206846Z","shell.execute_reply":"2021-07-29T03:08:39.215352Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def load_dicom_line(path):\n#     t_paths = sorted(\n#         glob.glob(os.path.join(path, \"*\")), \n#         key=lambda x: int(x[:-4].split(\"-\")[-1]),\n#     )\n#     images = []\n#     for filename in t_paths:\n#         data = load_dicom(filename)\n#         if data.max() == 0:\n#             continue\n#         images.append(data)\n        \n#     return images","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.218090Z","iopub.execute_input":"2021-07-29T03:08:39.218633Z","iopub.status.idle":"2021-07-29T03:08:39.225259Z","shell.execute_reply.started":"2021-07-29T03:08:39.218597Z","shell.execute_reply":"2021-07-29T03:08:39.224526Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# images = load_dicom_line(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/00000/FLAIR\")\n# create_animation(images)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.226217Z","iopub.execute_input":"2021-07-29T03:08:39.226758Z","iopub.status.idle":"2021-07-29T03:08:39.234389Z","shell.execute_reply.started":"2021-07-29T03:08:39.226724Z","shell.execute_reply":"2021-07-29T03:08:39.233582Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# images = load_dicom_line(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/00000/T1w\")\n# create_animation(images)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.237188Z","iopub.execute_input":"2021-07-29T03:08:39.237448Z","iopub.status.idle":"2021-07-29T03:08:39.242544Z","shell.execute_reply.started":"2021-07-29T03:08:39.237425Z","shell.execute_reply":"2021-07-29T03:08:39.241789Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# images = load_dicom_line(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/00000/T1wCE\")\n# create_animation(images)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.243996Z","iopub.execute_input":"2021-07-29T03:08:39.244565Z","iopub.status.idle":"2021-07-29T03:08:39.251408Z","shell.execute_reply.started":"2021-07-29T03:08:39.244529Z","shell.execute_reply":"2021-07-29T03:08:39.250539Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# images = load_dicom_line(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/00000/T2w\")\n# create_animation(images)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.254273Z","iopub.execute_input":"2021-07-29T03:08:39.254590Z","iopub.status.idle":"2021-07-29T03:08:39.259741Z","shell.execute_reply.started":"2021-07-29T03:08:39.254567Z","shell.execute_reply":"2021-07-29T03:08:39.259015Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"10\"></a>\n<h4 style='background:darkviolet; border:0; color:white'><center>Competition Metric<center><h4>","metadata":{}},{"cell_type":"markdown","source":"Submissions are evaluated on [area under the ROC curve](https://en.wikipedia.org/wiki/Receiver_operating_characteristic) between the predicted probability and the observed target.","metadata":{}},{"cell_type":"code","source":"# from sklearn.metrics import roc_auc_score, roc_curve, auc\n\n# list_y_true = [\n#     [1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0.],\n#     [1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0.],\n#     [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0.], #  IMBALANCE\n# ]\n# list_y_pred = [\n#     [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5],\n#     [0.9, 0.9, 0.9, 0.9, 0.1, 0.9, 0.9, 0.1, 0.9, 0.1, 0.1, 0.5],\n#     [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], #  IMBALANCE\n# ]\n\n# for y_true, y_pred in zip(list_y_true, list_y_pred):\n#     fpr, tpr, _ = roc_curve(y_true, y_pred)\n#     roc_auc = auc(fpr, tpr)\n\n#     plt.figure(figsize=(5, 5))\n#     plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)\n#     plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')\n#     plt.xlim([-0.01, 1.0])\n#     plt.ylim([0.0, 1.05])\n#     plt.xlabel('False Positive Rate')\n#     plt.ylabel('True Positive Rate')\n#     plt.title('Receiver operating characteristic example')\n#     plt.legend(loc=\"lower right\")\n#     plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.261095Z","iopub.execute_input":"2021-07-29T03:08:39.261841Z","iopub.status.idle":"2021-07-29T03:08:39.267427Z","shell.execute_reply.started":"2021-07-29T03:08:39.261802Z","shell.execute_reply":"2021-07-29T03:08:39.266635Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"20\"></a>\n<h2 style='background:darkviolet; border:0; color:white'><center>Sample Submission<center><h2>","metadata":{}},{"cell_type":"code","source":"# submission = pd.read_csv(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv\")\n# submission.to_csv(\"submission.csv\", index=False)\n# submission","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.270199Z","iopub.execute_input":"2021-07-29T03:08:39.270450Z","iopub.status.idle":"2021-07-29T03:08:39.278272Z","shell.execute_reply.started":"2021-07-29T03:08:39.270419Z","shell.execute_reply":"2021-07-29T03:08:39.277228Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"100\"></a>\n<h2 style='background:darkviolet; border:0; color:white'><center>Modeling<center><h2>","metadata":{}},{"cell_type":"code","source":"# package_path = \"../input/efficientnet-pytorch/EfficientNet-PyTorch/EfficientNet-PyTorch-master/\"\n# import sys \n# sys.path.append(package_path)\n\n# import time\n\n# import torch\n# from torch import nn\n# from torch.utils import data as torch_data\n# from sklearn import model_selection as sk_model_selection\n# from torch.nn import functional as torch_functional\n# import efficientnet_pytorch\n\n# from sklearn.model_selection import StratifiedKFold","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.279512Z","iopub.execute_input":"2021-07-29T03:08:39.280145Z","iopub.status.idle":"2021-07-29T03:08:39.286508Z","shell.execute_reply.started":"2021-07-29T03:08:39.280107Z","shell.execute_reply":"2021-07-29T03:08:39.285614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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\n\n# set_seed(42)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.287873Z","iopub.execute_input":"2021-07-29T03:08:39.288408Z","iopub.status.idle":"2021-07-29T03:08:39.294745Z","shell.execute_reply.started":"2021-07-29T03:08:39.288374Z","shell.execute_reply":"2021-07-29T03:08:39.293837Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df = pd.read_csv(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv\")\n# df_train, df_valid = sk_model_selection.train_test_split(\n#     df, \n#     test_size=0.2, \n#     random_state=42, \n#     stratify=train_df[\"MGMT_value\"],\n# )","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.296040Z","iopub.execute_input":"2021-07-29T03:08:39.296619Z","iopub.status.idle":"2021-07-29T03:08:39.303353Z","shell.execute_reply.started":"2021-07-29T03:08:39.296583Z","shell.execute_reply":"2021-07-29T03:08:39.302398Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# class DataRetriever(torch_data.Dataset):\n#     def __init__(self, paths, targets):\n#         self.paths = paths\n#         self.targets = targets\n          \n#     def __len__(self):\n#         return len(self.paths)\n    \n#     def __getitem__(self, index):\n#         _id = self.paths[index]\n#         patient_path = f\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/{str(_id).zfill(5)}/\"\n#         channels = []\n#         for t in (\"FLAIR\", \"T1w\", \"T1wCE\"): # \"T2w\"\n#             t_paths = sorted(\n#                 glob.glob(os.path.join(patient_path, t, \"*\")), \n#                 key=lambda x: int(x[:-4].split(\"-\")[-1]),\n#             )\n#             start, end = int(len(t_paths) * 0.5), int(len(t_paths) * 0.5)\n#             channel = []\n#             for i in range(start, end + 1):\n#                 channel.append(cv2.resize(load_dicom(t_paths[i]), (256, 256)) / 255)\n#             channel = np.mean(channel, axis=0)\n#             channels.append(channel)\n            \n#         y = torch.tensor(self.targets[index], dtype=torch.float)\n        \n#         return {\"X\": torch.tensor(channels).float(), \"y\": y}","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.304771Z","iopub.execute_input":"2021-07-29T03:08:39.305392Z","iopub.status.idle":"2021-07-29T03:08:39.313999Z","shell.execute_reply.started":"2021-07-29T03:08:39.305355Z","shell.execute_reply":"2021-07-29T03:08:39.313013Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_data_retriever = DataRetriever(\n#     df_train[\"BraTS21ID\"].values, \n#     df_train[\"MGMT_value\"].values, \n# )\n\n# valid_data_retriever = DataRetriever(\n#     df_valid[\"BraTS21ID\"].values, \n#     df_valid[\"MGMT_value\"].values,\n# )","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.315428Z","iopub.execute_input":"2021-07-29T03:08:39.315997Z","iopub.status.idle":"2021-07-29T03:08:39.321316Z","shell.execute_reply.started":"2021-07-29T03:08:39.315962Z","shell.execute_reply":"2021-07-29T03:08:39.320493Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plt.figure(figsize=(16, 6))\n# for i in range(3):\n#     plt.subplot(1, 3, i + 1)\n#     plt.imshow(train_data_retriever[82][\"X\"].numpy()[i], cmap=\"gray\")","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.322629Z","iopub.execute_input":"2021-07-29T03:08:39.323058Z","iopub.status.idle":"2021-07-29T03:08:39.329406Z","shell.execute_reply.started":"2021-07-29T03:08:39.323021Z","shell.execute_reply":"2021-07-29T03:08:39.328570Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# class Model(nn.Module):\n#     def __init__(self):\n#         super().__init__()\n#         self.net = efficientnet_pytorch.EfficientNet.from_name(\"efficientnet-b0\")\n#         checkpoint = torch.load(\"../input/efficientnet-pytorch/efficientnet-b0-08094119.pth\")\n#         self.net.load_state_dict(checkpoint)\n#         n_features = self.net._fc.in_features\n#         self.net._fc = nn.Linear(in_features=n_features, out_features=1, bias=True)\n    \n#     def forward(self, x):\n#         out = self.net(x)\n#         return out","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.330914Z","iopub.execute_input":"2021-07-29T03:08:39.331491Z","iopub.status.idle":"2021-07-29T03:08:39.337248Z","shell.execute_reply.started":"2021-07-29T03:08:39.331453Z","shell.execute_reply":"2021-07-29T03:08:39.336508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# class LossMeter:\n#     def __init__(self):\n#         self.avg = 0\n#         self.n = 0\n\n#     def update(self, val):\n#         self.n += 1\n#         # incremental update\n#         self.avg = val / self.n + (self.n - 1) / self.n * self.avg\n\n        \n# class AccMeter:\n#     def __init__(self):\n#         self.avg = 0\n#         self.n = 0\n        \n#     def update(self, y_true, y_pred):\n#         y_true = y_true.cpu().numpy().astype(int)\n#         y_pred = y_pred.cpu().numpy() >= 0\n#         last_n = self.n\n#         self.n += len(y_true)\n#         true_count = np.sum(y_true == y_pred)\n#         # incremental update\n#         self.avg = true_count / self.n + last_n / self.n * self.avg","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.338783Z","iopub.execute_input":"2021-07-29T03:08:39.339271Z","iopub.status.idle":"2021-07-29T03:08:39.347828Z","shell.execute_reply.started":"2021-07-29T03:08:39.339233Z","shell.execute_reply":"2021-07-29T03:08:39.347008Z"},"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#         loss_meter, \n#         score_meter\n#     ):\n#         self.model = model\n#         self.device = device\n#         self.optimizer = optimizer\n#         self.criterion = criterion\n#         self.loss_meter = loss_meter\n#         self.score_meter = score_meter\n        \n#         self.best_valid_score = -np.inf\n#         self.n_patience = 0\n        \n#         self.messages = {\n#             \"epoch\": \"[Epoch {}: {}] loss: {:.5f}, score: {:.5f}, time: {} s\",\n#             \"checkpoint\": \"The score improved from {:.5f} to {:.5f}. Save model to '{}'\",\n#             \"patience\": \"\\nValid score didn't improve last {} epochs.\"\n#         }\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_score, train_time = self.train_epoch(train_loader)\n#             valid_loss, valid_score, valid_time = self.valid_epoch(valid_loader)\n            \n#             self.info_message(\n#                 self.messages[\"epoch\"], \"Train\", n_epoch, train_loss, train_score, train_time\n#             )\n            \n#             self.info_message(\n#                 self.messages[\"epoch\"], \"Valid\", n_epoch, valid_loss, valid_score, valid_time\n#             )\n\n#             if True:\n# #             if self.best_valid_score < valid_score:\n#                 self.info_message(\n#                     self.messages[\"checkpoint\"], self.best_valid_score, valid_score, save_path\n#                 )\n#                 self.best_valid_score = valid_score\n#                 self.save_model(n_epoch, save_path)\n#                 self.n_patience = 0\n#             else:\n#                 self.n_patience += 1\n            \n#             if self.n_patience >= patience:\n#                 self.info_message(self.messages[\"patience\"], patience)\n#                 break\n            \n#     def train_epoch(self, train_loader):\n#         self.model.train()\n#         t = time.time()\n#         train_loss = self.loss_meter()\n#         train_score = self.score_meter()\n        \n#         for step, batch in enumerate(train_loader, 1):\n#             X = batch[\"X\"].to(self.device)\n#             targets = batch[\"y\"].to(self.device)\n#             self.optimizer.zero_grad()\n#             outputs = self.model(X).squeeze(1)\n            \n#             loss = self.criterion(outputs, targets)\n#             loss.backward()\n\n#             train_loss.update(loss.detach().item())\n#             train_score.update(targets, outputs.detach())\n\n#             self.optimizer.step()\n            \n#             _loss, _score = train_loss.avg, train_score.avg\n#             message = 'Train Step {}/{}, train_loss: {:.5f}, train_score: {:.5f}'\n#             self.info_message(message, step, len(train_loader), _loss, _score, end=\"\\r\")\n        \n#         return train_loss.avg, train_score.avg, int(time.time() - t)\n    \n#     def valid_epoch(self, valid_loader):\n#         self.model.eval()\n#         t = time.time()\n#         valid_loss = self.loss_meter()\n#         valid_score = self.score_meter()\n\n#         for step, batch in enumerate(valid_loader, 1):\n#             with torch.no_grad():\n#                 X = batch[\"X\"].to(self.device)\n#                 targets = batch[\"y\"].to(self.device)\n\n#                 outputs = self.model(X).squeeze(1)\n#                 loss = self.criterion(outputs, targets)\n\n#                 valid_loss.update(loss.detach().item())\n#                 valid_score.update(targets, outputs)\n                \n#             _loss, _score = valid_loss.avg, valid_score.avg\n#             message = 'Valid Step {}/{}, valid_loss: {:.5f}, valid_score: {:.5f}'\n#             self.info_message(message, step, len(valid_loader), _loss, _score, end=\"\\r\")\n        \n#         return valid_loss.avg, valid_score.avg, int(time.time() - t)\n    \n#     def save_model(self, n_epoch, save_path):\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#             save_path,\n#         )\n    \n#     @staticmethod\n#     def info_message(message, *args, end=\"\\n\"):\n#         print(message.format(*args), end=end)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.349318Z","iopub.execute_input":"2021-07-29T03:08:39.349731Z","iopub.status.idle":"2021-07-29T03:08:39.357413Z","shell.execute_reply.started":"2021-07-29T03:08:39.349698Z","shell.execute_reply":"2021-07-29T03:08:39.356315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\n# train_data_retriever = DataRetriever(\n#     df_train[\"BraTS21ID\"].values, \n#     df_train[\"MGMT_value\"].values, \n# )\n\n# valid_data_retriever = DataRetriever(\n#     df_valid[\"BraTS21ID\"].values, \n#     df_valid[\"MGMT_value\"].values,\n# )\n\n# train_loader = torch_data.DataLoader(\n#     train_data_retriever,\n#     batch_size=4,\n#     shuffle=True,\n#     num_workers=8,\n# )\n\n# valid_loader = torch_data.DataLoader(\n#     valid_data_retriever, \n#     batch_size=4,\n#     shuffle=False,\n#     num_workers=8,\n# )\n\n# model = Model()\n# model.to(device)\n\n# optimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n# criterion = torch_functional.binary_cross_entropy_with_logits\n\n# trainer = Trainer(\n#     model, \n#     device, \n#     optimizer, \n#     criterion, \n#     LossMeter, \n#     AccMeter\n# )\n\n# history = trainer.fit(\n#     3, \n#     train_loader, \n#     valid_loader, \n#     f\"best-model-0.pth\", \n#     100,\n# )\n","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.359258Z","iopub.execute_input":"2021-07-29T03:08:39.359594Z","iopub.status.idle":"2021-07-29T03:08:39.366985Z","shell.execute_reply.started":"2021-07-29T03:08:39.359562Z","shell.execute_reply":"2021-07-29T03:08:39.366137Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# models = []\n# for i in range(1):\n#     model = Model()\n#     model.to(device)\n    \n#     checkpoint = torch.load(f\"best-model-{i}.pth\")\n#     model.load_state_dict(checkpoint[\"model_state_dict\"])\n#     model.eval()\n    \n#     models.append(model)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.373276Z","iopub.execute_input":"2021-07-29T03:08:39.373536Z","iopub.status.idle":"2021-07-29T03:08:39.377150Z","shell.execute_reply.started":"2021-07-29T03:08:39.373506Z","shell.execute_reply":"2021-07-29T03:08:39.376193Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# class DataRetriever(torch_data.Dataset):\n#     def __init__(self, paths):\n#         self.paths = paths\n          \n#     def __len__(self):\n#         return len(self.paths)\n    \n#     def __getitem__(self, index):\n#         _id = self.paths[index]\n#         patient_path = f\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/test/{str(_id).zfill(5)}/\"\n#         channels = []\n#         for t in (\"FLAIR\", \"T1w\", \"T1wCE\"): # \"T2w\"\n#             t_paths = sorted(\n#                 glob.glob(os.path.join(patient_path, t, \"*\")), \n#                 key=lambda x: int(x[:-4].split(\"-\")[-1]),\n#             )\n#             start, end = int(len(t_paths) * 0.5), int(len(t_paths) * 0.5)\n#             channel = []\n#             for i in range(start, end + 1):\n#                 channel.append(cv2.resize(load_dicom(t_paths[i]), (256, 256)) / 255)\n#             channel = np.mean(channel, axis=0)\n#             channels.append(channel)\n        \n#         return {\"X\": torch.tensor(channels).float(), \"id\": _id}","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.381125Z","iopub.execute_input":"2021-07-29T03:08:39.381472Z","iopub.status.idle":"2021-07-29T03:08:39.385530Z","shell.execute_reply.started":"2021-07-29T03:08:39.381448Z","shell.execute_reply":"2021-07-29T03:08:39.384596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# submission = pd.read_csv(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv\")\n\n# test_data_retriever = DataRetriever(\n#     submission[\"BraTS21ID\"].values, \n# )\n\n# test_loader = torch_data.DataLoader(\n#     test_data_retriever,\n#     batch_size=4,\n#     shuffle=False,\n#     num_workers=8,\n# )","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.387007Z","iopub.execute_input":"2021-07-29T03:08:39.387723Z","iopub.status.idle":"2021-07-29T03:08:39.394787Z","shell.execute_reply.started":"2021-07-29T03:08:39.387689Z","shell.execute_reply":"2021-07-29T03:08:39.393969Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# y_pred = []\n# ids = []\n\n# for e, batch in enumerate(test_loader):\n#     print(f\"{e}/{len(test_loader)}\", end=\"\\r\")\n#     with torch.no_grad():\n#         tmp_pred = np.zeros((batch[\"X\"].shape[0], ))\n#         for model in models:\n#             tmp_res = torch.sigmoid(model(batch[\"X\"].to(device))).cpu().numpy().squeeze()\n#             tmp_pred += tmp_res\n#         y_pred.extend(tmp_pred)\n#         ids.extend(batch[\"id\"].numpy().tolist())","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.396096Z","iopub.execute_input":"2021-07-29T03:08:39.396566Z","iopub.status.idle":"2021-07-29T03:08:39.402656Z","shell.execute_reply.started":"2021-07-29T03:08:39.396531Z","shell.execute_reply":"2021-07-29T03:08:39.401842Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# submission = pd.DataFrame({\"BraTS21ID\": ids, \"MGMT_value\": y_pred})\n# submission.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.403919Z","iopub.execute_input":"2021-07-29T03:08:39.404345Z","iopub.status.idle":"2021-07-29T03:08:39.410117Z","shell.execute_reply.started":"2021-07-29T03:08:39.404309Z","shell.execute_reply":"2021-07-29T03:08:39.409383Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# submission","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.411592Z","iopub.execute_input":"2021-07-29T03:08:39.411944Z","iopub.status.idle":"2021-07-29T03:08:39.417610Z","shell.execute_reply.started":"2021-07-29T03:08:39.411910Z","shell.execute_reply":"2021-07-29T03:08:39.416877Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## My code...","metadata":{}},{"cell_type":"markdown","source":"#### Visualize","metadata":{}},{"cell_type":"code","source":"# Visualize\nimport os\nimport json\nimport glob\nimport random\nimport collections\n\nimport numpy as np\nimport pandas as pd\nimport pydicom\nimport cv2\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Display csv dataset\ntrain_df = pd.read_csv(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv\")\ntrain_df","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.419035Z","iopub.execute_input":"2021-07-29T03:08:39.419483Z","iopub.status.idle":"2021-07-29T03:08:39.455554Z","shell.execute_reply.started":"2021-07-29T03:08:39.419392Z","shell.execute_reply":"2021-07-29T03:08:39.454651Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot target counts\nplt.figure(figsize=(5, 5))\nsns.countplot(data=train_df, x=\"MGMT_value\");","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.456837Z","iopub.execute_input":"2021-07-29T03:08:39.457182Z","iopub.status.idle":"2021-07-29T03:08:39.591337Z","shell.execute_reply.started":"2021-07-29T03:08:39.457134Z","shell.execute_reply":"2021-07-29T03:08:39.590388Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Helper functions\n\n### func 1\ndef load_single_dicom(path):\n    data = pydicom.read_file(path).pixel_array\n    return data.astype(np.uint8)\n\n### func 2\ndef visualize_sample(\n                     brats21id, slice_i,mgmt_value,types=(\"FLAIR\", \"T1w\", \"T1wCE\", \"T2w\"),\n    dataroot=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/\"\n                    ):\n    \n    plt.figure(figsize=(16, 5))\n    patient_path = os.path.join(dataroot, str(brats21id).zfill(5),)\n    for i, t in enumerate(types, 1):\n        t_paths = sorted(\n            glob.glob(os.path.join(patient_path, t, \"*\")), \n            key=lambda x: int(x[:-4].split(\"-\")[-1]),\n        )\n        print(len(t_paths))\n        data = load_single_dicom(t_paths[int(len(t_paths) * slice_i)])\n        plt.subplot(1, 4, i)\n#         print(data.max())\n        plt.imshow(data, cmap=\"gray\")\n        plt.title(f\"{t}\", fontsize=16)\n        plt.axis(\"off\")\n\n    plt.suptitle(f\"MGMT_value: {mgmt_value}\", fontsize=16)\n    plt.show()\n    \n## func 3\ndef load_multi_dicom(n=10, random_display=False, slice_i=0.5,types=(\"FLAIR\", \"T1w\", \"T1wCE\", \"T2w\"),\n                     dataroot=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/\",\n                    csv_data=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv\"):\n    \n    #Load csv data\n    train_df = pd.read_csv(csv_data)\n    \n    # display n  data randomly\n    if random_display:\n        import random\n        \n        len_ = train_df.shape[0]\n        \n        # start displaying\n        for _ in range(n):\n            i = random.randrange(0,len_)\n            _brats21id = train_df.iloc[i][\"BraTS21ID\"]\n            _mgmt_value = train_df.iloc[i][\"MGMT_value\"]\n            visualize_sample(brats21id=_brats21id, mgmt_value=_mgmt_value, slice_i=0.5)\n            \n    # display n data sequentially\n    else:\n        for i in range(n):\n            _brats21id = train_df.iloc[i][\"BraTS21ID\"]\n            _mgmt_value = train_df.iloc[i][\"MGMT_value\"]\n            visualize_sample(brats21id=_brats21id, mgmt_value=_mgmt_value, slice_i=0.5)\n            \n# func 4\nfrom matplotlib import animation, rc\nrc('animation', html='jshtml')\n\n\ndef create_animation(ims):\n    print(len(ims))\n    fig = plt.figure(figsize=(6, 6))\n    plt.axis('off')\n    im = plt.imshow(ims[0], cmap=\"gray\")\n\n    def animate_func(i):\n        im.set_array(ims[i])\n        return [im]\n\n    return animation.FuncAnimation(fig, animate_func, frames = len(ims), interval = 1000//24)\n\n# func 5\ndef load_dicom_line(path):\n    t_paths = sorted(\n        glob.glob(os.path.join(path, \"*\")), \n        key=lambda x: int(x[:-4].split(\"-\")[-1]),\n    )\n    images = []\n    for filename in t_paths:\n        data = load_single_dicom(filename)\n        if data.max() == 0:\n            continue\n        images.append(data)\n        \n    return images\n\n# func 6\ndef load_single_dicom_mean(paths):\n    each_data = []\n    for each_path in paths:\n        each_data.append(cv2.resize(pydicom.read_file(each_path).pixel_array, (256, 256)))\n    each_data\n    data = np.mean(each_data, axis=0)\n    return data.astype(np.uint8)\n\n# func 7\ndef visualize_sample_mean(\n                     brats21id,mgmt_value,types=(\"FLAIR\", \"T1w\", \"T1wCE\", \"T2w\"),\n    dataroot=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/\"\n                    ):\n    plt.figure(figsize=(16, 5))\n    patient_path = os.path.join(dataroot, str(brats21id).zfill(5),)\n    for i, t in enumerate(types, 1):\n        t_paths = sorted(\n            glob.glob(os.path.join(patient_path, t, \"*\")), \n            key=lambda x: int(x[:-4].split(\"-\")[-1]),\n        )\n        print(len(t_paths))\n        data = load_single_dicom_mean(t_paths)\n        plt.subplot(1, 4, i)\n        plt.imshow(data, cmap=\"gray\")\n        plt.title(f\"{t}\", fontsize=16)\n        plt.axis(\"off\")\n\n    plt.suptitle(f\"MGMT_value: {mgmt_value}\", fontsize=16)\n    plt.show()\n    \n\n## func 8\ndef load_multi_dicom_mean(n=10, random_display=False,types=(\"FLAIR\", \"T1w\", \"T1wCE\", \"T2w\"),\n                     dataroot=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/\",\n                    csv_data=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv\"):\n    \n    #Load csv data\n    train_df = pd.read_csv(csv_data)\n    \n    # display n  data randomly\n    if random_display:\n        import random\n        \n        len_ = train_df.shape[0]\n        \n        # start displaying\n        for _ in range(n):\n            i = random.randrange(0,len_)\n            _brats21id = train_df.iloc[i][\"BraTS21ID\"]\n            _mgmt_value = train_df.iloc[i][\"MGMT_value\"]\n            visualize_sample_mean(brats21id=_brats21id, mgmt_value=_mgmt_value)\n    # display n data sequentially\n    else:\n        for i in range(n):\n            _brats21id = train_df.iloc[i][\"BraTS21ID\"]\n            _mgmt_value = train_df.iloc[i][\"MGMT_value\"]\n            visualize_sample_mean(brats21id=_brats21id, mgmt_value=_mgmt_value)\n            \n# func 9\ndef load_single_dicom_mean_full(full_paths):\n    each_data = []\n    full_data = []\n    \n    for paths in full_paths:\n        for each_path in  paths:\n            each_data.append(cv2.resize(pydicom.read_file(each_path).pixel_array, (256, 256)))\n        full_data.append(np.mean(each_data, axis=0))\n        each_data = []\n    data = np.mean(full_data, axis=0)\n    return data.astype(np.uint8)\n\n# func 10\ndef visualize_sample_mean_full(\n                     brats21id, mgmt_value,types=(\"FLAIR\", \"T1w\", \"T1wCE\", \"T2w\"),\n    dataroot=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/\"\n                    ):\n    plt.figure(figsize=(16, 5))\n    patient_path = os.path.join(dataroot, str(brats21id).zfill(5),)\n    full_paths = []\n    \n    \n    for i, t in enumerate(types, 1):\n        t_paths = sorted(\n            glob.glob(os.path.join(patient_path, t, \"*\")), \n            key=lambda x: int(x[:-4].split(\"-\")[-1]),\n        )\n        full_paths.append(t_paths)\n            \n    data = load_single_dicom_mean_full(full_paths)\n                 \n    plt.subplot(1, 1, 1)\n    print(data.max())\n    plt.imshow(data, cmap=\"gray\")\n    plt.title(\"full\", fontsize=16)\n    plt.axis(\"off\")\n\n    plt.suptitle(f\"MGMT_value: {mgmt_value}\", fontsize=16)\n    plt.show()\n\ndef quick_matrix_show(matrix,mgmt_value):\n    plt.figure(figsize=(16, 5))\n    plt.subplot(1, 1, 1)\n    plt.imshow(matrix, cmap=\"gray\")\n    plt.title(\"full\", fontsize=16)\n    plt.axis(\"off\")\n\n    plt.suptitle(f\"MGMT_value: {mgmt_value}\", fontsize=16)\n    plt.show()\n    \n    \n\n## func 11\ndef load_multi_dicom_mean_full(n=1, random_display=True, pick_n=False, types=(\"FLAIR\", \"T1w\", \"T1wCE\", \"T2w\"),\n                     dataroot=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/\",\n                    csv_data=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv\"):\n    \n    #Load csv data\n    train_df = pd.read_csv(csv_data)\n    \n    # display n  data randomly\n    if random_display and not pick_n:\n        import random\n        \n        len_ = train_df.shape[0]\n        \n        # start displaying\n        for _ in range(n):\n            i = random.randrange(0,len_)\n            _brats21id = train_df.iloc[i][\"BraTS21ID\"]\n            _mgmt_value = train_df.iloc[i][\"MGMT_value\"]\n            visualize_sample_mean_full(brats21id=_brats21id, mgmt_value=_mgmt_value)\n    # display n data sequentially\n    elif not random_display and pick_n:\n        _brats21id = train_df[train_df[\"BraTS21ID\"] == n][\"BraTS21ID\"].values[0]\n        _mgmt_value = train_df[train_df[\"BraTS21ID\"] == n][\"MGMT_value\"].values[0]\n        visualize_sample_mean_full(brats21id=_brats21id, mgmt_value=_mgmt_value)\n    else:\n        for i in range(n):\n            _brats21id = train_df.iloc[i][\"BraTS21ID\"]\n            _mgmt_value = train_df.iloc[i][\"MGMT_value\"]\n            visualize_sample_mean_full(brats21id=_brats21id, mgmt_value=_mgmt_value)\n# def create_n_animation(n=1, random_display=False,9u89uhpfyrfyfg\n#                      dataroot=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/\",\n#                     csv_data=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv\")","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.592888Z","iopub.execute_input":"2021-07-29T03:08:39.593245Z","iopub.status.idle":"2021-07-29T03:08:39.631539Z","shell.execute_reply.started":"2021-07-29T03:08:39.593208Z","shell.execute_reply":"2021-07-29T03:08:39.630615Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# load_multi_dicom_mean_full(random_display=True, n=3)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.633976Z","iopub.execute_input":"2021-07-29T03:08:39.634575Z","iopub.status.idle":"2021-07-29T03:08:39.643763Z","shell.execute_reply.started":"2021-07-29T03:08:39.634537Z","shell.execute_reply":"2021-07-29T03:08:39.642966Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# load_multi_dicom_mean(random_display=False, n=3)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.647088Z","iopub.execute_input":"2021-07-29T03:08:39.647460Z","iopub.status.idle":"2021-07-29T03:08:39.653093Z","shell.execute_reply.started":"2021-07-29T03:08:39.647428Z","shell.execute_reply":"2021-07-29T03:08:39.652325Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# display n data sequentially using multi func\n# load_multi_dicom(random_display=True, n=1)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.655396Z","iopub.execute_input":"2021-07-29T03:08:39.655641Z","iopub.status.idle":"2021-07-29T03:08:39.661579Z","shell.execute_reply.started":"2021-07-29T03:08:39.655618Z","shell.execute_reply":"2021-07-29T03:08:39.660778Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# load_multi_dicom(random_display=True, n=1)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.662930Z","iopub.execute_input":"2021-07-29T03:08:39.663321Z","iopub.status.idle":"2021-07-29T03:08:39.669522Z","shell.execute_reply.started":"2021-07-29T03:08:39.663288Z","shell.execute_reply":"2021-07-29T03:08:39.668782Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# images = load_dicom_line(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/00003/FLAIR\")\n# create_animation(images)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.670533Z","iopub.execute_input":"2021-07-29T03:08:39.672928Z","iopub.status.idle":"2021-07-29T03:08:39.677344Z","shell.execute_reply.started":"2021-07-29T03:08:39.672896Z","shell.execute_reply":"2021-07-29T03:08:39.676444Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# images = load_dicom_line(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/00003/T1w\")\n# create_animation(images)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.678498Z","iopub.execute_input":"2021-07-29T03:08:39.678959Z","iopub.status.idle":"2021-07-29T03:08:39.684514Z","shell.execute_reply.started":"2021-07-29T03:08:39.678925Z","shell.execute_reply":"2021-07-29T03:08:39.683819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# images = load_dicom_line(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/00003/T1wCE\")\n# create_animation(images)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.685926Z","iopub.execute_input":"2021-07-29T03:08:39.686499Z","iopub.status.idle":"2021-07-29T03:08:39.692393Z","shell.execute_reply.started":"2021-07-29T03:08:39.686464Z","shell.execute_reply":"2021-07-29T03:08:39.691542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# images = load_dicom_line(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/00000/T2w\")\n# create_animation(images)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.693682Z","iopub.execute_input":"2021-07-29T03:08:39.694039Z","iopub.status.idle":"2021-07-29T03:08:39.699401Z","shell.execute_reply.started":"2021-07-29T03:08:39.694004Z","shell.execute_reply":"2021-07-29T03:08:39.698349Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"package_path = \"../input/efficientnet-pytorch/EfficientNet-PyTorch/EfficientNet-PyTorch-master/\"\nimport sys \nsys.path.append(package_path)\n\nimport time\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\nimport efficientnet_pytorch\nfrom torchvision import models\n# from torchreid import models\nfrom sklearn.model_selection import StratifiedKFold\nfrom collections import OrderedDict\nfrom pytorch_lightning import Trainer, seed_everything\n\n# seed function \ndef 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\nrand_state = 7\nset_seed(rand_state)\nseed_everything(rand_state)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:39.700936Z","iopub.execute_input":"2021-07-29T03:08:39.701341Z","iopub.status.idle":"2021-07-29T03:08:42.552069Z","shell.execute_reply.started":"2021-07-29T03:08:39.701307Z","shell.execute_reply":"2021-07-29T03:08:42.551035Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# models.resnet50(pretrained=False)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.556456Z","iopub.execute_input":"2021-07-29T03:08:42.558488Z","iopub.status.idle":"2021-07-29T03:08:42.564607Z","shell.execute_reply.started":"2021-07-29T03:08:42.558416Z","shell.execute_reply":"2021-07-29T03:08:42.563748Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# os.path.join(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/\", str(4).zfill(5),\"\")","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.569316Z","iopub.execute_input":"2021-07-29T03:08:42.571824Z","iopub.status.idle":"2021-07-29T03:08:42.576811Z","shell.execute_reply.started":"2021-07-29T03:08:42.571779Z","shell.execute_reply":"2021-07-29T03:08:42.575986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# class DataRetriever(torch_data.Dataset):\n#     def __init__(self, paths, targets, types=(\"FLAIR\", \"T1w\", \"T1wCE\", \"T2w\"), dataroot=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/\"):\n#         self.paths = paths\n#         self.targets = targets\n#         self.types = types\n#         self.dataroot = dataroot\n          \n#     def __len__(self):\n#         return len(self.paths)\n    \n#     def __getitem__(self, index):\n#         _id = self.paths[index]        \n#         y = torch.tensor(self.targets[index], dtype=torch.float)\n#         patient_path = os.path.join(self.dataroot, str(_id).zfill(5),\"\")\n        \n            \n#         full_paths = self.load_all_dicom_mean_for_single(types=self.types, patient_path=patient_path)\n#         data = self.load_single_dicom_mean_full(full_paths)/255\n# #         print(data.max())\n#         return {\"X\": torch.tensor(data).float(), \"y\": y, \"index\":index, \"BraTS21ID\":_id}\n    \n#     def load_all_dicom_mean_for_single(self, types, patient_path):\n#         full_paths = []\n#         for i, t in enumerate(types, 1):\n#             t_paths = sorted(\n#                 glob.glob(os.path.join(patient_path, t, \"*\")), \n#                 key=lambda x: int(x[:-4].split(\"-\")[-1]),\n#             )\n#             full_paths.append(t_paths)\n#         return full_paths\n    \n#     # func 9\n#     def load_single_dicom_mean_full(self,full_paths):\n#         each_data = []\n#         full_data = []\n\n#         for paths in full_paths:\n#             for each_path in  paths:\n#                 each_data.append(cv2.resize(pydicom.read_file(each_path).pixel_array, (256, 256)))\n#             full_data.append(np.mean(each_data, axis=0))\n#             each_data = []\n#         data = np.mean(full_data, axis=0)\n#         return data.astype(np.uint8)\n","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.581581Z","iopub.execute_input":"2021-07-29T03:08:42.582149Z","iopub.status.idle":"2021-07-29T03:08:42.590101Z","shell.execute_reply.started":"2021-07-29T03:08:42.582112Z","shell.execute_reply":"2021-07-29T03:08:42.589086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms\nimport pytorch_lightning as pl\nfrom torchmetrics import Accuracy, F1\nfrom torch.nn import functional as F\n\nclass BrainTumorDataSetBackbone(Dataset):\n    \"\"\"Palm Oil Plantation dataset from kaggle, will be used in the PalmOilDataModule.\"\"\"\n\n    def __init__(self, paths, targets, types=(\"FLAIR\", \"T1w\", \"T1wCE\", \"T2w\"), dataroot=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train/\", transform=\"train\",test_csv_root=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv\"):\n        self.paths = paths\n        self.targets = targets\n        self.types = types\n        self.dataroot = dataroot\n        self.test_csv_root = test_csv_root\n            \n        if transform:\n            if transform in [\"train\", \"test\", \"val\"]:\n                self._transformer = self._pick_transformer(phase=transform)\n            elif type(transform) == transforms.Compose:\n                self._transformer = transform\n            else:\n                \"Use default transformer\"\n                self._transformer = self._pick_transformer()\n        else:\n            \"Pick no transformer\"\n            self._transformer = None\n\n    def __len__(self):\n        return len(self.paths)\n    \n    def load_brain_tumor_csv(csv_file):\n        df = pd.read_csv(csv_file_path)\n        return df\n    \n    def split_data(csv_file_path,split_ratio,random_state,stratify_by=\"MGMT_value\"):\n        #Load csv data\n        df = pd.read_csv(csv_file_path)\n        df_train, df_valid = sk_model_selection.train_test_split(\n            df, \n            test_size=split_ratio, \n            random_state=rand_state, \n            stratify=df[stratify_by],\n        )\n        return df_train, df_valid\n\n    @classmethod\n    def load_data_retriever(cls, df,transform=\"train\", test_csv=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv\"):\n        # #dataloader\n        data_retriever = cls(\n            df[\"BraTS21ID\"].values, \n            df[\"MGMT_value\"].values, \n            transform=transform\n        )\n        return data_retriever\n\n    def _pick_transformer(self, phase='test'):\n        if phase == \"each_transform\":\n            return {\n                    \"rand_rez_crop\" : transforms.RandomResizedCrop(224, scale=(0.5, 1.0), ratio=(0.2, 1)),\n                    \"rand_ver_flip\" : transforms.RandomVerticalFlip(p=0.7),\n                    \"rand_hor_flip\" : transforms.RandomHorizontalFlip(p=0.7),\n                    \"col_jit\" : transforms.ColorJitter(brightness=0.5, contrast=0.05, saturation=0.05, hue=0.05),\n                    \"rand_rot\": transforms.RandomRotation(30),\n                    \"to_tensor\" : transforms.ToTensor(),\n                    \"norm\" : transforms.Normalize((0.5, 0.5, 0.5), \n                                            (0.5, 0.5, 0.5))\n            }\n        elif phase == 'train':\n            return transforms.Compose([ \n                        transforms.Lambda(lambda x: x.expand(3, -1, -1)),\n#                         transforms.Resize((224, 224)),\n                        transforms.RandomResizedCrop(224, scale=(0.6, 1.0), ratio=(0.2, 1)),                        \n                        transforms.RandomVerticalFlip(p=0.7),\n                        transforms.RandomHorizontalFlip(p=0.7),\n#                         transforms.ColorJitter(),\n                        transforms.RandomRotation(30),\n#                         transforms.ToTensor(),,\n                        transforms.Grayscale(),\n#                         transforms.Normalize((0.5, 0.5, 0.5), \n#                                             (0.5, 0.5, 0.5))\n                    ])\n        \n        elif phase == 'val':\n                \n            return transforms.Compose([ \n                                            transforms.Lambda(lambda x: x.expand(3, -1, -1)),\n                                            transforms.Resize((224, 224)),\n#                                             transforms.ToTensor(),\n#                                             transforms.Normalize((0.5, 0.5, 0.5), \n#                                                                 (0.5, 0.5, 0.5)),\n                                            transforms.Grayscale()\n                                            ])\n                        \n        elif phase == 'test':\n\n            return transforms.Compose([ \n                                            transforms.Lambda(lambda x: x.expand(3, -1, -1)),\n                                            transforms.Resize((224, 224)),\n#                                             transforms.ToTensor(),\n#                                             transforms.Normalize((0.5, 0.5, 0.5), \n#                                                                 (0.5, 0.5, 0.5)),\n                                            transforms.Grayscale()\n                                            ])\n        else:\n            raise ValueError(\"Selected Transformer not available.\")\n\n    # real\n    def __getitem__(self, index):\n        _id = self.paths[index]        \n        y = torch.tensor(self.targets[index], dtype=torch.float)\n        patient_path = os.path.join(self.dataroot, str(_id).zfill(5),\"\")\n        \n        # load up the paths to images\n        full_paths = self.load_all_dicom_mean_for_single(types=self.types, patient_path=patient_path)\n        \n        # load up images\n        if self._transformer:\n            data = self.load_single_dicom_mean_full(full_paths, transform=self._transformer)/255\n        else:\n            data = self.load_single_dicom_mean_full(full_paths)/255\n        \n#         print(data.max())\n        return {\"X\": torch.tensor(data).float(), \"y\": y, \"index\":index, \"BraTS21ID\":_id}\n    \n    def load_all_dicom_mean_for_single(self, types, patient_path):\n        \"\"\"Function to load up all the paths to one single data point\"\"\"\n        full_paths = []\n        for i, t in enumerate(types, 1):\n            t_paths = sorted(\n                glob.glob(os.path.join(patient_path, t, \"*\")), \n                key=lambda x: int(x[:-4].split(\"-\")[-1]),\n            )\n            full_paths.append(t_paths)\n        return full_paths\n    \n    # func 9\n    def load_single_dicom_mean_full(self,full_paths,transform=None):\n        \"\"\"Function to load all the paths to images related to one data sample\"\"\"\n        each_data = []\n        full_data = []\n        for paths in full_paths:\n            for each_path in  paths:\n#                 each_data.append(cv2.resize(pydicom.read_file(each_path).pixel_array, (256, 256)))\n                image = np.array(pydicom.read_file(each_path).pixel_array, dtype=np.float32)\n                if transform:\n                    image = torch.from_numpy(image)\n                    image = transform(image).detach().cpu().squeeze(0).numpy()\n                else:\n                    image = cv2.resize(image, (224, 224))\n                each_data.append(image)\n            full_data.append(np.mean(each_data, axis=0))\n            each_data = []\n        data = np.mean(full_data, axis=0)\n        return data.astype(np.uint8)  ","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.594768Z","iopub.execute_input":"2021-07-29T03:08:42.595739Z","iopub.status.idle":"2021-07-29T03:08:42.640481Z","shell.execute_reply.started":"2021-07-29T03:08:42.595701Z","shell.execute_reply":"2021-07-29T03:08:42.639417Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class BrainTumorDataSetModule(pl.LightningDataModule):\n    def __init__(self, backbone, csv_file_path=None, split_ratio=0.2, random_state=rand_state, stratify_by=\"MGMT_value\"):\n        \"\"\"\n        Args:\n        \"\"\"\n        super().__init__()\n        self.backbone, self.csv_file_path, self.split_ratio, self.random_state, self.stratify_by = backbone, csv_file_path, split_ratio, random_state, stratify_by\n\n    def setup(self, test_csv=None):\n        # transforms for images\n        df_train, df_val = self.backbone.split_data(csv_file_path=self.csv_file_path, split_ratio=self.split_ratio, random_state=self.random_state, stratify_by=self.stratify_by)\n        self.train_data_retriever = self.backbone.load_data_retriever(df_train, transform=\"train\")\n        self.val_data_retriever = self.backbone.load_data_retriever(df_val, transform=\"val\")\n        if test_csv==None:\n            self.test_data_retriever  = self.backbone.load_data_retriever(df_val, transform=\"test\")\n        else:\n            df_test = self.backbone.load_brain_tumor_csv(csv_file=test_csv)\n            self.test_data_retriever  = self.backbone.load_data_retriever(df_test, transform=\"test\")\n\n    def train_dataloader(self):\n        return DataLoader(self.train_data_retriever, 50, shuffle=True, num_workers=8)\n\n    def val_dataloader(self):\n        return DataLoader(self.val_data_retriever, 30,shuffle=False, num_workers=8)\n\n    def test_dataloader(self):\n        if self.test_data_retriever:\n            return DataLoader(self.test_data_retriever, 30 ,shuffle=False, num_workers=8)\n        else:\n            return DataLoader(self.val_data_retriever, 30,shuffle=False, num_workers=8)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:42:34.157813Z","iopub.execute_input":"2021-07-29T03:42:34.158148Z","iopub.status.idle":"2021-07-29T03:42:34.167572Z","shell.execute_reply.started":"2021-07-29T03:42:34.158116Z","shell.execute_reply":"2021-07-29T03:42:34.166708Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# csv_data=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv\"\n\n# # rand_state = 89\n# # df_train, df_val = BrainTumorDataSetBackbone.split_data(csv_file_path=csv_data, split_ratio=0.2, random_state=rand_state, stratify_by=\"MGMT_value\")\n\n# # data_retriever\n# # train_data_retriever = BrainTumorDataSetBackbone.load_data_retriever(df_train, transform=\"train\")\n# # val_data_retriever = BrainTumorDataSetBackbone.load_data_retriever(df_val, transform=\"val\")\n# # test_data_retriever  = BrainTumorDataSetBackbone.load_data_retriever(df_val, transform=\"train\")\n\n# # data_loader\n# brain_tumor_dset = BrainTumorDataSetModule(backbone=BrainTumorDataSetBackbone, csv_file_path=csv_data, split_ratio=0.2, random_state=rand_state, stratify_by=\"MGMT_value\")\n# brain_tumor_dset.setup()","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.665343Z","iopub.execute_input":"2021-07-29T03:08:42.667839Z","iopub.status.idle":"2021-07-29T03:08:42.673316Z","shell.execute_reply.started":"2021-07-29T03:08:42.667795Z","shell.execute_reply":"2021-07-29T03:08:42.672502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_data_loader","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.677711Z","iopub.execute_input":"2021-07-29T03:08:42.680423Z","iopub.status.idle":"2021-07-29T03:08:42.685725Z","shell.execute_reply.started":"2021-07-29T03:08:42.680296Z","shell.execute_reply":"2021-07-29T03:08:42.684910Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ds = next(iter(train_data_loader))","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.689428Z","iopub.execute_input":"2021-07-29T03:08:42.692364Z","iopub.status.idle":"2021-07-29T03:08:42.696285Z","shell.execute_reply.started":"2021-07-29T03:08:42.692327Z","shell.execute_reply":"2021-07-29T03:08:42.695478Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ds[\"X\"].unsqueeze(1).shape","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.697670Z","iopub.execute_input":"2021-07-29T03:08:42.699441Z","iopub.status.idle":"2021-07-29T03:08:42.708288Z","shell.execute_reply.started":"2021-07-29T03:08:42.699404Z","shell.execute_reply":"2021-07-29T03:08:42.707438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ds[\"y\"].view((-1,1)).shape","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.709668Z","iopub.execute_input":"2021-07-29T03:08:42.710342Z","iopub.status.idle":"2021-07-29T03:08:42.715811Z","shell.execute_reply.started":"2021-07-29T03:08:42.710302Z","shell.execute_reply":"2021-07-29T03:08:42.715021Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# count = 0\n# for each in iter(brain_tumor_dset.test_data_retriever):\n#     print(each[\"index\"],each[\"BraTS21ID\"],each[\"X\"].max())\n#     quick_matrix_show(matrix=each[\"X\"], mgmt_value=each[\"y\"])\n#     print(\"<<< ===== >>>\")\n#     count +=1\n#     if count == 1:\n#         break\n# #         return_retriver","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.717138Z","iopub.execute_input":"2021-07-29T03:08:42.717661Z","iopub.status.idle":"2021-07-29T03:08:42.723713Z","shell.execute_reply.started":"2021-07-29T03:08:42.717624Z","shell.execute_reply":"2021-07-29T03:08:42.722924Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# load_multi_dicom_mean_full(n=530, random_display=False, pick_n=True)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.725080Z","iopub.execute_input":"2021-07-29T03:08:42.725822Z","iopub.status.idle":"2021-07-29T03:08:42.737687Z","shell.execute_reply.started":"2021-07-29T03:08:42.725783Z","shell.execute_reply":"2021-07-29T03:08:42.736763Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# load_multi_dicom_mean_full(n=296, random_display=False, pick_n=True)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.738800Z","iopub.execute_input":"2021-07-29T03:08:42.739284Z","iopub.status.idle":"2021-07-29T03:08:42.744707Z","shell.execute_reply.started":"2021-07-29T03:08:42.739251Z","shell.execute_reply":"2021-07-29T03:08:42.743824Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_train.iloc[:2]","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.746129Z","iopub.execute_input":"2021-07-29T03:08:42.746721Z","iopub.status.idle":"2021-07-29T03:08:42.751756Z","shell.execute_reply.started":"2021-07-29T03:08:42.746685Z","shell.execute_reply":"2021-07-29T03:08:42.750853Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_train[df_train.MGMT_value == 0].count()","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.753224Z","iopub.execute_input":"2021-07-29T03:08:42.753731Z","iopub.status.idle":"2021-07-29T03:08:42.764760Z","shell.execute_reply.started":"2021-07-29T03:08:42.753693Z","shell.execute_reply":"2021-07-29T03:08:42.763850Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_train[df_train.MGMT_value == 1].count()","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.766100Z","iopub.execute_input":"2021-07-29T03:08:42.766510Z","iopub.status.idle":"2021-07-29T03:08:42.771687Z","shell.execute_reply.started":"2021-07-29T03:08:42.766476Z","shell.execute_reply":"2021-07-29T03:08:42.770726Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_valid[df_valid.MGMT_value == 0].count()","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.773121Z","iopub.execute_input":"2021-07-29T03:08:42.773711Z","iopub.status.idle":"2021-07-29T03:08:42.778766Z","shell.execute_reply.started":"2021-07-29T03:08:42.773675Z","shell.execute_reply":"2021-07-29T03:08:42.777838Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df_valid[df_valid.MGMT_value == 1].count()","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.780251Z","iopub.execute_input":"2021-07-29T03:08:42.780788Z","iopub.status.idle":"2021-07-29T03:08:42.792827Z","shell.execute_reply.started":"2021-07-29T03:08:42.780753Z","shell.execute_reply":"2021-07-29T03:08:42.791837Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plt.figure(figsize=(16, 6))\n# for i in range(3):\n#     plt.subplot(1, 3, i + 1)\n#     plt.imshow(train_data_retriever[82+i][\"X\"].numpy(), cmap=\"gray\")","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.794134Z","iopub.execute_input":"2021-07-29T03:08:42.794464Z","iopub.status.idle":"2021-07-29T03:08:42.799961Z","shell.execute_reply.started":"2021-07-29T03:08:42.794433Z","shell.execute_reply":"2021-07-29T03:08:42.798991Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# models.resnet34(pretrained = False)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:08:42.801450Z","iopub.execute_input":"2021-07-29T03:08:42.802079Z","iopub.status.idle":"2021-07-29T03:08:42.806936Z","shell.execute_reply.started":"2021-07-29T03:08:42.802039Z","shell.execute_reply":"2021-07-29T03:08:42.805956Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nclass BrainTumorModel(pl.LightningModule):\n    \"\"\"\n    Multi-View Convolutional Neural Network (MVCNN)\n    Initializes a model with the architecture of a MVCNN with a ResNet34 base.\n    \"\"\"\n    def __init__(self, num_classes=1, pretrained=False):\n        super(BrainTumorModel, self).__init__()\n        \n        \n        resnet_backbone = models.resnet50(pretrained = pretrained)\n#         self.fc_in_features = resnet_backbone.fc.in_features\n#         self.acc = Accuracy()\n        tumornet_head = nn.Sequential(nn.Conv2d(1, 3, kernel_size=3, stride=1,bias=False))\n        \n        \n#         features = nn.Sequential(OrderedDict([\n#               ('ResnetBackbone', nn.Sequential(*list(resnet_backbone.children())[:-1], )),\n#             ]))\n#         print(self.fc_in_features)\n        resnet_backbone.fc = nn.Sequential(OrderedDict([\n                                          ('drop', nn.Dropout(p=0.3)),\n                                          ('relu', nn.ReLU(inplace=True)),\n                                          ('cassifier1', nn.Linear(2048,num_classes)),\n                                          ('sig', nn.Sigmoid())\n\n        ]))\n    \n\n        self.model  = nn.Sequential(OrderedDict([\n              ('TumornetHead', tumornet_head),\n              ('ResnetBackbone', resnet_backbone)\n            ]))\n        \n\n    def forward(self, inputs): # inputs.shape = samples x views x height x width x channels\n        if inputs.dim() == 3:\n            inputs = inputs.unsqueeze(1)\n        outputs = self.model(inputs)\n        return outputs\n\n    def configure_optimizers(self):\n        return SGD(self.parameters(), lr=0.0003)\n\n    def my_loss(self, y_hat, y):\n        return F.binary_cross_entropy(y_hat, y)\n\n    def training_step(self, batch, batch_idx,pred_threshold=0.5):\n        loss, acc = self.share_step(batch=batch,pred_threshold=pred_threshold)\n        metrics = {\n                    'loss': loss,\n                    'train_acc': acc,\n                }\n        self.log_dict(metrics, prog_bar=True, logger=True, on_step=False, on_epoch=True)\n        return metrics\n\n    def validation_step(self, batch, batch_idx,pred_threshold=0.5):\n        loss, acc = self.share_step(batch=batch,pred_threshold=pred_threshold)\n        metrics = { 'val_loss': loss, 'val_acc': acc}\n        self.log_dict(metrics, prog_bar=True, logger=True, on_step=False, on_epoch=True)\n        return metrics\n\n    def validation_step_end(self, val_step_outputs):\n        pass\n\n    def test_step(self, batch, batch_idx,pred_threshold=0.20):\n        metrics = self.validation_step(batch, batch_idx,pred_threshold)\n        metrics = {'test_acc': metrics['val_acc'], 'test_loss': metrics['val_loss']}\n        self.log_dict(metrics)\n\n    def share_step(self, batch, pred_threshold=0.5):\n        # unpack\n        x,y = batch[\"X\"], batch[\"y\"]\n\n        # forward pass\n        pred_probab = self(x)\n        \n        #get predictions and loss\n        # pred_probab = nn.Softmax(dim=1)(logits)\n        # pred_probab = nn.Sigmoid()(logits)\n        # print(pred_probab)\n        # y_hat = pred_probab.argmax(1)\n        y_hat = (pred_probab.clone().detach() > pred_threshold).type(torch.int)\n        loss = self.my_loss(pred_probab, y.unsqueeze(1))\n        acc = Accuracy()(y_hat, y.unsqueeze(1).long())\n        return loss, acc\n    \n    def disable_backprop_custom(self, head=False, features=True, tail=False):\n        \n        # Turn off all backprop\n        for param in self.parameters():\n            param.requires_grad = not features\n\n        # Turn on backprop for head\n        for param in self.model.TumornetHead.parameters():\n            param.requires_grad = not head\n\n        # Turn off backprop for tail\n        for param in self.model.ResnetBackbone.fc.parameters():\n            param.requires_grad = not tail","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:40:38.584643Z","iopub.execute_input":"2021-07-29T03:40:38.584974Z","iopub.status.idle":"2021-07-29T03:40:38.607207Z","shell.execute_reply.started":"2021-07-29T03:40:38.584940Z","shell.execute_reply":"2021-07-29T03:40:38.606268Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# load dataset to check model\n# ds = next(iter(brain_tumor_dset.test_dataloader()))","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:24:10.404204Z","iopub.execute_input":"2021-07-29T03:24:10.404621Z","iopub.status.idle":"2021-07-29T03:26:29.736134Z","shell.execute_reply.started":"2021-07-29T03:24:10.404584Z","shell.execute_reply":"2021-07-29T03:26:29.734401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for p in model.model.ResnetBackbone.fc.parameters():\n#     print(p)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:40:51.804477Z","iopub.execute_input":"2021-07-29T03:40:51.804806Z","iopub.status.idle":"2021-07-29T03:40:51.808963Z","shell.execute_reply.started":"2021-07-29T03:40:51.804774Z","shell.execute_reply":"2021-07-29T03:40:51.808074Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # #check model for any error\n# acc = Accuracy()\n# def my_loss(y_hat, y):\n#     return F.binary_cross_entropy(y_hat, y)\n# pred_probab = model(ds[\"X\"].cuda())\n# # # print(pred_probab.shape,ds[\"y\"].unsqueeze(1).shape)\n# # print(pred_probab, ds[\"y\"].unsqueeze(1))\n# loss = my_loss(pred_probab.cpu(), ds[\"y\"].unsqueeze(1))\n# y_hat = (pred_probab.clone().detach() > 0.5).type(torch.int)\n# print(y_hat)\n# acc = acc(y_hat.cpu(), ds[\"y\"].unsqueeze(1).long())\n# print(\"acc \",acc)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:40:54.404696Z","iopub.execute_input":"2021-07-29T03:40:54.405013Z","iopub.status.idle":"2021-07-29T03:40:54.408685Z","shell.execute_reply.started":"2021-07-29T03:40:54.404982Z","shell.execute_reply":"2021-07-29T03:40:54.407745Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from pytorch_lightning.callbacks import ModelCheckpoint\nfrom pytorch_lightning import Trainer\nfrom torch.optim import SGD,RMSprop\nimport time\n\ncsv_data=\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv\"\nrand_state = 89\n\n# data_loader init\nbrain_tumor_dset = BrainTumorDataSetModule(backbone=BrainTumorDataSetBackbone, csv_file_path=csv_data, split_ratio=0.2, random_state=rand_state, stratify_by=\"MGMT_value\")\nbrain_tumor_dset.setup()\n\n# model init\nmodel = BrainTumorModel(num_classes=1, pretrained=True).cuda()\n\n#load pretrained\npass\n\nmodel.disable_backprop_custom(head=False, features=True, tail=False)\n\n# checkpoint\nmonitor = 'val_loss'\nmodel_dir = './models/'\nfilename = 'palm-oil-model4-{epoch:02d}-{val_loss:.4f}-{val_acc:.4f}_'\nsave_top_k = 1\nmode='min'\n\n# training\nmax_epoch = 1\ncheck_val_every_n_epoch = 1\nis_cpu=-1\n\n#checkpoint init\ncheckpoint_callback = ModelCheckpoint(monitor=monitor,dirpath=model_dir, filename=filename+\"val\",save_top_k=save_top_k,mode=mode)\n\n#trainer init\ntrainer = Trainer(max_epochs=max_epoch, \n                    check_val_every_n_epoch=check_val_every_n_epoch,\n                    gpus=is_cpu,\n                    reload_dataloaders_every_epoch=True,\n                    callbacks=[checkpoint_callback]\n                    )\n\n#start timer\n# start = time.time()\n\n# # start/continue training\n# trainer.fit(model, brain_tumor_dset)\n\n# #stop and output timer result\n# print('model finish training at {}'.format(time.time()-start))","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:40:57.285829Z","iopub.execute_input":"2021-07-29T03:40:57.286150Z","iopub.status.idle":"2021-07-29T03:40:57.950708Z","shell.execute_reply.started":"2021-07-29T03:40:57.286118Z","shell.execute_reply":"2021-07-29T03:40:57.949877Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model = model.cuda()","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:17:25.232791Z","iopub.execute_input":"2021-07-29T03:17:25.233202Z","iopub.status.idle":"2021-07-29T03:17:25.287184Z","shell.execute_reply.started":"2021-07-29T03:17:25.233143Z","shell.execute_reply":"2021-07-29T03:17:25.286218Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model.device","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:41:04.164539Z","iopub.execute_input":"2021-07-29T03:41:04.164896Z","iopub.status.idle":"2021-07-29T03:41:04.170618Z","shell.execute_reply.started":"2021-07-29T03:41:04.164866Z","shell.execute_reply":"2021-07-29T03:41:04.169598Z"},"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":"# def main(args):\n#     model = LightningModule()\n#     trainer = Trainer.from_argparse_args(args)\n#     trainer.fit(model)\n\n# if __name__ == '__main__':\n#     parser = ArgumentParser()\n#     parser = Trainer.add_argparse_args(parser)\n#     args = parser.parse_args()\n\n#     main(args)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:17:25.297809Z","iopub.execute_input":"2021-07-29T03:17:25.298249Z","iopub.status.idle":"2021-07-29T03:17:25.306152Z","shell.execute_reply.started":"2021-07-29T03:17:25.298199Z","shell.execute_reply":"2021-07-29T03:17:25.304959Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model = BrainTumorModel(num_classes=1, pretrained=False)\n# model.to(device)\n\n# # Turn off backprop\n# for param in model.parameters():\n#     param.requires_grad = False\n\n# # Turn on backprop for head\n# for param in model.model[0].parameters():\n#     param.requires_grad = True\n    \n# # Turn on backprop for head\n# for param in model.model[2].parameters():\n#     param.requires_grad = True\n    \n# data = torch.randn(10,256,256).to(device)\n# model.eval()\n# model(data).shape","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:17:25.307796Z","iopub.execute_input":"2021-07-29T03:17:25.308238Z","iopub.status.idle":"2021-07-29T03:17:25.316766Z","shell.execute_reply.started":"2021-07-29T03:17:25.308186Z","shell.execute_reply":"2021-07-29T03:17:25.315817Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# class LossMeter:\n#     def __init__(self):\n#         self.avg = 0\n#         self.n = 0\n\n#     def update(self, val):\n#         self.n += 1\n#         # incremental update\n#         self.avg = val / self.n + (self.n - 1) / self.n * self.avg\n\n        \n# class AccMeter:\n#     def __init__(self):\n#         self.avg = 0\n#         self.n = 0\n        \n#     def update(self, y_true, y_pred):\n#         y_true = y_true.cpu().numpy().astype(int)\n#         y_pred = y_pred.cpu().numpy() >= 0\n#         last_n = self.n\n#         self.n += len(y_true)\n#         true_count = np.sum(y_true == y_pred)\n#         # incremental update\n#         self.avg = true_count / self.n + last_n / self.n * self.avg","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:17:25.318751Z","iopub.execute_input":"2021-07-29T03:17:25.319054Z","iopub.status.idle":"2021-07-29T03:17:25.329786Z","shell.execute_reply.started":"2021-07-29T03:17:25.319017Z","shell.execute_reply":"2021-07-29T03:17:25.328921Z"},"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#         loss_meter, \n#         score_meter\n#     ):\n#         self.model = model\n#         self.device = device\n#         self.optimizer = optimizer\n#         self.criterion = criterion\n#         self.loss_meter = loss_meter\n#         self.score_meter = score_meter\n        \n#         self.best_valid_score = -np.inf\n#         self.n_patience = 0\n        \n#         self.messages = {\n#             \"epoch\": \"[Epoch {}: {}] loss: {:.5f}, score: {:.5f}, time: {} s\",\n#             \"checkpoint\": \"The score improved from {:.5f} to {:.5f}. Save model to '{}'\",\n#             \"patience\": \"\\nValid score didn't improve last {} epochs.\"\n#         }\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_score, train_time = self.train_epoch(train_loader)\n#             valid_loss, valid_score, valid_time = self.valid_epoch(valid_loader)\n            \n#             self.info_message(\n#                 self.messages[\"epoch\"], \"Train\", n_epoch, train_loss, train_score, train_time\n#             )\n            \n#             self.info_message(\n#                 self.messages[\"epoch\"], \"Valid\", n_epoch, valid_loss, valid_score, valid_time\n#             )\n\n#             if True:\n# #             if self.best_valid_score < valid_score:\n#                 self.info_message(\n#                     self.messages[\"checkpoint\"], self.best_valid_score, valid_score, save_path\n#                 )\n#                 self.best_valid_score = valid_score\n#                 self.save_model(n_epoch, save_path)\n#                 self.n_patience = 0\n#             else:\n#                 self.n_patience += 1\n            \n#             if self.n_patience >= patience:\n#                 self.info_message(self.messages[\"patience\"], patience)\n#                 break\n            \n#     def train_epoch(self, train_loader):\n#         self.model.train()\n#         t = time.time()\n#         train_loss = self.loss_meter()\n#         train_score = self.score_meter()\n        \n#         for step, batch in enumerate(train_loader, 1):\n#             X = batch[\"X\"].to(self.device)\n#             targets = batch[\"y\"].to(self.device)\n#             self.optimizer.zero_grad()\n# #             outputs = self.model(X).squeeze(1)\n#             outputs = self.model(X)\n            \n#             loss = self.criterion(outputs, targets.view((-1,1)))\n#             loss.backward()\n\n#             train_loss.update(loss.detach().item())\n#             train_score.update(targets, outputs.detach())\n\n#             self.optimizer.step()\n            \n#             _loss, _score = train_loss.avg, train_score.avg\n#             message = 'Train Step {}/{}, train_loss: {:.5f}, train_score: {:.5f}'\n#             self.info_message(message, step, len(train_loader), _loss, _score, end=\"\\r\")\n        \n#         return train_loss.avg, train_score.avg, int(time.time() - t)\n    \n#     def valid_epoch(self, valid_loader):\n#         self.model.eval()\n#         t = time.time()\n#         valid_loss = self.loss_meter()\n#         valid_score = self.score_meter()\n\n#         for step, batch in enumerate(valid_loader, 1):\n#             with torch.no_grad():\n#                 X = batch[\"X\"].to(self.device)\n#                 targets = batch[\"y\"].to(self.device)\n\n#                 outputs = self.model(X).squeeze(1)\n#                 loss = self.criterion(outputs, targets)\n\n#                 valid_loss.update(loss.detach().item())\n#                 valid_score.update(targets, outputs)\n                \n#             _loss, _score = valid_loss.avg, valid_score.avg\n#             message = 'Valid Step {}/{}, valid_loss: {:.5f}, valid_score: {:.5f}'\n#             self.info_message(message, step, len(valid_loader), _loss, _score, end=\"\\r\")\n        \n#         return valid_loss.avg, valid_score.avg, int(time.time() - t)\n    \n#     def save_model(self, n_epoch, save_path):\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#             save_path,\n#         )\n    \n#     @staticmethod\n#     def info_message(message, *args, end=\"\\n\"):\n#         print(message.format(*args), end=end)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:17:25.332759Z","iopub.execute_input":"2021-07-29T03:17:25.333087Z","iopub.status.idle":"2021-07-29T03:17:25.339564Z","shell.execute_reply.started":"2021-07-29T03:17:25.333053Z","shell.execute_reply":"2021-07-29T03:17:25.338559Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# optimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n# criterion = torch_functional.binary_cross_entropy_with_logits\n\n# trainer = Trainer(\n#     model, \n#     device, \n#     optimizer, \n#     criterion, \n#     LossMeter, \n#     AccMeter\n# )\n\n# history = trainer.fit(\n#     3, \n#     train_loader, \n#     valid_loader, \n#     f\"best-model-0.pth\", \n#     100,\n# )\n","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:17:25.341072Z","iopub.execute_input":"2021-07-29T03:17:25.341427Z","iopub.status.idle":"2021-07-29T03:17:25.352480Z","shell.execute_reply.started":"2021-07-29T03:17:25.341394Z","shell.execute_reply":"2021-07-29T03:17:25.351254Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# models = []\n# for i in range(1):\n#     model = Model()\n#     model.to(device)\n    \n#     checkpoint = torch.load(f\"best-model-{i}.pth\")\n#     model.load_state_dict(checkpoint[\"model_state_dict\"])\n#     model.eval()\n    \n#     models.append(model)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:17:25.353990Z","iopub.execute_input":"2021-07-29T03:17:25.354369Z","iopub.status.idle":"2021-07-29T03:17:25.364633Z","shell.execute_reply.started":"2021-07-29T03:17:25.354335Z","shell.execute_reply":"2021-07-29T03:17:25.363753Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# class DataRetriever(torch_data.Dataset):\n#     def __init__(self, paths):\n#         self.paths = paths\n          \n#     def __len__(self):\n#         return len(self.paths)\n    \n#     def __getitem__(self, index):\n#         _id = self.paths[index]\n#         patient_path = f\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/test/{str(_id).zfill(5)}/\"\n#         channels = []\n#         for t in (\"FLAIR\", \"T1w\", \"T1wCE\"): # \"T2w\"\n#             t_paths = sorted(\n#                 glob.glob(os.path.join(patient_path, t, \"*\")), \n#                 key=lambda x: int(x[:-4].split(\"-\")[-1]),\n#             )\n#             start, end = int(len(t_paths) * 0.5), int(len(t_paths) * 0.5)\n#             channel = []\n#             for i in range(start, end + 1):\n#                 channel.append(cv2.resize(load_dicom(t_paths[i]), (256, 256)) / 255)\n#             channel = np.mean(channel, axis=0)\n#             channels.append(channel)\n        \n#         return {\"X\": torch.tensor(channels).float(), \"id\": _id}","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:17:25.365929Z","iopub.execute_input":"2021-07-29T03:17:25.366505Z","iopub.status.idle":"2021-07-29T03:17:25.373553Z","shell.execute_reply.started":"2021-07-29T03:17:25.366470Z","shell.execute_reply":"2021-07-29T03:17:25.372756Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# submission = pd.read_csv(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/sample_submission.csv\")\n\n# test_data_retriever = DataRetriever(\n#     submission[\"BraTS21ID\"].values, \n# )\n\n# test_loader = torch_data.DataLoader(\n#     test_data_retriever,\n#     batch_size=4,\n#     shuffle=False,\n#     num_workers=8,\n# )","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:17:25.374865Z","iopub.execute_input":"2021-07-29T03:17:25.375432Z","iopub.status.idle":"2021-07-29T03:17:25.382473Z","shell.execute_reply.started":"2021-07-29T03:17:25.375396Z","shell.execute_reply":"2021-07-29T03:17:25.381604Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# y_pred = []\n# ids = []\n\n# for e, batch in enumerate(test_loader):\n#     print(f\"{e}/{len(test_loader)}\", end=\"\\r\")\n#     with torch.no_grad():\n#         tmp_pred = np.zeros((batch[\"X\"].shape[0], ))\n#         for model in models:\n#             tmp_res = torch.sigmoid(model(batch[\"X\"].to(device))).cpu().numpy().squeeze()\n#             tmp_pred += tmp_res\n#         y_pred.extend(tmp_pred)\n#         ids.extend(batch[\"id\"].numpy().tolist())","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:17:25.385686Z","iopub.execute_input":"2021-07-29T03:17:25.385979Z","iopub.status.idle":"2021-07-29T03:17:25.392392Z","shell.execute_reply.started":"2021-07-29T03:17:25.385951Z","shell.execute_reply":"2021-07-29T03:17:25.391399Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# submission = pd.DataFrame({\"BraTS21ID\": ids, \"MGMT_value\": y_pred})\n# submission.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:17:25.401777Z","iopub.execute_input":"2021-07-29T03:17:25.402386Z","iopub.status.idle":"2021-07-29T03:17:25.405983Z","shell.execute_reply.started":"2021-07-29T03:17:25.402346Z","shell.execute_reply":"2021-07-29T03:17:25.404973Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# submission","metadata":{"execution":{"iopub.status.busy":"2021-07-29T03:17:25.407740Z","iopub.execute_input":"2021-07-29T03:17:25.408435Z","iopub.status.idle":"2021-07-29T03:17:25.415284Z","shell.execute_reply.started":"2021-07-29T03:17:25.408322Z","shell.execute_reply":"2021-07-29T03:17:25.414426Z"},"trusted":true},"execution_count":null,"outputs":[]}]}