{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport torch\nfrom torchvision import datasets\nimport torchvision.transforms as transforms\nfrom torchvision.io import read_image\nfrom torch.utils.data import Dataset\nfrom torchvision.transforms import ToTensor\nfrom torch.utils.data import DataLoader\nimport os\nimport cv2\nfrom skimage import io\nfrom skimage import data\nfrom skimage import filters\nimport glob, itertools\n# Data Augmentation for Image Preprocessing\nfrom albumentations import (ToFloat, Normalize, VerticalFlip, HorizontalFlip, Compose, Resize,\n                            RandomBrightnessContrast, HueSaturationValue, Blur, GaussNoise,\n                            Rotate, RandomResizedCrop, Cutout, ShiftScaleRotate, ToGray)\nfrom albumentations.pytorch import ToTensorV2\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport pydicom\nimport scipy\nfrom skimage.exposure import equalize_adapthist\nimport tqdm","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-02-07T15:34:24.26916Z","iopub.execute_input":"2023-02-07T15:34:24.269731Z","iopub.status.idle":"2023-02-07T15:34:26.962305Z","shell.execute_reply.started":"2023-02-07T15:34:24.269689Z","shell.execute_reply":"2023-02-07T15:34:26.961297Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pip install wandb","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:34:26.96449Z","iopub.execute_input":"2023-02-07T15:34:26.965115Z","iopub.status.idle":"2023-02-07T15:34:37.767425Z","shell.execute_reply.started":"2023-02-07T15:34:26.965075Z","shell.execute_reply":"2023-02-07T15:34:37.766238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open('/root/.netrc', 'w', encoding='utf-8') as f:\n    f.write('''machine api.wandb.ai\n        login user\n        password 5ea6bd91c3e49f50e2842e8fc29f928eb0f5cd82\n    ''')","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:34:37.769177Z","iopub.execute_input":"2023-02-07T15:34:37.769534Z","iopub.status.idle":"2023-02-07T15:34:37.779127Z","shell.execute_reply.started":"2023-02-07T15:34:37.769498Z","shell.execute_reply":"2023-02-07T15:34:37.777961Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import wandb\n\nwandb.init(project=\"breast-cancer\", entity=\"breast-cancer-kltn\")","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:34:37.784533Z","iopub.execute_input":"2023-02-07T15:34:37.784915Z","iopub.status.idle":"2023-02-07T15:34:49.710582Z","shell.execute_reply.started":"2023-02-07T15:34:37.784861Z","shell.execute_reply":"2023-02-07T15:34:49.709589Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class _color:\n    S = '\\033[1m' + '\\033[92m'\n    E = '\\033[0m'\n    \nDEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nprint(_color.S+'Device available now:'+_color.E, DEVICE)","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:34:49.715333Z","iopub.execute_input":"2023-02-07T15:34:49.717628Z","iopub.status.idle":"2023-02-07T15:34:49.799491Z","shell.execute_reply.started":"2023-02-07T15:34:49.717585Z","shell.execute_reply":"2023-02-07T15:34:49.798184Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_masks_and_sizes_of_connected_components(img_mask):\n    \"\"\"\n    Finds the connected components from the mask of the image\n    \"\"\"\n    mask, num_labels = scipy.ndimage.label(img_mask)\n\n    mask_pixels_dict = {}\n    for i in range(num_labels+1):\n        this_mask = (mask == i)\n        if img_mask[this_mask][0] != 0:\n            # Exclude the 0-valued mask\n            mask_pixels_dict[i] = np.sum(this_mask)\n        \n    return mask, mask_pixels_dict\n\n\ndef get_mask_of_largest_connected_component(img_mask):\n    \"\"\"\n    Finds the largest connected component from the mask of the image\n    \"\"\"\n    mask, mask_pixels_dict = get_masks_and_sizes_of_connected_components(img_mask)\n    largest_mask_index = pd.Series(mask_pixels_dict).idxmax()\n    largest_mask = mask == largest_mask_index\n    return largest_mask\n\ndef image_procescing(img):\n    \"\"\"\n    Crop image by find coordinates of the largest connected componen\n    \"\"\"\n    #check_img_convert_gray\n    if len(img.shape)==3:\n        img = rgb2gray(img)\n    #convert to bin\n    \n    threshold = filters.threshold_isodata(img)\n    bin_img = (img > threshold)*1\n    kernel = np.ones((5, 5), np.uint8)\n    bin_img = bin_img.astype('uint8')\n    bin_img = cv2.erode(bin_img, kernel, iterations=-2)\n    \n    #most mask\n    img_mask = get_mask_of_largest_connected_component(bin_img)\n    #crop_image\n    \n    farest_pixel = np.max(list(zip(*np.where(img_mask == 1))), axis=0)\n    nearest_pixel = np.min(list(zip(*np.where(img_mask == 1))), axis=0)\n    croped =  img[nearest_pixel[0]:farest_pixel[0], nearest_pixel[1]:farest_pixel[1]]\n    return croped","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:34:49.801536Z","iopub.execute_input":"2023-02-07T15:34:49.802389Z","iopub.status.idle":"2023-02-07T15:34:49.820996Z","shell.execute_reply.started":"2023-02-07T15:34:49.802351Z","shell.execute_reply":"2023-02-07T15:34:49.819939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def read_dicom_512(f, size=512):\n    \"\"\"\n    Read dicom path\n    \"\"\"\n    dicom = pydicom.dcmread(f)\n    img = dicom.pixel_array\n    img = (img - img.min()) / (img.max() - img.min())\n    if dicom.PhotometricInterpretation == \"MONOCHROME1\":\n        img = 1 - img\n\n    img = cv2.resize(img, (size, size))\n    \n    return img","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:34:49.825975Z","iopub.execute_input":"2023-02-07T15:34:49.82867Z","iopub.status.idle":"2023-02-07T15:34:49.838427Z","shell.execute_reply.started":"2023-02-07T15:34:49.828627Z","shell.execute_reply":"2023-02-07T15:34:49.837451Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class DDSM_dataset(Dataset):\n    def __init__(self,excel_file,root_dir,transform=None, is_train = True):\n        \"\"\"\n        is_train: if it's DDSM dataset or not it's RSNA data set\n        \"\"\"\n        self.root_dir = root_dir\n        self.is_train = is_train\n        if self.is_train:\n            self.dataframe = pd.read_excel(excel_file)\n            self.dataframe = self.dataframe[self.dataframe['Status']!='Benign']\n            self.transform = transform\n        else:\n            self.dataframe = pd.read_csv(excel_file)\n            self.transform = Compose([Resize(height=227,width=227,always_apply=True),\n                                      ToTensorV2()])\n            \n    def __len__(self):\n        return len(self.dataframe)\n    \n    def pre_img(self, img):\n        img_clahe = equalize_adapthist(img, clip_limit=0.04, nbins=256)\n        return img_clahe\n    \n    def __getitem__(self,index):\n        \n        if self.is_train:\n            if (self.dataframe.iloc[index]['Status']=='Normal') :\n                image_path = self.root_dir + 'Normal/' + str(self.dataframe.iloc[index].fullPath.replace(\"\\\\\", \"/\").split('/')[2])\n            elif (self.dataframe.iloc[index]['Status']=='Cancer') :\n                image_path = self.root_dir + 'Cancer/' + str(self.dataframe.iloc[index].fullPath.replace(\"\\\\\", \"/\").split('/')[2])\n            image = cv2.imread(image_path,0)\n            image = self.pre_img(image)\n            if self.transform != None:\n                image_trans = self.transform(image=image)['image']\n\n            else:\n                image_trans = image \n            label = (self.dataframe.iloc[index]['Status'] == \"Cancer\")*1\n            return image_trans,label\n        else:\n            image_path = self.root_dir+'/'+str(self.dataframe.iloc[index].patient_id) + \"/\" + str(self.dataframe.iloc[index].image_id) + \".dcm\"\n            image = read_dicom_512(image_path)\n            img = image_procescing(image)\n            if self.transform != None:\n                image_trans = self.transform(image=image)['image']\n            prediction_id = self.dataframe.iloc[index]['prediction_id']\n            return image_trans,prediction_id","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:34:49.843243Z","iopub.execute_input":"2023-02-07T15:34:49.845794Z","iopub.status.idle":"2023-02-07T15:34:49.865869Z","shell.execute_reply.started":"2023-02-07T15:34:49.845754Z","shell.execute_reply":"2023-02-07T15:34:49.864885Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"excel_path = '/kaggle/input/miniddsm2/MINI-DDSM-Complete-JPEG-8/DataWMask.xlsx'\nimage_path = '/kaggle/input/ddsm-croped-image/'\ntest_csv_path = '/kaggle/input/rsna-breast-cancer-detection/test.csv'\ntest_RSNA = '/kaggle/input/rsna-breast-cancer-detection/test_images'\n\ntransform = Compose([Resize(height=227,width=227,always_apply=True),\n                    Normalize(mean=0.449,std=0.226),\n                    HorizontalFlip(),\n                    VerticalFlip(),\n                    Rotate(),\n#                     RandomBrightnessContrast(p=0.15),\n                    ToTensorV2()])\n\ndef data_to_device(img,label=None):\n    if label !=None:\n        return img.to(DEVICE), label.to(DEVICE)\n    else:\n        return img.to(DEVICE)","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:34:49.871212Z","iopub.execute_input":"2023-02-07T15:34:49.873605Z","iopub.status.idle":"2023-02-07T15:34:49.884863Z","shell.execute_reply.started":"2023-02-07T15:34:49.873566Z","shell.execute_reply":"2023-02-07T15:34:49.88394Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data=DDSM_dataset(excel_path,image_path,transform)\ntrain_dataloader = DataLoader(data, batch_size=16, shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:34:49.89315Z","iopub.execute_input":"2023-02-07T15:34:49.895866Z","iopub.status.idle":"2023-02-07T15:34:52.737153Z","shell.execute_reply.started":"2023-02-07T15:34:49.895827Z","shell.execute_reply":"2023-02-07T15:34:52.735973Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train_dataloader)*16","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:34:52.742436Z","iopub.execute_input":"2023-02-07T15:34:52.743785Z","iopub.status.idle":"2023-02-07T15:34:52.754242Z","shell.execute_reply.started":"2023-02-07T15:34:52.743745Z","shell.execute_reply":"2023-02-07T15:34:52.753077Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img = cv2.imread('/kaggle/input/ddsm-croped-image/Cancer/C_0018_1.RIGHT_MLO.jpg')\nplt.imshow(img)","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:34:52.755966Z","iopub.execute_input":"2023-02-07T15:34:52.75647Z","iopub.status.idle":"2023-02-07T15:34:53.38612Z","shell.execute_reply.started":"2023-02-07T15:34:52.756429Z","shell.execute_reply":"2023-02-07T15:34:53.384878Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for k,(img,la) in enumerate(train_dataloader):\n    if k == 2:\n        break\n    print(la)\n    img,la = data_to_device(img,la)\n    print(_color.S + f\"Batch: {k}\" + _color.E, \"\\n\" +\n          _color.S + \"Image:\" + _color.E, img.shape, \"\\n\" +\n          _color.S + \"Label:\" + _color.E, la, \"\\n\" +\n          \"=\"*50)","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:34:53.390748Z","iopub.execute_input":"2023-02-07T15:34:53.393575Z","iopub.status.idle":"2023-02-07T15:35:19.427171Z","shell.execute_reply.started":"2023-02-07T15:34:53.393534Z","shell.execute_reply":"2023-02-07T15:35:19.425832Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(15, 15))\nfor i, (img, label) in enumerate(data):\n    plt.subplot(1,15,i+1)\n    plt.imshow(img.squeeze(), cmap='gray')\n    plt.axis('off')\n    plt.subplots_adjust(wspace=None, hspace=None)\n    plt.title(label)\n    if i == 14:\n        break","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:35:19.432279Z","iopub.execute_input":"2023-02-07T15:35:19.435119Z","iopub.status.idle":"2023-02-07T15:35:25.755287Z","shell.execute_reply.started":"2023-02-07T15:35:19.435075Z","shell.execute_reply":"2023-02-07T15:35:25.75403Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_t,la=data.__getitem__(10)\nplt.imshow(img_t.permute(1,2,0),cmap=plt.cm.gray);\nprint(_color.S+'Label of this image is:'+_color.E,la)","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:35:25.756553Z","iopub.execute_input":"2023-02-07T15:35:25.756979Z","iopub.status.idle":"2023-02-07T15:35:26.443405Z","shell.execute_reply.started":"2023-02-07T15:35:25.756936Z","shell.execute_reply":"2023-02-07T15:35:26.442304Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Test with CNN Model","metadata":{}},{"cell_type":"code","source":"class CNN(nn.Module):\n    def __init__(self):\n        super(CNN,self).__init__()\n        def layer(input_channel: int, \n                  output_channel: int, \n                  kernel_size_conv: int=3, \n                  padding: str='same', \n                  stride_conv: int=1, \n                  kernel_size_maxpool: int=2, \n                  stride_maxpool: int=2,\n                  batchnorm=True,\n                  maxpool=True,):\n            layers = [nn.Conv2d(input_channel, output_channel, kernel_size_conv,stride_conv, padding)]\n            if batchnorm:\n                layers.append(nn.BatchNorm2d(output_channel))\n                \n            layers.append(nn.ReLU())\n            \n            if maxpool:\n                layers.append(nn.MaxPool2d(kernel_size_maxpool, stride_maxpool))\n                \n            return layers\n        self.conv_seq = nn.Sequential(\n                        *layer(input_channel=1, \n                               output_channel=8 ,\n                               kernel_size_conv=3, \n                               stride_conv=1,\n                               padding='same',\n                               kernel_size_maxpool=2,\n                               stride_maxpool=2),\n            \n                        *layer(input_channel=8, \n                               output_channel=16 ,\n                               kernel_size_conv=3, \n                               stride_conv=1,\n                               padding='same',\n                               kernel_size_maxpool=2,\n                               stride_maxpool=2),\n            \n                        *layer(input_channel=16, \n                               output_channel=32,\n                               kernel_size_conv=3, \n                               stride_conv=1,\n                               padding='same',\n                               maxpool=False),\n                    )\n        self.fc_seq = nn.Sequential(nn.Linear(100352,512),\n                                   nn.ReLU(),\n                                   nn.Linear(512,128),\n                                   nn.ReLU(),\n                                   nn.Linear(128,2))\n    def forward(self,x):\n        x=self.conv_seq(x)\n        x = torch.flatten(x,1)\n        output=self.fc_seq(x)\n        return output","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:35:26.446727Z","iopub.execute_input":"2023-02-07T15:35:26.447406Z","iopub.status.idle":"2023-02-07T15:35:26.467174Z","shell.execute_reply.started":"2023-02-07T15:35:26.447367Z","shell.execute_reply":"2023-02-07T15:35:26.46606Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = CNN().to(DEVICE)\nprint(_color.S+str(model)+_color.E)","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:35:26.472834Z","iopub.execute_input":"2023-02-07T15:35:26.475663Z","iopub.status.idle":"2023-02-07T15:35:27.302322Z","shell.execute_reply.started":"2023-02-07T15:35:26.475623Z","shell.execute_reply":"2023-02-07T15:35:27.301374Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train(train_dataloader, model, loss_fn, optimizer):\n    size = len(train_dataloader.dataset)\n    model.train()\n    l = []\n    for batch, (img, la) in enumerate(train_dataloader):\n        img, la = data_to_device(img, la)\n        \n        # Compute prediction error\n        pred = model(img)\n        loss = loss_fn(pred, la)\n\n        # Backpropagation\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        if batch % 1000 == 0:\n            loss, current = loss.item(), batch * len(img)\n            print(f\"loss: {loss:>7f}  [{current:>5d}/{size:>5d}]\")\n    \n    return loss","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:35:27.308129Z","iopub.execute_input":"2023-02-07T15:35:27.3104Z","iopub.status.idle":"2023-02-07T15:35:27.321164Z","shell.execute_reply.started":"2023-02-07T15:35:27.31036Z","shell.execute_reply":"2023-02-07T15:35:27.320088Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"loss_fn = nn.CrossEntropyLoss()\noptimizer = torch.optim.RMSprop(model.parameters(), lr=1e-3)","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:35:27.325983Z","iopub.execute_input":"2023-02-07T15:35:27.328599Z","iopub.status.idle":"2023-02-07T15:35:27.336675Z","shell.execute_reply.started":"2023-02-07T15:35:27.328561Z","shell.execute_reply":"2023-02-07T15:35:27.335603Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"n_epochs = 20\nfor t in range(n_epochs):\n    print(f'----------epoch {t}------------\\n')\n    l = train(train_dataloader, model, loss_fn, optimizer)\n    wandb.log({'loss':l})\nprint(\"Done!\")","metadata":{"execution":{"iopub.status.busy":"2023-02-07T15:35:27.341691Z","iopub.execute_input":"2023-02-07T15:35:27.344306Z","iopub.status.idle":"2023-02-07T16:02:34.66001Z","shell.execute_reply.started":"2023-02-07T15:35:27.344266Z","shell.execute_reply":"2023-02-07T16:02:34.658942Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataset=DDSM_dataset(test_csv_path,test_RSNA,is_train = False)\ntest_dataloader = DataLoader(test_dataset, batch_size=4, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2023-02-07T16:02:34.661346Z","iopub.execute_input":"2023-02-07T16:02:34.661676Z","iopub.status.idle":"2023-02-07T16:02:34.675241Z","shell.execute_reply.started":"2023-02-07T16:02:34.661641Z","shell.execute_reply":"2023-02-07T16:02:34.674113Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"hi, he = test_dataset.__getitem__(2)\nplt.imshow(hi.permute(1,2,0),cmap=plt.cm.gray);\nprint(_color.S+'Label of this image is:'+_color.E,he)","metadata":{"execution":{"iopub.status.busy":"2023-02-07T16:02:34.676977Z","iopub.execute_input":"2023-02-07T16:02:34.677329Z","iopub.status.idle":"2023-02-07T16:02:35.819959Z","shell.execute_reply.started":"2023-02-07T16:02:34.677293Z","shell.execute_reply":"2023-02-07T16:02:35.81882Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classes = ['No Cancer','Cancer']\nlist_pred_id=[]\nlist_pred_cancer=[]\nmodel.eval()\nwith torch.no_grad():\n    fig,ax = plt.subplots(1,4,figsize=(15,15))\n    for k,(img_test,pred_id) in enumerate(test_dataset):\n        ax_idx = ax[k]\n        ax_idx.imshow(img_test.permute(1,2,0),cmap=plt.cm.gray)\n        pred = model(img_test.type(torch.cuda.FloatTensor).unsqueeze(0))\n        softmax=nn.Softmax(dim=1)\n        final_pred = softmax(pred)\n        predicted = classes[final_pred[0].argmax(0)]\n        list_pred_id.append(pred_id)\n        list_pred_cancer.append(final_pred[0].argmax(0).item())\n        ax_idx.set_title(f\"Fig {pred_id} is {predicted}\")","metadata":{"execution":{"iopub.status.busy":"2023-02-07T16:02:35.821306Z","iopub.execute_input":"2023-02-07T16:02:35.821753Z","iopub.status.idle":"2023-02-07T16:02:39.325978Z","shell.execute_reply.started":"2023-02-07T16:02:35.821716Z","shell.execute_reply":"2023-02-07T16:02:39.324797Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Ảnh test nét hơn so với ảnh train\na = read_dicom_512('/kaggle/input/rsna-breast-cancer-detection/test_images/10008/1591370361.dcm')\na = image_procescing(a)\nb = read_dicom_512('/kaggle/input/rsna-breast-cancer-detection/test_images/10008/361203119.dcm')\nb = image_procescing(b)\nc = read_dicom_512('/kaggle/input/rsna-breast-cancer-detection/test_images/10008/68070693.dcm')\nc = image_procescing(c)\nd = read_dicom_512('/kaggle/input/rsna-breast-cancer-detection/test_images/10008/736471439.dcm')\nd = image_procescing(d)\nfig, ax = plt.subplots(1, 4)\nfig.set_size_inches(12, 6)\nax[0].imshow(a, cmap='turbo')\nax[1].imshow(b,cmap='turbo')\nax[2].imshow(c,cmap='turbo')\nax[3].imshow(d,cmap='turbo')","metadata":{"execution":{"iopub.status.busy":"2023-02-07T16:02:39.327675Z","iopub.execute_input":"2023-02-07T16:02:39.328057Z","iopub.status.idle":"2023-02-07T16:02:43.084694Z","shell.execute_reply.started":"2023-02-07T16:02:39.328023Z","shell.execute_reply":"2023-02-07T16:02:43.083802Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(b, cmap='gray')","metadata":{"execution":{"iopub.status.busy":"2023-02-07T16:02:43.086135Z","iopub.execute_input":"2023-02-07T16:02:43.086663Z","iopub.status.idle":"2023-02-07T16:02:43.295081Z","shell.execute_reply.started":"2023-02-07T16:02:43.086625Z","shell.execute_reply":"2023-02-07T16:02:43.293954Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test_csv = pd.read_csv('/kaggle/input/rsna-breast-cancer-detection/test.csv')\ndf_test_csv","metadata":{"execution":{"iopub.status.busy":"2023-02-07T16:02:43.296451Z","iopub.execute_input":"2023-02-07T16:02:43.296817Z","iopub.status.idle":"2023-02-07T16:02:43.324829Z","shell.execute_reply.started":"2023-02-07T16:02:43.296779Z","shell.execute_reply":"2023-02-07T16:02:43.3239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!mkdir /kaggle/working/model_cnn_breast_cancer","metadata":{"execution":{"iopub.status.busy":"2023-02-07T16:02:43.326273Z","iopub.execute_input":"2023-02-07T16:02:43.326598Z","iopub.status.idle":"2023-02-07T16:02:44.34706Z","shell.execute_reply.started":"2023-02-07T16:02:43.326564Z","shell.execute_reply":"2023-02-07T16:02:44.345628Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.save(model.state_dict(), \"/kaggle/working/model_cnn_breast_cancer/cnn.pth\")","metadata":{"execution":{"iopub.status.busy":"2023-02-07T16:02:44.353917Z","iopub.execute_input":"2023-02-07T16:02:44.35445Z","iopub.status.idle":"2023-02-07T16:02:44.945393Z","shell.execute_reply.started":"2023-02-07T16:02:44.3544Z","shell.execute_reply":"2023-02-07T16:02:44.944433Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix\nimport seaborn as sn\nimport pandas as pd\n\ny_pred = []\ny_true = []\n\nfor inputs, labels in train_dataloader:\n        inputs, labels= data_to_device(inputs, labels)\n        output = model(inputs) # Feed Network\n\n        output = (torch.max(torch.exp(output), 1)[1]).data.cpu().numpy()\n        y_pred.extend(output) # Save Prediction\n        \n        labels = labels.data.cpu().numpy()\n        y_true.extend(labels) # Save Truth\n        \n\n# constant for classes\nclasses = ('no-cancer','cancer')\n\n# Build confusion matrix\ncf_matrix = confusion_matrix(y_true, y_pred)\ndf_cm = pd.DataFrame(cf_matrix / np.sum(cf_matrix, axis=1), index = [i for i in classes],\n                     columns = [i for i in classes])\nplt.figure(figsize = (12,7))\nsn.heatmap(df_cm, annot=True)\nplt.savefig('/kaggle/working/output.png')","metadata":{"execution":{"iopub.status.busy":"2023-02-07T16:07:32.185826Z","iopub.execute_input":"2023-02-07T16:07:32.186237Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}