{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":20270,"databundleVersionId":1222630,"sourceType":"competition"},{"sourceId":9797223,"sourceType":"datasetVersion","datasetId":982170},{"sourceId":261002435,"sourceType":"kernelVersion"},{"sourceId":266394805,"sourceType":"kernelVersion"},{"sourceId":265821012,"sourceType":"kernelVersion"},{"sourceId":574351,"sourceType":"modelInstanceVersion","modelInstanceId":429902,"modelId":446851},{"sourceId":574363,"sourceType":"modelInstanceVersion","modelInstanceId":429911,"modelId":446860},{"sourceId":601654,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":450907,"modelId":467248}],"dockerImageVersionId":31090,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import sys\nfrom sklearn.preprocessing import LabelEncoder,StandardScaler\nsys.path.append(\"../input/tez-lib/\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-10-08T13:16:12.447115Z","iopub.execute_input":"2025-10-08T13:16:12.447451Z","iopub.status.idle":"2025-10-08T13:16:13.571860Z","shell.execute_reply.started":"2025-10-08T13:16:12.447423Z","shell.execute_reply":"2025-10-08T13:16:13.571031Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tez\nfrom tez import Tez, TezConfig\nimport albumentations\nimport pandas as pd\nimport cv2\nimport numpy as np\nimport timm\nimport torch.nn as nn\nfrom sklearn import metrics\nimport torch\nfrom tez.callbacks import EarlyStopping\nfrom tqdm import tqdm\nimport math","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-08T13:16:13.573126Z","iopub.execute_input":"2025-10-08T13:16:13.573524Z","iopub.status.idle":"2025-10-08T13:16:58.762187Z","shell.execute_reply.started":"2025-10-08T13:16:13.573502Z","shell.execute_reply":"2025-10-08T13:16:58.761354Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class args:\n    batch_size = 64#16\n    image_size = 384 #64","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-08T13:16:58.762941Z","iopub.execute_input":"2025-10-08T13:16:58.763155Z","iopub.status.idle":"2025-10-08T13:16:58.766860Z","shell.execute_reply.started":"2025-10-08T13:16:58.763139Z","shell.execute_reply":"2025-10-08T13:16:58.766136Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def sigmoid(x):\n    return 1 / (1 + math.exp(-x))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-08T13:16:58.768345Z","iopub.execute_input":"2025-10-08T13:16:58.768593Z","iopub.status.idle":"2025-10-08T13:16:58.789913Z","shell.execute_reply.started":"2025-10-08T13:16:58.768576Z","shell.execute_reply":"2025-10-08T13:16:58.789128Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class MelanomaDataset:\n    def __init__(self, image_paths, dense_features, targets, augmentations):\n        self.image_paths = image_paths\n        self.dense_features = dense_features\n        self.targets = targets\n        self.augmentations = augmentations\n        \n    def __len__(self):\n        return len(self.image_paths)\n    \n    def __getitem__(self, item):\n        image = cv2.imread(self.image_paths[item])\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        \n        if self.augmentations is not None:\n            augmented = self.augmentations(image=image)\n            image = augmented[\"image\"]\n            \n        image = np.transpose(image, (2, 0, 1)).astype(np.float32)\n        \n        features = self.dense_features[item, :]\n        targets = self.targets[item]\n        \n        return {\n            \"image\": torch.tensor(image, dtype=torch.float),\n            \"features\": torch.tensor(features, dtype=torch.float),\n            \"targets\": torch.tensor(targets, dtype=torch.float),\n        }","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-08T13:16:58.790838Z","iopub.execute_input":"2025-10-08T13:16:58.791121Z","iopub.status.idle":"2025-10-08T13:16:58.805215Z","shell.execute_reply.started":"2025-10-08T13:16:58.791095Z","shell.execute_reply":"2025-10-08T13:16:58.804482Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class MelanomaModel(tez.Model):\n    def __init__(self):\n        super().__init__()        \n        self.model = timm.create_model(\"resnet50\", pretrained=False, in_chans=3)#resnet50#resnet101#eca_nfnet_l1#resnest101e\n\n        \n        self.dropout = nn.Dropout(0.5)# increase dropout\n        self.out = nn.Linear(1000+3, 512)\n        # self.out = nn.Linear(1000, 1)\n        self.out_final = nn.Linear(512, 1)\n        \n        self.step_scheduler_after = \"epoch\"\n\n\n    def monitor_metrics(self, outputs, targets):\n        outputs = torch.sigmoid(outputs).cpu().detach().numpy()\n        targets = targets.cpu().detach().numpy()\n        try:\n            auc = metrics.roc_auc_score(targets, outputs)\n        except ValueError:\n            auc = 0.5\n        return {\"auc\": torch.tensor(auc, dtype=torch.float32)}\n\n    def optimizer_scheduler(self):\n        opt = torch.optim.AdamW(self.parameters(), lr=1e-5, weight_decay=0.01)\n        sch = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(\n            opt, T_0=10, T_mult=1, eta_min=1e-6, last_epoch=-1\n        )\n        return opt,sch\n\n    def forward(self, image, features, targets=None):\n        \n        x = self.model(image)\n        x = self.dropout(x)\n        x = torch.cat([x, features], dim=1)\n        x = self.dropout(x)\n        x = self.out(x)\n        x = self.dropout(x)\n        x = self.out_final(x)\n        \n        if targets is not None:\n            loss = nn.BCEWithLogitsLoss()(x, targets.view(-1, 1).type_as(x))\n            metrics = self.monitor_metrics(x, targets)\n            return x, loss, metrics\n        return x, 0, {}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-08T13:16:58.805928Z","iopub.execute_input":"2025-10-08T13:16:58.806156Z","iopub.status.idle":"2025-10-08T13:16:58.816226Z","shell.execute_reply.started":"2025-10-08T13:16:58.806139Z","shell.execute_reply":"2025-10-08T13:16:58.815492Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_aug = albumentations.Compose(\n    [\n        albumentations.Resize(args.image_size, args.image_size, p=1),\n        albumentations.Normalize(\n            mean=[0.485, 0.456, 0.406],\n            std=[0.229, 0.224, 0.225],\n            max_pixel_value=255.0,\n            p=1.0,\n        ),\n    ],\n    p=1.0,\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-08T13:16:58.816863Z","iopub.execute_input":"2025-10-08T13:16:58.817053Z","iopub.status.idle":"2025-10-08T13:16:58.834763Z","shell.execute_reply.started":"2025-10-08T13:16:58.817027Z","shell.execute_reply":"2025-10-08T13:16:58.833988Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test = pd.read_csv(\"../input/siim-isic-melanoma-classification/test.csv\")\ndf_train = pd.read_csv(\"/kaggle/input/syeda-noorain-23bcs10221-melanoma-fold-creation/train_5folds.csv\") \n\n\ndf_train['age_approx'] = df_train['age_approx'].fillna(df_train['age_approx'].mean())\ndf_test['age_approx'] = df_test['age_approx'].fillna(df_train['age_approx'].mean()) \n\nscaler = StandardScaler()\ndf_train['age_approx'] = scaler.fit_transform(df_train[['age_approx']])\ndf_test['age_approx'] = scaler.transform(df_test[['age_approx']]) ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-08T13:20:57.369550Z","iopub.execute_input":"2025-10-08T13:20:57.369825Z","iopub.status.idle":"2025-10-08T13:20:57.484849Z","shell.execute_reply.started":"2025-10-08T13:20:57.369804Z","shell.execute_reply":"2025-10-08T13:20:57.484329Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"super_final_predictions = []\n\nmodel = MelanomaModel()\nmodel = Tez(model)\n# # model.load(f\"/kaggle/input/training-petfinder-my-pawpularity-contest/model_f{i}.bin\", weights_only=True)\n# model.load(f\"/kaggle/input/melanoma_models/pytorch/default/1/model_f{i}.bin\", weights_only=True)\n# # model.load(f\"/kaggle/input/resnet50v1/pytorch/default/1/model_f{i} (1).bin\", weights_only=True)\n\n\ntest_img_paths = [f\"../input/siim-isic-melanoma-classification/jpeg/test/{x}.jpg\" for x in df_test[\"image_name\"].values]\n\ndense_features = [\n    'sex','age_approx','anatom_site_general_challenge'\n]\n\n\nfor col in ['sex','anatom_site_general_challenge']:\n    le = LabelEncoder()\n    df_test[col] = le.fit_transform(df_test[col].astype(str))\ntest_dataset = MelanomaDataset(\n    image_paths=test_img_paths,\n    dense_features=df_test[dense_features].values.astype(np.float32),\n    targets=np.ones(len(test_img_paths)),\n    augmentations=test_aug,\n)\n# test_predictions = model.predict(test_dataset, batch_size=2*args.batch_size, n_jobs=-1)\n\nfor i in range(2):\n    print(f\"--- Predicting with Fold {i} ---\")\n    \n    # Load the weights for the CURRENT fold\n    model_path = f\"../input/melanoma_models/pytorch/default/1/model_f{i}.bin\"\n    model.load(model_path, weights_only=True)\n    \n    # Run prediction for the CURRENT model\n    # The output is a generator, so we convert it to a list\n    preds_generator = model.predict(test_dataset, batch_size=2*args.batch_size, n_jobs=-1)\n    \n    current_fold_preds = []\n    for batch_preds in tqdm(preds_generator):\n        current_fold_preds.extend(batch_preds.ravel().tolist())\n    \n    super_final_predictions.append(current_fold_preds)\n\n# 3. Average Predictions and Create Submission File (AFTER the loop)\nprint(\"--- Averaging predictions and creating submission file ---\")\n\n# Use np.column_stack to create a (num_samples, num_folds) array, then average across folds\navg_preds = np.mean(np.column_stack(super_final_predictions), axis=1)\n\n# Apply sigmoid to the averaged logits\nfinal_submission_preds = [sigmoid(x) for x in avg_preds]\n\ndf_test[\"target\"] = final_submission_preds\ndf_test = df_test[[\"image_name\", \"target\"]]\ndf_test.to_csv(\"submission.csv\", index=False)\n\nprint(\"Submission file created successfully!\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-08T13:48:58.944392Z","iopub.execute_input":"2025-10-08T13:48:58.944947Z","iopub.status.idle":"2025-10-08T13:49:02.271565Z","shell.execute_reply.started":"2025-10-08T13:48:58.944919Z","shell.execute_reply":"2025-10-08T13:49:02.270385Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-08T13:47:18.458663Z","iopub.execute_input":"2025-10-08T13:47:18.459015Z","iopub.status.idle":"2025-10-08T13:47:18.480713Z","shell.execute_reply.started":"2025-10-08T13:47:18.458982Z","shell.execute_reply":"2025-10-08T13:47:18.480148Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}