{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceType":"competition","sourceId":71549,"databundleVersionId":8561470},{"sourceType":"datasetVersion","sourceId":8668300,"datasetId":5194716,"databundleVersionId":8819455},{"sourceType":"datasetVersion","sourceId":8678321,"datasetId":5187110,"databundleVersionId":8829934},{"sourceType":"datasetVersion","sourceId":8611955,"datasetId":5153879,"databundleVersionId":8759544},{"sourceType":"datasetVersion","sourceId":8622676,"datasetId":5161866,"databundleVersionId":8770864},{"sourceType":"datasetVersion","sourceId":8666422,"datasetId":5193305,"databundleVersionId":8817487},{"sourceType":"datasetVersion","sourceId":8616535,"datasetId":5156556,"databundleVersionId":8764366},{"sourceType":"datasetVersion","sourceId":8622489,"datasetId":5161716,"databundleVersionId":8770659}],"dockerImageVersionId":30715,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nfrom torch import nn\nimport torch.optim as optim\nimport torch.nn.functional as F\nfrom torchvision import transforms\nimport pandas as pd\nimport os\nimport pydicom\nfrom torch.utils.data import Dataset, DataLoader, random_split\nfrom PIL import Image\nfrom tqdm import tqdm\nimport pandas.api.types\nimport sklearn.metrics\nimport matplotlib.pylab as plt\nimport numpy as np\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-06-13T10:13:06.024338Z","iopub.execute_input":"2024-06-13T10:13:06.025253Z","iopub.status.idle":"2024-06-13T10:13:06.031590Z","shell.execute_reply.started":"2024-06-13T10:13:06.025217Z","shell.execute_reply":"2024-06-13T10:13:06.030581Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"study_id_list = [3060042925, 1593756893, 1971971972, 1872256708, 3294654272, 2411161648, 450306455, 2732780676, 364930790, 1395246421, 3427409235, 245660566, 4191656587, 224965813, 2508151528, 2427774074, 3369277408, 1636129590, 4266523380, 652905669, 3013617022, 1490244055, 1888632588, 1438760543, 2008315239, 938355286, 2015704745, 2832824115, 2864587679, 3423802304, 3687214038, 975569097, 4169954134, 3110826149, 1546104377, 442693546, 2842534107, 3489738948, 886537006, 618246392, 4262145542, 3340993109, 425970461, 833869440, 1296715983, 109677683, 704573554, 1887375316, 2744048264, 3139274536, 798120215, 3583858507, 3587842489, 270031150, 109454808, 3306525595, 1307961168, 3496208349, 256201877, 1460690973, 2515979951, 1580580328, 3941522676, 961169106, 2026891078, 3260381770, 1009445512, 1879696087, 719421409, 2460381798, 1172644546, 3748910433, 3522926594, 1085426528, 3808402167, 1525303131, 2387323642, 372642770, 1144816961, 2626030939, 3438741348, 2428792562, 2218598325, 722563469, 3856886497, 2587679358, 2607713777, 3544851736, 3882109306, 2504110412, 92407737, 4200324709, 1294500604, 3453722652, 732899790, 526295265, 3148156510, 3464714863, 2020252446, 1237708996, 3876649184, 3930841971, 2370517350, 3128832901, 1778251850, 2445296690, 3867046855, 597752094, 2265301200, 3487958667, 3548637673, 1078357909, 3501721118, 3360871005, 4219508579, 3237383375, 2348702073, 1025265129, 177339056, 806727758, 901299313, 3573227658, 634296400, 1497488178, 2768000694, 3895795003, 140799588, 2732830741, 2589599188, 3559395900, 4172077685, 2015991939, 2293787755, 2809323451, 2782244888, 1336412861, 286903519, 1972541574, 734370379, 1737682527, 215788128, 435244060, 3503499724, 3110593254, 2543001868, 2627142799, 1647658981, 674762852, 2255550102, 938749597, 3324678907, 959820751, 1346363777, 1612489437, 1506063459, 844086813, 691886557, 185510290, 870699023, 3507369254, 4091646786, 683183578, 3495818564, 3048304282, 2881985242, 3889278475, 888069612, 2440553478, 3480975258, 414452265, 1827243377, 1542748721, 2625021354, 972691286, 308645397, 2937573964, 3595591792, 4177419629, 208289456, 680021009, 1998772961, 3697763310, 652321402, 642715533, 3068697362, 480042730, 566404205, 113758629, 3721755136, 2139287338, 3275218656, 2802539097, 4167935162, 2172940318, 1525013622, 3955843496, 4074422985, 241354569, 1291515204, 153831832]\nstudy_id_list = study_id_list[:200]","metadata":{"execution":{"iopub.status.busy":"2024-06-13T10:13:06.055416Z","iopub.execute_input":"2024-06-13T10:13:06.055736Z","iopub.status.idle":"2024-06-13T10:13:06.070173Z","shell.execute_reply.started":"2024-06-13T10:13:06.055698Z","shell.execute_reply":"2024-06-13T10:13:06.069276Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ParticipantVisibleError(Exception):\n    pass\n\ndef get_condition(full_location: str) -> str:\n    # Given an input like spinal_canal_stenosis_l1_l2 extracts 'spinal'\n    for injury_condition in ['spinal', 'foraminal', 'subarticular']:\n        if injury_condition in full_location:\n            return injury_condition\n    raise ValueError(f'condition not found in {full_location}')\n\ndef add_sample_weight(df: pd.DataFrame) -> pd.DataFrame:\n    # Assign weights based on severity levels\n    conditions = ['normal_mild', 'moderate', 'severe']\n    weights = [1, 2, 4]\n    sample_weights = df[conditions].dot(weights)\n    df['sample_weight'] = sample_weights\n    return df\n\ndef score(solution: pd.DataFrame, submission: pd.DataFrame, row_id_column_name: str, any_severe_scalar: float) -> float:\n    target_levels = ['normal_mild', 'moderate', 'severe']\n\n    # Create copies of solution and submission DataFrames\n    solution_copy = solution.copy()\n    submission_copy = submission.copy()\n\n    solution['study_id'] = solution['row_id'].apply(lambda x: x.split('_')[0])\n    solution['location'] = solution['row_id'].apply(lambda x: '_'.join(x.split('_')[1:]))\n    solution['condition'] = solution['row_id'].apply(get_condition)\n\n    solution = add_sample_weight(solution)\n\n    # Remove the column temporarily\n    del solution[row_id_column_name]\n    del submission[row_id_column_name]\n    assert sorted(submission.columns) == sorted(target_levels)\n\n    submission['study_id'] = solution['study_id']\n    submission['location'] = solution['location']\n    submission['condition'] = solution['condition']\n\n    condition_losses = []\n    condition_weights = []\n    for condition in ['spinal', 'foraminal', 'subarticular']:\n        condition_indices = solution.loc[solution['condition'] == condition].index.values\n        condition_loss = sklearn.metrics.log_loss(\n            y_true=solution.loc[condition_indices, target_levels].values,\n            y_pred=submission.loc[condition_indices, target_levels].values,\n            sample_weight=solution.loc[condition_indices, 'sample_weight'].values\n        )\n        condition_losses.append(condition_loss)\n        condition_weights.append(1)\n\n    any_severe_spinal_labels = pd.Series(solution.loc[solution['condition'] == 'spinal'].groupby('study_id')['severe'].max())\n    any_severe_spinal_weights = pd.Series(solution.loc[solution['condition'] == 'spinal'].groupby('study_id')['sample_weight'].max())\n    any_severe_spinal_predictions = pd.Series(submission.loc[submission['condition'] == 'spinal'].groupby('study_id')['severe'].max())\n    any_severe_spinal_loss = sklearn.metrics.log_loss(\n        y_true=any_severe_spinal_labels,\n        y_pred=any_severe_spinal_predictions,\n        sample_weight=any_severe_spinal_weights\n    )\n    condition_losses.append(any_severe_spinal_loss)\n    condition_weights.append(any_severe_scalar)\n\n    # Recover the deleted column\n    solution[row_id_column_name] = solution_copy[row_id_column_name]\n    submission[row_id_column_name] = submission_copy[row_id_column_name]\n\n    return np.average(condition_losses, weights=condition_weights)","metadata":{"execution":{"iopub.status.busy":"2024-06-13T10:13:06.125956Z","iopub.execute_input":"2024-06-13T10:13:06.126309Z","iopub.status.idle":"2024-06-13T10:13:06.145663Z","shell.execute_reply.started":"2024-06-13T10:13:06.126280Z","shell.execute_reply":"2024-06-13T10:13:06.144404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train.csv')\ndf = df.dropna()\n\ndf = pd.get_dummies(df, columns=df.columns[1:])\ndf.set_index('study_id', inplace=True)","metadata":{"execution":{"iopub.status.busy":"2024-06-13T10:13:06.148364Z","iopub.execute_input":"2024-06-13T10:13:06.149102Z","iopub.status.idle":"2024-06-13T10:13:06.202888Z","shell.execute_reply.started":"2024-06-13T10:13:06.149065Z","shell.execute_reply":"2024-06-13T10:13:06.202110Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"diagnoses_list = df.columns","metadata":{"execution":{"iopub.status.busy":"2024-06-13T10:13:06.204607Z","iopub.execute_input":"2024-06-13T10:13:06.205268Z","iopub.status.idle":"2024-06-13T10:13:06.209477Z","shell.execute_reply.started":"2024-06-13T10:13:06.205232Z","shell.execute_reply":"2024-06-13T10:13:06.208567Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"solution_df = pd.DataFrame(columns=['row_id', 'normal_mild', 'moderate', 'severe', 'study_id', 'diagnosis'])   \nfor study_id in os.listdir('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images'):\n    if int(study_id) in study_id_list:\n        for i in range(0, 75, 3):\n            row_id = f\"{study_id}_{diagnoses_list[i]}\"[:-9]  \n            a = df.loc[int(study_id), diagnoses_list[i]]\n            b = df.loc[int(study_id), diagnoses_list[i+1]]\n            c = df.loc[int(study_id), diagnoses_list[i+2]]\n            solution_df.loc[len(solution_df)] = [row_id, int(b), int(a), int(c), study_id, diagnoses_list[i][:-9]]\ndf.reset_index(inplace=True)\nsolution_df","metadata":{"execution":{"iopub.status.busy":"2024-06-13T10:13:06.256133Z","iopub.execute_input":"2024-06-13T10:13:06.256479Z","iopub.status.idle":"2024-06-13T10:13:06.580299Z","shell.execute_reply.started":"2024-06-13T10:13:06.256453Z","shell.execute_reply":"2024-06-13T10:13:06.579196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CustomDataset(Dataset):\n    def __init__(self, images, targets):\n        self.images = images\n        self.targets = targets\n\n    def __len__(self):\n        return len(self.images)\n\n    def __getitem__(self, idx):\n        return self.images[idx], self.targets[idx]\n\ntransform = transforms.Compose([\n    transforms.Resize((128, 128)),  # Resize images to a common size\n    transforms.ToTensor(),  # Convert the images to PyTorch tensors\n    transforms.Normalize(mean=[0.5], std=[0.5])  # Normalize if needed\n])","metadata":{"execution":{"iopub.status.busy":"2024-06-13T10:13:06.582461Z","iopub.execute_input":"2024-06-13T10:13:06.582810Z","iopub.status.idle":"2024-06-13T10:13:06.590414Z","shell.execute_reply.started":"2024-06-13T10:13:06.582782Z","shell.execute_reply":"2024-06-13T10:13:06.589277Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Fast = 0\n\nif Fast:\n    stacked_images = torch.load('/kaggle/input/very-small-train/stacked_images.pt')  # small data\n    stacked_targets = torch.load('/kaggle/input/very-small-train/stacked_targets.pt')  # small data\n    \nelse:\n    stacked_images = torch.load('/kaggle/input/train-data/stacked_images.pt')  # train data\n    stacked_targets = torch.load('/kaggle/input/train-data/stacked_targets.pt')  # train data\n\n# stacked_images = torch.load('/kaggle/input/tensors-128x128/stacked_images.pt')  # fuill data\n# stacked_targets = torch.load('/kaggle/input/tensors-128x128/stacked_targets.pt')  # full data\n\nval_images = torch.load('/kaggle/input/1-data/stacked_images.pt') # val data\nval_targets = torch.load('/kaggle/input/1-data/stacked_targets.pt') # val data\n\nstacked_images.shape, stacked_targets.shape, val_images.shape, val_targets.shape","metadata":{"execution":{"iopub.status.busy":"2024-06-13T10:13:06.592015Z","iopub.execute_input":"2024-06-13T10:13:06.592765Z","iopub.status.idle":"2024-06-13T10:13:07.353216Z","shell.execute_reply.started":"2024-06-13T10:13:06.592708Z","shell.execute_reply":"2024-06-13T10:13:07.352229Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = CustomDataset(stacked_images, stacked_targets)\nval_dataset = CustomDataset(val_images, val_targets)\ntrain_dataloader = DataLoader(train_dataset, batch_size=32, shuffle=True, drop_last=True)\nval_dataloader = DataLoader(val_dataset, batch_size=317, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2024-06-13T10:13:07.354713Z","iopub.execute_input":"2024-06-13T10:13:07.355541Z","iopub.status.idle":"2024-06-13T10:13:07.469612Z","shell.execute_reply.started":"2024-06-13T10:13:07.355498Z","shell.execute_reply":"2024-06-13T10:13:07.468784Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict_series(model, image_path):\n    dicom = pydicom.dcmread(image_path)\n    image = transform(Image.fromarray(dicom.pixel_array.astype(float))).to(device)\n    \n    with torch.no_grad():\n        output = model(image.unsqueeze(0)).squeeze(0)\n        \n    return output#torch.cat([F.softmax(output[i:i+3], dim=0) for i in range(0, len(output), 3)])\n\ndef temperature_scaling(probs, temperature):\n    scaled_probs = np.power(probs, 1/temperature)\n    scaled_probs /= np.sum(scaled_probs, axis=1, keepdims=True)\n    return scaled_probs\n","metadata":{"execution":{"iopub.status.busy":"2024-06-13T10:13:07.471692Z","iopub.execute_input":"2024-06-13T10:13:07.472005Z","iopub.status.idle":"2024-06-13T10:13:07.478500Z","shell.execute_reply.started":"2024-06-13T10:13:07.471979Z","shell.execute_reply":"2024-06-13T10:13:07.477525Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\n# Define the model and move it to the GPU\nclass MultiLabelNN(nn.Module):\n    def __init__(self):\n        super(MultiLabelNN, self).__init__()\n        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)\n        self.bn1 = nn.BatchNorm2d(32)\n        self.conv2 = nn.Conv2d(32, 128, kernel_size=3, padding=1)\n        self.bn2 = nn.BatchNorm2d(128)\n        self.conv3 = nn.Conv2d(128, 512, kernel_size=3, padding=1)\n        self.bn3 = nn.BatchNorm2d(512)\n        self.pool = nn.AvgPool2d(3)\n        self.dropout = nn.Dropout(0.75)\n        self.fc1 = nn.Linear(512 * 8 * 2, 1024)  # Adjusting for the reduced spatial dimensions\n        self.fc2 = nn.Linear(1024, 512)\n        self.fc3 = nn.Linear(512, 75)  # 75 is the number of labels\n\n    def forward(self, x):\n        x = self.pool(F.relu(self.bn1(self.conv1(x))))\n        x = self.pool(F.relu(self.bn2(self.conv2(x))))\n        x = self.pool(F.relu(self.bn3(self.conv3(x))))\n        x = x.view(-1, 512 * 8 * 2)\n        x = F.relu(self.fc1(x))\n        x = self.dropout(x)\n        x = F.relu(self.fc2(x))\n        x = self.fc3(x)\n        return x\n\nmodel = MultiLabelNN().to(device)\n\ncriterion = nn.BCEWithLogitsLoss()\noptimizer = optim.Adam(model.parameters(), lr=0.0001)\nbest_metric = 10000000\nnum_epochs = 25\n\ntrain_losses = []\nval_losses = []\nval_accuracies = []\nval_f1_scores = []\ncompetition_metrics = []\nbest_temp = []\n\nfor epoch in range(num_epochs):\n    model.train()\n    running_loss = 0.0\n    for batch_images, batch_targets in tqdm(train_dataloader, desc=f\"Epoch {epoch+1}/{num_epochs}\", leave=False):\n        batch_images, batch_targets = batch_images.to(device), batch_targets.to(device)\n        optimizer.zero_grad() \n\n        outputs = model(batch_images)\n        loss = criterion(outputs, batch_targets)\n        \n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n    \n    print(f'Epoch {epoch+1}/{num_epochs}, Loss: {running_loss/len(train_dataloader)}')\n    model.eval()  # Set model to evaluation mode\n    with torch.no_grad():\n        submission_df = pd.DataFrame(columns=['row_id', 'normal_mild', 'moderate', 'severe'])\n        test_images_folder = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images'\n        for study_id in os.listdir(test_images_folder):\n            if int(study_id) in study_id_list:\n                tensor_list = []\n                study_id_path = os.path.join(test_images_folder, study_id)\n                for series in os.listdir(study_id_path):\n                    series_path = os.path.join(study_id_path, series)\n                    for image in os.listdir(series_path):\n                        image_path = os.path.join(series_path, image)\n                        tensor_list.append(predict_series(model, image_path)) \n                stacked_tensors = torch.stack(tensor_list)   \n                result = torch.sum(stacked_tensors, dim=0)/stacked_tensors.shape[0]\n                for i in range(0, 75, 3):\n                    softmax_values = torch.sigmoid(torch.tensor([result[i], result[i+1], result[i+2]]))\n                    row_id = f\"{study_id}_{diagnoses_list[i]}\"[:-9]  \n                    submission_df.loc[len(submission_df)] = [row_id, softmax_values[1].item(), softmax_values[0].item(), softmax_values[2].item()]\n        cop_1 = submission_df.copy()\n        cop_2 = solution_df.copy()\n\n        temperatures = 1 + np.arange(20) / 10.0\n        probs_array = cop_1[['normal_mild', 'moderate', 'severe']].values.astype(float)\n\n        best_score = []\n        for temperature in temperatures:\n            scaled_probs = temperature_scaling(probs_array, temperature)\n            temp_df = cop_1.copy()\n            temp_df[['normal_mild', 'moderate', 'severe']] = scaled_probs\n            score_result = score(solution_df, temp_df, 'row_id', 1)\n            best_score.append(score_result)\n            print(score_result, temperature)\n            \n        best_temp.append(1+np.argmin(best_score)*0.1)    \n        competition_metrics.append(min(best_score))\n        \n        \n        val_loss = 0.0\n        all_preds = []\n        all_targets = []\n        \n        with torch.no_grad():\n            for val_images, val_targets in val_dataloader:\n                val_images, val_targets = val_images.to(device), val_targets.to(device)\n                outputs = model(val_images)\n                loss = criterion(outputs, val_targets)\n                val_loss += loss.item()\n\n                preds = torch.sigmoid(outputs) > 0.5\n                all_preds.extend(preds.cpu().numpy())\n                all_targets.extend(val_targets.cpu().numpy())                    \n                \n        val_loss /= len(val_dataloader)\n        train_losses.append(running_loss/len(train_dataloader))\n        val_losses.append(val_loss)\n\n        all_preds = np.array(all_preds, dtype=np.float32)\n        all_targets = np.array(all_targets, dtype=np.float32)\n\n        # Calculate metrics\n        accuracy = (all_preds == all_targets).mean()\n        f1 = f1_score(all_targets, all_preds, average='samples')\n\n        val_accuracies.append(accuracy)\n        val_f1_scores.append(f1)\n        \n        submission_df[['normal_mild', 'moderate', 'severe']] = (\n        submission_df[['normal_mild', 'moderate', 'severe']]\n        .apply(lambda row: (row == row.max()).astype(int), axis=1))\n\n        metrics = {col: {\n            'precision': precision_score(solution_df[col], submission_df[col]),\n            'recall': recall_score(solution_df[col], submission_df[col])\n        } for col in ['normal_mild', 'moderate', 'severe']}\n        \n        print(f'Competition Metric: {max(best_score)}')\n        print(f'Validation Loss: {val_loss}')\n        print(f'Validation Accuracy: {accuracy * 100:.2f}%')\n        print(f'Validation F1 Score: {f1:.4f}')\n        display(metrics)\n        \n        if min(best_score) < best_metric:\n            best_metric = min(best_score)\n            best_epoch = epoch + 1\n            torch.save(model.state_dict(), 'best_model.pt')\n            print(f'Best model saved at epoch {epoch+1} with competition metric: {best_metric}')\nmodel.load_state_dict(torch.load('best_model.pt'))\nprint(f'Loaded best model from epoch {best_epoch} with competition metric: {best_metric}')\nprint(best_temp)","metadata":{"execution":{"iopub.status.busy":"2024-06-13T10:13:07.479940Z","iopub.execute_input":"2024-06-13T10:13:07.480241Z","iopub.status.idle":"2024-06-13T10:15:38.953097Z","shell.execute_reply.started":"2024-06-13T10:13:07.480214Z","shell.execute_reply":"2024-06-13T10:15:38.952162Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12, 6))\n\n# Plot training and validation losses\nplt.subplot(2, 2, 1)\nplt.plot(range(1, num_epochs + 1), train_losses, label='Training Loss')\nplt.plot(range(1, num_epochs + 1), val_losses, label='Validation Loss')\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.title('Training and Validation Loss')\nplt.legend()\n\n# Plot validation accuracy and F1 score\nplt.subplot(2, 2, 2)\nplt.plot(range(1, num_epochs + 1), val_accuracies, label='Validation Accuracy')\nplt.plot(range(1, num_epochs + 1), val_f1_scores, label='Validation F1 Score')\nplt.xlabel('Epochs')\nplt.ylabel('Percentage / Score')\nplt.title('Validation Accuracy and F1 Score')\nplt.legend()\n\n# Plot competition metric\nplt.subplot(2, 2, 3)\nplt.plot(range(1, num_epochs + 1), competition_metrics, label='Competition Metric')\nplt.xlabel('Epochs')\nplt.ylabel('Score')\nplt.title('Competition Metric')\nplt.legend()\n\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-13T10:15:38.965417Z","iopub.execute_input":"2024-06-13T10:15:38.965832Z","iopub.status.idle":"2024-06-13T10:15:39.748299Z","shell.execute_reply.started":"2024-06-13T10:15:38.965797Z","shell.execute_reply":"2024-06-13T10:15:39.747401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model.eval()\n# submission_df = pd.DataFrame(columns=['row_id', 'normal_mild', 'moderate', 'severe'])\n# test_images_folder = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_images'\n# for study_id in os.listdir(test_images_folder):\n#     tensor_list = []\n#     study_id_path = os.path.join(test_images_folder, study_id)\n#     for series in os.listdir(study_id_path):\n#         series_path = os.path.join(study_id_path, series)\n#         for image in os.listdir(series_path):\n#             image_path = os.path.join(series_path, image)\n#             tensor_list.append(predict_series(model, image_path))\n            \n#     stacked_tensors = torch.stack(tensor_list)       \n#     result = torch.sum(stacked_tensors, dim=0)/stacked_tensors.shape[0]\n#     for i in range(0, 75, 3):\n#         softmax_values = F.softmax(torch.tensor([result[i], result[i+1], result[i+2]]), dim=0)\n#         row_id = f\"{study_id}_{diagnoses_list[i]}\"[:-9]  # Assuming diagnoses_list is in the same order as probabilities\n#         submission_df.loc[len(submission_df)] = [row_id, softmax_values[1].item(), softmax_values[0].item(), softmax_values[2].item()] \n        \n# for index, row in submission_df.iterrows():\n#             temperature = 1.4\n#             probs = row[['normal_mild', 'moderate', 'severe']].values.astype(float)\n#             scaled_probs = temperature_scaling(probs, temperature)\n#             submission_df.loc[index, ['normal_mild', 'moderate', 'severe']] = scaled_probs","metadata":{"execution":{"iopub.status.busy":"2024-06-13T10:15:39.749535Z","iopub.execute_input":"2024-06-13T10:15:39.749887Z","iopub.status.idle":"2024-06-13T10:15:42.802079Z","shell.execute_reply.started":"2024-06-13T10:15:39.749854Z","shell.execute_reply":"2024-06-13T10:15:42.800709Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def sort_batches(df, batch_size):\n#     sorted_batches = []\n#     for i in range(0, len(df), batch_size):\n#         batch = df.iloc[i:i + batch_size].sort_values(by='row_id')\n#         sorted_batches.append(batch)\n#     return pd.concat(sorted_batches).reset_index(drop=True)\n\n# # Sort the DataFrame in batches of 25 rows\n# submission_df = sort_batches(submission_df, 25)\n\n# # Display the sorted DataFrame\n# submission_df","metadata":{"execution":{"iopub.status.busy":"2024-06-13T10:15:42.802989Z","iopub.status.idle":"2024-06-13T10:15:42.803454Z","shell.execute_reply.started":"2024-06-13T10:15:42.803221Z","shell.execute_reply":"2024-06-13T10:15:42.803241Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# submission_df.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-06-13T10:15:42.804814Z","iopub.status.idle":"2024-06-13T10:15:42.805274Z","shell.execute_reply.started":"2024-06-13T10:15:42.805033Z","shell.execute_reply":"2024-06-13T10:15:42.805054Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}