{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","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"}],"dockerImageVersionId":30805,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nfrom PIL import Image\n\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import models, transforms\nfrom sklearn.model_selection import train_test_split\n\n# Load the train and test datasets\ntrain_df = pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/train.csv')\ntest_df = pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/test.csv')\n\n# Path to images\ntrain_image_dir = '/kaggle/input/siim-isic-melanoma-classification/jpeg/train/'\ntest_image_dir = '/kaggle/input/siim-isic-melanoma-classification/jpeg/test/'\n\n# Set constants\nIMG_SIZE = 64  # Reduced image size for faster computation\nBATCH_SIZE = 4\nEPOCHS = 1\nDEVICE = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:48:52.191628Z","iopub.execute_input":"2024-12-07T06:48:52.191874Z","iopub.status.idle":"2024-12-07T06:48:58.103419Z","shell.execute_reply.started":"2024-12-07T06:48:52.191847Z","shell.execute_reply":"2024-12-07T06:48:58.102684Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n\n# Data preprocessing\nclass MelanomaDataset(Dataset):\n    def __init__(self, df, image_dir, transform=None, is_train=True):\n        self.df = df\n        self.image_dir = image_dir\n        self.transform = transform\n        self.is_train = is_train\n\n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        image_name = self.df.iloc[idx]['image_name']\n        image_path = os.path.join(self.image_dir, image_name + '.jpg')\n        image = Image.open(image_path).convert(\"RGB\")\n    \n        if self.transform:\n            image = self.transform(image)\n    \n        # Ensure labels are returned for validation\n        label = self.df.iloc[idx]['target'] if 'target' in self.df.columns else None\n        return (image, label) if self.is_train or label is not None else image\n    \n\n# Image transformations\ntrain_transforms = transforms.Compose([\n    # transforms.RandomHorizontalFlip(),\n    # transforms.RandomVerticalFlip(),\n    # transforms.RandomRotation(10),\n    # transforms.ColorJitter(brightness=0.1, contrast=0.1, saturation=0.1, hue=0.1),\n    transforms.Resize((IMG_SIZE, IMG_SIZE)),\n    transforms.ToTensor(),\n    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),\n])\n\ntest_transforms = transforms.Compose([\n    transforms.Resize((IMG_SIZE, IMG_SIZE)),\n    transforms.ToTensor(),\n    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),\n])\n\n# Preprocessing the data\ntrain_df['age_approx'].fillna(train_df['age_approx'].mean(), inplace=True)\ntrain_df['sex'].fillna('unknown', inplace=True)\ntrain_df['anatom_site_general_challenge'].fillna(train_df['anatom_site_general_challenge'].mode()[0], inplace=True)\ntrain_df = pd.get_dummies(train_df, columns=['sex', 'anatom_site_general_challenge'])\n\n# Train-validation split\ntrain_df, val_df = train_test_split(train_df, test_size=0.2, random_state=0)\n\n# Datasets and DataLoaders\ntrain_dataset = MelanomaDataset(train_df, train_image_dir, transform=train_transforms)\nval_dataset = MelanomaDataset(val_df, train_image_dir, transform=test_transforms, is_train=False)\ntest_dataset = MelanomaDataset(test_df, test_image_dir, transform=test_transforms, is_train=False)\n\ntrain_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=2)\nval_loader = DataLoader(val_dataset, batch_size=BATCH_SIZE, shuffle=False, num_workers=2)\ntest_loader = DataLoader(test_dataset, batch_size=BATCH_SIZE, shuffle=False, num_workers=2)\n\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:50:22.396878Z","iopub.execute_input":"2024-12-07T06:50:22.397226Z","iopub.status.idle":"2024-12-07T06:50:22.443761Z","shell.execute_reply.started":"2024-12-07T06:50:22.397196Z","shell.execute_reply":"2024-12-07T06:50:22.442901Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define the model\nclass MelanomaModel(nn.Module):\n    def __init__(self):\n        super(MelanomaModel, self).__init__()\n        self.base_model = models.efficientnet_b3(pretrained=True)\n        self.base_model.classifier = nn.Sequential(\n            nn.Linear(self.base_model.classifier[1].in_features, 128),\n            nn.ReLU(),\n            nn.Dropout(0.5),\n            nn.Linear(128, 1),\n            nn.Sigmoid()\n        )\n\n    def forward(self, x):\n        return self.base_model(x)\n\nmodel = MelanomaModel().to(DEVICE)\n\n# Loss and optimizer\ncriterion = nn.BCELoss()\noptimizer = optim.Adam(model.parameters(), lr=0.0001)\n\n# Training loop\n# def train_model(model, train_loader, val_loader, criterion, optimizer, epochs):\n#     for epoch in range(epochs):\n#         model.train()\n#         train_loss = 0.0\n#         for images, labels in train_loader:\n#             images, labels = images.to(DEVICE), labels.to(DEVICE).float()\n\n#             optimizer.zero_grad()\n#             outputs = model(images).squeeze()\n#             loss = criterion(outputs, labels)\n#             loss.backward()\n#             optimizer.step()\n\n#             train_loss += loss.item()\n\n#         val_loss = 0.0\n#         model.eval()\n#         with torch.no_grad():\n#             for images, labels in val_loader:\n#                 images, labels = images.to(DEVICE), labels.to(DEVICE).float()\n#                 outputs = model(images).squeeze()\n#                 loss = criterion(outputs, labels)\n#                 val_loss += loss.item()\n\n#         print(f\"Epoch {epoch+1}/{epochs}, Train Loss: {train_loss/len(train_loader):.4f}, Val Loss: {val_loss/len(val_loader):.4f}\")\n\ndef train_model(model, train_loader, val_loader, criterion, optimizer, epochs):\n    for epoch in range(epochs):\n        print(f\"\\nStarting epoch {epoch+1}/{epochs}\")\n        model.train()\n        train_loss = 0.0\n        \n        for batch_idx, (images, labels) in enumerate(train_loader):\n            # Debug: Print the batch index and tensor shapes\n            print(f\"\\nBatch {batch_idx+1}/{len(train_loader)}\")\n            # print(f\"Images shape: {images.shape}, Labels shape: {labels.shape}\")\n            \n            images, labels = images.to(DEVICE), labels.to(DEVICE).float()\n\n            # Forward pass\n            optimizer.zero_grad()\n            outputs = model(images).squeeze()\n            # print(f\"Outputs shape: {outputs.shape}, Labels shape: {labels.shape}\")\n\n            # Loss computation\n            loss = criterion(outputs, labels)\n            print(f\"Batch Loss: {loss.item():.4f}\")\n\n            # Backward pass and optimization\n            loss.backward()\n            optimizer.step()\n\n            train_loss += loss.item()\n            # if batch_idx == 2:  # Stop after debugging a few batches\n            #     break\n\n        # Validation loop\n        val_loss = 0.0\n        model.eval()\n        with torch.no_grad():\n            for batch_idx, (images, labels) in enumerate(val_loader):\n                images, labels = images.to(DEVICE), labels.to(DEVICE).float()\n                outputs = model(images).squeeze()\n                loss = criterion(outputs, labels)\n                val_loss += loss.item()\n                # if batch_idx == 2:  # Stop after debugging a few batches\n                #     break\n\n        print(f\"Epoch {epoch+1}/{epochs}, Train Loss: {train_loss/(batch_idx+1):.4f}, Val Loss: {val_loss/(batch_idx+1):.4f}\")\n\n\n# Train the model\n# train_model(model, train_loader, val_loader, criterion, optimizer, EPOCHS)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:49:06.322757Z","iopub.execute_input":"2024-12-07T06:49:06.323092Z","iopub.status.idle":"2024-12-07T06:49:07.165732Z","shell.execute_reply.started":"2024-12-07T06:49:06.323063Z","shell.execute_reply":"2024-12-07T06:49:07.164961Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Debugging: Use a small subset of data\ndebug_sample_size = 100  # Adjust this number as needed\ntrain_subset = torch.utils.data.Subset(train_dataset, list(range(debug_sample_size)))\nval_subset = torch.utils.data.Subset(val_dataset, list(range(debug_sample_size)))\n\n# DataLoaders for debugging\ndebug_train_loader = DataLoader(train_subset, batch_size=BATCH_SIZE, shuffle=True, num_workers=2)\ndebug_val_loader = DataLoader(val_subset, batch_size=BATCH_SIZE, shuffle=False, num_workers=2)\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:50:33.016352Z","iopub.execute_input":"2024-12-07T06:50:33.016717Z","iopub.status.idle":"2024-12-07T06:50:33.022131Z","shell.execute_reply.started":"2024-12-07T06:50:33.016686Z","shell.execute_reply":"2024-12-07T06:50:33.021248Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class SimpleCNN(nn.Module):\n    def __init__(self):\n        super(SimpleCNN, self).__init__()\n        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)\n        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)\n        self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)\n        self.fc1 = nn.Linear(32 * (IMG_SIZE // 4) * (IMG_SIZE // 4), 128)\n        self.fc2 = nn.Linear(128, 1)\n        self.sigmoid = nn.Sigmoid()\n\n    def forward(self, x):\n        x = self.pool(torch.relu(self.conv1(x)))\n        x = self.pool(torch.relu(self.conv2(x)))\n        x = x.view(x.size(0), -1)  # Flatten\n        x = torch.relu(self.fc1(x))\n        x = self.sigmoid(self.fc2(x))\n        return x\n\n# Instantiate the simplified model\ndebug_model = SimpleCNN().to(DEVICE)\n\n# Use the same loss function and optimizer\ncriterion = nn.BCELoss()\noptimizer = optim.Adam(debug_model.parameters(), lr=0.0001)\n\n# Train the simplified model for debugging\ntrain_model(debug_model, train_loader, val_loader, criterion, optimizer, EPOCHS)# Train the model with the smaller dataset\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T06:50:39.890187Z","iopub.execute_input":"2024-12-07T06:50:39.890891Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# train_model(model, train_loader, val_loader, criterion, optimizer, 12)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Save the entire model\ntorch.save(debug_model, \"entire_debug_model.pth\")\n\n# Load the entire model\nloaded_entire_model = torch.load(\"entire_debug_model.pth\")\nloaded_entire_model.eval()\nprint(\"Entire model loaded successfully.\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score\n\ndef evaluate_model(model, test_loader):\n    model.eval()\n    all_labels = []\n    all_preds = []\n\n    with torch.no_grad():\n        for images, labels in test_loader:\n            images = images.to(DEVICE)\n            labels = labels.to(DEVICE).float()\n\n            # Forward pass\n            outputs = model(images).squeeze()\n\n            # Collect predictions and labels\n            preds = (outputs > 0.5).float()  # Convert probabilities to binary predictions\n            all_preds.extend(preds.cpu().numpy())\n            all_labels.extend(labels.cpu().numpy())\n\n    # Convert to numpy arrays\n    all_labels = np.array(all_labels)\n    all_preds = np.array(all_preds)\n\n    # Calculate metrics\n    accuracy = accuracy_score(all_labels, all_preds)\n    precision = precision_score(all_labels, all_preds)\n    recall = recall_score(all_labels, all_preds)\n    f1 = f1_score(all_labels, all_preds)\n    auc = roc_auc_score(all_labels, all_preds)\n\n    print(\"Evaluation Metrics:\")\n    print(f\"Accuracy:  {accuracy:.4f}\")\n    print(f\"Precision: {precision:.4f}\")\n    print(f\"Recall:    {recall:.4f}\")\n    print(f\"F1 Score:  {f1:.4f}\")\n    print(f\"AUC:       {auc:.4f}\")\n\n    return accuracy, precision, recall, f1, auc","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}