{"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":"!pip install python-gdcm -q","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install pylibjpeg -q","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install -U pylibjpeg pylibjpeg-openjpeg pylibjpeg-libjpeg pydicom","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \n\nimport pydicom as dicom\nimport matplotlib.pylab as plt\n\nimport torch\n\nfrom sklearn.preprocessing import LabelEncoder\n\nimport os\nimport glob\nfrom os import walk\n\nimport torchvision.transforms as T\n\nimport tqdm\n\nfrom torch.utils.data import Dataset, DataLoader, Subset\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\nfrom torch.autograd import Variable\n\nfrom sklearn.model_selection import StratifiedKFold, GroupKFold\n","metadata":{"execution":{"iopub.status.busy":"2023-01-12T02:33:57.443588Z","iopub.execute_input":"2023-01-12T02:33:57.444601Z","iopub.status.idle":"2023-01-12T02:34:00.099204Z","shell.execute_reply.started":"2023-01-12T02:33:57.444512Z","shell.execute_reply":"2023-01-12T02:34:00.097669Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nprint('Device available now:', DEVICE)","metadata":{"execution":{"iopub.status.busy":"2023-01-12T02:34:00.104969Z","iopub.execute_input":"2023-01-12T02:34:00.105597Z","iopub.status.idle":"2023-01-12T02:34:00.26416Z","shell.execute_reply.started":"2023-01-12T02:34:00.105554Z","shell.execute_reply":"2023-01-12T02:34:00.261489Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"BATCH_SIZE = 100\nEPOCHS = 10\nFOLDS = 5\n","metadata":{"execution":{"iopub.status.busy":"2023-01-12T02:34:14.617825Z","iopub.execute_input":"2023-01-12T02:34:14.618396Z","iopub.status.idle":"2023-01-12T02:34:14.626976Z","shell.execute_reply.started":"2023-01-12T02:34:14.618343Z","shell.execute_reply":"2023-01-12T02:34:14.62608Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv(\"/kaggle/input/rsna-breast-cancer-detection/train.csv\")\n\nbase_path = \"/kaggle/input/rsna-breast-cancer-detection/train_images/\"\nall_paths = []\nfor k in range(len(train)):\n    row = train.iloc[k, :]\n    all_paths.append(base_path + str(row.patient_id) + \"/\" + str(row.image_id) + \".dcm\")\n    \ntrain[\"path\"] = all_paths","metadata":{"execution":{"iopub.status.busy":"2023-01-12T02:34:15.686239Z","iopub.execute_input":"2023-01-12T02:34:15.687305Z","iopub.status.idle":"2023-01-12T02:34:23.94244Z","shell.execute_reply.started":"2023-01-12T02:34:15.687265Z","shell.execute_reply":"2023-01-12T02:34:23.941367Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Dataset(Dataset):\n    \n    def __init__(self , dataframe , istrain):\n        self.dataframe = dataframe\n        self.istrain = istrain\n        \n        if self.istrain == True:\n            self.transform = T.Compose([T.RandomResizedCrop((224 , 224) , scale = (0.2 , 1.0))])\n        else:\n            self.transform = T.Compose([T.ToTensor()])\n\n            \n    def __len__(self):\n        return len(self.dataframe)\n    \n    def __getitem__(self, index):\n        '''Take each row in batcj at a time.'''\n        \n        # Select path and read image\n        image_path = self.dataframe['path'][index]\n        image = dicom.dcmread(image_path)\n        image = torch.from_numpy(image.pixel_array.astype(np.float64)).long()\n        image = image.view(-1 , image.shape[0] , image.shape[1])\n        \n        # Apply transforms\n        image = self.transform(image)\n        \n        if self.istrain == True:\n            return image , self.dataframe['cancer'][index]\n        else:\n            return image\n        ","metadata":{"execution":{"iopub.status.busy":"2023-01-12T14:22:20.578003Z","iopub.execute_input":"2023-01-12T14:22:20.578403Z","iopub.status.idle":"2023-01-12T14:22:20.590186Z","shell.execute_reply.started":"2023-01-12T14:22:20.578363Z","shell.execute_reply":"2023-01-12T14:22:20.589288Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Instantiate Dataset object\ndataset = Dataset(train , True)\n# The Dataloader\ndataloader = DataLoader(dataset, batch_size = BATCH_SIZE, shuffle=False)\n\n\n'''\n# Output of the Dataloader\nfor k, (image , label) in enumerate(dataloader):\n    image = image.to(DEVICE)\n    label = label.to(DEVICE)\n    print(k , image.shape , label)\n    \n'''","metadata":{"execution":{"iopub.status.busy":"2023-01-12T14:22:21.80121Z","iopub.execute_input":"2023-01-12T14:22:21.801914Z","iopub.status.idle":"2023-01-12T14:22:21.809689Z","shell.execute_reply.started":"2023-01-12T14:22:21.801879Z","shell.execute_reply":"2023-01-12T14:22:21.808684Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset","metadata":{"execution":{"iopub.status.busy":"2023-01-12T14:22:28.479714Z","iopub.execute_input":"2023-01-12T14:22:28.480122Z","iopub.status.idle":"2023-01-12T14:22:28.486944Z","shell.execute_reply.started":"2023-01-12T14:22:28.480089Z","shell.execute_reply":"2023-01-12T14:22:28.485155Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CNN(nn.Module):\n    def __init__(self):\n        super(CNN , self).__init__()\n        self.conv1 = nn.Conv2d(1 , 32 , kernel_size = 5)\n        self.conv2 = nn.Conv2d(32 , 32 , kernel_size = 5)\n        self.conv3 = nn.Conv2d(32 , 64 , kernel_size = 5)\n        self.fc1 = nn.Linear(2 * 2 * 43264 , 512)\n        self.fc2 = nn.Linear(512 , 2)\n\n    def forward(self , x):\n        x = F.relu(self.conv1(x))\n        x = F.relu(F.max_pool2d(self.conv2(x) , 2))\n        x = F.dropout(x , p = 0.5 , training = self.training)\n        x = F.relu(F.max_pool2d(self.conv3(x) , 2))\n        x = F.dropout(x , p = 0.5 , training = self.training)\n        x = x.view(-1 , 2 * 2 * 43264)\n        x = F.relu(self.fc1(x))\n        x = F.dropout(x , training = self.training)\n        x = self.fc2(x)\n        return F.log_softmax(x , dim = 1)","metadata":{"execution":{"iopub.status.busy":"2023-01-12T02:34:23.982728Z","iopub.execute_input":"2023-01-12T02:34:23.983556Z","iopub.status.idle":"2023-01-12T02:34:23.994106Z","shell.execute_reply.started":"2023-01-12T02:34:23.983511Z","shell.execute_reply":"2023-01-12T02:34:23.993104Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = CNN().to(DEVICE)\n\ndef fit():\n    \n    group_fold = GroupKFold(n_splits = FOLDS)\n    \n    k_folds = group_fold.split(X = np.zeros(len(train)), \n                               y = train['cancer'], \n                               groups = train['patient_id'].tolist())\n    \n    for i, (train_index, valid_index) in enumerate(k_folds):\n        print(len(train_index) , len(valid_index))\n        \n        \n        train_data = train.iloc[train_index].reset_index(drop=True)\n        valid_data = train.iloc[valid_index].reset_index(drop=True)\n\n        # Create Data instances\n        train_dataset = Dataset(train_data , True)\n        valid_dataset = Dataset(valid_data , False)\n\n        # Dataloaders\n        train_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)\n        valid_loader = DataLoader(valid_dataset, batch_size=BATCH_SIZE, shuffle=False)\n\n        optimizer = torch.optim.Adam(model.parameters())\n        error = nn.CrossEntropyLoss()\n        model.train()\n\n        for epoch in range(EPOCHS):\n            correct = 0\n            for batch_idx , (X_batch , y_batch) in enumerate(train_loader):\n                vX_batch = Variable(X_batch).float()\n                vy_batch = Variable(y_batch)\n                \n                vX_batch = vX_batch.to(DEVICE)\n                vy_batch = vy_batch.to(DEVICE)\n                \n                optimizer.zero_grad()\n                output = model(vX_batch)\n                loss = error(output , vy_batch)\n                loss.backward()\n                optimizer.step()\n\n                predicted = torch.max(output.data , 1)[1]\n                correct += (predicted == vy_batch).sum()\n\n            print(\"Epoch: \" , epoch , \"\\tLoss: \" , loss.data , \"\\tAccuracy: \" , round(float(correct*100) / float(len(train_index))) , 2)\n            \n        train_acc = round(float(correct*100) / float(len(train_index)) , 2)\n        \n        print(\"Train Accuracy: \" , train_acc , \"%\" )\n        \n        model.eval()\n\n        # Disables gradients (we need to be sure no optimization happens)\n        with torch.no_grad():\n            for batch_idx , (X_batch , y_batch)  in enumerate(valid_loader):\n                \n                vX_batch = Variable(X_batch).float()\n                vy_batch = Variable(y_batch)\n                \n                vX_batch = vX_batch.to(DEVICE)\n                vy_batch = vy_batch.to(DEVICE)\n\n                output = model(vX_batch)\n                predicted = torch.max(output.data , 1)[1]\n                correct += (predicted == vy_batch).sum()\n\n            # Calculate accuracy\n            valid_acc = round(float(correct*100) / float(len(valid_index)) , 2)\n            \n            print(\"Valid Accuracy: \" , valid_acc , \"%\" )                 ","metadata":{"execution":{"iopub.status.busy":"2023-01-12T02:56:11.582736Z","iopub.execute_input":"2023-01-12T02:56:11.583166Z","iopub.status.idle":"2023-01-12T02:56:12.530578Z","shell.execute_reply.started":"2023-01-12T02:56:11.583122Z","shell.execute_reply":"2023-01-12T02:56:12.529573Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fit()","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}