{"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":25383,"databundleVersionId":2684322,"sourceType":"competition"},{"sourceId":9797223,"sourceType":"datasetVersion","datasetId":982170},{"sourceId":261002435,"sourceType":"kernelVersion"},{"sourceId":266660054,"sourceType":"kernelVersion"},{"sourceId":574351,"sourceType":"modelInstanceVersion","modelInstanceId":429902,"modelId":446851},{"sourceId":574363,"sourceType":"modelInstanceVersion","modelInstanceId":429911,"modelId":446860}],"dockerImageVersionId":31090,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import sys\nsys.path.append(\"../input/tez-lib/\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2025-10-09T12:16:13.875242Z","iopub.execute_input":"2025-10-09T12:16:13.875516Z","iopub.status.idle":"2025-10-09T12:16:13.885492Z","shell.execute_reply.started":"2025-10-09T12:16:13.875488Z","shell.execute_reply":"2025-10-09T12:16:13.884190Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# import tez\n# from tez import Tez, TezConfig\n# import albumentations\n# import pandas as pd\n# import cv2\n# import numpy as np\n# import timm\n# import torch.nn as nn\n# from sklearn import metrics\n# import torch\n# from tez.callbacks import EarlyStopping\n# from tqdm import tqdm\n# import math","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T12:16:13.886396Z","iopub.execute_input":"2025-10-09T12:16:13.887223Z","iopub.status.idle":"2025-10-09T12:16:13.901214Z","shell.execute_reply.started":"2025-10-09T12:16:13.887191Z","shell.execute_reply":"2025-10-09T12:16:13.900556Z"}},"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-09T12:16:13.903116Z","iopub.execute_input":"2025-10-09T12:16:13.903967Z","iopub.status.idle":"2025-10-09T12:16:13.914077Z","shell.execute_reply.started":"2025-10-09T12:16:13.903944Z","shell.execute_reply":"2025-10-09T12:16:13.913386Z"}},"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-09T12:16:13.914761Z","iopub.execute_input":"2025-10-09T12:16:13.914963Z","iopub.status.idle":"2025-10-09T12:16:13.926541Z","shell.execute_reply.started":"2025-10-09T12:16:13.914947Z","shell.execute_reply":"2025-10-09T12:16:13.925766Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# class CustomDataset:\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-09T12:16:13.927255Z","iopub.execute_input":"2025-10-09T12:16:13.927639Z","iopub.status.idle":"2025-10-09T12:16:13.939765Z","shell.execute_reply.started":"2025-10-09T12:16:13.927616Z","shell.execute_reply":"2025-10-09T12:16:13.939017Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# # class CustomModel(tez.Model):\n# class CustomModel(nn.Module):\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#         self.dropout = nn.Dropout(0.5)# increase dropout\n#         # self.out = nn.Linear(1280+12, 1)\n#         self.out = nn.Linear(self.model.num_features, 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, loss):\n#         # rmse = torch.sqrt(loss).cpu().detach().numpy()\n#         rmse = loss\n#         if str(rmse) == 'nan':\n#             rmse = float('inf')\n#         # return {\"rmse\": rmse}\n#         return {\"rmse\": rmse}\n\n#     def optimizer_scheduler(self):\n#         opt = torch.optim.AdamW(self.parameters(), lr=2.5e-05, 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.MSELoss()(x, targets.view(-1, 1))\n#             metrics = self.monitor_metrics(x, targets, loss)\n#             return x, loss, metrics\n#         return x, 0, {}\n\n# # CustomModel()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T12:16:13.940484Z","iopub.execute_input":"2025-10-09T12:16:13.940735Z","iopub.status.idle":"2025-10-09T12:16:13.952950Z","shell.execute_reply.started":"2025-10-09T12:16:13.940718Z","shell.execute_reply":"2025-10-09T12:16:13.952242Z"}},"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-09T12:16:13.953645Z","iopub.execute_input":"2025-10-09T12:16:13.954199Z","iopub.status.idle":"2025-10-09T12:16:13.969195Z","shell.execute_reply.started":"2025-10-09T12:16:13.954176Z","shell.execute_reply":"2025-10-09T12:16:13.968432Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# super_final_predictions = []\n# i=0\n# model = CustomModel()\n# model = 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/naresh-kumar-t-23bcs1006-training/model_f0.bin\", weights_only=True)\n# # model.load(f\"/kaggle/input/resnet50v1/pytorch/default/1/model_f{i} (1).bin\", weights_only=True)\n\n# df_test = pd.read_csv(\"/kaggle/input/siim-isic-melanoma-classification/test.csv\")\n# test_img_paths = [f\"/kaggle/input/siim-isic-melanoma-classification/jpeg/test/{x}.jpg\" for x in df_test[\"Id\"].values]\n\n# dense_features = [\n# ]\n\n# test_dataset = CustomDataset(\n#     image_paths=test_img_paths,\n#     dense_features=df_test[dense_features].values,\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\n# final_test_predictions = []\n# for preds in tqdm(test_predictions):\n#     final_test_predictions.extend(preds.ravel().tolist())\n\n# final_test_predictions = [sigmoid(x) * 100 for x in final_test_predictions]\n# super_final_predictions.append(final_test_predictions)\n\n# super_final_predictions = np.mean(np.column_stack(super_final_predictions), axis=1)\n# df_test[\"target\"] = super_final_predictions\n# df_test = df_test[[\"image_name\", \"target\"]]\n# df_test.to_csv(\"submission.csv\", index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T12:16:13.969950Z","iopub.execute_input":"2025-10-09T12:16:13.970490Z","iopub.status.idle":"2025-10-09T12:16:13.982404Z","shell.execute_reply.started":"2025-10-09T12:16:13.970465Z","shell.execute_reply":"2025-10-09T12:16:13.981873Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# df_test.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T12:16:13.984157Z","iopub.execute_input":"2025-10-09T12:16:13.984401Z","iopub.status.idle":"2025-10-09T12:16:14.007765Z","shell.execute_reply.started":"2025-10-09T12:16:13.984384Z","shell.execute_reply":"2025-10-09T12:16:14.007017Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import sys\nsys.path.append(\"../input/tez-lib/\")\nimport 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\nimport torch\nfrom tqdm import tqdm\nimport math\n\nclass args:\n    batch_size = 64\n    image_size = 384 \n\ndef sigmoid(x):\n    return 1 / (1 + math.exp(-x))\n\nclass CustomDataset:\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        # Handle dense features gracefully if empty\n        features = self.dense_features[item, :] if (self.dense_features is not None and self.dense_features.size) else np.zeros((0,), dtype=np.float32)\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        }\n\n# --- CORRECTED MODEL DEFINITION (Subclass of tez.Model) ---\nclass CustomModel(tez.Model): \n    def __init__(self, pos_weight=None):\n        super().__init__()        \n        # FIX: Renamed to self.backbone to match checkpoint keys (e.g., 'backbone.conv1.weight')\n        self.backbone = timm.create_model(\"resnet50\", pretrained=False, in_chans=3, num_classes=0, global_pool=\"avg\")\n        \n        nf = getattr(self.backbone, \"num_features\", 2048)\n        self.dropout = nn.Dropout(0.5)\n        self.out = nn.Linear(nf, 1)\n\n        # FIX: loss_fn attribute must be present to match checkpoint key 'loss_fn.pos_weight'\n        if pos_weight is not None:\n            self.loss_fn = nn.BCEWithLogitsLoss(pos_weight=pos_weight)\n        else:\n            self.loss_fn = nn.BCEWithLogitsLoss() \n\n        self.step_scheduler_after = \"epoch\"\n\n\n    def monitor_metrics(self, outputs, targets, loss):\n        # Using loss as the metric for simplicity in prediction stub\n        rmse = loss\n        if str(rmse) == 'nan': rmse = float('inf')\n        return {\"rmse\": rmse}\n\n    def optimizer_scheduler(self):\n        # Method required by tez.Model\n        opt = torch.optim.AdamW(self.parameters(), lr=2.5e-05, 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        x = self.backbone(image) # FIX: Use self.backbone\n        x = self.dropout(x)\n        x = self.out(x)\n        \n        if targets is not None:\n            loss = self.loss_fn(x.view(-1), targets.view(-1).type_as(x.view(-1))) \n            \n            rmse = loss \n            if str(rmse) == 'nan': rmse = float('inf')\n            metrics = {\"rmse\": rmse}\n            \n            return x, loss, metrics\n        return x, 0, {} \n\ntest_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\nsuper_final_predictions = []\ni=0\n\nmodel_nn = CustomModel(pos_weight=None) \n\nconfig = TezConfig(\n    training_batch_size=args.batch_size, \n    validation_batch_size=2 * args.batch_size, \n    fp16=True, # Assuming FP16 was used in training\n)\nmodel = Tez(model_nn, config=config) \n# ----------------------------------------------------------------------\n\n\nMODEL_PATH = f\"/kaggle/input/naresh-kumar-t-23bcs1006-training/model_f0.bin\"\nprint(f\"Loading weights from {MODEL_PATH} with strict=False...\")\n\nmodel_dict = torch.load(MODEL_PATH, map_location=\"cpu\")\n\nstate_dict_to_load = model_dict.get(\"state_dict\", model_dict)\n\nmodel_nn.load_state_dict(state_dict_to_load, strict=False)\n\nprint(\"Model weights loaded successfully by ignoring unexpected keys!\")\n# ----------------------------------------------------------------------\n\n\ndf_test = pd.read_csv(\"/kaggle/input/siim-isic-melanoma-classification/test.csv\")\n\n# Use 'image_name' if available, otherwise 'Id'\nIMAGE_ID_COL = \"image_name\" if \"image_name\" in df_test.columns else \"Id\" \n\ntest_img_paths = [f\"/kaggle/input/siim-isic-melanoma-classification/jpeg/test/{x}.jpg\" for x in df_test[IMAGE_ID_COL].values]\n\ndense_features = [] \n\ntest_dataset = CustomDataset(\n    image_paths=test_img_paths,\n    dense_features=df_test[dense_features].values if dense_features else np.zeros((len(df_test), 0)),\n    targets=np.ones(len(test_img_paths)),\n    augmentations=test_aug,\n)\n\ntest_predictions = model.predict(test_dataset, batch_size=2*args.batch_size, n_jobs=-1)\n\nfinal_test_predictions = []\nfor preds in tqdm(test_predictions):\n    # Convert logits (raw output) to probabilities (0-1) using sigmoid\n    probs = torch.sigmoid(torch.tensor(preds)).ravel().tolist()\n    final_test_predictions.extend(probs)\n\nsuper_final_predictions.append(final_test_predictions)\nsuper_final_predictions = np.mean(np.column_stack(super_final_predictions), axis=1)\n\ndf_test[\"image_name\"] = df_test[IMAGE_ID_COL]\ndf_test[\"target\"] = super_final_predictions\ndf_test = df_test[[\"image_name\", \"target\"]]\ndf_test.to_csv(\"submission.csv\", index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T12:16:14.008457Z","iopub.execute_input":"2025-10-09T12:16:14.008756Z","iopub.status.idle":"2025-10-09T12:24:27.869892Z","shell.execute_reply.started":"2025-10-09T12:16:14.008734Z","shell.execute_reply":"2025-10-09T12:24:27.869151Z"}},"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}]}