{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":14774,"databundleVersionId":875431,"sourceType":"competition"}],"dockerImageVersionId":30787,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torchvision.transforms as transforms\nimport torch.optim as optim\nimport pandas as pd\nfrom PIL import Image\nfrom torch.utils.data import Dataset, DataLoader\nimport os\nimport matplotlib.pyplot as plt\n\n# Custom Dataset Class\nclass CustomImageDataset(Dataset):\n    def __init__(self, image_dir, labels_file, transform=None):\n        self.image_dir = image_dir\n        self.labels_df = pd.read_csv(labels_file)\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.labels_df)\n\n    def __getitem__(self, idx):\n        img_name = os.path.join(self.image_dir, self.labels_df.iloc[idx, 0] + '.png')  # Append .png\n        image = Image.open(img_name).convert(\"RGB\")  # Convert to RGB\n        label = self.labels_df.iloc[idx, 1]  # Assuming second column is label\n\n        if self.transform:\n            image = self.transform(image)\n\n        return image, label\n\n# DataLoader setup\ntrain_image_dir = '/kaggle/input/aptos2019-blindness-detection/train_images'\ntest_image_dir = '/kaggle/input/aptos2019-blindness-detection/test_images'\nlabels_file = '/kaggle/input/aptos2019-blindness-detection/train.csv'\ntransform = transforms.Compose([transforms.Resize((256, 256)), transforms.ToTensor()])\n\ntrain_dataset = CustomImageDataset(train_image_dir, labels_file, transform=transform)\ntrain_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)\n\n# Define your model classes\nclass MyModel(nn.Module):\n    def __init__(self):\n        super(MyModel, self).__init__()\n        self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)\n        self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1)\n        self.fc1 = nn.Linear(32 * 64 * 64, 128)  # Adjust based on your image size\n        self.fc2 = nn.Linear(128, num_classes)    # Set `num_classes` based on your dataset\n\n    def forward(self, x):\n        x = nn.ReLU()(self.conv1(x))\n        x = nn.MaxPool2d(kernel_size=2)(x)\n        x = nn.ReLU()(self.conv2(x))\n        x = nn.MaxPool2d(kernel_size=2)(x)\n        x = x.view(x.size(0), -1)  # Flatten\n        x = nn.ReLU()(self.fc1(x))\n        x = self.fc2(x)\n        return x\n\n# Set the number of classes based on your dataset\nnum_classes = 10  # For example, if you have 10 classes\n\n# Model and optimizer setup\nmodel = MyModel().cuda()  # Move model to GPU if available\noptimizer = optim.Adam(model.parameters(), lr=1e-3)\ncriterion = nn.CrossEntropyLoss()\n\n# Training loop\nnum_epochs = 10  # Set the number of epochs\nfor epoch in range(num_epochs):\n    model.train()\n    running_loss = 0.0\n    for i, (inputs, labels) in enumerate(train_loader):\n        inputs, labels = inputs.cuda(), labels.cuda()\n        \n        # Forward pass\n        outputs = model(inputs)\n        loss = criterion(outputs, labels)\n        \n        # Backward pass and optimization\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        \n        # Track running loss\n        running_loss += loss.item()\n        if i % 100 == 99:\n            print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}], Loss: {running_loss/100:.4f}')\n            running_loss = 0.0\n\nprint(\"Training Complete.\")\n\n# Custom Dataset Class for Test Data (without labels)\nclass CustomTestDataset(Dataset):\n    def __init__(self, image_dir, test_file, transform=None):\n        self.image_dir = image_dir\n        self.test_df = pd.read_csv(test_file)\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.test_df)\n\n    def __getitem__(self, idx):\n        img_name = os.path.join(self.image_dir, self.test_df.iloc[idx, 0] + '.png')  # Append .png\n        image = Image.open(img_name).convert(\"RGB\")  # Convert to RGB\n\n        if self.transform:\n            image = self.transform(image)\n\n        return image, self.test_df.iloc[idx, 0]  # Return image and image ID\n\n# Load Test Data\ntest_file = '/kaggle/input/aptos2019-blindness-detection/test.csv'  # Path to test.csv file (for image IDs)\ntest_dataset = CustomTestDataset(test_image_dir, test_file, transform=transforms.Compose([transforms.Resize((256, 256)), transforms.ToTensor()]))\ntest_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)\n\n# Make predictions on test data\nmodel.eval()  # Set the model to evaluation mode\npredictions = []\nimage_ids = []\n\nwith torch.no_grad():  # Disable gradient calculation for inference\n    for inputs, img_ids in test_loader:\n        inputs = inputs.cuda()  # Move inputs to GPU\n        outputs = model(inputs)  # Get model predictions\n        _, preds = torch.max(outputs, 1)  # Get the index of the max log-probability (predicted class)\n\n        # Collect predictions and image IDs\n        predictions.extend(preds.cpu().numpy())  # Move predictions back to CPU and convert to NumPy\n        image_ids.extend(img_ids)  # Collect image IDs\n\n# Save results to CSV\noutput_df = pd.DataFrame({'id_code': image_ids, 'diagnosis': predictions})\noutput_df.to_csv('submission.csv', index=False)\n\nprint(\"Test predictions saved to submission.csv\")\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-10-05T11:42:33.871810Z","iopub.execute_input":"2024-10-05T11:42:33.872209Z","iopub.status.idle":"2024-10-05T12:56:16.073043Z","shell.execute_reply.started":"2024-10-05T11:42:33.872172Z","shell.execute_reply":"2024-10-05T12:56:16.071974Z"},"trusted":true},"execution_count":null,"outputs":[]}]}