{"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 tensorflow_gpu==1.14.0","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:27:49.719157Z","iopub.execute_input":"2021-11-24T06:27:49.72001Z","iopub.status.idle":"2021-11-24T06:28:30.387085Z","shell.execute_reply.started":"2021-11-24T06:27:49.719882Z","shell.execute_reply":"2021-11-24T06:28:30.38623Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install pydicom","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:28:30.390912Z","iopub.execute_input":"2021-11-24T06:28:30.391144Z","iopub.status.idle":"2021-11-24T06:28:38.367556Z","shell.execute_reply.started":"2021-11-24T06:28:30.391117Z","shell.execute_reply":"2021-11-24T06:28:38.366732Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport pydicom\nimport torch\nfrom torch.utils.data import Dataset\n\n\ndef correct_dcm(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\ndef window_image(dcm, window_center, window_width):\n    if (dcm.BitsStored == 12) and (dcm.PixelRepresentation == 0) and (int(dcm.RescaleIntercept) > -100):\n        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\ndef bsb_window(dcm):\n    brain_img = window_image(dcm, 40, 80)\n    subdural_img = window_image(dcm, 80, 200)\n    soft_img = 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\nclass IntracranialDataset(Dataset):\n\n    def __init__(self, csv_file, path, labels, transform=None):\n        self.path = path\n        self.data = pd.read_csv(csv_file)\n        self.transform = transform\n        self.labels = labels\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n        try:\n            dicom = pydicom.dcmread(self.path + self.data.loc[idx, 'Image'] + '.dcm')\n            img = bsb_window(dicom)\n        except:\n            img = np.zeros((512, 512, 3))\n\n        if self.transform:\n            augmented = self.transform(image=img)\n            img = augmented['image']\n\n        if self.labels:\n\n            labels = torch.tensor(\n                self.data.loc[\n                    idx, ['epidural', 'intraparenchymal', 'intraventricular', 'subarachnoid', 'subdural', 'any']])\n            return {'image': img, 'labels': labels}\n\n        else:\n\n            return {'image': img}\n\n\nclass PredictionsDataset(Dataset):\n\n    def __init__(self, data, col_names, features=120, train=True, series=None):\n        self.data = data\n        self.train = train\n        self.col_names = col_names\n        self.embed_cols = [str(i) for i in range(features)]\n\n        if series is None:\n            self.series = self.data['SeriesInstanceUID'].unique()\n        else:\n            self.series = series\n\n    def __len__(self):\n        return len(self.series)\n\n    def __getitem__(self, idx):\n        series_id = self.series[idx]\n        images = self.data[self.data['SeriesInstanceUID'] == series_id].sort_values(by=['ImagePositionSpan', 'ImageId'])\n\n        cols = self.col_names\n        if self.train:\n            cols = [x + '_x' for x in self.col_names]\n\n        image_preds = images[cols].to_numpy().astype(np.float)\n\n        if self.train:\n            image_truths = images[[x + '_y' for x in self.col_names]].to_numpy().astype(np.float)\n\n            image_embeds = images[self.embed_cols].to_numpy().astype(np.float)\n            return {\n                'preds': torch.tensor(image_preds).to(torch.float),\n                'labels': torch.tensor(image_truths).to(torch.float),\n                'embeds': torch.tensor(image_embeds).to(torch.float)\n            }\n        else:\n            image_embeds = images[self.embed_cols].to_numpy().astype(np.float)\n            return {\n                'preds': torch.tensor(image_preds).to(torch.float),\n                'embeds': torch.tensor(image_embeds).to(torch.float)\n            }","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:28:38.370213Z","iopub.execute_input":"2021-11-24T06:28:38.370499Z","iopub.status.idle":"2021-11-24T06:28:40.156048Z","shell.execute_reply.started":"2021-11-24T06:28:38.37046Z","shell.execute_reply":"2021-11-24T06:28:40.155308Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\n\nclass ResNeXtModel(torch.nn.Module):\n    def __init__(self):\n        super(ResNeXtModel, self).__init__()\n        self.base = torch.nn.Sequential(*list(model.children())[:-1])\n        self.fc = torch.nn.Sequential(torch.nn.Linear(2048, 6)\n        )\n    \n    def forward(self, input):\n        features = self.base(input).reshape(-1, 2048)\n        out = self.fc(features)\n        return out, features\n\n\nclass EmbeddingSmootherModel(torch.nn.Module):\n\n    def __init__(self, features=120, hidden_size=256):\n        super(EmbeddingSmootherModel, self).__init__()\n        self.hidden_size = hidden_size\n        self.lstm = torch.nn.LSTM(features + 6, self.hidden_size, num_layers=3, dropout=0.3, batch_first=True,\n                                  bidirectional=True)\n        self.scan_rnn = torch.nn.GRU(6, 64, num_layers=1, batch_first=True, bidirectional=True)\n        self.classifier = torch.nn.Sequential(\n            torch.nn.Linear(self.hidden_size * 2 + 6, 6)\n        )\n        self.dropout = torch.nn.Dropout(0.5)\n\n    def forward(self, seq, preds):\n        device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n\n        hidden = (\n            torch.zeros(6, 1, self.hidden_size).to(device),\n            torch.zeros(6, 1, self.hidden_size).to(device)\n        )\n\n        out, hidden = self.lstm(seq, hidden)\n        combined_out = torch.cat((out, preds), 2)\n        out = self.classifier(self.dropout(combined_out))\n\n        return out","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:28:40.158121Z","iopub.execute_input":"2021-11-24T06:28:40.15831Z","iopub.status.idle":"2021-11-24T06:28:40.169467Z","shell.execute_reply.started":"2021-11-24T06:28:40.158287Z","shell.execute_reply":"2021-11-24T06:28:40.168811Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torchvision.models.resnet import ResNet, Bottleneck\nfrom torch.hub import load_state_dict_from_url\nmodel_urls = {\n    'resnext101_32x8d': 'https://download.pytorch.org/models/ig_resnext101_32x8-c38310e5.pth',\n    \n}\n\ndef _resnext(arch, block, layers, pretrained, progress, **kwargs):\n    model = ResNet(block, layers, **kwargs)\n    state_dict = load_state_dict_from_url(model_urls[arch], progress=progress)\n    model.load_state_dict(state_dict)\n    return model","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:28:40.17063Z","iopub.execute_input":"2021-11-24T06:28:40.171514Z","iopub.status.idle":"2021-11-24T06:28:40.48426Z","shell.execute_reply.started":"2021-11-24T06:28:40.171472Z","shell.execute_reply":"2021-11-24T06:28:40.483305Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def resnext101_32x8d_wsl(progress=True, **kwargs):\n            \"\"\"Constructs a ResNeXt-101 32x8 model pre-trained on weakly-supervised data\n            and finetuned on ImageNet from Figure 5 in\n            `\"Exploring the Limits of Weakly Supervised Pretraining\" <https://arxiv.org/abs/1805.00932>`_\n            Args:\n                progress (bool): If True, displays a progress bar of the download to stderr.\n            \"\"\"\n            kwargs['groups'] = 32\n            kwargs['width_per_group'] = 8\n            return _resnext('resnext101_32x8d', Bottleneck, [3, 4, 23, 3], True, progress, **kwargs)\nmodel = resnext101_32x8d_wsl()","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:28:40.488754Z","iopub.execute_input":"2021-11-24T06:28:40.489104Z","iopub.status.idle":"2021-11-24T06:28:58.00355Z","shell.execute_reply.started":"2021-11-24T06:28:40.48907Z","shell.execute_reply":"2021-11-24T06:28:58.002677Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import glob\nimport os\n\nimport numpy as np\nimport pandas as pd\nimport torch\nimport torch.optim as optim\nfrom albumentations import Compose, ShiftScaleRotate, Resize, HorizontalFlip, RandomBrightnessContrast, \\\n    Normalize\nfrom albumentations.pytorch import ToTensorV2\nfrom sklearn.decomposition import PCA\nfrom sklearn.metrics import roc_auc_score\nfrom torch.utils.data import Dataset\nfrom tqdm import tqdm\n\n\nsaved_model_dir = './'\n\ndir_csv = '../input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection'\ntest_images_dir = '../input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection/stage_2_test'\ntrain_images_dir = '../input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection/stage_2_train'\ntrain_metadata_csv = '../input/rsnametadataset/train_metadata_noidx.csv'\ntest_metadata_csv = '../input/rsnametadataset/test_metadata_noidx.csv'\n\nn_classes = 6\nn_epochs = 3\nbatch_size = 4\n\nCOLS = ['epidural', 'intraparenchymal', 'intraventricular', 'subarachnoid', 'subdural', 'any']\n\n# Read train and test data\ntrain = pd.read_csv(os.path.join(dir_csv, 'stage_2_train.csv'))\ntest = pd.read_csv(os.path.join(dir_csv, 'stage_2_sample_submission.csv'))\nprint(\"Original train data\")\nprint(train.head(3))\n# Read metadata for train/validation split\ntest_metadata_noidx = pd.read_csv(test_metadata_csv)\ntrain_metadata_noidx = pd.read_csv(train_metadata_csv)\n","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:28:58.005641Z","iopub.execute_input":"2021-11-24T06:28:58.006512Z","iopub.status.idle":"2021-11-24T06:29:07.23671Z","shell.execute_reply.started":"2021-11-24T06:28:58.006439Z","shell.execute_reply":"2021-11-24T06:29:07.235914Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# Prepare train table\ntrain[['ID', 'Image', 'Diagnosis']] = train['ID'].str.split('_', expand=True)\ntrain = train[['Image', 'Diagnosis', 'Label']]\ntrain.drop_duplicates(inplace=True)\ntrain = train.pivot(index='Image', columns='Diagnosis', values='Label').reset_index()\ntrain['Image'] = 'ID_' + train['Image']\ntrain.head(5)\n\n# Remove invalid PNGs\npng = glob.glob(os.path.join(train_images_dir, '*.dcm'))\npng = [os.path.basename(png)[:-4] for png in png]\npng = np.array(png)\n\ntrain = train[train['Image'].isin(png)]\ntrain.head(5)\nmerged_train = pd.merge(left=train, right=train_metadata_noidx, how='left', left_on='Image', right_on='ImageId')\n\ntrain_series = train_metadata_noidx['SeriesInstanceUID'].unique()\nvalid_series = train_series[2500:4000]\ntrain_series = train_series[:2500]\n\nprint(len(train_series))\nprint(len(valid_series))\n\ntrain_df = merged_train[merged_train['SeriesInstanceUID'].isin(train_series)]\nvalid_df = merged_train[merged_train['SeriesInstanceUID'].isin(valid_series)]\n\nprint(train_df.shape)\nprint(valid_df.shape)","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:29:07.238055Z","iopub.execute_input":"2021-11-24T06:29:07.23832Z","iopub.status.idle":"2021-11-24T06:29:58.109738Z","shell.execute_reply.started":"2021-11-24T06:29:07.238286Z","shell.execute_reply":"2021-11-24T06:29:58.108989Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df=train_df.head(2500)\nvalid_df=valid_df.head(2500)\nprint(train_df.shape)\nprint(valid_df.shape)","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:29:58.111002Z","iopub.execute_input":"2021-11-24T06:29:58.111333Z","iopub.status.idle":"2021-11-24T06:29:58.117004Z","shell.execute_reply.started":"2021-11-24T06:29:58.111295Z","shell.execute_reply":"2021-11-24T06:29:58.116271Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.to_csv('train.csv', index=False)\nprint(train_df['any'].value_counts())\nvalid_df.to_csv('valid.csv', index=False)\nprint(valid_df['any'].value_counts())\n\n# Prepare test table\ntest[['ID', 'Image', 'Diagnosis']] = test['ID'].str.split('_', expand=True)\ntest['Image'] = 'ID_' + test['Image']\ntest = test[['Image', 'Label']]\ntest.drop_duplicates(inplace=True)\n\n# Remove invalid PNGs\n# Some files didn't contain legitimate images, so we need to remove them\npng1 = glob.glob(os.path.join(test_images_dir, '*.dcm'))\npng1 = [os.path.basename(png)[:-4] for png in png1]\npng1 = np.array(png1)\ntest = test[test['Image'].isin(png1)]\ntest=test.head(2000)\n#print(test.shape)\ntest.to_csv('test.csv', index=False)\n#print(train['any'].value_counts())\nprint(\"test\",test.shape)","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:29:58.119735Z","iopub.execute_input":"2021-11-24T06:29:58.120587Z","iopub.status.idle":"2021-11-24T06:30:03.300188Z","shell.execute_reply.started":"2021-11-24T06:29:58.120545Z","shell.execute_reply":"2021-11-24T06:30:03.299384Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Data loaders\ntransform_train = Compose([Resize(256, 256),\n                           Normalize(mean=[0.1738, 0.1433, 0.1970], std=[0.3161, 0.2850, 0.3111], max_pixel_value=1.),\n                           HorizontalFlip(),\n                           ShiftScaleRotate(),\n                           RandomBrightnessContrast(),\n                           ToTensorV2()])\n\ntransform_test = Compose([Resize(256, 256),\n                          Normalize(mean=[0.1738, 0.1433, 0.1970], std=[0.3161, 0.2850, 0.3111], max_pixel_value=1.),\n                          ToTensorV2()])\n\ntransform_tta = Compose([Resize(256, 256),\n                         HorizontalFlip(),\n                         ShiftScaleRotate(),\n                         Normalize(mean=[0.1738, 0.1433, 0.1970], std=[0.3161, 0.2850, 0.3111], max_pixel_value=1.),\n                         ToTensorV2()])\n\ntrain_dataset = IntracranialDataset(\n    csv_file='train.csv', path=train_images_dir, transform=transform_train, labels=True)\n\nvalid_dataset = IntracranialDataset(\n    csv_file='valid.csv', path=train_images_dir, transform=transform_train, labels=True)\n\ntest_dataset = IntracranialDataset(\n    csv_file='test.csv', path=test_images_dir, transform=transform_test, labels=False)\n\ndata_loader_train = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=False, num_workers=2)\ndata_loader_valid = torch.utils.data.DataLoader(valid_dataset, batch_size=batch_size, shuffle=False, num_workers=2)\ndata_loader_test = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=2)\n\nprint(\"train_dataset\",len(train_dataset))\nprint(\"valid_dataset\",len(valid_dataset))\nprint(\"test_dataset\",len(test_dataset))\n\nprint(\"data_loader_train\",len(data_loader_train))\nprint(\"data_loader_valid\",len(data_loader_valid))\nprint(\"data_loader_test\",len(data_loader_test))\n","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:30:03.30153Z","iopub.execute_input":"2021-11-24T06:30:03.301943Z","iopub.status.idle":"2021-11-24T06:30:03.33843Z","shell.execute_reply.started":"2021-11-24T06:30:03.301906Z","shell.execute_reply":"2021-11-24T06:30:03.337659Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%matplotlib ipympl\n\nimport matplotlib.pyplot as plt","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:30:03.340575Z","iopub.execute_input":"2021-11-24T06:30:03.340982Z","iopub.status.idle":"2021-11-24T06:30:03.351576Z","shell.execute_reply.started":"2021-11-24T06:30:03.340933Z","shell.execute_reply":"2021-11-24T06:30:03.350758Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n\nmodel = ResNeXtModel()\n\nmodel.to(device)\n\ncriterion = torch.nn.BCEWithLogitsLoss()\noptimizer = optim.Adam(model.parameters(), lr=1e-5)\n\n# model, optimizer = amp.initialize(model, optimizer, opt_level=\"O1\")\n\nfor epoch in range(n_epochs):\n\n    print('Epoch {}/{}'.format(epoch + 1, n_epochs))\n    print('-' * 10)\n\n    model.train()\n    tr_loss = 0\n\n    for step, batch in enumerate(data_loader_train):\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        loss = criterion(outputs, labels)\n      \n        tr_loss += loss.item()\n\n        optimizer.step()\n        optimizer.zero_grad()\n\n        if step % 512 == 0:\n            epoch_loss = tr_loss / (step + 1)\n            print('Training Loss at {}: {:.4f}'.format(step, epoch_loss))\n\n    epoch_loss = tr_loss / len(data_loader_train)\n    print('Training Loss: {:.4f}'.format(epoch_loss))\n    print('-----------------------')\n\n    model.eval()\n    tr_loss = 0\n\n    auc_preds = []\n    auc_truths = []\n\n    for step, batch in enumerate(data_loader_valid):\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        loss = criterion(outputs, labels)\n\n        tr_loss += loss.item()\n\n        auc_preds.append(outputs.view(-1, 6).detach().cpu().numpy())\n        auc_truths.append(labels.view(-1, 6).detach().cpu().numpy())\n\n    epoch_loss = tr_loss / len(data_loader_valid)\n    print('Validation Loss: {:.4f}'.format(epoch_loss))\n\n    roc_preds = np.concatenate(auc_preds)\n\n    roc_truths = np.concatenate(auc_truths)\n\n    for tp in range(0, 6):\n        print(COLS[tp], roc_auc_score(roc_truths[:, tp], roc_preds[:, tp]), )\n    print('-----------------------')\n\n# Save checkpoint\ncheckpoint = {\n    'model': model.state_dict(),\n    'optimizer': optimizer.state_dict(),\n    # 'amp': amp.state_dict()\n}\ntorch.save(checkpoint, 'model.pt')\n\n# Save embeddings/predictions\nPCA_BATCHES = 1000\nmodel.eval()\n\ntrain_embed_dict = {}\n\nfor i, x_batch in enumerate(tqdm(data_loader_train)):\n    x_images = x_batch['labels']\n    x_batch = x_batch[\"image\"]\n    x_batch = x_batch.to(device, dtype=torch.float)\n\n    if i > PCA_BATCHES:\n        break\n\n    with torch.no_grad():\n        _, embed = model(x_batch)\n\n        for x, y in zip(x_images, embed):\n            e = y.squeeze().detach().cpu().numpy()\n            train_embed_dict[x] = e\n\nemb_stat = np.array(list(train_embed_dict.values()))\nprint(np.mean(emb_stat), np.std(emb_stat))  # 0.4707987 0.7724904\n\npca = PCA()\npca.fit(emb_stat)\nplt.figure()\nplt.plot(np.cumsum(pca.explained_variance_ratio_))\nplt.xlabel('Number of Components')\nplt.ylabel('Variance (%)')\nplt.title('Explained Variance')\nplt.show()\n\npca = PCA(n_components=100)\n\npca.fit(emb_stat)\n\nmodel.eval()\n\n# TRAIN\ntrain_pred_dict = {}\ntrain_embed_dict = {}\n\nfor i, x_batch in enumerate(tqdm(data_loader_train)):\n    x_images = x_batch['labels']\n    x_batch = x_batch[\"image\"]\n    x_batch = x_batch.to(device, dtype=torch.float)\n\n    with torch.no_grad():\n\n        pred, embed = model(x_batch)\n        pred = torch.sigmoid(pred)\n\n        for x, y in zip(x_images, pred):\n            train_pred_dict[x] = y.detach().cpu().numpy()\n        for x, y in zip(x_images, embed):\n            e = y.squeeze().detach().cpu().numpy()\n            e = np.expand_dims(e, axis=0)\n            train_embed_dict[x] = pca.transform(e)[0]\n\ntrain_embed_df = pd.DataFrame.from_dict(train_embed_dict, orient='index')\ntrain_embed_df.to_csv('train_embeds.csv')\n\ntrain_pred_df = pd.DataFrame.from_dict(train_pred_dict, orient='index')\ntrain_pred_df.to_csv('train_preds.csv')\n\n# VALID\nvalid_pred_dict = {}\nvalid_embed_dict = {}\n\nfor i, x_batch in enumerate(tqdm(data_loader_valid)):\n    x_images = x_batch['labels']\n    x_batch = x_batch[\"image\"]\n    x_batch = x_batch.to(device, dtype=torch.float)\n\n    with torch.no_grad():\n\n        pred, embed = model(x_batch)\n        pred = torch.sigmoid(pred)\n\n        for x, y in zip(x_images, pred):\n            valid_pred_dict[x] = y.detach().cpu().numpy()\n        for x, y in zip(x_images, embed):\n            e = y.squeeze().detach().cpu().numpy()\n            e = np.expand_dims(e, axis=0)\n            valid_embed_dict[x] = pca.transform(e)[0]\n\nvalid_embed_df = pd.DataFrame.from_dict(valid_embed_dict, orient='index')\nvalid_embed_df.to_csv('valid_embeds.csv')\n\nvalid_pred_df = pd.DataFrame.from_dict(valid_pred_dict, orient='index')\nvalid_pred_df.to_csv('valid_preds.csv')\n\n# TEST\ntest_pred_dict = {}\ntest_embed_dict = {}\n\nfor i, x_batch in enumerate(tqdm(data_loader_test)):\n    x_images = x_batch['image']\n    x_batch = x_batch[\"image\"]\n    x_batch = x_batch.to(device, dtype=torch.float)\n\n    with torch.no_grad():\n\n        pred, embed = model(x_batch)\n        pred = torch.sigmoid(pred)\n\n        for x, y in zip(x_images, pred):\n            test_pred_dict[x] = y.detach().cpu().numpy()\n        for x, y in zip(x_images, embed):\n            e = y.squeeze().detach().cpu().numpy()\n            e = np.expand_dims(e, axis=0)\n            test_embed_dict[x] = pca.transform(e)[0]\n\ntest_embed_df = pd.DataFrame.from_dict(test_embed_dict, orient='index')\ntest_embed_df.to_csv('test_embeds.csv')\n\ntest_pred_df = pd.DataFrame.from_dict(test_pred_dict, orient='index')\ntest_pred_df.to_csv('test_preds.csv')\n\nprint('----------------------- Done')","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:30:03.353308Z","iopub.execute_input":"2021-11-24T06:30:03.353786Z","iopub.status.idle":"2021-11-24T06:37:14.954355Z","shell.execute_reply.started":"2021-11-24T06:30:03.353751Z","shell.execute_reply":"2021-11-24T06:37:14.953401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:37:14.956169Z","iopub.execute_input":"2021-11-24T06:37:14.957019Z","iopub.status.idle":"2021-11-24T06:37:14.961865Z","shell.execute_reply.started":"2021-11-24T06:37:14.956957Z","shell.execute_reply":"2021-11-24T06:37:14.961105Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import shutil","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:37:14.96319Z","iopub.execute_input":"2021-11-24T06:37:14.964099Z","iopub.status.idle":"2021-11-24T06:37:14.977689Z","shell.execute_reply.started":"2021-11-24T06:37:14.964062Z","shell.execute_reply":"2021-11-24T06:37:14.976659Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"shutil.copy(\"../input/rsnacodefile/datasets.py\", \"./\")\nshutil.copy(\"../input/rsnacodefile/models.py\", \"./\")\nshutil.copy(\"../input/rsnacodefile/train_cnn.py\", \"./\")\nshutil.copy(\"../input/rsnacodefile/train_lstm.py\", \"./\")","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:37:14.978873Z","iopub.execute_input":"2021-11-24T06:37:14.979248Z","iopub.status.idle":"2021-11-24T06:37:15.029324Z","shell.execute_reply.started":"2021-11-24T06:37:14.979211Z","shell.execute_reply":"2021-11-24T06:37:15.028504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from apex import amp\nimport glob\nimport os\n\nimport numpy as np\nimport pandas as pd\nimport torch\nimport torch.optim as optim\nfrom albumentations import Compose, ShiftScaleRotate, Resize, HorizontalFlip, RandomBrightnessContrast, \\\n    Normalize\nfrom albumentations.pytorch import ToTensorV2\nfrom sklearn.decomposition import PCA\nfrom sklearn.metrics import roc_auc_score\nfrom torch.utils.data import Dataset\nfrom tqdm import tqdm\n\n# from datasets import IntracranialDataset\n# from models import ResNeXtModel\n\nsaved_model_dir = '../input/resnext32x4dcheckpoint/'\n\ndir_csv = '../input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection'\ntest_images_dir = '../input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection/stage_2_test/'\ntrain_images_dir = '../input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection/stage_2_train/'\ntrain_metadata_csv = '../input/rsnametadataset/train_metadata_noidx.csv'\ntest_metadata_csv = '../input/rsnametadataset/test_metadata_noidx.csv'\n\nn_classes = 6\nn_epochs = 3\nbatch_size = 16\n\nCOLS = ['epidural', 'intraparenchymal', 'intraventricular', 'subarachnoid', 'subdural', 'any']\n\n# Read train and test data\ntrain = pd.read_csv(os.path.join(dir_csv, 'stage_2_train.csv'))\ntest = pd.read_csv(os.path.join(dir_csv, 'stage_2_sample_submission.csv'))\n\n# Read metadata for train/validation split\ntest_metadata_noidx = pd.read_csv(test_metadata_csv)\ntrain_metadata_noidx = pd.read_csv(train_metadata_csv)\n\n# Prepare train table\ntrain[['ID', 'Image', 'Diagnosis']] = train['ID'].str.split('_', expand=True)\ntrain = train[['Image', 'Diagnosis', 'Label']]\ntrain.drop_duplicates(inplace=True)\ntrain = train.pivot(index='Image', columns='Diagnosis', values='Label').reset_index()\ntrain['Image'] = 'ID_' + train['Image']\n\n# Remove invalid PNGs\npng = glob.glob(os.path.join(train_images_dir, '*.dcm'))\npng = [os.path.basename(png)[:-4] for png in png]\npng = np.array(png)\n\ntrain = train[train['Image'].isin(png)]\n\nmerged_train = pd.merge(left=train, right=train_metadata_noidx, how='left', left_on='Image', right_on='ImageId')\n\ntrain_series = train_metadata_noidx['SeriesInstanceUID'].unique()\nvalid_series = train_series[21000:]\ntrain_series = train_series[:21000]\n\nprint(len(train_series))\nprint(len(valid_series))\n\ntrain_df = merged_train[merged_train['SeriesInstanceUID'].isin(train_series)]\nvalid_df = merged_train[merged_train['SeriesInstanceUID'].isin(valid_series)]\n\nprint(len(train_df))\nprint(len(valid_df))\n\ntrain_df.to_csv('train.csv', index=False)\nprint(train_df['any'].value_counts())\nvalid_df.to_csv('valid.csv', index=False)\nprint(valid_df['any'].value_counts())\n\n# Prepare test table\ntest[['ID', 'Image', 'Diagnosis']] = test['ID'].str.split('_', expand=True)\ntest['Image'] = 'ID_' + test['Image']\ntest = test[['Image', 'Label']]\ntest.drop_duplicates(inplace=True)\n\ntest.to_csv('test.csv', index=False)\n\n# Data loaders\ntransform_train = Compose([Resize(256, 256),\n                           Normalize(mean=[0.1738, 0.1433, 0.1970], std=[0.3161, 0.2850, 0.3111], max_pixel_value=1.),\n                           HorizontalFlip(),\n                           ShiftScaleRotate(),\n                           RandomBrightnessContrast(),\n                           ToTensorV2()])\n\ntransform_test = Compose([Resize(256, 256),\n                          Normalize(mean=[0.1738, 0.1433, 0.1970], std=[0.3161, 0.2850, 0.3111], max_pixel_value=1.),\n                          ToTensorV2()])\n\ntransform_tta = Compose([Resize(256, 256),\n                         HorizontalFlip(),\n                         ShiftScaleRotate(),\n                         Normalize(mean=[0.1738, 0.1433, 0.1970], std=[0.3161, 0.2850, 0.3111], max_pixel_value=1.),\n                         ToTensorV2()])\n\ntrain_dataset = IntracranialDataset(\n    csv_file='train.csv', path=train_images_dir, transform=transform_train, labels=True)\n\nvalid_dataset = IntracranialDataset(\n    csv_file='valid.csv', path=train_images_dir, transform=transform_train, labels=True)\n\ntest_dataset = IntracranialDataset(\n    csv_file='test.csv', path=test_images_dir, transform=transform_test, labels=False)\n\ndata_loader_train = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=False, num_workers=2)\ndata_loader_valid = torch.utils.data.DataLoader(valid_dataset, batch_size=batch_size, shuffle=False, num_workers=2)\ndata_loader_test = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=2)\n\nprint(len(train_dataset))\nprint(len(valid_dataset))\nprint(len(test_dataset))\n\nprint(len(data_loader_train))\nprint(len(data_loader_valid))\nprint(len(data_loader_test))\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n\nmodel = ResNeXtModel()\n\nmodel.to(device)\n\ncriterion = torch.nn.BCEWithLogitsLoss()\noptimizer = optim.Adam(model.parameters(), lr=1e-5)\n\n# model, optimizer = amp.initialize(model, optimizer, opt_level=\"O1\")\n\nfor epoch in range(n_epochs):\n\n    print('Epoch {}/{}'.format(epoch + 1, n_epochs))\n    print('-' * 10)\n\n    model.train()\n    tr_loss = 0\n\n    for step, batch in enumerate(data_loader_train):\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        loss = criterion(outputs, labels)\n\n#         with amp.scale_loss(loss, optimizer) as scaled_loss:\n#             scaled_loss.backward()\n\n        tr_loss += loss.item()\n\n        optimizer.step()\n        optimizer.zero_grad()\n\n        if step % 512 == 0:\n            epoch_loss = tr_loss / (step + 1)\n            print('Training Loss at {}: {:.4f}'.format(step, epoch_loss))\n\n    epoch_loss = tr_loss / len(data_loader_train)\n    print('Training Loss: {:.4f}'.format(epoch_loss))\n    print('-----------------------')\n\n    model.eval()\n    tr_loss = 0\n\n    auc_preds = []\n    auc_truths = []\n\n    for step, batch in enumerate(data_loader_valid):\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        loss = criterion(outputs, labels)\n\n        tr_loss += loss.item()\n\n        auc_preds.append(outputs.view(-1, 6).detach().cpu().numpy())\n        auc_truths.append(labels.view(-1, 6).detach().cpu().numpy())\n\n    epoch_loss = tr_loss / len(data_loader_valid)\n    print('Validation Loss: {:.4f}'.format(epoch_loss))\n\n    roc_preds = np.concatenate(auc_preds)\n\n    roc_truths = np.concatenate(auc_truths)\n\n    for tp in range(0, 6):\n        print(COLS[tp], roc_auc_score(roc_truths[:, tp], roc_preds[:, tp]), )\n    print('-----------------------')\n\n# Save checkpoint\ncheckpoint = {\n    'model': model.state_dict(),\n    'optimizer': optimizer.state_dict(),\n    # 'amp': amp.state_dict()\n}\ntorch.save(checkpoint, 'model.pt')\n\n# Save embeddings/predictions\nPCA_BATCHES = 1000\nmodel.eval()\n\ntrain_embed_dict = {}\n\nprint (enumerate(tqdm(data_loader_train)));\n# for i, x_batch in enumerate(tqdm(data_loader_train)):\n#     x_images = x_batch['image_id']\n#     x_batch = x_batch[\"image\"]\n#     x_batch = x_batch.to(device, dtype=torch.float)\n\n#     if i > PCA_BATCHES:\n#         break\n\n#     with torch.no_grad():\n#         _, embed = model(x_batch)\n\n#         for x, y in zip(x_images, embed):\n#             e = y.squeeze().detach().cpu().numpy()\n#             train_embed_dict[x] = e\n\n# emb_stat = np.array(list(train_embed_dict.values()))\n# print(np.mean(emb_stat), np.std(emb_stat))  # 0.4707987 0.7724904\n\n# # pca = PCA()\n# # pca.fit(emb_stat)\n# # plt.figure()\n# # plt.plot(np.cumsum(pca.explained_variance_ratio_))\n# # plt.xlabel('Number of Components')\n# # plt.ylabel('Variance (%)')\n# # plt.title('Explained Variance')\n# # plt.show()\n\n# pca = PCA(n_components=100)\n\n# pca.fit(emb_stat)\n\n# model.eval()\n\n# # TRAIN\n# train_pred_dict = {}\n# train_embed_dict = {}\n\n# for i, x_batch in enumerate(tqdm(data_loader_train)):\n#     x_images = x_batch['image_id']\n#     x_batch = x_batch[\"image\"]\n    \n#     x_batch = x_batch.to(device, dtype=torch.float)\n\n#     with torch.no_grad():\n\n#         pred, embed = model(x_batch)\n#         pred = torch.sigmoid(pred)\n\n#         for x, y in zip(x_images, pred):\n#             train_pred_dict[x] = y.detach().cpu().numpy()\n#         for x, y in zip(x_images, embed):\n#             e = y.squeeze().detach().cpu().numpy()\n#             e = np.expand_dims(e, axis=0)\n#             train_embed_dict[x] = pca.transform(e)[0]\n\n# train_embed_df = pd.DataFrame.from_dict(train_embed_dict, orient='index')\n# train_embed_df.to_csv('train_embeds.csv')\n\n# train_pred_df = pd.DataFrame.from_dict(train_pred_dict, orient='index')\n# train_pred_df.to_csv('train_preds.csv')\n\n# # VALID\n# valid_pred_dict = {}\n# valid_embed_dict = {}\n\n# for i, x_batch in enumerate(tqdm(data_loader_valid)):\n#     x_images = x_batch['image_id']\n#     x_batch = x_batch[\"image\"]\n#     x_batch = x_batch.to(device, dtype=torch.float)\n\n#     with torch.no_grad():\n\n#         pred, embed = model(x_batch)\n#         pred = torch.sigmoid(pred)\n\n#         for x, y in zip(x_images, pred):\n#             valid_pred_dict[x] = y.detach().cpu().numpy()\n#         for x, y in zip(x_images, embed):\n#             e = y.squeeze().detach().cpu().numpy()\n#             e = np.expand_dims(e, axis=0)\n#             valid_embed_dict[x] = pca.transform(e)[0]\n\n# valid_embed_df = pd.DataFrame.from_dict(valid_embed_dict, orient='index')\n# valid_embed_df.to_csv('valid_embeds.csv')\n\n# valid_pred_df = pd.DataFrame.from_dict(valid_pred_dict, orient='index')\n# valid_pred_df.to_csv('valid_preds.csv')\n\n# # TEST\n# test_pred_dict = {}\n# test_embed_dict = {}\n\n# for i, x_batch in enumerate(tqdm(data_loader_valid)):\n#     x_images = x_batch['image_id']\n#     x_batch = x_batch[\"image\"]\n#     x_batch = x_batch.to(device, dtype=torch.float)\n\n#     with torch.no_grad():\n\n#         pred, embed = model(x_batch)\n#         pred = torch.sigmoid(pred)\n\n#         for x, y in zip(x_images, pred):\n#             test_pred_dict[x] = y.detach().cpu().numpy()\n#         for x, y in zip(x_images, embed):\n#             e = y.squeeze().detach().cpu().numpy()\n#             e = np.expand_dims(e, axis=0)\n#             test_embed_dict[x] = pca.transform(e)[0]\n\n# test_embed_df = pd.DataFrame.from_dict(test_embed_dict, orient='index')\n# test_embed_df.to_csv('test_embeds.csv')\n\n# test_pred_df = pd.DataFrame.from_dict(test_pred_dict, orient='index')\n# test_pred_df.to_csv('test_preds.csv')\n","metadata":{"execution":{"iopub.status.busy":"2021-11-24T06:37:15.030862Z","iopub.execute_input":"2021-11-24T06:37:15.031141Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport torch\nimport torch.optim as optim\nfrom sklearn.metrics import roc_auc_score, classification_report\nfrom torch.utils.data import Dataset\nfrom tqdm.notebook import tqdm\n# from datasets import PredictionsDataset\n# from models import EmbeddingSmootherModel\n\nCOLS = ['epidural', 'intraparenchymal', 'intraventricular', 'subarachnoid', 'subdural', 'any']\n\nstage_dir = '../input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection/'\nmetadata_csv = './../input/rsnametadataset'\nworking_directory = './../input/outputdata'\n\ntrain = pd.read_csv(os.path.join(stage_dir, 'stage_2_train.csv'))\ntest = pd.read_csv(os.path.join(stage_dir, 'stage_2_sample_submission.csv'))\n\ntest_preds = pd.read_csv(f'{working_directory}/test_preds.csv', index_col=False)\nvalid_preds = pd.read_csv(f'{working_directory}/valid_preds.csv', index_col=False)\ntrain_preds = pd.read_csv(f'{working_directory}/train_preds.csv', index_col=False)\n\ntest_preds.rename(columns={'Unnamed: 0': 'Image'}, inplace=True)\nvalid_preds.rename(columns={'Unnamed: 0': 'Image'}, inplace=True)\ntrain_preds.rename(columns={'Unnamed: 0': 'Image'}, inplace=True)\n\nvalid_embeds = pd.read_csv(f'{working_directory}/valid_embeds.csv', index_col=False)\ntrain_embeds = pd.read_csv(f'{working_directory}/train_embeds.csv', index_col=False)\ntest_embeds = pd.read_csv(f'{working_directory}/test_embeds.csv', index_col=False)\n\nvalid_embeds.rename(columns={'Unnamed: 0': 'Image'}, inplace=True)\ntrain_embeds.rename(columns={'Unnamed: 0': 'Image'}, inplace=True)\ntest_embeds.rename(columns={'Unnamed: 0': 'Image'}, inplace=True)\n\nFEATURES = train_embeds.columns.size - 1\n\ntest_metadata_noidx = pd.read_csv(f'{metadata_csv}/test_metadata_noidx.csv')\ntrain_metadata_noidx = pd.read_csv(f'{metadata_csv}/train_metadata_noidx.csv')\n\ntrain[['ID', 'Image', 'Diagnosis']] = train['ID'].str.split('_', expand=True)\ntrain = train[['Image', 'Diagnosis', 'Label']]\ntrain.drop_duplicates(inplace=True)\ntrain = train.pivot(index='Image', columns='Diagnosis', values='Label').reset_index()\ntrain['Image'] = 'ID_' + train['Image']\n\n# Also prepare the test data\ntest[['ID', 'Image', 'Diagnosis']] = test['ID'].str.split('_', expand=True)\ntest['Image'] = 'ID_' + test['Image']\ntest = test[['Image', 'Label']]\ntest.drop_duplicates(inplace=True)\n\nmerged_train = pd.merge(left=train_preds, right=train_metadata_noidx, how='left', left_on='Image', right_on='ImageId')\nmerged_valid = pd.merge(left=valid_preds, right=train_metadata_noidx, how='left', left_on='Image', right_on='ImageId')\nmerged_test = pd.merge(left=test_preds, right=test_metadata_noidx, how='left', left_on='Image', right_on='ImageId')\n\nmerged_train = pd.merge(left=merged_train, right=train, how='left', left_on='Image', right_on='Image')\nmerged_valid = pd.merge(left=merged_valid, right=train, how='left', left_on='Image', right_on='Image')\nmerged_test = pd.merge(left=merged_test, right=test, how='left', left_on='Image', right_on='Image')\n\nmerged_train = pd.merge(left=merged_train, right=train_embeds, how='left', left_on='Image', right_on='Image')\nmerged_valid = pd.merge(left=merged_valid, right=valid_embeds, how='left', left_on='Image', right_on='Image')\nmerged_test = pd.merge(left=merged_test, right=test_embeds, how='left', left_on='Image', right_on='Image')\n\ntrain_dataset = PredictionsDataset(merged_train, COLS, 100, True, None)\nvalid_dataset = PredictionsDataset(merged_valid, COLS, 100, True, None)\ntest_dataset = PredictionsDataset(merged_test, COLS, 100, False, None)\n\ndata_loader_train = torch.utils.data.DataLoader(train_dataset, batch_size=1, shuffle=True, num_workers=2)\ndata_loader_valid = torch.utils.data.DataLoader(valid_dataset, batch_size=1, shuffle=False, num_workers=2)\ndata_loader_test = torch.utils.data.DataLoader(test_dataset, batch_size=1, shuffle=False, num_workers=2)\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n\nembedding_model = EmbeddingSmootherModel(100, 256)\n\nembedding_model.to(device)\n\ncriterion = torch.nn.BCEWithLogitsLoss()\nplist = [\n    {'params': embedding_model.parameters(), 'lr': 3e-5},\n]\noptimizer = optim.Adam(plist, lr=3e-5)\n\nn_epochs = 5\nfor epoch in range(n_epochs):\n\n    print('Epoch {}/{}'.format(epoch + 1, n_epochs))\n    print('-' * 10)\n\n    embedding_model.train()\n    tr_loss = 0.\n    st_loss = 0.\n\n    auc_preds = []\n    auc_truths = []\n\n    # tk0 = tqdm(data_loader_train, desc=\"Iteration\")\n\n    for step, batch in enumerate(data_loader_train):\n        inputs = batch[\"preds\"]\n        labels = batch[\"labels\"]\n        embeds = batch[\"concats\"]\n        if step == 0:\n            print(embeds.shape)\n\n        inputs = inputs.to(device, dtype=torch.float)\n        labels = labels.to(device, dtype=torch.float)\n        embeds = embeds.to(device, dtype=torch.float)\n\n        outputs = embedding_model(embeds, inputs)\n        loss = criterion(outputs.view(-1, 6), labels.view(-1, 6))\n\n        tr_loss += loss.item()\n        loss.backward()\n\n        optimizer.step()\n        optimizer.zero_grad()\n\n        if step % 1048 == 0:\n            epoch_loss = tr_loss / (step + 1)\n            st_epoch_loss = 0\n            print('Training Loss at {}: {:.4f}\\t{:.4f}'.format(step, epoch_loss, st_epoch_loss))\n\n    epoch_loss = tr_loss / len(data_loader_train)\n    print('Training Loss: {:.4f}'.format(epoch_loss))\n\n    embedding_model.eval()\n    tr_loss = 0.\n    st_loss = 0.\n\n    auc_preds = []\n    auc_truths = []\n    auc_preds_individual = []\n    auc_truths_individual = []\n\n    for step, batch in enumerate(data_loader_valid):\n        inputs = batch[\"preds\"]\n        labels = batch[\"labels\"]\n        embeds = batch[\"concats\"]\n\n        inputs = inputs.to(device, dtype=torch.float)\n        labels = labels.to(device, dtype=torch.float)\n        embeds = embeds.to(device, dtype=torch.float)\n\n        outputs, scan_output = embedding_model(embeds, inputs)\n\n        tr_loss += criterion(outputs.view(-1, 6), labels.view(-1, 6)).item()\n\n        outputs = torch.sigmoid(outputs)\n\n        detached_outputs = outputs.view(-1, 6).detach().cpu().numpy()\n        detached_labels = labels.view(-1, 6).detach().cpu().numpy()\n\n        auc_preds.append(np.max(detached_outputs, axis=0))\n        auc_truths.append(np.max(detached_labels, axis=0))\n\n        for o, l in zip(detached_outputs, detached_labels):\n            auc_preds_individual.append(o)\n            auc_truths_individual.append(l)\n\n    epoch_loss = tr_loss / len(data_loader_valid)\n\n    roc_preds = np.array(auc_preds)\n    roc_truths = np.array(auc_truths)\n\n    roc_preds_individual = np.array(auc_preds_individual)\n    roc_truths_individual = np.array(auc_truths_individual)\n\n    print('Validation Loss: {:.4f}'.format(epoch_loss))\n    print('-----------SCAN-----------')\n    print('-----------ROCAUC-----------')\n    for tp in range(0, 6):\n        print(COLS[tp], roc_auc_score(roc_truths[:, tp], roc_preds[:, tp]), )\n    print('-----------F1/Sens/Spec-----------')\n    for tp in range(0, 6):\n        print(COLS[tp])\n        print(classification_report(roc_truths[:, tp], np.round(roc_preds[:, tp]), digits=4))\n    print('---------------------------------')\n    print('-----------SLICE-----------')\n    print('-----------ROCAUC-----------')\n    for tp in range(0, 6):\n        print(COLS[tp], roc_auc_score(roc_truths_individual[:, tp], roc_preds_individual[:, tp]), )\n    print('-----------F1/Sens/Spec-----------')\n    for tp in range(0, 6):\n        print(COLS[tp])\n        print(classification_report(roc_truths_individual[:, tp], np.round(roc_preds_individual[:, tp]), digits=4))\n    print('---------------------------------')\n\n# Submission\ncols = COLS\nresults = []\n\ntk0 = tqdm(data_loader_test, desc=\"Iteration\")\nembedding_model.eval()\nfor step, batch in enumerate(tk0):\n    seriesId = test_dataset.series[step]\n    images = test_dataset.data[test_dataset.data['SeriesInstanceUID'] == seriesId].sort_values(\n        by=['ImagePositionSpan', 'ImageId']).ImageId.to_numpy()\n    x_batch = batch[\"embeds\"]\n    x_batch_x = batch[\"preds\"]\n    with torch.no_grad():\n        preds = embedding_model(x_batch.to(device, dtype=torch.float), x_batch_x.to(device, dtype=torch.float))\n        preds = torch.sigmoid(preds)\n\n        preds = preds.detach().cpu().numpy()[0]\n        for img, pred in zip(images, preds):\n            res = {\n                'Image': img\n            }\n            for x, y in zip(cols, pred):\n                res[x] = y\n            results.append(res)\n\nsub_df = pd.DataFrame(results)\n\nsubmission = pd.read_csv(os.path.join('stage_2', 'stage_2_sample_submission.csv'))\n\nmelt_df = sub_df.melt(id_vars=['Image'], var_name='Diagnosis', value_name='Label')\nmelt_df['ID'] = melt_df['Image'] + '_' + melt_df['Diagnosis']\nmelt_df = melt_df.drop(['Image', 'Diagnosis'], axis=1)\n\nsub_df = submission.merge(melt_df, on='ID', how='inner', suffixes=('_x', '')).drop('Label_x', axis=1)\nsub_df.to_csv('embedding_sub.csv', index=False)\n\nfirst_df = sub_df.copy()\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}