{"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":127713,"databundleVersionId":15291341,"sourceType":"competition"}],"dockerImageVersionId":31240,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# 1. ALl Imports","metadata":{}},{"cell_type":"code","source":"import os\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 transforms","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-01-13T04:08:28.398135Z","iopub.execute_input":"2026-01-13T04:08:28.398384Z","iopub.status.idle":"2026-01-13T04:08:37.821458Z","shell.execute_reply.started":"2026-01-13T04:08:28.398364Z","shell.execute_reply":"2026-01-13T04:08:37.820574Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 2. Using CUDA","metadata":{}},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(\"Using device:\", device)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-13T04:08:37.822929Z","iopub.execute_input":"2026-01-13T04:08:37.823351Z","iopub.status.idle":"2026-01-13T04:08:37.884986Z","shell.execute_reply.started":"2026-01-13T04:08:37.823331Z","shell.execute_reply":"2026-01-13T04:08:37.883773Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 3. Makig the Dataset","metadata":{}},{"cell_type":"code","source":"class AnimeDataset(Dataset):\n    def __init__(self, csv_file, img_dir, transform=None):\n        self.data = pd.read_csv(csv_file)\n        self.img_dir = img_dir\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n        img_name = self.data.iloc[idx, 0]\n        label = self.data.iloc[idx, 1]\n\n        img_path = os.path.join(self.img_dir, img_name)\n        image = Image.open(img_path).convert(\"RGB\")\n\n        if self.transform:\n            image = self.transform(image)\n\n        return image, torch.tensor(label, dtype=torch.long)\n\ntransform = transforms.Compose([\n    transforms.Resize((128, 128)),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.5, 0.5, 0.5],\n                         std=[0.5, 0.5, 0.5])\n])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-13T04:08:37.885978Z","iopub.execute_input":"2026-01-13T04:08:37.886211Z","iopub.status.idle":"2026-01-13T04:08:38.094466Z","shell.execute_reply.started":"2026-01-13T04:08:37.886192Z","shell.execute_reply":"2026-01-13T04:08:38.093465Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 4. Initailizing Test Dataset","metadata":{}},{"cell_type":"code","source":"train_dataset = AnimeDataset(\n    csv_file=\"/kaggle/input/anime-gender-classification/dataset/train.csv\",\n    img_dir=\"/kaggle/input/anime-gender-classification/dataset/train_images\",\n    transform=transform\n)\n\ntrain_loader = DataLoader(\n    train_dataset,\n    batch_size=32,\n    shuffle=True,\n    num_workers=2\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-13T04:08:38.095360Z","iopub.execute_input":"2026-01-13T04:08:38.095582Z","iopub.status.idle":"2026-01-13T04:08:38.130937Z","shell.execute_reply.started":"2026-01-13T04:08:38.095564Z","shell.execute_reply":"2026-01-13T04:08:38.130347Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 5. Model Architectutre","metadata":{}},{"cell_type":"code","source":"class SimpleCNN(nn.Module):\n    def __init__(self):\n        super().__init__()\n\n        self.features = nn.Sequential(\n            nn.Conv2d(3, 32, 3, padding=1),\n            nn.ReLU(),\n            nn.MaxPool2d(2),\n\n            nn.Conv2d(32, 64, 3, padding=1),\n            nn.ReLU(),\n            nn.MaxPool2d(2),\n\n            nn.Conv2d(64, 128, 3, padding=1),\n            nn.ReLU(),\n            nn.MaxPool2d(2)\n        )\n\n        self.classifier = nn.Sequential(\n            nn.Flatten(),\n            nn.Linear(128 * 16 * 16, 256),\n            nn.ReLU(),\n            nn.Linear(256, 2)   # Binary classification\n        )\n\n    def forward(self, x):\n        x = self.features(x)\n        x = self.classifier(x)\n        return x\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-13T04:08:38.131690Z","iopub.execute_input":"2026-01-13T04:08:38.131892Z","iopub.status.idle":"2026-01-13T04:08:38.137653Z","shell.execute_reply.started":"2026-01-13T04:08:38.131875Z","shell.execute_reply":"2026-01-13T04:08:38.136886Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 6. Initialize MODEL","metadata":{}},{"cell_type":"code","source":"model = SimpleCNN().to(device)\n\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=0.0003)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-13T04:08:38.138569Z","iopub.execute_input":"2026-01-13T04:08:38.138858Z","iopub.status.idle":"2026-01-13T04:08:38.398230Z","shell.execute_reply.started":"2026-01-13T04:08:38.138832Z","shell.execute_reply":"2026-01-13T04:08:38.397368Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 7. Training Loop","metadata":{}},{"cell_type":"code","source":"epochs = 5\n\nfor epoch in range(epochs):\n    model.train()\n    total_loss = 0\n    correct = 0\n    total = 0\n\n    for images, labels in train_loader:\n        images = images.to(device)\n        labels = labels.to(device)\n\n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n\n        loss.backward()\n        optimizer.step()\n\n        total_loss += loss.item()\n        _, predicted = torch.max(outputs, 1)\n        correct += (predicted == labels).sum().item()\n        total += labels.size(0)\n\n    acc = 100 * correct / total\n    print(f\"Epoch [{epoch+1}/{epochs}]  Loss: {total_loss:.4f}  Accuracy: {acc:.2f}%\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-13T04:08:38.400183Z","iopub.execute_input":"2026-01-13T04:08:38.401083Z","iopub.status.idle":"2026-01-13T04:11:12.632521Z","shell.execute_reply.started":"2026-01-13T04:08:38.401033Z","shell.execute_reply":"2026-01-13T04:11:12.631353Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"---","metadata":{}},{"cell_type":"markdown","source":"# 8. Making Training Dataset","metadata":{}},{"cell_type":"code","source":"class TestDataset(Dataset):\n    def __init__(self, img_dir, transform=None):\n        self.img_dir = img_dir\n        self.images = sorted(os.listdir(img_dir))\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.images)\n\n    def __getitem__(self, idx):\n        img_name = self.images[idx]\n        img_path = os.path.join(self.img_dir, img_name)\n        image = Image.open(img_path).convert(\"RGB\")\n\n        if self.transform:\n            image = self.transform(image)\n\n        return image, img_name","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-13T04:12:02.243588Z","iopub.execute_input":"2026-01-13T04:12:02.244447Z","iopub.status.idle":"2026-01-13T04:12:02.266709Z","shell.execute_reply.started":"2026-01-13T04:12:02.244419Z","shell.execute_reply":"2026-01-13T04:12:02.265810Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 9. Transform and Create Data Loader","metadata":{}},{"cell_type":"code","source":"test_dataset = TestDataset(\n    img_dir=\"/kaggle/input/anime-gender-classification/dataset/test_images\",\n    transform=transform\n)\n\ntest_loader = DataLoader(\n    test_dataset,\n    batch_size=32,\n    shuffle=False\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-13T04:12:02.243588Z","iopub.execute_input":"2026-01-13T04:12:02.244447Z","iopub.status.idle":"2026-01-13T04:12:02.266709Z","shell.execute_reply.started":"2026-01-13T04:12:02.244419Z","shell.execute_reply":"2026-01-13T04:12:02.265810Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 10. Evaluate the Model","metadata":{}},{"cell_type":"code","source":"results = []\n\nwith torch.no_grad():\n    for images, img_names in test_loader:\n        images = images.to(device)\n\n        outputs = model(images)\n        _, preds = torch.max(outputs, 1)\n\n        for img_name, pred in zip(img_names, preds):\n            results.append({\n                \"id\": img_name,\n                \"prediction\": int(pred.item())\n            })\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-13T04:12:10.069480Z","iopub.execute_input":"2026-01-13T04:12:10.069773Z","iopub.status.idle":"2026-01-13T04:12:17.088380Z","shell.execute_reply.started":"2026-01-13T04:12:10.069754Z","shell.execute_reply":"2026-01-13T04:12:17.087494Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 11. Submit the CSV","metadata":{}},{"cell_type":"code","source":"submission = pd.DataFrame(results)\nsubmission.to_csv(\"submission.csv\", index=False)\n\nsubmission.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-13T04:12:19.567412Z","iopub.execute_input":"2026-01-13T04:12:19.567730Z","iopub.status.idle":"2026-01-13T04:12:19.600831Z","shell.execute_reply.started":"2026-01-13T04:12:19.567704Z","shell.execute_reply":"2026-01-13T04:12:19.600011Z"}},"outputs":[],"execution_count":null}]}