{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport numpy as np \nimport pandas as pd \nimport sys\nimport gc\nimport random\nimport time\nfrom contextlib import contextmanager\nfrom pathlib import Path\nfrom collections import defaultdict, Counter\n\nimport skimage.io\nimport cv2\nfrom PIL import Image\nimport scipy as sp\n\nimport sklearn.metrics\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.model_selection import StratifiedKFold\n\nfrom functools import partial\nfrom tqdm import tqdm\n\nimport torch\nimport torch.nn as nn\nfrom torch.optim import Adam, SGD\nfrom torch.optim.lr_scheduler import CosineAnnealingLR, ReduceLROnPlateau\nfrom torch.utils.data import DataLoader, Dataset\nimport torchvision.models as models\n\nfrom albumentations import Compose, Normalize, HorizontalFlip, VerticalFlip\nfrom albumentations.pytorch import ToTensorV2\n\nimport warnings \nwarnings.filterwarnings('ignore')\n\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\ndevice","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-12-19T06:08:46.942534Z","iopub.execute_input":"2022-12-19T06:08:46.942957Z","iopub.status.idle":"2022-12-19T06:08:50.552122Z","shell.execute_reply.started":"2022-12-19T06:08:46.942875Z","shell.execute_reply":"2022-12-19T06:08:50.5511Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.listdir('../input/prostate-cancer-grade-assessment')","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:08:50.554233Z","iopub.execute_input":"2022-12-19T06:08:50.5548Z","iopub.status.idle":"2022-12-19T06:08:50.564491Z","shell.execute_reply.started":"2022-12-19T06:08:50.554763Z","shell.execute_reply":"2022-12-19T06:08:50.561866Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def check_id(df, folder):\n    id_list = [f.name for f in os.scandir(folder)]\n    id_list = [id[:-4] for id in id_list]\n    df = df[(df['image_id'].isin(id_list))]\n    return df","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:08:50.566792Z","iopub.execute_input":"2022-12-19T06:08:50.567539Z","iopub.status.idle":"2022-12-19T06:08:50.574076Z","shell.execute_reply.started":"2022-12-19T06:08:50.567505Z","shell.execute_reply":"2022-12-19T06:08:50.573019Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/train-test-splitted-panda/1.csv')\ntest_df = pd.read_csv('/kaggle/input/train-test-splitted-panda/2.csv')","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:08:50.576771Z","iopub.execute_input":"2022-12-19T06:08:50.577511Z","iopub.status.idle":"2022-12-19T06:08:50.617364Z","shell.execute_reply.started":"2022-12-19T06:08:50.577478Z","shell.execute_reply":"2022-12-19T06:08:50.61655Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path = '/kaggle/input/image-mask-overlay-512x512/train_overlay_images/'\ntrain_new = check_id(train_df, path)","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:08:50.618593Z","iopub.execute_input":"2022-12-19T06:08:50.619012Z","iopub.status.idle":"2022-12-19T06:08:51.766567Z","shell.execute_reply.started":"2022-12-19T06:08:50.618978Z","shell.execute_reply":"2022-12-19T06:08:51.765608Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_new.reset_index(drop = True, inplace = True)","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:08:51.768193Z","iopub.execute_input":"2022-12-19T06:08:51.768721Z","iopub.status.idle":"2022-12-19T06:08:51.774055Z","shell.execute_reply.started":"2022-12-19T06:08:51.768685Z","shell.execute_reply":"2022-12-19T06:08:51.772644Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_new","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:08:51.77569Z","iopub.execute_input":"2022-12-19T06:08:51.77642Z","iopub.status.idle":"2022-12-19T06:08:51.795872Z","shell.execute_reply.started":"2022-12-19T06:08:51.776386Z","shell.execute_reply":"2022-12-19T06:08:51.794877Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import imageio","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:08:51.797293Z","iopub.execute_input":"2022-12-19T06:08:51.797623Z","iopub.status.idle":"2022-12-19T06:08:51.801914Z","shell.execute_reply.started":"2022-12-19T06:08:51.797592Z","shell.execute_reply":"2022-12-19T06:08:51.800871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path = '/kaggle/input/image-mask-overlay-512x512/train_overlay_images/'\ntest_new = check_id(test_df, path)","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:08:51.803699Z","iopub.execute_input":"2022-12-19T06:08:51.804194Z","iopub.status.idle":"2022-12-19T06:08:51.825321Z","shell.execute_reply.started":"2022-12-19T06:08:51.80416Z","shell.execute_reply":"2022-12-19T06:08:51.82453Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_new.reset_index(drop = True, inplace = True)","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:08:51.828846Z","iopub.execute_input":"2022-12-19T06:08:51.829123Z","iopub.status.idle":"2022-12-19T06:08:51.834284Z","shell.execute_reply.started":"2022-12-19T06:08:51.829099Z","shell.execute_reply":"2022-12-19T06:08:51.833114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_new","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:08:51.835985Z","iopub.execute_input":"2022-12-19T06:08:51.836354Z","iopub.status.idle":"2022-12-19T06:08:51.852339Z","shell.execute_reply.started":"2022-12-19T06:08:51.836296Z","shell.execute_reply":"2022-12-19T06:08:51.851364Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Tiles","metadata":{}},{"cell_type":"code","source":"def tile(img, sz=7, N=16):\n    #sz = size of each tile, N = number of tiles\n    \n    # will give the shape of input image \n    shape = img.shape \n    \n    #padding of images is done so that information does'nt gets lost.\n    pad0,pad1 = (sz - shape[0]%sz)%sz, (sz - shape[1]%sz)%sz  \n    img = np.pad(img,[[pad0//2,pad0-pad0//2],[pad1//2,pad1-pad1//2],[0,0]],\n                 constant_values=255)\n    \n    #reshaping and transposing the images\n    img = img.reshape(img.shape[0]//sz,sz,img.shape[1]//sz,sz,3)\n    img = img.transpose(0,2,1,3,4).reshape(-1,sz,sz,3)\n    \n    #if length of image is less than number of tiles(N) then padding will take place\n    if len(img) < N:\n        img = np.pad(img,[[0,N-len(img)],[0,0],[0,0],[0,0]],constant_values=255)\n        \n    #sorting the images in ascending order(default) with the lowest sum\n    idxs = np.argsort(img.reshape(img.shape[0],-1).sum(-1))[:N] \n    img = img[idxs] \n    \n    #returning images\n    return img","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:34:47.242977Z","iopub.execute_input":"2022-12-19T06:34:47.243734Z","iopub.status.idle":"2022-12-19T06:34:47.25501Z","shell.execute_reply.started":"2022-12-19T06:34:47.243693Z","shell.execute_reply":"2022-12-19T06:34:47.253865Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\n    train_dataset = TrainDataset(folds.loc[trn_idx].reset_index(drop=True), \n                                 folds.loc[trn_idx].reset_index(drop=True)[CFG.target_col], \n                                 transform=get_transforms(data='train'))\n    valid_dataset = TrainDataset(folds.loc[val_idx].reset_index(drop=True), \n                                 folds.loc[val_idx].reset_index(drop=True)[CFG.target_col], \n                                 transform=get_transforms(data='valid'))\n    \n    train_loader = DataLoader(train_dataset, batch_size=CFG.batch_size, shuffle=True, num_workers=4)\n    \n    valid_loader = DataLoader(valid_dataset, batch_size=CFG.batch_size, shuffle=False, num_workers=4)\n    \n\"\"\"","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:08:51.864039Z","iopub.execute_input":"2022-12-19T06:08:51.864679Z","iopub.status.idle":"2022-12-19T06:08:51.878014Z","shell.execute_reply.started":"2022-12-19T06:08:51.864647Z","shell.execute_reply":"2022-12-19T06:08:51.877065Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# MONAI","metadata":{}},{"cell_type":"code","source":"!pip install scapy","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:08:51.879671Z","iopub.execute_input":"2022-12-19T06:08:51.880217Z","iopub.status.idle":"2022-12-19T06:09:07.222913Z","shell.execute_reply.started":"2022-12-19T06:08:51.880177Z","shell.execute_reply":"2022-12-19T06:09:07.221758Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install -q monai","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:07.225387Z","iopub.execute_input":"2022-12-19T06:09:07.225809Z","iopub.status.idle":"2022-12-19T06:09:19.367653Z","shell.execute_reply.started":"2022-12-19T06:09:07.22577Z","shell.execute_reply":"2022-12-19T06:09:19.366399Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Copyright 2020 MONAI Consortium\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#     http://www.apache.org/licenses/LICENSE-2.0\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport os\nimport shutil\nimport tempfile\nimport matplotlib.pyplot as plt\nimport PIL\nimport torch\nimport numpy as np\nfrom sklearn.metrics import classification_report\nimport monai\n\nfrom monai.apps import download_and_extract\nfrom monai.config import print_config\nfrom monai.data import decollate_batch, DataLoader\nfrom monai.metrics import ROCAUCMetric\nfrom monai.networks.nets import DenseNet121\nfrom monai.transforms import (\n    Activations,\n    EnsureChannelFirst,\n    AsDiscrete,\n    Compose,\n    LoadImage,\n    RandFlip,\n    RandRotate,\n    RandZoom,\n    ScaleIntensity,\n)\nfrom monai.utils import set_determinism\n\nprint_config()","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:19.370041Z","iopub.execute_input":"2022-12-19T06:09:19.370422Z","iopub.status.idle":"2022-12-19T06:09:22.873668Z","shell.execute_reply.started":"2022-12-19T06:09:19.370383Z","shell.execute_reply":"2022-12-19T06:09:22.87276Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from monai.apps import download_and_extract\nfrom monai.config import print_config\nfrom monai.metrics import ROCAUCMetric\nfrom monai.networks.nets import DenseNet121,EfficientNetBN, SEResNext50, UNet\nfrom monai.transforms import *\nfrom monai.data import Dataset, DataLoader\nfrom monai.utils import set_determinism","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:22.875076Z","iopub.execute_input":"2022-12-19T06:09:22.875443Z","iopub.status.idle":"2022-12-19T06:09:22.885507Z","shell.execute_reply.started":"2022-12-19T06:09:22.875406Z","shell.execute_reply":"2022-12-19T06:09:22.884679Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/train-test-splitted-panda/1.csv')\ntest = pd.read_csv('/kaggle/input/train-test-splitted-panda/2.csv')","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:22.88711Z","iopub.execute_input":"2022-12-19T06:09:22.88744Z","iopub.status.idle":"2022-12-19T06:09:22.915661Z","shell.execute_reply.started":"2022-12-19T06:09:22.887408Z","shell.execute_reply":"2022-12-19T06:09:22.914856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class_names = [0,1,2,3,4,5]\nnum_class = len(class_names)","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:22.920974Z","iopub.execute_input":"2022-12-19T06:09:22.921228Z","iopub.status.idle":"2022-12-19T06:09:22.925762Z","shell.execute_reply.started":"2022-12-19T06:09:22.921204Z","shell.execute_reply":"2022-12-19T06:09:22.924763Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir = '/kaggle/input/train-test-splitted-panda/1.csv'","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:22.927316Z","iopub.execute_input":"2022-12-19T06:09:22.927921Z","iopub.status.idle":"2022-12-19T06:09:22.935611Z","shell.execute_reply.started":"2022-12-19T06:09:22.927888Z","shell.execute_reply":"2022-12-19T06:09:22.934483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"a = (train_new['isup_grade'])[2]\nprint(a)","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:22.937131Z","iopub.execute_input":"2022-12-19T06:09:22.937682Z","iopub.status.idle":"2022-12-19T06:09:22.945964Z","shell.execute_reply.started":"2022-12-19T06:09:22.937648Z","shell.execute_reply":"2022-12-19T06:09:22.944758Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x = len(train_new['image_id'])\nx","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:22.947736Z","iopub.execute_input":"2022-12-19T06:09:22.948201Z","iopub.status.idle":"2022-12-19T06:09:22.956173Z","shell.execute_reply.started":"2022-12-19T06:09:22.948167Z","shell.execute_reply":"2022-12-19T06:09:22.955347Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y = len(train_new['isup_grade'])\ny","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:22.957649Z","iopub.execute_input":"2022-12-19T06:09:22.958476Z","iopub.status.idle":"2022-12-19T06:09:22.965123Z","shell.execute_reply.started":"2022-12-19T06:09:22.958416Z","shell.execute_reply":"2022-12-19T06:09:22.964238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img = train_new['image_id']\nim = img.to_list()","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:22.966555Z","iopub.execute_input":"2022-12-19T06:09:22.967256Z","iopub.status.idle":"2022-12-19T06:09:22.972799Z","shell.execute_reply.started":"2022-12-19T06:09:22.967219Z","shell.execute_reply":"2022-12-19T06:09:22.972138Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_label = train_new['isup_grade']","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:22.974273Z","iopub.execute_input":"2022-12-19T06:09:22.975039Z","iopub.status.idle":"2022-12-19T06:09:22.980643Z","shell.execute_reply.started":"2022-12-19T06:09:22.975002Z","shell.execute_reply":"2022-12-19T06:09:22.979977Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"im_lb = img_label.to_list()\n","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:22.981981Z","iopub.execute_input":"2022-12-19T06:09:22.982731Z","iopub.status.idle":"2022-12-19T06:09:22.990306Z","shell.execute_reply.started":"2022-12-19T06:09:22.982696Z","shell.execute_reply":"2022-12-19T06:09:22.989398Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"im[0]","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:22.993253Z","iopub.execute_input":"2022-12-19T06:09:22.993506Z","iopub.status.idle":"2022-12-19T06:09:23.004505Z","shell.execute_reply.started":"2022-12-19T06:09:22.993483Z","shell.execute_reply":"2022-12-19T06:09:23.003767Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_file_list = im\nimage_label_list = im_lb\n\n    \n# for i in range(len(train['isup_grade'])): \n#     image_label_list.extend((train['isup_grade'])[i])\n\nnum_total = len(image_label_list)\nprint(num_total)","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:23.005945Z","iopub.execute_input":"2022-12-19T06:09:23.006576Z","iopub.status.idle":"2022-12-19T06:09:23.014438Z","shell.execute_reply.started":"2022-12-19T06:09:23.006541Z","shell.execute_reply":"2022-12-19T06:09:23.013743Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"valid_frac = 0.20\ntrainX,trainY = [],[]\nvalX,valY = [],[]\n\nfor i in range(num_total):\n    rann = np.random.random()\n    if rann < valid_frac:\n        valX.append(image_file_list[i])\n        valY.append(image_label_list[i])\n    else:\n        trainX.append(image_file_list[i])\n        trainY.append(image_label_list[i])\n\nprint(len(trainX),len(valX))","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:23.016285Z","iopub.execute_input":"2022-12-19T06:09:23.017167Z","iopub.status.idle":"2022-12-19T06:09:23.034703Z","shell.execute_reply.started":"2022-12-19T06:09:23.017135Z","shell.execute_reply":"2022-12-19T06:09:23.03365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_img = test_new['image_id']\ntest_im = test_img.to_list()\n\ntest_img_lb = test_new['isup_grade']\ntest_im_lb = test_img_lb.to_list()\n\nt_image_file_list = test_im\nt_image_label_list = test_im_lb\n\ntest_num_t = len(t_image_label_list)\nprint(test_num_t)","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:23.037071Z","iopub.execute_input":"2022-12-19T06:09:23.03732Z","iopub.status.idle":"2022-12-19T06:09:23.043571Z","shell.execute_reply.started":"2022-12-19T06:09:23.037297Z","shell.execute_reply":"2022-12-19T06:09:23.042609Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainX=np.array(trainX)\ntrainY=np.array(trainY)\nvalX=np.array(valX)\nvalY=np.array(valY)\ntestX=np.array(t_image_file_list)\ntestY=np.array(t_image_label_list)","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:23.044923Z","iopub.execute_input":"2022-12-19T06:09:23.046086Z","iopub.status.idle":"2022-12-19T06:09:23.056317Z","shell.execute_reply.started":"2022-12-19T06:09:23.046052Z","shell.execute_reply":"2022-12-19T06:09:23.055467Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# class SumDimension(Transform):\n#     def __init__(self, dim=1):\n#         self.dim = dim\n\n#     def __call__(self, inputs):\n#         return inputs.sum(self.dim)","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:23.058Z","iopub.execute_input":"2022-12-19T06:09:23.058358Z","iopub.status.idle":"2022-12-19T06:09:23.062908Z","shell.execute_reply.started":"2022-12-19T06:09:23.058325Z","shell.execute_reply":"2022-12-19T06:09:23.061785Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# class MyResize(Transform):\n#     def __init__(self, size=(128,128)):\n#         self.size = size\n#     def __call__(self, inputs):\n#         image2=cv2.resize(inputs,dsize=(self.size[1],self.size[0]),interpolation=cv2.INTER_CUBIC)\n#         return image2","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:23.064274Z","iopub.execute_input":"2022-12-19T06:09:23.064849Z","iopub.status.idle":"2022-12-19T06:09:23.072222Z","shell.execute_reply.started":"2022-12-19T06:09:23.064797Z","shell.execute_reply":"2022-12-19T06:09:23.071203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_transforms(*, data):\n    \n    assert data in ('train', 'valid')\n    \n    if data == 'train': \n        # if train dataset is considered, it wil flip and normalize the images\n        return Compose([\n            HorizontalFlip(p=0.5), #flips horizontally with value of probability as 0.5\n            VerticalFlip(p=0.5), #flips vertically with value of probability as 0.5\n            Normalize(\n                mean=[0.485, 0.456, 0.406],\n                std=[0.229, 0.224, 0.225],\n            ),\n            ToTensorV2(),\n        ])\n    \n    elif data == 'valid':\n        # if valid dataset is considered, it wil normalize the images\n        return Compose([\n            Normalize(\n                mean=[0.485, 0.456, 0.406],\n                std=[0.229, 0.224, 0.225],\n            ),\n            ToTensorV2(),\n        ])","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:23.073716Z","iopub.execute_input":"2022-12-19T06:09:23.074134Z","iopub.status.idle":"2022-12-19T06:09:23.082153Z","shell.execute_reply.started":"2022-12-19T06:09:23.074102Z","shell.execute_reply":"2022-12-19T06:09:23.081033Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_transforms = Compose([\n#     LoadImage(image_only=True),\n#     SumDimension(2),\n#     MyResize(),   \n#     ToTensor(),\n# ])\n\n# val_transforms = Compose([\n#     LoadImage(image_only=True),\n#     SumDimension(2),\n#     MyResize(),  \n#     ToTensor(),\n# ])\n\n# test_transforms = Compose([\n#     LoadImage(image_only=True),\n#     SumDimension(2),\n#     MyResize(),    \n#     ToTensor(),\n# ])\n\n# act = Activations(softmax=True)\n# to_onehot = AsDiscrete(to_onehot= num_class)","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:23.083757Z","iopub.execute_input":"2022-12-19T06:09:23.084196Z","iopub.status.idle":"2022-12-19T06:09:23.092704Z","shell.execute_reply.started":"2022-12-19T06:09:23.084163Z","shell.execute_reply":"2022-12-19T06:09:23.091862Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# class TrainDataset(Dataset):\n\n#     def __init__(self, image_files, labels, transform=None):\n#         self.image_files = image_files\n#         self.labels = labels\n#         self.transform = transform\n\n#     def __len__(self):\n#         return len(self.image_files)\n\n#     def __getitem__(self, index):\n        \n#         file_name = self.image_files['image_id'].values[index]\n#         file_path = f'../input/prostate-cancer-grade-assessment/train_images/{file_name}.png'\n        \n#         image = imageio.imread(file_path)\n        \n# #         image = skimage.io.MultiImage(file_path)[-1] \n#         image = tile(image, sz=128, N=16) # tile function is called here\n        \n# #Horizontal and Vertical concatination of all 16 tiles to get a single image\n#         image = cv2.hconcat([cv2.vconcat([image[0], image[1], image[2], image[3]]), \n#                              cv2.vconcat([image[4], image[5], image[6], image[7]]), \n#                              cv2.vconcat([image[8], image[9], image[10], image[11]]), \n#                              cv2.vconcat([image[12], image[13], image[14], image[15]])])\n#         image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) #specifies the color of image that we need\n        \n#         if self.transform:\n#             augmented = self.transform(image=image)\n#             image = augmented['image']\n        \n#         label = torch.tensor(self.labels[idx]).float()\n#         return image, label\n    \n","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:23.09416Z","iopub.execute_input":"2022-12-19T06:09:23.094608Z","iopub.status.idle":"2022-12-19T06:09:23.102617Z","shell.execute_reply.started":"2022-12-19T06:09:23.094574Z","shell.execute_reply":"2022-12-19T06:09:23.101725Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"folds = train_new.copy()\nfolds.reindex()","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:23.104092Z","iopub.execute_input":"2022-12-19T06:09:23.104534Z","iopub.status.idle":"2022-12-19T06:09:23.125337Z","shell.execute_reply.started":"2022-12-19T06:09:23.104502Z","shell.execute_reply":"2022-12-19T06:09:23.124357Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Config: \n\nclass CFG:\n    debug=False\n    lr=1e-4\n    batch_size=16\n    epochs=10\n    seed=777\n    target_size=1\n    target_col='isup_grade'\n    n_fold=2   #number of folds","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:23.126882Z","iopub.execute_input":"2022-12-19T06:09:23.127229Z","iopub.status.idle":"2022-12-19T06:09:23.132201Z","shell.execute_reply.started":"2022-12-19T06:09:23.127183Z","shell.execute_reply":"2022-12-19T06:09:23.131134Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_labels = folds[CFG.target_col].values #ISUP Score\nprint(train_labels)\n\n\n# StratifiedKFold= helps in cross validation, divides the data into various folds and each fold has the balanced data.\n#Number of splits is taken as equal to number of folds which is equal to 4\nkf = StratifiedKFold(n_splits=CFG.n_fold, shuffle=True, random_state=CFG.seed)\n\n\nfor fold, (train_index, val_index) in enumerate(kf.split(folds.values, train_labels)):\n    print(fold)\n    folds.loc[val_index, 'fold'] = fold\n\n    \nfolds['fold'] = folds['fold'].astype(int)\nfolds.to_csv('folds.csv', index=None)\nprint(folds.shape)\nfolds.head()","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:09:23.133937Z","iopub.execute_input":"2022-12-19T06:09:23.134342Z","iopub.status.idle":"2022-12-19T06:09:23.178047Z","shell.execute_reply.started":"2022-12-19T06:09:23.13431Z","shell.execute_reply":"2022-12-19T06:09:23.177006Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:32:20.359866Z","iopub.execute_input":"2022-12-19T06:32:20.360254Z","iopub.status.idle":"2022-12-19T06:32:20.366996Z","shell.execute_reply.started":"2022-12-19T06:32:20.360219Z","shell.execute_reply":"2022-12-19T06:32:20.365877Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Done for Train Dataset\n\nclass TrainDataset(torch.utils.data.Dataset):\n    def __init__(self, df, labels, transform=None):\n        self.df = df\n        self.labels = labels\n        self.transform = transform\n        \n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        file_name = self.df['image_id'].values[idx]\n        file_path = f'/kaggle/input/image-mask-overlay-512x512/train_overlay_images/{file_name}.png'\n        \n        #last layer of image is taken since -1 is used\n\n\n        image = imageio.imread(file_path)\n        \n        image = Image.open(file_path).convert('L')\n        \n\n        #image = skimage.io.MultiImage(file_path)[-1] \n        image = tile(image, sz=7, N=12) # tile function is called here\n        \n#Horizontal and Vertical concatination of all 12 tiles to get a single image\n        image = cv2.hconcat([cv2.vconcat([image[0], image[1], image[2], image[3]]), \n                             cv2.vconcat([image[4], image[5], image[6], image[7]]), \n                             cv2.vconcat([image[8], image[9], image[10], image[11]])])\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) #specifies the color of image that we need\n        \n        if self.transform:\n            augmented = self.transform(image)\n            image = augmented['image']\n            \n        label = torch.tensor(self.labels[idx]).float()\n        \n        return image, label\n    \n\n# Done for Testing Dataset: \nclass TestDataset(Dataset):\n    def __init__(self, df, dir_name, transform=None):\n        self.df = df\n        self.dir_name = dir_name\n        self.transform = transform\n        \n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        file_name = self.df['image_id'].values[idx]\n        file_path = f'../input/prostate-cancer-grade-assessment/{self.dir_name}/{file_name}.png'\n        image = imageio.imread(file_path) #last layer of image \n        image = Image.open(file_path).convert('L')\n        image = tile(image, sz=7, N=12)\n        \n# Horizontal and Vertical concatination of all 12 tiles to get a single image   \n        image = cv2.hconcat([cv2.vconcat([image[0], image[1], image[2], image[3]]), \n                             cv2.vconcat([image[4], image[5], image[6], image[7]]), \n                             cv2.vconcat([image[8], image[9], image[10], image[11]])])\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        \n        if self.transform:\n            augmented = self.transform(image)\n            image = augmented['image']\n        \n        return image","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:35:15.830597Z","iopub.execute_input":"2022-12-19T06:35:15.830979Z","iopub.status.idle":"2022-12-19T06:35:15.847582Z","shell.execute_reply.started":"2022-12-19T06:35:15.830947Z","shell.execute_reply":"2022-12-19T06:35:15.846494Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import cohen_kappa_score\n\n#Quadratic Weighted Kappa score is a ratio that can take a value between -1 and 1 \n#A negative QWK score implies that the model is \"worse than random\"\n#A random model should give a score of close to 0. Lastly, perfect predictions will yield a score of 1\n\ndef quadratic_weighted_kappa(y_hat, y):\n    return cohen_kappa_score(y_hat, y, weights='quadratic')\n\n\nclass OptimizedRounder():\n    def __init__(self):\n        self.coef_ = 0\n\n    def _kappa_loss(self, coef, X, y):\n        X_p = np.copy(X)\n        for i, pred in enumerate(X_p):\n            if pred < coef[0]:\n                X_p[i] = 0\n            elif pred >= coef[0] and pred < coef[1]:\n                X_p[i] = 1\n            elif pred >= coef[1] and pred < coef[2]:\n                X_p[i] = 2\n            elif pred >= coef[2] and pred < coef[3]:\n                X_p[i] = 3\n            elif pred >= coef[3] and pred < coef[4]:\n                X_p[i] = 4\n            else:\n                X_p[i] = 5\n\n        ll = quadratic_weighted_kappa(y, X_p)\n        return -ll\n\n    def fit(self, X, y):\n        loss_partial = partial(self._kappa_loss, X=X, y=y)\n        initial_coef = [0.5, 1.5, 2.5, 3.5, 4.5]\n        self.coef_ = sp.optimize.minimize(loss_partial, initial_coef, method='nelder-mead')\n\n    def predict(self, X, coef):\n        X_p = np.copy(X)\n        for i, pred in enumerate(X_p):\n            if pred < coef[0]:\n                X_p[i] = 0\n            elif pred >= coef[0] and pred < coef[1]:\n                X_p[i] = 1\n            elif pred >= coef[1] and pred < coef[2]:\n                X_p[i] = 2\n            elif pred >= coef[2] and pred < coef[3]:\n                X_p[i] = 3\n            elif pred >= coef[3] and pred < coef[4]:\n                X_p[i] = 4\n            else:\n                X_p[i] = 5\n        return X_p\n\n    def coefficients(self):\n        return self.coef_['x']","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:35:18.519802Z","iopub.execute_input":"2022-12-19T06:35:18.520498Z","iopub.status.idle":"2022-12-19T06:35:18.534028Z","shell.execute_reply.started":"2022-12-19T06:35:18.520462Z","shell.execute_reply":"2022-12-19T06:35:18.53281Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from monai.networks.layers import Norm","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:35:19.179012Z","iopub.execute_input":"2022-12-19T06:35:19.180131Z","iopub.status.idle":"2022-12-19T06:35:19.185246Z","shell.execute_reply.started":"2022-12-19T06:35:19.180088Z","shell.execute_reply":"2022-12-19T06:35:19.184115Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:35:19.482148Z","iopub.execute_input":"2022-12-19T06:35:19.4841Z","iopub.status.idle":"2022-12-19T06:35:19.48823Z","shell.execute_reply.started":"2022-12-19T06:35:19.484057Z","shell.execute_reply":"2022-12-19T06:35:19.48713Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train_fn(fold):\n    \n    print(f\"### fold: {fold} ###\")\n    optimized_rounder = OptimizedRounder()\n    \n#if [folds['fold'] is not equal to fold, it will go into trn_idx(train) else it will go in val_idx(valid)\n    trn_idx = folds[folds['fold'] != fold].index\n    val_idx = folds[folds['fold'] == fold].index\n     \n    train_dataset = TrainDataset(folds.loc[trn_idx].reset_index(drop=True), \n                                 folds.loc[trn_idx].reset_index(drop=True)[CFG.target_col], \n                                 transform=None)\n    valid_dataset = TrainDataset(folds.loc[val_idx].reset_index(drop=True), \n                                 folds.loc[val_idx].reset_index(drop=True)[CFG.target_col], \n                                 transform=None)\n    \n#DataLoader function is called in ehich batch_size is taken as 16\n    train_loader = DataLoader(train_dataset, batch_size=CFG.batch_size, shuffle=True, num_workers=4)\n    valid_loader = DataLoader(valid_dataset, batch_size=CFG.batch_size, shuffle=False, num_workers=4)\n    \n    \n    model = DenseNet121(spatial_dims=2, in_channels=1,out_channels=num_class).to(device)\n#     model = UNet(\n#     spatial_dims = 2,\n#     dimensions=3,\n#     in_channels=1,\n#     out_channels=num_class,\n#     channels=(16, 32, 64, 128, 256),\n#     strides=(2, 2, 2, 2),\n#     num_res_units=2,\n#     norm=Norm.BATCH,).to(device)\n#optimizer used here is Adam, learning rate is 1e-4\n    optimizer = Adam(model.parameters(), lr=CFG.lr, amsgrad=False)\n    \n#ReduceLROnPlateau(Reduce Learning Rate):\n#This callback monitors a quantity and if no improvement is seen for a 'patience' number of epochs, the learning rate is reduced.\n    scheduler = ReduceLROnPlateau(optimizer, 'min', factor=0.5, patience=2, verbose=True, eps=1e-6)\n    \n    criterion = nn.MSELoss()\n    best_score = -100    #best score is taken as -100\n    best_loss = np.inf   #best loss is taken as infinity\n    best_preds = None\n    \n    print(\"epoch start:   \")\n    \n    for epoch in range(CFG.epochs): \n        #Number of epochs is taken as 8, it can be further increased\n        \n        start_time = time.time()\n\n        model.train()\n        avg_loss = 0.\n\n        optimizer.zero_grad()\n        tk0 = tqdm(enumerate(train_loader), total=len(train_loader))\n\n        for i, (images, labels) in tk0:\n\n            images = images.to(device)\n            labels = labels.to(device)\n            \n#             print(images.shape)\n            \n            y_preds = model(images)\n            loss = criterion(y_preds.view(-1), labels)\n            \n            loss.backward()\n            optimizer.step()\n            optimizer.zero_grad()\n\n            avg_loss += loss.item() / len(train_loader)\n            \n        model.eval()\n        avg_val_loss = 0.\n        preds = []\n        valid_labels = []\n        tk1 = tqdm(enumerate(valid_loader), total=len(valid_loader))\n\n        for i, (images, labels) in tk1:\n            \n            images = images.to(device)\n            labels = labels.to(device)\n            \n            print(images.shape)\n            \n            with torch.no_grad():\n                y_preds = model(images)\n            \n            preds.append(y_preds.to('cpu').numpy())\n            valid_labels.append(labels.to('cpu').numpy())\n\n            loss = criterion(y_preds.view(-1), labels)\n            avg_val_loss += loss.item() / len(valid_loader)\n        \n        scheduler.step(avg_val_loss)\n            \n        preds = np.concatenate(preds)\n        valid_labels = np.concatenate(valid_labels)\n        \n        optimized_rounder.fit(preds, valid_labels)\n        coefficients = optimized_rounder.coefficients()\n        final_preds = optimized_rounder.predict(preds, coefficients)\n\n        #QWK (metrics-Quadratic weighted kappa) function is called here.\n        score = quadratic_weighted_kappa(valid_labels, final_preds)\n\n        elapsed = time.time() - start_time\n        \n\n        if score>best_score:\n            best_score = score\n            best_preds = preds\n            torch.save(model.state_dict(), f'fold{fold}_saved_model.pth')\n    \n    return best_preds, valid_labels,coefficients\n","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:36:44.245271Z","iopub.execute_input":"2022-12-19T06:36:44.246441Z","iopub.status.idle":"2022-12-19T06:36:44.278851Z","shell.execute_reply.started":"2022-12-19T06:36:44.246393Z","shell.execute_reply":"2022-12-19T06:36:44.277895Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# number of folds is taken as 4 i.e 0,1,2 & 3;8 epochs will run in each fold having a batch size of 8\npreds = []\nvalid_labels = []\n\nfor fold in range(CFG.n_fold):\n    _preds, _valid_labels,coefficients = train_fn(fold)\n    preds.append(_preds)\n    valid_labels.append(_valid_labels)  \n#Each fold will have 8 epochs and will print QWK score,saved best score,model coeffand losses.","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:36:45.076213Z","iopub.execute_input":"2022-12-19T06:36:45.077169Z","iopub.status.idle":"2022-12-19T06:36:45.68047Z","shell.execute_reply.started":"2022-12-19T06:36:45.077133Z","shell.execute_reply":"2022-12-19T06:36:45.678831Z"},"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":"# train_ds = TrainDataset(trainX, trainY, transform=get_transforms(data='train'))\n# train_loader = DataLoader(train_ds, batch_size=16, shuffle=True, num_workers=4)\n\n# val_ds = TrainDataset(valX, valY, transform=get_transforms(data='valid'))\n# val_loader = DataLoader(val_ds, batch_size=16, num_workers=4)\n\n# # test_ds = TrainDataset(testX, testY, test_transforms)\n# # test_loader = DataLoader(test_ds, batch_size=64, num_workers=2)","metadata":{"execution":{"iopub.status.busy":"2022-12-19T06:35:20.734417Z","iopub.execute_input":"2022-12-19T06:35:20.734762Z","iopub.status.idle":"2022-12-19T06:35:20.742562Z","shell.execute_reply.started":"2022-12-19T06:35:20.734731Z","shell.execute_reply":"2022-12-19T06:35:20.741542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# device = torch.device(\"cuda:0\")   #\"cuda:0\"\n# model = DenseNet121(\n#     spatial_dims=2,            \n#     in_channels=1,\n#     out_channels=num_class,\n# ).to(device)\n\n# loss_function = torch.nn.CrossEntropyLoss()\n# optimizer = torch.optim.Adam(model.parameters(), 1e-5)\n# epoch_num = 30\n# val_interval = 1","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:28:54.365626Z","iopub.execute_input":"2022-12-13T11:28:54.36595Z","iopub.status.idle":"2022-12-13T11:28:54.588067Z","shell.execute_reply.started":"2022-12-13T11:28:54.365921Z","shell.execute_reply":"2022-12-13T11:28:54.587157Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model.train()","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:28:54.865008Z","iopub.execute_input":"2022-12-13T11:28:54.86536Z","iopub.status.idle":"2022-12-13T11:28:54.870987Z","shell.execute_reply.started":"2022-12-13T11:28:54.865331Z","shell.execute_reply":"2022-12-13T11:28:54.870018Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# optimized_rounder = OptimizedRounder()\n\n     \n# # train_dataset = TrainDataset(folds.loc[trn_idx].reset_index(drop=True), \n# #                                  folds.loc[trn_idx].reset_index(drop=True)[CFG.target_col], \n# #                                  transform=get_transforms(data='train'))\n# #     valid_dataset = TrainDataset(folds.loc[val_idx].reset_index(drop=True), \n# #                                  folds.loc[val_idx].reset_index(drop=True)[CFG.target_col], \n# #                                  transform=get_transforms(data='valid'))\n# train_ds = TrainDataset(trainX, trainY, transform=get_transforms(data='train'))\n# train_loader = DataLoader(train_ds, batch_size=32, shuffle=True, num_workers=4)\n\n# val_ds = TrainDataset(valX, valY, transform=get_transforms(data='valid'))\n# valid_loader = DataLoader(val_ds, batch_size=32, num_workers=4)\n# #DataLoader function is called in ehich batch_size is taken as 16\n# #     train_loader = DataLoader(train_dataset, batch_size=CFG.batch_size, shuffle=True, num_workers=4)\n# #     valid_loader = DataLoader(valid_dataset, batch_size=CFG.batch_size, shuffle=False, num_workers=4)\n    \n# device = torch.device(\"cuda:0\")   #\"cuda:0\"\n# model = DenseNet121(\n#     spatial_dims=2,            \n#     in_channels=1,\n#     out_channels=num_class).to(device)\n\n# loss_function = torch.nn.CrossEntropyLoss()\n# optimizer = torch.optim.Adam(model.parameters(), 1e-5)\n# epoch_num = 10\n# val_interval = 1\n    \n# #optimizer used here is Adam, learning rate is 1e-4\n# #     optimizer = Adam(model.parameters(), lr=CFG.lr, amsgrad=False)\n    \n# #ReduceLROnPlateau(Reduce Learning Rate):\n# #This callback monitors a quantity and if no improvement is seen for a 'patience' number of epochs, the learning rate is reduced.\n# scheduler = ReduceLROnPlateau(optimizer, 'min', factor=0.5, patience=2, verbose=True, eps=1e-6)\n    \n# criterion = nn.MSELoss()\n# best_score = -100    #best score is taken as -100\n# best_loss = np.inf   #best loss is taken as infinity\n# best_preds = None\n\n# for epoch in range(epoch_num): \n# #Number of epochs is taken as 8, it can be further increased\n \n#     start_time = time.time()\n\n#     model.train()\n#     avg_loss = 0.\n\n#     optimizer.zero_grad()\n#     tk0 = tqdm(enumerate(train_loader), total=len(train_loader))\n\n#     for i, (images, labels) in tk0:\n\n#         images = images.to(device)\n#         labels = labels.to(device)\n            \n#         y_preds = model(images)\n#         loss = criterion(y_preds.view(-1), labels)\n            \n#         loss.backward()\n#         optimizer.step()\n#         optimizer.zero_grad()\n\n#         avg_loss += loss.item() / len(train_loader)\n            \n#     model.eval()\n#     avg_val_loss = 0.\n#     preds = []\n#     valid_labels = []\n#     tk1 = tqdm(enumerate(valid_loader), total=len(valid_loader))\n\n#     for i, (images, labels) in tk1:\n            \n#         images = images.to(device)\n#         labels = labels.to(device)\n            \n#         with torch.no_grad():\n#             y_preds = model(images)\n            \n#         preds.append(y_preds.to('cpu').numpy())\n#         valid_labels.append(labels.to('cpu').numpy())\n\n#         loss = criterion(y_preds.view(-1), labels)\n#         avg_val_loss += loss.item() / len(valid_loader)\n        \n#     scheduler.step(avg_val_loss)\n            \n#     preds = np.concatenate(preds)\n#     valid_labels = np.concatenate(valid_labels)\n        \n#     optimized_rounder.fit(preds, valid_labels)\n#     coefficients = optimized_rounder.coefficients()\n#     final_preds = optimized_rounder.predict(preds, coefficients)\n        \n#         #QWK (metrics-Quadratic weighted kappa) function is called here.\n#     score = quadratic_weighted_kappa(valid_labels, final_preds)\n\n#     elapsed = time.time() - start_time\n                \n#     if score>best_score:\n#         best_score = score\n#         best_preds = preds\n#         torch.save(model.state_dict(), f'fold{fold}_model_saved.pth')","metadata":{"execution":{"iopub.status.busy":"2022-12-14T12:13:13.576899Z","iopub.execute_input":"2022-12-14T12:13:13.577261Z","iopub.status.idle":"2022-12-14T12:13:13.586264Z","shell.execute_reply.started":"2022-12-14T12:13:13.577232Z","shell.execute_reply":"2022-12-14T12:13:13.583676Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# best_metric = -1\n# best_metric_epoch = -1\n# epoch_loss_values = list()\n# auc_metric = ROCAUCMetric()\n# metric_values = list()\n\n# for epoch in range(epoch_num):\n#     print('-' * 10)\n#     print(f\"epoch {epoch + 1}/{epoch_num}\")\n#     model.train()\n#     epoch_loss = 0\n#     step = 0\n\n#     for batch_data in train_loader:\n#         step += 1\n#         inputs, labels = batch_data[0].to(device), batch_data[1].to(device)\n#         optimizer.zero_grad()\n#         outputs = model(inputs.float())     ##### \n#         loss = loss_function(outputs, labels)\n#         loss.backward()\n#         optimizer.step()\n#         epoch_loss += loss.item()\n#         print(f\"{step}/{len(train_ds) // train_loader.batch_size}, train_loss: {loss.item():.4f}\")\n#         epoch_len = len(train_ds) // train_loader.batch_size\n\n#     epoch_loss /= step\n#     epoch_loss_values.append(epoch_loss)\n#     print(f\"epoch {epoch + 1} average loss: {epoch_loss:.4f}\")\n\n#     if (epoch + 1) % val_interval == 0:\n#         model.eval()\n#         with torch.no_grad():\n#             y_pred = torch.tensor([], dtype=torch.float32, device=device)\n#             y = torch.tensor([], dtype=torch.long, device=device)\n#             for val_data in val_loader:\n#                 val_images, val_labels = val_data[0].to(device), val_data[1].to(device)\n#                 y_pred = torch.cat([y_pred, model(val_images.float())], dim=0)\n#                 y = torch.cat([y, val_labels], dim=0)\n                \n#             y_onehot = [to_onehot(i) for i in y]\n#             y_pred_act = [act(i) for i in y_pred]\n#             auc_metric(y_pred_act, y_onehot)\n#             auc_result = auc_metric.aggregate()\n#             auc_metric.reset()\n#             del y_pred_act, y_onehot\n#             metric_values.append(auc_result)\n#             acc_value = torch.eq(y_pred.argmax(dim=1), y)\n#             acc_metric = acc_value.sum().item() / len(acc_value)\n            \n#             if acc_metric > best_metric:\n#                 best_metric = acc_metric\n#                 best_metric_epoch = epoch + 1\n#                 torch.save(model.state_dict(), 'best_metric_model.pth')\n#                 print('saved new best metric model')\n                \n#             print(f\"current epoch: {epoch + 1} current AUC: {auc_result:.4f}\"\n#                   f\" current accuracy: {acc_metric:.4f} best AUC: {best_metric:.4f}\"\n#                   f\" at epoch: {best_metric_epoch}\")\n            \n# print(f\"train completed, best_metric: {best_metric:.4f} at epoch: {best_metric_epoch}\")","metadata":{"execution":{"iopub.status.busy":"2022-12-13T11:28:56.211022Z","iopub.status.idle":"2022-12-13T11:28:56.211497Z","shell.execute_reply.started":"2022-12-13T11:28:56.211316Z","shell.execute_reply":"2022-12-13T11:28:56.211335Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# best_score = -100    #best score is taken as -100\n# best_loss = np.inf   #best loss is taken as infinity\n# best_metric_epoch = -1\n# best_preds = None\n# epoch_loss_values = list()\n# auc_metric = ROCAUCMetric()\n# metric_values = list()\n\n\n# for epoch in range(epoch_num): \n#     #Number of epochs is taken as 8, it can be further increased\n        \n#     start_time = time.time()\n#     model.train()\n#     avg_loss = 0.\n#     epoch_loss = 0\n#     step = 0\n#     optimizer.zero_grad()\n#     tk0 = tqdm(enumerate(train_loader), total=len(train_loader))\n\n#     for i, (images, labels) in tk0:\n#         step += 1\n#         images = images.to(device)\n#         labels = labels.to(device)\n            \n# #         y_preds = model(images)\n# #         loss = criterion(y_preds.view(-1), labels)\n#         outputs = model(images.float())     ##### \n#         loss = loss_function(outputs, labels)\n        \n#         loss.backward()\n#         optimizer.step()\n#         optimizer.zero_grad()\n        \n#         epoch_loss += loss.item()\n#         avg_loss += loss.item() / len(train_loader)\n            \n#     model.eval()\n#     epoch_loss /= step\n#     epoch_loss_values.append(epoch_loss)\n   \n# # Validation\n#     avg_val_loss = 0.\n#     preds = []\n#     valid_labels = []\n#     tk1 = tqdm(enumerate(valid_loader), total=len(valid_loader))\n\n#     for i, (images, labels) in tk1:\n            \n#         images = images.to(device)\n#         labels = labels.to(device)\n        \n# #         outputs = model(images.float())     ##### \n# #         loss = loss_function(outputs, labels)\n        \n#         with torch.no_grad():\n#             y_preds = model(images)\n            \n#         preds.append(y_preds.to('cpu').numpy())\n#         valid_labels.append(labels.to('cpu').numpy())\n\n#         loss = loss_function(y_preds.view(-1), labels)\n#         avg_val_loss += loss.item() / len(valid_loader)\n        \n#     scheduler.step(avg_val_loss)\n            \n#     preds = np.concatenate(preds)\n#     valid_labels = np.concatenate(valid_labels)\n        \n#     optimized_rounder.fit(preds, valid_labels)\n#     coefficients = optimized_rounder.coefficients()\n#     final_preds = optimized_rounder.predict(preds, coefficients)\n#     LOGGER.debug(f'Counter preds: {Counter(np.concatenate(final_preds))}')\n#     LOGGER.debug(f'coefficients: {coefficients}')\n        \n#     #QWK (metrics-Quadratic weighted kappa) function is called here.\n#     score = quadratic_weighted_kappa(valid_labels, final_preds)\n\n#     elapsed = time.time() - start_time\n    \n# #     if acc_metric > best_metric:\n# #         best_metric = acc_metric\n# #         best_metric_epoch = epoch + 1\n# #         torch.save(model.state_dict(), 'best_metric_model.pth')\n# #         print('saved new best metric model')\n    \n#     if score>best_score:\n#             best_score = score\n#             best_preds = preds\n#             torch.save(model.state_dict(), 'best_metric_model.pth')\n    \n    \n","metadata":{"execution":{"iopub.status.busy":"2022-12-14T12:12:47.624813Z","iopub.execute_input":"2022-12-14T12:12:47.625251Z","iopub.status.idle":"2022-12-14T12:12:47.637453Z","shell.execute_reply.started":"2022-12-14T12:12:47.625214Z","shell.execute_reply":"2022-12-14T12:12:47.636424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# val_frac = 0.1\n# length = len(train)\n# len_test = len(test)\n# indices = np.arange(length)\n# indices_test = np.arange(len_test)\n# np.random.shuffle(indices)\n\n# val_split = int(val_frac * length)\n# val_indices = indices[:val_split]\n# train_indices = indices[val_split:]\n\n# train_x = [train['image_id'][i] for i in train_indices]\n# train_y = [train['isup_grade'][i] for i in train_indices]\n# val_x = [train['image_id'][i] for i in val_indices]\n# val_y = [train['isup_grade'][i] for i in val_indices]\n# test_x = [test['image_id'][i] for i in indices_test]\n# test_y = [test['isup_grade'][i] for i in indices_test]\n\n# print(\n#     f\"Training count: {len(train_x)}, Validation count: \"\n#     f\"{len(val_x)}, Test count: {len(test_x)}\")","metadata":{"execution":{"iopub.status.busy":"2022-12-13T06:58:28.885378Z","iopub.execute_input":"2022-12-13T06:58:28.885807Z","iopub.status.idle":"2022-12-13T06:58:29.039124Z","shell.execute_reply.started":"2022-12-13T06:58:28.885739Z","shell.execute_reply":"2022-12-13T06:58:29.037956Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"execution":{"iopub.status.busy":"2022-12-13T06:58:29.040853Z","iopub.execute_input":"2022-12-13T06:58:29.041248Z","iopub.status.idle":"2022-12-13T06:58:29.046391Z","shell.execute_reply.started":"2022-12-13T06:58:29.041214Z","shell.execute_reply":"2022-12-13T06:58:29.045173Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_transforms = Compose(\n#     [\n#         LoadImage(image_only=True),\n#         EnsureChannelFirst(),\n#         ScaleIntensity(),\n#         RandRotate(range_x=np.pi / 12, prob=0.5, keep_size=True),\n#         RandFlip(spatial_axis=0, prob=0.5),\n#         RandZoom(min_zoom=0.9, max_zoom=1.1, prob=0.5),\n#     ]\n# )\n\n# val_transforms = Compose(\n#     [LoadImage(image_only=True), EnsureChannelFirst(), ScaleIntensity()])\n\n# y_pred_trans = Compose([Activations(softmax=True)])\n# y_trans = Compose([AsDiscrete(to_onehot=num_class)])","metadata":{"execution":{"iopub.status.busy":"2022-12-13T06:58:29.048092Z","iopub.execute_input":"2022-12-13T06:58:29.048416Z","iopub.status.idle":"2022-12-13T06:58:29.062645Z","shell.execute_reply.started":"2022-12-13T06:58:29.048387Z","shell.execute_reply":"2022-12-13T06:58:29.06122Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_df = pd.DataFrame(train_x, columns = ['image_id'])\n# val_df = pd.DataFrame(val_x, columns = ['image_id'])\n# test_df = pd.DataFrame(test_x, columns = ['image_id'])\n\n\n# train_ds = TrainDataset(train_df.reset_index(drop=True), train_y, train_transforms)\n# train_loader = DataLoader(\n#     train_ds, batch_size=16, shuffle=True, num_workers=4)\n\n# val_ds = TrainDataset(val_df, val_y, val_transforms)\n# val_loader = DataLoader(\n#     val_ds, batch_size=16, num_workers=4)\n\n# test_ds = TrainDataset(test_df, test_y, val_transforms)\n# test_loader = DataLoader(\n#     test_ds, batch_size=16, num_workers=4)","metadata":{"execution":{"iopub.status.busy":"2022-12-13T06:58:29.064205Z","iopub.execute_input":"2022-12-13T06:58:29.06473Z","iopub.status.idle":"2022-12-13T06:58:29.078274Z","shell.execute_reply.started":"2022-12-13T06:58:29.064698Z","shell.execute_reply":"2022-12-13T06:58:29.076986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n# model = DenseNet121(spatial_dims=2, in_channels=1,\n#                     out_channels=num_class).to(device)\n# loss_function = torch.nn.CrossEntropyLoss()\n# optimizer = torch.optim.Adam(model.parameters(), 1e-5)\n# max_epochs = 4\n# val_interval = 1\n# auc_metric = ROCAUCMetric()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# best_metric = -1\n# best_metric_epoch = -1\n# epoch_loss_values = []\n# metric_values = []\n\n# for epoch in range(max_epochs):\n#     print(\"-\" * 10)\n#     print(f\"epoch {epoch + 1}/{max_epochs}\")\n#     model.train()\n#     epoch_loss = 0\n#     step = 0\n#     for batch_data in train_loader:\n#         print(batch_data[1])\n#         step += 1\n#         inputs, labels = batch_data[0].to(device), batch_data[1].to(device)\n#         optimizer.zero_grad()\n#         outputs = model(inputs)\n#         loss = loss_function(outputs, labels)\n#         loss.backward()\n#         optimizer.step()\n#         epoch_loss += loss.item()\n#         print(\n#             f\"{step}/{len(train_ds) // train_loader.batch_size}, \"\n#             f\"train_loss: {loss.item():.4f}\")\n#         epoch_len = len(train_ds) // train_loader.batch_size\n#     epoch_loss /= step\n#     epoch_loss_values.append(epoch_loss)\n#     print(f\"epoch {epoch + 1} average loss: {epoch_loss:.4f}\")\n\n#     if (epoch + 1) % val_interval == 0:\n#         model.eval()\n#         with torch.no_grad():\n#             y_pred = torch.tensor([], dtype=torch.float32, device=device)\n#             y = torch.tensor([], dtype=torch.long, device=device)\n#             for val_data in val_loader:\n#                 val_images, val_labels = (\n#                     val_data[0].to(device),\n#                     val_data[1].to(device),\n#                 )\n#                 y_pred = torch.cat([y_pred, model(val_images)], dim=0)\n#                 y = torch.cat([y, val_labels], dim=0)\n#             y_onehot = [y_trans(i) for i in decollate_batch(y, detach=False)]\n#             y_pred_act = [y_pred_trans(i) for i in decollate_batch(y_pred)]\n#             auc_metric(y_pred_act, y_onehot)\n#             result = auc_metric.aggregate()\n#             auc_metric.reset()\n#             del y_pred_act, y_onehot\n#             metric_values.append(result)\n#             acc_value = torch.eq(y_pred.argmax(dim=1), y)\n#             acc_metric = acc_value.sum().item() / len(acc_value)\n#             if result > best_metric:\n#                 best_metric = result\n#                 best_metric_epoch = epoch + 1\n#                 torch.save(model.state_dict(), os.path.join(\n#                     root_dir, \"best_metric_model.pth\"))\n#                 print(\"saved new best metric model\")\n#             print(\n#                 f\"current epoch: {epoch + 1} current AUC: {result:.4f}\"\n#                 f\" current accuracy: {acc_metric:.4f}\"\n#                 f\" best AUC: {best_metric:.4f}\"\n#                 f\" at epoch: {best_metric_epoch}\"\n#             )\n\n# print(\n#     f\"train completed, best_metric: {best_metric:.4f} \"\n#     f\"at epoch: {best_metric_epoch}\")","metadata":{},"execution_count":null,"outputs":[]}]}