{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"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"},"colab":{"machine_shape":"hm","gpuType":"T4"},"accelerator":"GPU","kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":20270,"databundleVersionId":1222630,"sourceType":"competition"},{"sourceId":25383,"databundleVersionId":2684322,"sourceType":"competition"},{"sourceId":9797223,"sourceType":"datasetVersion","datasetId":982170},{"sourceId":80230206,"sourceType":"kernelVersion"},{"sourceId":265822687,"sourceType":"kernelVersion"},{"sourceId":267108963,"sourceType":"kernelVersion"}],"dockerImageVersionId":31090,"isInternetEnabled":true,"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":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-10T18:35:50.218477Z","iopub.execute_input":"2025-10-10T18:35:50.218697Z","iopub.status.idle":"2025-10-10T18:35:50.222339Z","shell.execute_reply.started":"2025-10-10T18:35:50.218680Z","shell.execute_reply":"2025-10-10T18:35:50.221579Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import random\nimport numpy as np\nimport torch\nimport os\n\ndef seed_everything(seed):\n    random.seed(seed)\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.deterministic = False  # Changed for speed\n    torch.backends.cudnn.benchmark = True  # Enable for speed\n    \nseed_everything(42)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-10T18:45:01.068908Z","iopub.status.idle":"2025-10-10T18:45:01.069157Z","shell.execute_reply.started":"2025-10-10T18:45:01.069043Z","shell.execute_reply":"2025-10-10T18:45:01.069055Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch.nn as nn\nfrom tez import Tez, TezConfig\nimport tez\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","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-10T18:45:01.070305Z","iopub.status.idle":"2025-10-10T18:45:01.070653Z","shell.execute_reply.started":"2025-10-10T18:45:01.070471Z","shell.execute_reply":"2025-10-10T18:45:01.070484Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class args:\n    batch_size = 32  # Increased for speed\n    image_size = 224  # Reduced further\n    epochs = 3  # Much fewer epochs\n    fold = 0","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-10T19:03:35.965946Z","iopub.execute_input":"2025-10-10T19:03:35.966246Z","iopub.status.idle":"2025-10-10T19:03:35.970355Z","shell.execute_reply.started":"2025-10-10T19:03:35.966208Z","shell.execute_reply":"2025-10-10T19:03:35.969696Z"}},"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-10T19:03:49.242371Z","iopub.execute_input":"2025-10-10T19:03:49.242666Z","iopub.status.idle":"2025-10-10T19:03:49.248674Z","shell.execute_reply.started":"2025-10-10T19:03:49.242644Z","shell.execute_reply":"2025-10-10T19:03:49.247909Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class CustomModel(nn.Module):\n    def __init__(self):\n        super().__init__()        \n        self.model = timm.create_model(\"resnet34\", pretrained=True, in_chans=3)  # Lighter model\n        \n        n_features = self.model.fc.in_features\n        self.model.fc = nn.Identity()\n        \n        self.dropout = nn.Dropout(0.3)\n        self.out = nn.Linear(n_features + 1, 1)\n        \n        self.step_scheduler_after = \"epoch\"\n\n    def monitor_metrics(self, outputs, targets, loss):\n        valid_binaryloss = loss\n        if str(valid_binaryloss) == 'nan':\n            valid_binaryloss = float('inf')\n        return {\"binaryloss\": valid_binaryloss}\n\n    def optimizer_scheduler(self):\n        opt = torch.optim.AdamW(self.parameters(), lr=3e-4, weight_decay=0.01)  # Higher LR\n        sch = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=args.epochs, eta_min=1e-6)\n        return opt, sch\n\n    def forward(self, image, features, targets=None):\n        x = self.model(image)\n        x = self.dropout(x)\n        x = torch.cat([x, features], dim=1)\n        x = self.out(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, loss)\n            return x, loss, metrics\n        return x, 0, {}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-10T19:03:59.557956Z","iopub.execute_input":"2025-10-10T19:03:59.558678Z","iopub.status.idle":"2025-10-10T19:03:59.565709Z","shell.execute_reply.started":"2025-10-10T19:03:59.558653Z","shell.execute_reply":"2025-10-10T19:03:59.564757Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Minimal augmentations for speed\ntrain_aug = albumentations.Compose(\n    [\n        albumentations.Resize(args.image_size, args.image_size, p=1),  # Direct resize\n        \n        albumentations.HorizontalFlip(p=0.5),\n        albumentations.Rotate(limit=20, p=0.3),  # Reduced\n        \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)\n\nvalid_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-10T19:04:13.205995Z","iopub.execute_input":"2025-10-10T19:04:13.206269Z","iopub.status.idle":"2025-10-10T19:04:13.215976Z","shell.execute_reply.started":"2025-10-10T19:04:13.206249Z","shell.execute_reply":"2025-10-10T19:04:13.215231Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = pd.read_csv(\"/kaggle/input/2023bcs10139-swarnim-kfold-melonama/train_5folds.csv\")\ndf.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-10T18:37:01.374468Z","iopub.execute_input":"2025-10-10T18:37:01.374758Z","iopub.status.idle":"2025-10-10T18:37:01.475678Z","shell.execute_reply.started":"2025-10-10T18:37:01.374738Z","shell.execute_reply":"2025-10-10T18:37:01.474976Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f'Training fold: {args.fold} start')\n\ndf_train = df[df.kfold != args.fold].reset_index(drop=True)\ndf_valid = df[df.kfold == args.fold].reset_index(drop=True)\n\ndense_features = ['age_approx']\n\ntrain_img_paths = [f\"/kaggle/input/siim-isic-melanoma-classification/jpeg/train/{x}.jpg\" for x in df_train[\"image_name\"].values]\nvalid_img_paths = [f\"/kaggle/input/siim-isic-melanoma-classification/jpeg/train/{x}.jpg\" for x in df_valid[\"image_name\"].values]\n\ntrain_dataset = CustomDataset(\n    image_paths=train_img_paths,\n    dense_features=df_train[dense_features].values,\n    targets=df_train.target.values,\n    augmentations=train_aug,\n)\n\nvalid_dataset = CustomDataset(\n    image_paths=valid_img_paths,\n    dense_features=df_valid[dense_features].values,\n    targets=df_valid.target.values,\n    augmentations=valid_aug,\n)\n\nmodel = CustomModel()\nmodel = Tez(model)\n\nconfig = TezConfig(\n    training_batch_size=args.batch_size,\n    validation_batch_size=args.batch_size * 2,\n    epochs=args.epochs,\n    step_scheduler_after=\"epoch\",\n    step_scheduler_metric=\"valid_binaryloss\",\n    fp16=True,\n    val_strategy=\"epoch\",\n)\n\nes = EarlyStopping(\n    monitor=\"valid_binaryloss\",\n    model_path=f\"model_f{args.fold}.bin\",\n    patience=2,\n    mode=\"min\",\n    save_weights_only=True,\n)\n\nmodel.fit(\n    train_dataset,\n    valid_dataset=valid_dataset,\n    callbacks=[es],\n    config=config,\n)\n\nprint(f'Training fold: {args.fold} complete')\nprint(f'Best model saved at: model_f{args.fold}.bin')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-10T19:07:11.757209Z","iopub.execute_input":"2025-10-10T19:07:11.757876Z","iopub.status.idle":"2025-10-10T19:08:29.084324Z","shell.execute_reply.started":"2025-10-10T19:07:11.757852Z","shell.execute_reply":"2025-10-10T19:08:29.082684Z"}},"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},{"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},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}