{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":39272,"databundleVersionId":4629629,"sourceType":"competition"},{"sourceId":4619805,"sourceType":"datasetVersion","datasetId":2688675}],"dockerImageVersionId":31041,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport torch\nimport matplotlib.pyplot as plt\nimport pandas as pd\nfrom torch.utils.data import DataLoader, Dataset\nfrom PIL import Image","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-17T08:46:01.919478Z","iopub.execute_input":"2025-05-17T08:46:01.919725Z","iopub.status.idle":"2025-05-17T08:46:06.125214Z","shell.execute_reply.started":"2025-05-17T08:46:01.919701Z","shell.execute_reply":"2025-05-17T08:46:06.124436Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class BreastCancerDataset(Dataset):\n    def __init__(self, image_dir, labels_df, transform=None):\n        self.image_dir = image_dir\n        self.labels_df = labels_df\n        self.transform = transform \n\n    def __len__(self):\n        return len(self.labels_df)\n\n    def __getitem__(self, index): \n        row = self.labels_df.iloc[index]\n        label = row[\"cancer\"]\n        image_name = f\"{row['patient_id']}_{row['image_id']}\"\n        image_path = os.path.join(self.image_dir, f\"{image_name}.png\")\n        \n        image = Image.open(image_path).convert(\"RGB\")\n\n        if self.transform:\n            image = self.transform(image)\n\n        return image, torch.tensor(label, dtype=torch.long)\n        ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-17T08:46:06.126493Z","iopub.execute_input":"2025-05-17T08:46:06.126809Z","iopub.status.idle":"2025-05-17T08:46:06.133432Z","shell.execute_reply.started":"2025-05-17T08:46:06.126791Z","shell.execute_reply":"2025-05-17T08:46:06.132593Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# import matplotlib.pyplot as plt \n# image_dir = \"/kaggle/input/rsna-breast-cancer-512-pngs\"\n# full_df = pd.read_csv(\"/kaggle/input/rsna-breast-cancer-detection/train.csv\")\n# breast = BreastCancerDataset(image_dir, full_df)\n# image, label = breast[0]\n# print(label)\n# plt.imshow(image)\n# plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-17T08:46:06.134409Z","iopub.execute_input":"2025-05-17T08:46:06.134674Z","iopub.status.idle":"2025-05-17T08:46:06.150096Z","shell.execute_reply.started":"2025-05-17T08:46:06.134652Z","shell.execute_reply":"2025-05-17T08:46:06.149416Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torchvision\ndef creating_single_model():\n    model = torchvision.models.convnext_small(weights=torchvision.models.ConvNeXt_Small_Weights.IMAGENET1K_V1)\n    model.classifier[2] = torch.nn.Linear(in_features=768, out_features=2)\n    return model","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-17T08:46:06.150907Z","iopub.execute_input":"2025-05-17T08:46:06.151164Z","iopub.status.idle":"2025-05-17T08:46:09.311389Z","shell.execute_reply.started":"2025-05-17T08:46:06.151143Z","shell.execute_reply":"2025-05-17T08:46:09.310811Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom torch.utils.data import DataLoader\nimport torch.nn.functional as F\nfrom torchvision import transforms\nimport matplotlib.pyplot as plt\nimport os\nfrom tqdm.notebook import tqdm \n\n# Basic training function\ndef train_model(model, train_loader, val_loader, criterion, optimizer, device, num_epochs=10):\n    print('0')\n    train_losses, val_losses = [], []\n    train_accuracies, val_accuracies = [], []\n    \n    model.to(device)\n    print('1')\n    for epoch in range(num_epochs):\n        print(f'epoch:  {epoch+1}')\n        model.train()\n        running_loss = 0.0\n        correct = 0\n        total = 0\n\n        loop = tqdm(train_loader, desc=f\"Epoch {epoch+1}/{num_epochs}\")\n        for images, labels in train_loader:\n            images, labels = images.to(device), labels.to(device)\n            print('updating weights..............')\n            optimizer.zero_grad()\n            # print(\"0\")\n            outputs = model(images)\n            # print(\"1\")\n            loss = criterion(outputs, labels)\n            # print(\"2\")\n            loss.backward()\n            # print(\"3\")\n            optimizer.step()\n            # print(\"4\")\n            running_loss += loss.item() * images.size(0)  #???\n            # print(\"5\")\n            _, predicted = torch.max(outputs, 1)\n            # print(\"6\")\n            total += labels.size(0) # ???\n            # print(\"7\")\n            correct += (predicted == labels).sum().item()\n            # print(\"8\")\n            loop.set_postfix(loss=loss.item(), acc=correct/total)\n\n\n        epoch_loss = running_loss / len(train_loader.dataset)\n        epoch_acc = correct / total\n        train_losses.append(epoch_loss)\n        train_accuracies.append(epoch_acc)\n\n        # Validation\n        model.eval()\n        val_loss = 0.0\n        val_correct = 0\n        val_total = 0\n\n        with torch.no_grad():\n            for images, labels in val_loader:\n                images, labels = images.to(device), labels.to(device)\n                outputs = model(images)\n                loss = criterion(outputs, labels)\n\n                val_loss += loss.item() * images.size(0) #???\n                _, predicted = torch.max(outputs, 1)\n                val_total += labels.size(0) # ???\n                val_correct += (predicted == labels).sum().item()\n\n        val_loss = val_loss / len(val_loader.dataset)\n        val_acc = val_correct / val_total\n        val_losses.append(val_loss)\n        val_accuracies.append(val_acc)\n\n        print(f\"Epoch {epoch+1}/{num_epochs}, \"\n              f\"Train Loss: {epoch_loss:.4f}, Train Acc: {epoch_acc:.4f}, \"\n              f\"Val Loss: {val_loss:.4f}, Val Acc: {val_acc:.4f}\")\n\n    return train_losses, val_losses, train_accuracies, val_accuracies\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-17T08:46:09.313214Z","iopub.execute_input":"2025-05-17T08:46:09.313543Z","iopub.status.idle":"2025-05-17T08:46:09.438722Z","shell.execute_reply.started":"2025-05-17T08:46:09.313523Z","shell.execute_reply":"2025-05-17T08:46:09.438204Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def plot_learning_curves(train_losses, val_losses, train_accs, val_accs):\n    epochs = range(1, len(train_losses)+1)\n\n    plt.figure(figsize=(12, 5))\n\n    # Loss\n    plt.subplot(1, 2, 1)\n    plt.plot(epochs, train_losses, label='Training Loss')\n    plt.plot(epochs, val_losses, label='Validation Loss')\n    plt.xlabel(\"Epoch\")\n    plt.ylabel(\"Loss\")\n    plt.title(\"Loss Curve\")\n    plt.legend()\n\n    # Accuracy\n    plt.subplot(1, 2, 2)\n    plt.plot(epochs, train_accs, label='Training Accuracy')\n    plt.plot(epochs, val_accs, label='Validation Accuracy')\n    plt.xlabel(\"Epoch\")\n    plt.ylabel(\"Accuracy\")\n    plt.title(\"Accuracy Curve\")\n    plt.legend()\n\n    plt.tight_layout()\n    plt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-17T08:46:09.439353Z","iopub.execute_input":"2025-05-17T08:46:09.439607Z","iopub.status.idle":"2025-05-17T08:46:09.444572Z","shell.execute_reply.started":"2025-05-17T08:46:09.43959Z","shell.execute_reply":"2025-05-17T08:46:09.444089Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def evaluate_model(model, test_loader, device):\n    model.eval()\n    model.to(device)\n\n    correct = 0\n    total = 0\n\n    with torch.no_grad():\n        for images, labels in test_loader:\n            images, labels = images.to(device), labels.to(device)\n            outputs = model(images)\n            _, predicted = torch.max(outputs, 1)\n            total += labels.size(0)\n            correct += (predicted == labels).sum().item()\n\n    accuracy = correct / total\n    print(f\"Test Accuracy: {accuracy:.4f}\")\n    return accuracy\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-17T08:46:09.445078Z","iopub.execute_input":"2025-05-17T08:46:09.445262Z","iopub.status.idle":"2025-05-17T08:46:09.456318Z","shell.execute_reply.started":"2025-05-17T08:46:09.445248Z","shell.execute_reply":"2025-05-17T08:46:09.455644Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nimport pandas as pd\nimport torchvision\nfrom torchvision import transforms\n\n# Set up\nimage_dir = \"/kaggle/input/rsna-breast-cancer-512-pngs\"\nfull_df = pd.read_csv(\"/kaggle/input/rsna-breast-cancer-detection/train.csv\")\ntransform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.ToTensor(),\n])\n\ntrain_df, tem_df = train_test_split(full_df, test_size=0.3, stratify=full_df[\"cancer\"], random_state=42)\nval_df, test_df = train_test_split(tem_df, test_size=0.5, stratify=tem_df[\"cancer\"], random_state=42)\n\n# Initialize datasets\ntrain_dataset = BreastCancerDataset(image_dir, train_df, transform)\nval_dataset = BreastCancerDataset(image_dir, val_df, transform)\ntest_dataset = BreastCancerDataset(image_dir, test_df, transform)\n\n# DataLoaders\ntrain_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=2)\nval_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=2)\ntest_loader = DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=2)\n\n# Model, loss, optimizer\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nmodel = creating_single_model()\n# print(\"0\")\ncriterion = torch.nn.CrossEntropyLoss()\n# print(\"1\")\noptimizer = torch.optim.Adam(model.parameters(), lr=1e-4)\n# print(\"2\")\n# Train\ntrain_losses, val_losses, train_accs, val_accs = train_model(\n    model, train_loader, val_loader, criterion, optimizer, device, num_epochs=10\n)\n# print(\"3\")\n# Plot\nplot_learning_curves(train_losses, val_losses, train_accs, val_accs)\n\n# Evaluate\nevaluate_model(model, test_loader, device)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-17T08:46:09.457028Z","iopub.execute_input":"2025-05-17T08:46:09.457284Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}