{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":13451,"databundleVersionId":1188070,"sourceType":"competition"}],"dockerImageVersionId":30665,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import re\nimport os\nimport pydicom\nimport torch\nimport numpy as np\nimport random\nimport pandas as pd\nimport torch.nn as nn\nfrom torch import optim\nfrom torchvision import transforms\nimport torchvision\nfrom torchvision.models import inception_v3\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom torch.utils.data import Dataset\n\nrandom.seed(42)\nnp.random.seed(42)\ntorch.manual_seed(42)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-03-10T14:04:10.053011Z","iopub.execute_input":"2024-03-10T14:04:10.053419Z","iopub.status.idle":"2024-03-10T14:04:18.816346Z","shell.execute_reply.started":"2024-03-10T14:04:10.053365Z","shell.execute_reply":"2024-03-10T14:04:18.815348Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import warnings\nwarnings.simplefilter(action='ignore', category=FutureWarning)","metadata":{"execution":{"iopub.status.busy":"2024-03-10T14:04:18.818135Z","iopub.execute_input":"2024-03-10T14:04:18.818621Z","iopub.status.idle":"2024-03-10T14:04:18.82377Z","shell.execute_reply.started":"2024-03-10T14:04:18.818591Z","shell.execute_reply":"2024-03-10T14:04:18.822577Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TRAIN_PATH= r'/kaggle/input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection/stage_2_train'\ndevice= 'cuda' if torch.cuda.is_available() else 'cpu'","metadata":{"execution":{"iopub.status.busy":"2024-03-10T14:04:18.825101Z","iopub.execute_input":"2024-03-10T14:04:18.82541Z","iopub.status.idle":"2024-03-10T14:04:18.862915Z","shell.execute_reply.started":"2024-03-10T14:04:18.825367Z","shell.execute_reply":"2024-03-10T14:04:18.861741Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def preprocess(path):\n    traindf= pd.read_csv('/kaggle/input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection/stage_2_train.csv')\n    traindf[['ID','Subtype']]= traindf['ID'].str.rsplit(pat='_',n=1,expand=True)\n    traindf= traindf.pivot_table(columns='Subtype',values='Label',index='ID').reset_index()\n    traindf.replace([np.inf, -np.inf], np.nan, inplace=True)\n    traindf['any']= traindf['any'].apply(lambda x : 0.0 if x==1.0 else 1.0)\n    \n    return sample(traindf)","metadata":{"execution":{"iopub.status.busy":"2024-03-10T14:04:18.86565Z","iopub.execute_input":"2024-03-10T14:04:18.866225Z","iopub.status.idle":"2024-03-10T14:04:18.8863Z","shell.execute_reply.started":"2024-03-10T14:04:18.866189Z","shell.execute_reply":"2024-03-10T14:04:18.885144Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def sample(traindf):\n    not_any= traindf[traindf['any']==1.0]\n    epidural = traindf[traindf['epidural']==1.0]\n    intraparenchymal = traindf[traindf['intraparenchymal']==1.0]\n    intraventricular = traindf[traindf['intraventricular']==1.0]\n    subarachnoid = traindf[traindf['subarachnoid']==1.0]\n    subdural = traindf[traindf['subdural']==1.0]\n    data= [not_any, epidural, intraparenchymal, intraventricular, subarachnoid, subdural]\n    lim= min([i.shape[0] for i in data])\n    n= not_any.sample(lim*4)\n    df= pd.concat([i.sample(lim) for i in data], axis=0)\n    df= pd.concat([df,n],axis=0)\n    return df","metadata":{"execution":{"iopub.status.busy":"2024-03-10T14:04:18.88768Z","iopub.execute_input":"2024-03-10T14:04:18.888013Z","iopub.status.idle":"2024-03-10T14:04:18.900137Z","shell.execute_reply.started":"2024-03-10T14:04:18.887986Z","shell.execute_reply":"2024-03-10T14:04:18.899159Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = preprocess(r'/kaggle/input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection/stage_2_train.csv')","metadata":{"execution":{"iopub.status.busy":"2024-03-10T14:04:18.901465Z","iopub.execute_input":"2024-03-10T14:04:18.904621Z","iopub.status.idle":"2024-03-10T14:04:43.195691Z","shell.execute_reply.started":"2024-03-10T14:04:18.904594Z","shell.execute_reply":"2024-03-10T14:04:43.194542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class DicomDataset(Dataset):\n    def __init__(self, img_dir, df, transform=None, labels=True):\n        self.transform = transform\n        self.img_dir = img_dir\n        self.df = df\n        self.labels=labels\n        \n    def correct_dcm(self, dcm):\n        x = dcm.pixel_array + 1000\n        px_mode = 4096\n        x[x>=px_mode] = x[x>=px_mode] - px_mode\n        dcm.PixelData = x.tobytes()\n        dcm.RescaleIntercept = -1000\n\n    def window_image(self, dcm, window_center, window_width):\n\n        if (dcm.BitsStored == 12) and (dcm.PixelRepresentation == 0) and (int(dcm.RescaleIntercept) > -100):\n            self.correct_dcm(dcm)\n\n        img = dcm.pixel_array * dcm.RescaleSlope + dcm.RescaleIntercept\n        img_min = window_center - window_width // 2\n        img_max = window_center + window_width // 2\n        img = np.clip(img, img_min, img_max)\n\n        return img\n\n    def bsb_window(self, dcm):\n        brain_img = self.window_image(dcm, 40, 80)\n        subdural_img = self.window_image(dcm, 80, 200)\n        soft_img = self.window_image(dcm, 40, 380)\n\n        brain_img = (brain_img - 0) / 80\n        subdural_img = (subdural_img - (-20)) / 200\n        soft_img = (soft_img - (-150)) / 380\n        bsb_img = np.array([brain_img, subdural_img, soft_img]).transpose(1,2,0)\n\n        return bsb_img\n    \n#     def zero_center(self, image):\n#         image = image - PIXEL_MEAN\n#         return image\n    \n    \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, idx):\n        if torch.is_tensor(idx):\n            idx = idx.tolist()\n            \n        img_path = os.path.join(self.img_dir, self.df.iloc[idx, 0]+'.dcm')\n        data = pydicom.read_file(img_path)\n        img = self.bsb_window(data)\n        \n        if self.transform:       \n            augmented = self.transform(image=img)\n            img = augmented['image']\n        \n        if self.labels:\n            label = torch.tensor(self.df.iloc[idx, 1:],dtype=torch.float64)#.astype(float).to_numpy()\n            return {'image': img, 'labels': label} \n#         img = GET WINDOWED, NORMALIZED and SCALED PIXEL ARRAY HERE\n        return {'image': img}","metadata":{"execution":{"iopub.status.busy":"2024-03-10T14:04:43.197136Z","iopub.execute_input":"2024-03-10T14:04:43.197563Z","iopub.status.idle":"2024-03-10T14:04:43.213653Z","shell.execute_reply.started":"2024-03-10T14:04:43.197525Z","shell.execute_reply":"2024-03-10T14:04:43.212554Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import albumentations as A\nfrom albumentations import Compose, CenterCrop, HorizontalFlip, Normalize, RandomRotate90\nfrom albumentations.pytorch import ToTensorV2\n\ntransform_train = Compose([CenterCrop(299,299),\n                           Normalize(mean=0.5, std=1.0),\n                           A.OneOf([\n                                RandomRotate90(p=0.3),\n                                HorizontalFlip(p=0.3)\n                           ]),\n                           ToTensorV2()\n])\n\ntransform_test= Compose([CenterCrop(299,299),\n                         Normalize(mean=0.5, std=1.0),\n                         ToTensorV2()\n])","metadata":{"execution":{"iopub.status.busy":"2024-03-10T14:04:43.215343Z","iopub.execute_input":"2024-03-10T14:04:43.215845Z","iopub.status.idle":"2024-03-10T14:04:43.877954Z","shell.execute_reply.started":"2024-03-10T14:04:43.215812Z","shell.execute_reply":"2024-03-10T14:04:43.876962Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nX,Y= train_test_split(df, test_size=0.2, shuffle=True)\n\ntrain_dataset= DicomDataset(TRAIN_PATH, X, transform=transform_train, labels=True)\ntest_dataset= DicomDataset(TRAIN_PATH, Y, transform=transform_test, labels=True)","metadata":{"execution":{"iopub.status.busy":"2024-03-10T14:04:43.879306Z","iopub.execute_input":"2024-03-10T14:04:43.880243Z","iopub.status.idle":"2024-03-10T14:04:43.893227Z","shell.execute_reply.started":"2024-03-10T14:04:43.880204Z","shell.execute_reply":"2024-03-10T14:04:43.892137Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_loader_train = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)\ndata_loader_test = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4)","metadata":{"execution":{"iopub.status.busy":"2024-03-10T14:04:43.896904Z","iopub.execute_input":"2024-03-10T14:04:43.897276Z","iopub.status.idle":"2024-03-10T14:04:43.903917Z","shell.execute_reply.started":"2024-03-10T14:04:43.897243Z","shell.execute_reply":"2024-03-10T14:04:43.902746Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class GoogLeNet(nn.Module):\n    def __init__(self, in_channels=3, num_classes=1000):\n        super(GoogLeNet, self).__init__()\n\n        # Write in_channels, etc, all explicit in self.conv1, rest will write to\n        # make everything as compact as possible, kernel_size=3 instead of (3,3)\n        self.stem = Stem(3)\n        self.inc_A = nn.Sequential(\n            Inception_Res_A(384, 0.2),\n            Inception_Res_A(384, 0.2),\n            Inception_Res_A(384, 0.2),\n#             Inception_Res_A(384, 0.2),\n#             Inception_Res_A(384, 0.2)\n        )\n        self.red_A = Reduction_A(384)\n        self.inc_B = nn.Sequential(\n            Inception_Res_B(1152, 0.2),\n            Inception_Res_B(1152, 0.2),\n            Inception_Res_B(1152, 0.2),\n            Inception_Res_B(1152, 0.2),\n            Inception_Res_B(1152, 0.2),\n            Inception_Res_B(1152, 0.2),\n#             Inception_Res_B(1152, 0.2),\n#             Inception_Res_B(1152, 0.2),\n#             Inception_Res_B(1152, 0.2),\n#             Inception_Res_B(1152, 0.2)\n        )\n        self.red_B = Reduction_B(1152)\n        self.inc_C = nn.Sequential(\n            Inception_Res_C(2144, 0.2),\n            Inception_Res_C(2144, 0.2),\n            Inception_Res_C(2144, 0.2),\n#             Inception_Res_C(2144, 0.2),\n#             Inception_Res_C(2144, 0.2)\n        )\n        self.avgpool = nn.AvgPool2d(kernel_size=7, stride=1)\n        self.dropout = nn.Dropout(p=0.4)\n        self.fc1 = nn.Linear(8576, num_classes)\n\n    def forward(self, x):\n        x = self.stem(x)\n        x = self.inc_A(x)\n        x = self.red_A(x)\n        x = self.inc_B(x)\n        x = self.red_B(x)\n        x = self.inc_C(x)\n        x = self.avgpool(x)\n        x = x.reshape(x.shape[0], -1)\n        x = self.dropout(x)\n        x = self.fc1(x)\n        \n        return x\n\nclass Stem(nn.Module):\n    def __init__(self, in_channels):\n        super(Stem, self).__init__()\n\n        #1st concat\n        self.stem1 = nn.Sequential(\n            conv_block(in_channels, 32, kernel_size=3, stride=2),\n            conv_block(32, 32, kernel_size=3),\n            conv_block(32, 64, kernel_size=3, padding='same')\n        )\n        self.conv_1 = conv_block(64, 96, kernel_size=3, stride= 2)\n        self.maxpool_1 = nn.MaxPool2d(kernel_size=3, stride=2)\n\n        #2nd concat\n        self.stem2_a = nn.Sequential(\n            conv_block(160, 64, kernel_size=1, padding='same'),\n            conv_block(64, 96, kernel_size=3)\n        )\n        self.stem2_b = nn.Sequential(\n            conv_block(160, 64, kernel_size=1, padding='same'),\n            conv_block(64, 64, kernel_size=(7,1), padding='same'),\n            conv_block(64, 64, kernel_size=(1,7), padding='same'),\n            conv_block(64, 96, kernel_size=3)\n        )\n\n        #3rd concat\n        self.conv_3 = conv_block(192, 192, kernel_size=3, stride=2)\n        self.maxpool_3 = nn.MaxPool2d(kernel_size=3, stride=2)\n\n    def forward(self, x):\n        x = self.stem1(x)\n        x = torch.cat([self.conv_1(x), self.maxpool_1(x)], 1)\n        x = torch.cat([self.stem2_a(x), self.stem2_b(x)], 1)\n        return torch.cat([self.conv_3(x), self.maxpool_3(x)], 1) #384 channels\n    \nclass Inception_Res_A(nn.Module):\n    def __init__(self, in_channels, scale=1.0): # 384->384\n        super(Inception_Res_A, self).__init__()\n\n        self.scale = scale\n        self.stem_1 = conv_block(in_channels, 32, kernel_size=1, padding='same')\n        self.stem_2 = nn.Sequential(\n            conv_block(in_channels, 32, kernel_size=1, padding='same'),\n            conv_block(32, 32, kernel_size=3, padding='same')\n        )\n        self.stem_3 = nn.Sequential(\n            conv_block(in_channels, 32, kernel_size=1, padding='same'),\n            conv_block(32, 48, kernel_size=3, padding='same'),\n            conv_block(48, 64, kernel_size=3, padding='same')\n        )\n        self.conv2d= nn.Conv2d(128, 384, kernel_size=1, padding='same')\n        self.relu= nn.ReLU()\n    \n    def forward(self, x):\n        a = torch.cat([self.stem_1(x),self.stem_2(x),self.stem_3(x)], 1)\n        a = self.conv2d(a)\n        a = a*self.scale + x\n        return self.relu(a)\n\nclass Reduction_A(nn.Module):\n    def __init__(self, in_channels): #384->1152\n        super(Reduction_A, self).__init__()\n\n        self.stem_1 = nn.MaxPool2d(kernel_size=3, stride=2)\n        self.stem_2 = conv_block(in_channels, 384, kernel_size=3, stride=2)\n        self.stem_3 = nn.Sequential(\n            conv_block(in_channels, 256, kernel_size=1, padding='same'),\n            conv_block(256, 256, kernel_size=3, padding='same'),\n            conv_block(256, 384, kernel_size=3, stride=2)\n        )\n\n    def forward(self, x):\n        return torch.concat(\n            [self.stem_1(x), self.stem_2(x), self.stem_3(x)], 1\n        )\n\n\nclass Inception_Res_B(nn.Module):\n    def __init__(self, in_channels, scale=1.0): #1152->1152\n        super(Inception_Res_B, self).__init__()\n\n        self.scale = scale\n        self.stem_1 = conv_block(in_channels, 192, kernel_size=1, padding='same')\n        self.stem_2 = nn.Sequential(\n            conv_block(in_channels, 128, kernel_size=1, padding='same'),\n            conv_block(128, 160, kernel_size=(1,7), padding='same'),\n            conv_block(160, 192, kernel_size=(7,1), padding='same')\n        )\n        self.conv2d = nn.Conv2d(384, 1152, kernel_size=1, padding='same')\n        self.relu= nn.ReLU()\n    \n    def forward(self, x):\n        a = torch.concat([self.stem_1(x), self.stem_2(x)], 1)\n        a = self.conv2d(a)\n        a = a*self.scale + x\n        return self.relu(a)\n\nclass Reduction_B(nn.Module):\n    def __init__(self, in_channels): #1152->2144\n        super(Reduction_B, self).__init__()\n\n        self.stem_1 = nn.MaxPool2d(kernel_size=3, stride=2)\n        self.stem_2 = nn.Sequential(\n            conv_block(in_channels, 256, kernel_size=1, padding='same'),\n            conv_block(256, 384, kernel_size=3, stride=2)\n        )\n        self.stem_3 = nn.Sequential(\n            conv_block(in_channels, 256, kernel_size=1, padding='same'),\n            conv_block(256, 288, kernel_size=3, stride=2)\n        )\n        self.stem_4 = nn.Sequential(\n            conv_block(in_channels, 256, kernel_size=1, padding='same'),\n            conv_block(256, 288, kernel_size=3, padding='same'),\n            conv_block(288, 320, kernel_size=3, stride=2)\n        )\n\n    def forward(self, x):\n        return torch.concat(\n            [self.stem_1(x), self.stem_2(x), self.stem_3(x), self.stem_4(x)], 1\n        )\n\nclass Inception_Res_C(nn.Module):\n    def __init__(self, in_channels, scale=1.0): #2144->2144\n        super(Inception_Res_C, self).__init__()\n\n        self.scale = scale\n        self.stem_1 = conv_block(in_channels, 192, kernel_size=1, padding='same')\n        self.stem_2 = nn.Sequential(\n            conv_block(in_channels, 192, kernel_size=1, padding='same'),\n            conv_block(192, 224, kernel_size=(1,3), padding='same'),\n            conv_block(224, 256, kernel_size=(3,1), padding='same')\n        )\n        self.conv2d = nn.Conv2d(448, 2144, kernel_size=1, padding='same') #PROBLEM HERE\n        self.relu= nn.ReLU()\n    \n    def forward(self, x):\n        a = torch.concat([self.stem_1(x), self.stem_2(x)], 1)\n        a = self.conv2d(a)\n        a = a*self.scale + x\n        return self.relu(a)\n\n\nclass conv_block(nn.Module):\n    def __init__(self, in_channels, out_channels, **kwargs):\n        super(conv_block, self).__init__()\n        self.relu = nn.ReLU()\n        self.conv = nn.Conv2d(in_channels, out_channels, **kwargs)\n        self.batchnorm = nn.BatchNorm2d(out_channels)\n\n    def forward(self, x):\n        return self.relu(self.batchnorm(self.conv(x)))","metadata":{"execution":{"iopub.status.busy":"2024-03-10T14:04:43.905451Z","iopub.execute_input":"2024-03-10T14:04:43.905793Z","iopub.status.idle":"2024-03-10T14:04:43.953942Z","shell.execute_reply.started":"2024-03-10T14:04:43.905756Z","shell.execute_reply":"2024-03-10T14:04:43.952766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classes = 6\n\nmodel = GoogLeNet(in_channels=3, num_classes=classes)\nmodel.to(device)\n\ncriterion= nn.BCEWithLogitsLoss()\noptimizer= optim.Adam(model.parameters(),lr=2e-5)","metadata":{"execution":{"iopub.status.busy":"2024-03-10T14:06:08.440496Z","iopub.execute_input":"2024-03-10T14:06:08.440945Z","iopub.status.idle":"2024-03-10T14:06:08.740027Z","shell.execute_reply.started":"2024-03-10T14:06:08.440906Z","shell.execute_reply":"2024-03-10T14:06:08.739156Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# BATCH_SIZE = 5\n# x = torch.randn(BATCH_SIZE, 3, 299, 299)\n# model = GoogLeNet(num_classes=5)\n# print(model(x).shape)\n# assert model(x).shape == torch.Size([BATCH_SIZE, 5])","metadata":{"execution":{"iopub.status.busy":"2024-03-10T14:06:09.644871Z","iopub.execute_input":"2024-03-10T14:06:09.645322Z","iopub.status.idle":"2024-03-10T14:06:09.650249Z","shell.execute_reply.started":"2024-03-10T14:06:09.645279Z","shell.execute_reply":"2024-03-10T14:06:09.64908Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score\n\nn_epochs = 50\nhistory = {'accuracy': [], 'precision': [], 'loss': [], 'f1': []}\n\nfor epoch in range(n_epochs):\n    print('Epoch {}/{}'.format(epoch, n_epochs - 1))\n    print('-' * 10)\n\n    model.train()\n    tr_loss = 0\n    y_true = []\n    y_pred = []\n\n    total_batches = len(data_loader_train)\n    tk0 = tqdm(data_loader_train, total=total_batches, desc=\"Iteration\", position=0, leave=True)\n\n    for step, batch in enumerate(tk0):\n        inputs = batch[\"image\"]\n        labels = batch[\"labels\"]\n\n        inputs = inputs.to(device, dtype=torch.float)\n        labels = labels.to(device, dtype=torch.float)\n\n        outputs = model(inputs)\n        \n        loss = criterion(outputs, labels)\n\n        loss.backward()\n\n        tr_loss += loss.item()\n\n        optimizer.step()\n        optimizer.zero_grad()\n\n        # Collect true and predicted labels for metrics calculation\n        y_true.extend(labels.cpu().numpy())\n        y_pred.extend(outputs.cpu().detach().numpy())\n\n        if epoch == 1 and step > 6000:\n            epoch_loss = tr_loss / 6000\n            print('Training Loss: {:.4f}'.format(epoch_loss))\n            break\n        \n    if epoch and (epoch % 10 == 0):\n        torch.save({\n                'epoch': epoch,\n                'model_state_dict': model.state_dict(),\n                'optimizer_state_dict': optimizer.state_dict(),\n            }, f'chkpt_{epoch}.tar')\n    # Calculate training loss for the epoch\n    epoch_loss = tr_loss / len(data_loader_train)\n    print('Training Loss: {:.4f}'.format(epoch_loss))\n    history['loss'].append(epoch_loss)\n\n    # Calculate and append accuracy, precision, and F1 score to history\n#     y_true = np.round(y_true).astype(int)\n    y_true= np.argmax(y_true, axis=1)\n#     y_pred = np.round(y_pred).astype(int)\n    y_pred= np.argmax(y_pred,axis=1)\n\n    accuracy = accuracy_score(y_true, y_pred)\n    precision = precision_score(y_true, y_pred, average='weighted')\n    f1 = f1_score(y_true, y_pred, average='weighted')\n\n    print('Accuracy: {:.4f}'.format(accuracy))\n    print('Precision: {:.4f}'.format(precision))\n    print('F1 Score: {:.4f}'.format(f1))\n\n    history['accuracy'].append(accuracy)\n    history['precision'].append(precision)\n    history['f1'].append(f1)","metadata":{"execution":{"iopub.status.busy":"2024-03-10T14:06:09.911776Z","iopub.execute_input":"2024-03-10T14:06:09.9127Z","iopub.status.idle":"2024-03-10T17:59:55.192736Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.save({\n                'epoch': epoch,\n                'model_state_dict': model.state_dict(),\n                'optimizer_state_dict': optimizer.state_dict(),\n            }, 'chkpt_final.tar')","metadata":{"execution":{"iopub.status.busy":"2024-03-10T18:02:01.016153Z","iopub.execute_input":"2024-03-10T18:02:01.016555Z","iopub.status.idle":"2024-03-10T18:02:01.488691Z","shell.execute_reply.started":"2024-03-10T18:02:01.016519Z","shell.execute_reply":"2024-03-10T18:02:01.487509Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dd= pd.DataFrame(history)\ndd.to_csv('stats.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-03-10T18:05:00.391735Z","iopub.execute_input":"2024-03-10T18:05:00.392471Z","iopub.status.idle":"2024-03-10T18:05:00.402969Z","shell.execute_reply.started":"2024-03-10T18:05:00.392438Z","shell.execute_reply":"2024-03-10T18:05:00.402125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import classification_report\ndata_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4)\n\nall_y_true= []\nall_y_pred= []\n\nfor batch in data_loader:\n\n    inputs = batch[\"image\"]\n    labels = batch[\"labels\"]\n\n    inputs = inputs.to(device, dtype=torch.float)\n    labels = labels.to(device, dtype=torch.float)\n\n    outputs = model(inputs)\n\n    y_true=labels.cpu().numpy()\n    y_pred=outputs.cpu().detach().numpy()\n\n    y_true= np.argmax(y_true, axis=1)\n    y_pred= np.argmax(y_pred,axis=1)\n\n    all_y_true.extend(y_true)\n    all_y_pred.extend(y_pred)\n\nc= classification_report(all_y_pred,all_y_true, output_dict=True)\nprint(c)","metadata":{"execution":{"iopub.status.busy":"2024-03-10T18:09:02.070805Z","iopub.execute_input":"2024-03-10T18:09:02.071733Z","iopub.status.idle":"2024-03-10T18:09:54.03865Z","shell.execute_reply.started":"2024-03-10T18:09:02.071679Z","shell.execute_reply":"2024-03-10T18:09:54.037446Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"c= pd.DataFrame(c)\nc.to_csv('dense_report.csv',index=False)","metadata":{"execution":{"iopub.status.busy":"2024-03-10T18:09:54.040758Z","iopub.execute_input":"2024-03-10T18:09:54.041053Z","iopub.status.idle":"2024-03-10T18:09:54.050266Z","shell.execute_reply.started":"2024-03-10T18:09:54.041026Z","shell.execute_reply":"2024-03-10T18:09:54.049365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(classification_report(all_y_pred,all_y_true))","metadata":{"execution":{"iopub.status.busy":"2024-03-10T18:09:54.05158Z","iopub.execute_input":"2024-03-10T18:09:54.05228Z","iopub.status.idle":"2024-03-10T18:09:54.076356Z","shell.execute_reply.started":"2024-03-10T18:09:54.052243Z","shell.execute_reply":"2024-03-10T18:09:54.075568Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}