{"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 torch\nfrom torch.utils.data import Dataset\nfrom torch.utils.data import DataLoader\nimport numpy as np\nfrom sklearn.utils import shuffle\nimport pydicom\nfrom pydicom.data import get_testdata_file\nimport cv2\nimport torch.nn as nn\nimport torch.optim as optim\nimport torchvision\nimport torchvision.transforms as transforms\nimport time\nimport copy\nfrom torchvision import models, transforms\nfrom torch.optim import lr_scheduler","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-02-19T18:06:24.301505Z","iopub.execute_input":"2023-02-19T18:06:24.301881Z","iopub.status.idle":"2023-02-19T18:06:24.311079Z","shell.execute_reply.started":"2023-02-19T18:06:24.301849Z","shell.execute_reply":"2023-02-19T18:06:24.309206Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def read_xray(file_path, img_size=None):\n    dicom = pydicom.read_file(file_path)\n    img = dicom.pixel_array\n\n    if dicom.PhotometricInterpretation == \"MONOCHROME1\":\n        img = np.max(img) - img\n\n    if img_size:\n        img_size = (img_size, img_size) # Convert img_size to a tuple\n        img = cv2.resize(img, dsize=img_size)\n\n    # Add channel dim at First\n    img = img[np.newaxis]\n\n    # Converting img to float32\n    img = img / np.max(img)\n    img = img.astype(\"float32\")\n\n    return img","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:24.314411Z","iopub.execute_input":"2023-02-19T18:06:24.314671Z","iopub.status.idle":"2023-02-19T18:06:24.326035Z","shell.execute_reply.started":"2023-02-19T18:06:24.314646Z","shell.execute_reply":"2023-02-19T18:06:24.325054Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = np.load('/kaggle/input/smaller-dataset2/X_train.npy')\ny_train= np.load('/kaggle/input/smaller-dataset2/y_train.npy')","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:24.327611Z","iopub.execute_input":"2023-02-19T18:06:24.328335Z","iopub.status.idle":"2023-02-19T18:06:24.530062Z","shell.execute_reply.started":"2023-02-19T18:06:24.328292Z","shell.execute_reply":"2023-02-19T18:06:24.52906Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#print(X_train.shape)\n#print(y_train.shape)\nX_train, y_train = shuffle(X_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:24.532721Z","iopub.execute_input":"2023-02-19T18:06:24.533186Z","iopub.status.idle":"2023-02-19T18:06:24.72042Z","shell.execute_reply.started":"2023-02-19T18:06:24.533095Z","shell.execute_reply":"2023-02-19T18:06:24.719413Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = X_train[:2000]\ny_train = y_train[:2000]\n\nX_validation = X_train[-316:]\ny_validation = y_train[-316:]\n\n'''print(X_train.shape)\nprint(y_train.shape)\nprint(X_validation.shape)\nprint(y_validation.shape)\nprint(np.count_nonzero(y_train == 1))\nprint(np.count_nonzero(y_validation == 1))'''","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:24.722066Z","iopub.execute_input":"2023-02-19T18:06:24.722449Z","iopub.status.idle":"2023-02-19T18:06:24.730308Z","shell.execute_reply.started":"2023-02-19T18:06:24.722413Z","shell.execute_reply":"2023-02-19T18:06:24.729125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class RSNA_dataset(Dataset):\n    def __init__(self, feature, label):\n        self.feature = feature\n        self.label = label\n\n    def __len__(self):\n        return len(self.label)\n\n    def __getitem__(self, idx):\n        return self.feature[idx], self.label[idx]","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:24.732114Z","iopub.execute_input":"2023-02-19T18:06:24.732515Z","iopub.status.idle":"2023-02-19T18:06:24.739673Z","shell.execute_reply.started":"2023-02-19T18:06:24.732477Z","shell.execute_reply":"2023-02-19T18:06:24.738626Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = RSNA_dataset(X_train, y_train)\ntrain_dataloader = DataLoader(train_dataset, batch_size=32, shuffle=True)\n\nvalidation_dataset = RSNA_dataset(X_validation, y_validation)\nvalidation_dataloader = DataLoader(validation_dataset, batch_size=32, shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:24.741585Z","iopub.execute_input":"2023-02-19T18:06:24.742108Z","iopub.status.idle":"2023-02-19T18:06:24.750109Z","shell.execute_reply.started":"2023-02-19T18:06:24.742072Z","shell.execute_reply":"2023-02-19T18:06:24.748968Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\ndataloaders = {'train': train_dataloader, 'val': validation_dataloader}\ndataset_sizes= {'train': len(train_dataset), 'val': len(validation_dataset)}","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:24.751987Z","iopub.execute_input":"2023-02-19T18:06:24.752403Z","iopub.status.idle":"2023-02-19T18:06:24.76164Z","shell.execute_reply.started":"2023-02-19T18:06:24.752369Z","shell.execute_reply":"2023-02-19T18:06:24.760691Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train_model(model, criterion, optimizer, scheduler, dataloaders, dataset_sizes, num_epochs=25):\n    since = time.time()\n\n    best_model_wts = copy.deepcopy(model.state_dict())\n    best_acc = 0.0\n\n    for epoch in range(num_epochs):\n        #print('Epoch {}/{}'.format(epoch, num_epochs - 1))\n        #print('-' * 10)\n\n        # Each epoch has a training and validation phase\n        for phase in ['train', 'val']:\n            if phase == 'train':\n                model.train()  # Set model to training mode\n            else:\n                model.eval()   # Set model to evaluate mode\n\n            running_loss = 0.0\n            running_corrects = 0\n\n            # Iterate over data.\n            for inputs, labels in dataloaders[phase]:\n                inputs = inputs.to(device)\n                labels = labels.to(device)\n\n                # zero the parameter gradients\n                optimizer.zero_grad()\n\n                # forward\n                # track history if only in train\n                with torch.set_grad_enabled(phase == 'train'):\n                    outputs = model(inputs)\n                    _, preds = torch.max(outputs, 1)\n                    loss = criterion(outputs, labels)\n\n                    # backward + optimize only if in training phase\n                    if phase == 'train':\n                        loss.backward()\n                        optimizer.step()\n\n                # statistics\n                running_loss += loss.item() * inputs.size(0)\n                running_corrects += torch.sum(preds == labels.data)\n            if phase == 'train':\n                scheduler.step()\n\n            epoch_loss = running_loss / dataset_sizes[phase]\n            epoch_acc = running_corrects.double() / dataset_sizes[phase]\n\n            #print('{} Loss: {:.4f} Acc: {:.4f}'.format(\n                #phase, epoch_loss, epoch_acc))\n\n            # deep copy the model\n            if phase == 'val' and epoch_acc > best_acc:\n                best_acc = epoch_acc\n                best_model_wts = copy.deepcopy(model.state_dict())\n\n        #print(epoch, \"loss: \", epoch_loss, \"acc: \", epoch_acc)\n\n    time_elapsed = time.time() - since\n    #print('Training complete in {:.0f}m {:.0f}s'.format(\n        #time_elapsed // 60, time_elapsed % 60))\n    #print('Best val Acc: {:4f}'.format(best_acc))\n\n    # load best model weights\n    model.load_state_dict(best_model_wts)\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:24.766698Z","iopub.execute_input":"2023-02-19T18:06:24.767466Z","iopub.status.idle":"2023-02-19T18:06:24.779618Z","shell.execute_reply.started":"2023-02-19T18:06:24.767428Z","shell.execute_reply":"2023-02-19T18:06:24.778696Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = 2\n\n# make resnet 18 model\nmodel_ft = models.resnet18(pretrained=False)\n\n# change input layer\n# the default number of input channel in the resnet is 3, but our images are 1 channel. So we have to change 3 to 1.\n# nn.Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False) <- default\nmodel_ft.conv1 = nn.Conv2d(1, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False) \n\n# change fc layer\n# the number of classes in our dataset is 10. default is 1000.\nnum_ftrs = model_ft.fc.in_features\nmodel_ft.fc = nn.Linear(num_ftrs, 2)\n\nmodel_ft = model_ft.to(device)\n\ncriterion = nn.CrossEntropyLoss()\n\noptimizer_ft = optim.Adam(model_ft.parameters(), lr=0.001)\n\n# decay LR by a factor of 0.1 every 5 epochs\nexp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=5, gamma=0.1)","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:24.780985Z","iopub.execute_input":"2023-02-19T18:06:24.781517Z","iopub.status.idle":"2023-02-19T18:06:24.970274Z","shell.execute_reply.started":"2023-02-19T18:06:24.781484Z","shell.execute_reply":"2023-02-19T18:06:24.969094Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train model\nmodel_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler, dataloaders, dataset_sizes,\n                       num_epochs=epochs)","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:24.971668Z","iopub.execute_input":"2023-02-19T18:06:24.972133Z","iopub.status.idle":"2023-02-19T18:06:48.343188Z","shell.execute_reply.started":"2023-02-19T18:06:24.972096Z","shell.execute_reply":"2023-02-19T18:06:48.342246Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Convert Test Images to Numpy arrays\n\ntest_path = \"/kaggle/input/rsna-breast-cancer-detection/test_images/\"\nall_paths = []\n\ntest_df = pd.read_csv(\"/kaggle/input/rsna-breast-cancer-detection/test.csv\")\n\nfor k in range(len(test_df)):\n    row = test_df.iloc[k, :]\n    all_paths.append(test_path + str(row.patient_id) + \"/\" + str(row.image_id) + \".dcm\")\n    \ntest_df[\"path\"] = all_paths\nprint(test_df.head)","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:48.344619Z","iopub.execute_input":"2023-02-19T18:06:48.345098Z","iopub.status.idle":"2023-02-19T18:06:48.362057Z","shell.execute_reply.started":"2023-02-19T18:06:48.345057Z","shell.execute_reply":"2023-02-19T18:06:48.36073Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(all_paths))","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:48.363934Z","iopub.execute_input":"2023-02-19T18:06:48.364291Z","iopub.status.idle":"2023-02-19T18:06:48.369605Z","shell.execute_reply.started":"2023-02-19T18:06:48.364256Z","shell.execute_reply":"2023-02-19T18:06:48.3685Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# try and except???\n\n# X_test = []\n# for i in range(test_df.shape[0]):\n#     path = test_df['path'].iloc[i]\n#     xray = read_xray(path, 256)\n#     X_test.append(xray)","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:48.371257Z","iopub.execute_input":"2023-02-19T18:06:48.371989Z","iopub.status.idle":"2023-02-19T18:06:48.379244Z","shell.execute_reply.started":"2023-02-19T18:06:48.371954Z","shell.execute_reply":"2023-02-19T18:06:48.378247Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(test_df)","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:48.380818Z","iopub.execute_input":"2023-02-19T18:06:48.381503Z","iopub.status.idle":"2023-02-19T18:06:48.392616Z","shell.execute_reply.started":"2023-02-19T18:06:48.381468Z","shell.execute_reply":"2023-02-19T18:06:48.39149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test = []\nfor i in range(test_df.shape[0]):\n    row = test_df.iloc[i, :]\n    path = test_path + str(row.patient_id) + \"/\" + str(row.image_id) + \".dcm\"\n    xray = read_xray(path, 256)\n    X_test.append(xray)\n    \nprint(len(X_test))","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:48.394452Z","iopub.execute_input":"2023-02-19T18:06:48.395358Z","iopub.status.idle":"2023-02-19T18:06:50.647087Z","shell.execute_reply.started":"2023-02-19T18:06:48.395325Z","shell.execute_reply":"2023-02-19T18:06:50.645886Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_csv = pd.read_csv('../input/rsna-breast-cancer-detection/test.csv')\nsubmission = pd.DataFrame(data={'prediction_id': test_csv['prediction_id'], 'cancer': np.random.rand(test_csv.shape[0])}).drop_duplicates(subset='prediction_id')\nsubmission.head()\nsubmission.to_csv('submission.csv', index=False)\n","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:50.648512Z","iopub.execute_input":"2023-02-19T18:06:50.649207Z","iopub.status.idle":"2023-02-19T18:06:50.66141Z","shell.execute_reply.started":"2023-02-19T18:06:50.649168Z","shell.execute_reply":"2023-02-19T18:06:50.660331Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# class RSNA_testset(Dataset):\n#     def __init__(self, feature):\n#         self.feature = feature\n\n#     def __len__(self):\n#         return len(self.feature)\n\n#     def __getitem__(self, idx):\n#         return self.feature[idx]\n\n# test_dataset = RSNA_testset(X_test)\n# test_dataloader = DataLoader(test_dataset, batch_size=1, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:50.662642Z","iopub.execute_input":"2023-02-19T18:06:50.66312Z","iopub.status.idle":"2023-02-19T18:06:50.668431Z","shell.execute_reply.started":"2023-02-19T18:06:50.663083Z","shell.execute_reply":"2023-02-19T18:06:50.667259Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for data in test_dataloader:\n#     print(data.shape)","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:50.669716Z","iopub.execute_input":"2023-02-19T18:06:50.670747Z","iopub.status.idle":"2023-02-19T18:06:50.679064Z","shell.execute_reply.started":"2023-02-19T18:06:50.670709Z","shell.execute_reply":"2023-02-19T18:06:50.678031Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# predictions = []\n\n# for data in test_dataloader:\n#     data = data.to(device)\n#     model_ft.eval()\n#     with torch.no_grad():\n#         pred = model_ft(data)\n#         predictions.append(pred)\n\n# print(predictions)","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:50.680428Z","iopub.execute_input":"2023-02-19T18:06:50.680831Z","iopub.status.idle":"2023-02-19T18:06:50.689185Z","shell.execute_reply.started":"2023-02-19T18:06:50.68078Z","shell.execute_reply":"2023-02-19T18:06:50.688154Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# probabilities = [torch.sigmoid(t) for t in predictions]\n# print(probabilities)","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:50.690667Z","iopub.execute_input":"2023-02-19T18:06:50.691063Z","iopub.status.idle":"2023-02-19T18:06:50.699662Z","shell.execute_reply.started":"2023-02-19T18:06:50.691018Z","shell.execute_reply":"2023-02-19T18:06:50.698457Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Get the second value(probability of Cancer)\n# second_vals = [t[0, 1].item() for t in probabilities]\n# print(second_vals)\n# #\n# test_df[\"cancer\"] = second_vals \n# print(test_df.head)","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:50.701056Z","iopub.execute_input":"2023-02-19T18:06:50.701457Z","iopub.status.idle":"2023-02-19T18:06:50.709164Z","shell.execute_reply.started":"2023-02-19T18:06:50.701424Z","shell.execute_reply":"2023-02-19T18:06:50.707746Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Create submission dataframe\n# submission_df = test_df[['prediction_id', 'cancer']]\n\n# submission = submission_df[['prediction_id', 'cancer']].groupby(\"prediction_id\").mean().reset_index()\n# print(submission)\n# submission.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:50.710866Z","iopub.execute_input":"2023-02-19T18:06:50.712134Z","iopub.status.idle":"2023-02-19T18:06:50.721953Z","shell.execute_reply.started":"2023-02-19T18:06:50.712074Z","shell.execute_reply":"2023-02-19T18:06:50.720924Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# THRESHOLD = .2\n# submission[\"cancer\"] = (submission[\"cancer\"] > THRESHOLD).astype(int)\n# submission.head()\n# submission.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:50.728082Z","iopub.execute_input":"2023-02-19T18:06:50.728355Z","iopub.status.idle":"2023-02-19T18:06:50.73305Z","shell.execute_reply.started":"2023-02-19T18:06:50.728329Z","shell.execute_reply":"2023-02-19T18:06:50.731698Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''test_csv = pd.read_csv('../input/rsna-breast-cancer-detection/test.csv')\nsubmission = pd.DataFrame(data={'prediction_id': test_csv['prediction_id'], 'cancer': np.random.rand(test_csv.shape[0])}).drop_duplicates(subset='prediction_id')\nsubmission.head()\nsubmission.to_csv('submission.csv', index=False)'''","metadata":{"execution":{"iopub.status.busy":"2023-02-19T18:06:50.73512Z","iopub.execute_input":"2023-02-19T18:06:50.735857Z","iopub.status.idle":"2023-02-19T18:06:50.745456Z","shell.execute_reply.started":"2023-02-19T18:06:50.73582Z","shell.execute_reply":"2023-02-19T18:06:50.744197Z"},"trusted":true},"execution_count":null,"outputs":[]}]}