{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":3649,"databundleVersionId":46718,"sourceType":"competition"}],"dockerImageVersionId":31089,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nprint(os.listdir(\"/kaggle/input/cifar-10-object-recognition-in-images\"))\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:20:19.59223Z","iopub.execute_input":"2025-09-23T11:20:19.592707Z","iopub.status.idle":"2025-09-23T11:20:19.600499Z","shell.execute_reply.started":"2025-09-23T11:20:19.592683Z","shell.execute_reply":"2025-09-23T11:20:19.599691Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nprint(os.listdir(\"/kaggle/input/cifar-10-object-recognition-in-images\"))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:20:23.357242Z","iopub.execute_input":"2025-09-23T11:20:23.357478Z","iopub.status.idle":"2025-09-23T11:20:23.365679Z","shell.execute_reply.started":"2025-09-23T11:20:23.357461Z","shell.execute_reply":"2025-09-23T11:20:23.364713Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nprint(os.listdir(\"/kaggle/input/\"))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:20:26.636908Z","iopub.execute_input":"2025-09-23T11:20:26.637216Z","iopub.status.idle":"2025-09-23T11:20:26.641918Z","shell.execute_reply.started":"2025-09-23T11:20:26.637193Z","shell.execute_reply":"2025-09-23T11:20:26.641305Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(os.listdir(\"/kaggle/input/cifar-10-object-recognition-in-images\"))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:20:29.852851Z","iopub.execute_input":"2025-09-23T11:20:29.853579Z","iopub.status.idle":"2025-09-23T11:20:29.861083Z","shell.execute_reply.started":"2025-09-23T11:20:29.853554Z","shell.execute_reply":"2025-09-23T11:20:29.860161Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(os.listdir('/kaggle/input/cifar-10'))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:20:33.228792Z","iopub.execute_input":"2025-09-23T11:20:33.229074Z","iopub.status.idle":"2025-09-23T11:20:33.233583Z","shell.execute_reply.started":"2025-09-23T11:20:33.229033Z","shell.execute_reply":"2025-09-23T11:20:33.232956Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Step 1: test.7z ko extract karo\n!apt-get -y -qq install libarchive-dev\n!pip install -q libarchive\n\nimport libarchive.public\nimport os\n\nos.makedirs('/kaggle/working/test', exist_ok=True)\n\nwith libarchive.public.file_reader('/kaggle/input/cifar-10/test.7z') as e:\n    for entry in e:\n        for block in entry.get_blocks():\n            out_path = os.path.join('/kaggle/working/test', entry.pathname)\n            os.makedirs(os.path.dirname(out_path), exist_ok=True)\n            with open(out_path, \"ab\") as f:\n                f.write(block)\n\n# Extracted images ab /kaggle/working/test/ me milengi\nprint('Extract done:', len(os.listdir('/kaggle/working/test')))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:20:36.596577Z","iopub.execute_input":"2025-09-23T11:20:36.596835Z","iopub.status.idle":"2025-09-23T11:22:02.470166Z","shell.execute_reply.started":"2025-09-23T11:20:36.596814Z","shell.execute_reply":"2025-09-23T11:22:02.469386Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom torchvision import datasets, transforms\nfrom torch.utils.data import DataLoader, random_split\nfrom PIL import Image\nimport glob\nimport os\n\n# Paths\nTRAIN_DIR = '/kaggle/input/cifar-10/train'\nTEST_DIR  = '/kaggle/working/test'\n\n# Normalization values for CIFAR-10\nCIFAR_MEAN = (0.4914, 0.4822, 0.4465)\nCIFAR_STD  = (0.2470, 0.2435, 0.2616)\n\n# Transforms\ntrain_tfms = transforms.Compose([\n    transforms.RandomHorizontalFlip(),\n    transforms.RandomCrop(32, padding=4),\n    transforms.ToTensor(),\n    transforms.Normalize(CIFAR_MEAN, CIFAR_STD),\n])\ntest_tfms = transforms.Compose([\n    transforms.ToTensor(),\n    transforms.Normalize(CIFAR_MEAN, CIFAR_STD),\n])\n\n# Train dataset\nfull_train = datasets.ImageFolder(TRAIN_DIR, transform=train_tfms)\n# Validation split (5000 for val)\nval_size = 5000\ntrain_size = len(full_train) - val_size\ntrain_ds, val_ds = random_split(full_train, [train_size, val_size], generator=torch.Generator().manual_seed(42))\nval_ds.dataset.transform = test_tfms  # No aug for val\n\n# Dataloaders\nBS = 128\ntrain_dl = DataLoader(train_ds, batch_size=BS, shuffle=True, num_workers=2, pin_memory=True)\nval_dl = DataLoader(val_ds, batch_size=BS, shuffle=False, num_workers=2, pin_memory=True)\n\n# Test dataset (custom loader)\nclass PlainImages(torch.utils.data.Dataset):\n    def __init__(self, folder, transform):\n        self.paths = sorted(glob.glob(os.path.join(folder, \"*.png\")), key=lambda x: int(os.path.basename(x).split('.')[0]))\n        self.transform = transform\n    def __len__(self): return len(self.paths)\n    def __getitem__(self, i):\n        img = Image.open(self.paths[i]).convert(\"RGB\")\n        return self.transform(img), os.path.basename(self.paths[i])\ntest_ds = PlainImages(TEST_DIR, test_tfms)\ntest_dl = DataLoader(test_ds, batch_size=BS, shuffle=False, num_workers=2, pin_memory=True)\n\nprint(\"Train set:\", len(train_ds), \"Val set:\", len(val_ds), \"Test set:\", len(test_ds))\nprint(\"Classes:\", full_train.classes)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:22:02.471516Z","iopub.execute_input":"2025-09-23T11:22:02.471754Z","iopub.status.idle":"2025-09-23T11:22:07.339475Z","shell.execute_reply.started":"2025-09-23T11:22:02.471726Z","shell.execute_reply":"2025-09-23T11:22:07.338532Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# TRAIN folder bhi extract karo (like test)\nimport libarchive.public\nimport os\n\nos.makedirs('/kaggle/working/train', exist_ok=True)\n\nwith libarchive.public.file_reader('/kaggle/input/cifar-10/train.7z') as e:\n    for entry in e:\n        for block in entry.get_blocks():\n            out_path = os.path.join('/kaggle/working/train', entry.pathname)\n            os.makedirs(os.path.dirname(out_path), exist_ok=True)\n            with open(out_path, \"ab\") as f:\n                f.write(block)\n\nprint('Train extract done:', len(os.listdir('/kaggle/working/train')))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:23:05.382581Z","iopub.execute_input":"2025-09-23T11:23:05.3833Z","iopub.status.idle":"2025-09-23T11:23:17.662247Z","shell.execute_reply.started":"2025-09-23T11:23:05.383277Z","shell.execute_reply":"2025-09-23T11:23:17.661466Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom torchvision import datasets, transforms\nfrom torch.utils.data import DataLoader, random_split\nfrom PIL import Image\nimport glob\nimport os\n\n# Yeh dono updated path use karo!\nTRAIN_DIR = '/kaggle/working/train'\nTEST_DIR  = '/kaggle/working/test'\n\nCIFAR_MEAN = (0.4914, 0.4822, 0.4465)\nCIFAR_STD  = (0.2470, 0.2435, 0.2616)\n\ntrain_tfms = transforms.Compose([\n    transforms.RandomHorizontalFlip(),\n    transforms.RandomCrop(32, padding=4),\n    transforms.ToTensor(),\n    transforms.Normalize(CIFAR_MEAN, CIFAR_STD),\n])\ntest_tfms = transforms.Compose([\n    transforms.ToTensor(),\n    transforms.Normalize(CIFAR_MEAN, CIFAR_STD),\n])\n\n# Train dataset\nfull_train = datasets.ImageFolder(TRAIN_DIR, transform=train_tfms)\nval_size = 5000\ntrain_size = len(full_train) - val_size\ntrain_ds, val_ds = random_split(full_train, [train_size, val_size], generator=torch.Generator().manual_seed(42))\nval_ds.dataset.transform = test_tfms  # No aug for val\n\n# Dataloaders\nBS = 128\ntrain_dl = DataLoader(train_ds, batch_size=BS, shuffle=True, num_workers=2, pin_memory=True)\nval_dl = DataLoader(val_ds, batch_size=BS, shuffle=False, num_workers=2, pin_memory=True)\n\n# Test dataset (custom loader)\nclass PlainImages(torch.utils.data.Dataset):\n    def __init__(self, folder, transform):\n        self.paths = sorted(glob.glob(os.path.join(folder, \"*.png\")), key=lambda x: int(os.path.basename(x).split('.')[0]))\n        self.transform = transform\n    def __len__(self): return len(self.paths)\n    def __getitem__(self, i):\n        img = Image.open(self.paths[i]).convert(\"RGB\")\n        return self.transform(img), os.path.basename(self.paths[i])\ntest_ds = PlainImages(TEST_DIR, test_tfms)\ntest_dl = DataLoader(test_ds, batch_size=BS, shuffle=False, num_workers=2, pin_memory=True)\n\nprint(\"Train set:\", len(train_ds), \"Val set:\", len(val_ds), \"Test set:\", len(test_ds))\nprint(\"Classes:\", full_train.classes)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:23:22.206407Z","iopub.execute_input":"2025-09-23T11:23:22.206677Z","iopub.status.idle":"2025-09-23T11:23:22.32804Z","shell.execute_reply.started":"2025-09-23T11:23:22.206657Z","shell.execute_reply":"2025-09-23T11:23:22.327396Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nprint(os.listdir('/kaggle/working/train'))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:23:29.253616Z","iopub.execute_input":"2025-09-23T11:23:29.254363Z","iopub.status.idle":"2025-09-23T11:23:29.258331Z","shell.execute_reply.started":"2025-09-23T11:23:29.254335Z","shell.execute_reply":"2025-09-23T11:23:29.257579Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"TRAIN_DIR = '/kaggle/working/train/train'\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:23:32.998586Z","iopub.execute_input":"2025-09-23T11:23:32.999261Z","iopub.status.idle":"2025-09-23T11:23:33.002083Z","shell.execute_reply.started":"2025-09-23T11:23:32.999239Z","shell.execute_reply":"2025-09-23T11:23:33.001471Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(os.listdir('/kaggle/working/train/train'))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:23:36.11765Z","iopub.execute_input":"2025-09-23T11:23:36.118667Z","iopub.status.idle":"2025-09-23T11:23:36.15972Z","shell.execute_reply.started":"2025-09-23T11:23:36.118639Z","shell.execute_reply":"2025-09-23T11:23:36.158854Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"TRAIN_DIR = '/kaggle/working/train/train'\nTEST_DIR  = '/kaggle/working/test'\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:23:59.853631Z","iopub.execute_input":"2025-09-23T11:23:59.85424Z","iopub.status.idle":"2025-09-23T11:23:59.857333Z","shell.execute_reply.started":"2025-09-23T11:23:59.854216Z","shell.execute_reply":"2025-09-23T11:23:59.856721Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nprint(os.listdir('/kaggle/working/train/train'))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:24:06.053699Z","iopub.execute_input":"2025-09-23T11:24:06.054313Z","iopub.status.idle":"2025-09-23T11:24:06.090241Z","shell.execute_reply.started":"2025-09-23T11:24:06.05429Z","shell.execute_reply":"2025-09-23T11:24:06.089549Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"TRAIN_DIR = '/kaggle/working/train/train'\nTEST_DIR  = '/kaggle/working/test'\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:24:17.270308Z","iopub.execute_input":"2025-09-23T11:24:17.270582Z","iopub.status.idle":"2025-09-23T11:24:17.274228Z","shell.execute_reply.started":"2025-09-23T11:24:17.270563Z","shell.execute_reply":"2025-09-23T11:24:17.273647Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nprint(os.listdir('/kaggle/working/train/train'))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:24:20.325696Z","iopub.execute_input":"2025-09-23T11:24:20.325955Z","iopub.status.idle":"2025-09-23T11:24:20.361866Z","shell.execute_reply.started":"2025-09-23T11:24:20.325935Z","shell.execute_reply":"2025-09-23T11:24:20.361212Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nlabels = pd.read_csv('/kaggle/input/cifar-10/trainLabels.csv')\nprint(labels.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:24:29.446854Z","iopub.execute_input":"2025-09-23T11:24:29.447645Z","iopub.status.idle":"2025-09-23T11:24:29.747209Z","shell.execute_reply.started":"2025-09-23T11:24:29.447617Z","shell.execute_reply":"2025-09-23T11:24:29.746443Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport shutil\nimport pandas as pd\n\ntrain_dir = '/kaggle/working/train/train'\ncsv_file = '/kaggle/input/cifar-10/trainLabels.csv'\n\nlabels = pd.read_csv(csv_file)\nfor _, row in labels.iterrows():\n    fname, label = row['id'] + '.png', row['label']\n    src = os.path.join(train_dir, fname)\n    dst_dir = os.path.join(train_dir, label)\n    os.makedirs(dst_dir, exist_ok=True)\n    dst = os.path.join(dst_dir, fname)\n    if os.path.exists(src):\n        shutil.move(src, dst)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:24:35.326412Z","iopub.execute_input":"2025-09-23T11:24:35.326655Z","iopub.status.idle":"2025-09-23T11:24:35.376872Z","shell.execute_reply.started":"2025-09-23T11:24:35.32664Z","shell.execute_reply":"2025-09-23T11:24:35.375967Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport shutil\nimport pandas as pd\n\ntrain_dir = '/kaggle/working/train/train'\ncsv_file = '/kaggle/input/cifar-10/trainLabels.csv'\n\nlabels = pd.read_csv(csv_file)\nfor _, row in labels.iterrows():\n    fname = str(row['id']) + '.png'\n    label = row['label']\n    src = os.path.join(train_dir, fname)\n    dst_dir = os.path.join(train_dir, label)\n    os.makedirs(dst_dir, exist_ok=True)\n    dst = os.path.join(dst_dir, fname)\n    if os.path.exists(src):\n        shutil.move(src, dst)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:24:41.542468Z","iopub.execute_input":"2025-09-23T11:24:41.542743Z","iopub.status.idle":"2025-09-23T11:24:46.643486Z","shell.execute_reply.started":"2025-09-23T11:24:41.542722Z","shell.execute_reply":"2025-09-23T11:24:46.642924Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(os.listdir('/kaggle/working/train/train'))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:24:53.454687Z","iopub.execute_input":"2025-09-23T11:24:53.455459Z","iopub.status.idle":"2025-09-23T11:24:53.459584Z","shell.execute_reply.started":"2025-09-23T11:24:53.455436Z","shell.execute_reply":"2025-09-23T11:24:53.458742Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom torchvision import datasets, transforms\nfrom torch.utils.data import DataLoader\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:24:58.087691Z","iopub.execute_input":"2025-09-23T11:24:58.088439Z","iopub.status.idle":"2025-09-23T11:24:58.091796Z","shell.execute_reply.started":"2025-09-23T11:24:58.088414Z","shell.execute_reply":"2025-09-23T11:24:58.091129Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_transforms = transforms.Compose([\n    transforms.Resize((32, 32)),\n    transforms.ToTensor(),\n    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))\n])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:25:02.983204Z","iopub.execute_input":"2025-09-23T11:25:02.983479Z","iopub.status.idle":"2025-09-23T11:25:02.987563Z","shell.execute_reply.started":"2025-09-23T11:25:02.983459Z","shell.execute_reply":"2025-09-23T11:25:02.986929Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data = datasets.ImageFolder('/kaggle/working/train/train', transform=train_transforms)\ntrain_loader = DataLoader(train_data, batch_size=64, shuffle=True)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:25:06.485645Z","iopub.execute_input":"2025-09-23T11:25:06.486497Z","iopub.status.idle":"2025-09-23T11:25:06.590294Z","shell.execute_reply.started":"2025-09-23T11:25:06.486472Z","shell.execute_reply":"2025-09-23T11:25:06.589447Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Ek batch print karo\nimages, labels = next(iter(train_loader))\nprint(images.shape, labels.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:25:09.606105Z","iopub.execute_input":"2025-09-23T11:25:09.606392Z","iopub.status.idle":"2025-09-23T11:25:09.694582Z","shell.execute_reply.started":"2025-09-23T11:25:09.606372Z","shell.execute_reply":"2025-09-23T11:25:09.693983Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.utils.data import random_split\n\n# Total train images count\ntrain_len = int(0.8 * len(train_data))   # 80% train\nval_len = len(train_data) - train_len    # 20% val\n\n# Split datasets\ntrain_ds, val_ds = random_split(train_data, [train_len, val_len])\n\n# DataLoader for both\ntrain_loader = DataLoader(train_ds, batch_size=64, shuffle=True)\nval_loader = DataLoader(val_ds, batch_size=64, shuffle=False)\n\n# Test ek batch\nimages, labels = next(iter(val_loader))\nprint(images.shape, labels.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:25:13.038449Z","iopub.execute_input":"2025-09-23T11:25:13.038895Z","iopub.status.idle":"2025-09-23T11:25:13.074509Z","shell.execute_reply.started":"2025-09-23T11:25:13.038871Z","shell.execute_reply":"2025-09-23T11:25:13.073916Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch.nn as nn\nimport torch.nn.functional as F\n\nclass SimpleCNN(nn.Module):\n    def __init__(self):\n        super(SimpleCNN, self).__init__()\n        self.conv1 = nn.Conv2d(3, 32, 3, padding=1)\n        self.conv2 = nn.Conv2d(32, 64, 3, padding=1)\n        self.pool = nn.MaxPool2d(2, 2)\n        self.fc1 = nn.Linear(64 * 8 * 8, 128)\n        self.fc2 = nn.Linear(128, 10)   # 10 classes\n\n    def forward(self, x):\n        x = self.pool(F.relu(self.conv1(x)))\n        x = self.pool(F.relu(self.conv2(x)))\n        x = x.view(-1, 64 * 8 * 8)\n        x = F.relu(self.fc1(x))\n        x = self.fc2(x)\n        return x\n\nmodel = SimpleCNN()\nprint(model)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:25:15.894594Z","iopub.execute_input":"2025-09-23T11:25:15.895172Z","iopub.status.idle":"2025-09-23T11:25:15.907161Z","shell.execute_reply.started":"2025-09-23T11:25:15.895146Z","shell.execute_reply":"2025-09-23T11:25:15.906474Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(\"Device being used:\", device)\n\nmodel = model.to(device)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:25:22.136221Z","iopub.execute_input":"2025-09-23T11:25:22.137025Z","iopub.status.idle":"2025-09-23T11:25:22.407604Z","shell.execute_reply.started":"2025-09-23T11:25:22.136984Z","shell.execute_reply":"2025-09-23T11:25:22.406916Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch.optim as optim\n\ncriterion = torch.nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=0.001)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:25:26.342121Z","iopub.execute_input":"2025-09-23T11:25:26.34278Z","iopub.status.idle":"2025-09-23T11:25:26.346923Z","shell.execute_reply.started":"2025-09-23T11:25:26.342754Z","shell.execute_reply":"2025-09-23T11:25:26.346191Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"num_epochs = 2  # Start with 2 for testing\n\nfor epoch in range(num_epochs):\n    model.train()\n    running_loss = 0.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        loss.backward()\n        optimizer.step()\n        running_loss += loss.item() * images.size(0)\n\n    epoch_loss = running_loss / len(train_loader.dataset)\n    print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {epoch_loss:.4f}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:25:29.798335Z","iopub.execute_input":"2025-09-23T11:25:29.798999Z","iopub.status.idle":"2025-09-23T11:26:07.427915Z","shell.execute_reply.started":"2025-09-23T11:25:29.798976Z","shell.execute_reply":"2025-09-23T11:26:07.427217Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"num_epochs = 2   # Jaise abhi tum kar rahe ho, test ke liye 2 epoch rakh lo\n\nfor epoch in range(num_epochs):\n    model.train()\n    running_loss = 0.0\n\n    for images, labels in train_loader:\n        images = images.to(device)\n        labels = labels.to(device)\n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item() * images.size(0)\n\n    epoch_loss = running_loss / len(train_loader.dataset)\n    print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {epoch_loss:.4f}\")\n\n    # --- Validation loop ---\n    model.eval()\n    correct = 0\n    total = 0\n    with torch.no_grad():\n        for images, labels in val_loader:\n            images = images.to(device)\n            labels = 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    val_acc = 100 * correct / total\n    print(f\"Validation Accuracy: {val_acc:.2f}%\\n\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:26:21.295619Z","iopub.execute_input":"2025-09-23T11:26:21.29592Z","iopub.status.idle":"2025-09-23T11:27:06.487678Z","shell.execute_reply.started":"2025-09-23T11:26:21.295896Z","shell.execute_reply":"2025-09-23T11:27:06.487037Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_losses, val_accuracies = [], []\nfor epoch in range(num_epochs):\n    # ...training loop...\n    train_losses.append(epoch_loss)\n    # ...validation loop...\n    val_accuracies.append(val_acc)\n\n# Plot karo\nimport matplotlib.pyplot as plt\nplt.plot(train_losses, label='Train Loss')\nplt.plot(val_accuracies, label='Val Accuracy')\nplt.legend()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:33:18.025598Z","iopub.execute_input":"2025-09-23T11:33:18.025908Z","iopub.status.idle":"2025-09-23T11:33:18.229976Z","shell.execute_reply.started":"2025-09-23T11:33:18.025886Z","shell.execute_reply":"2025-09-23T11:33:18.229427Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"num_epochs = 20  # Ya 30 ya 40 bhi kar saktay ho, jitna time ho\n\ntrain_losses = []\nval_accuracies = []\n\nfor epoch in range(num_epochs):\n    model.train()\n    running_loss = 0.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        loss.backward()\n        optimizer.step()\n        running_loss += loss.item() * images.size(0)\n        \n    epoch_loss = running_loss / len(train_loader.dataset)\n    train_losses.append(epoch_loss)\n    print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {epoch_loss:.4f}\")\n\n    # --- Validation loop ---\n    model.eval()\n    correct = 0\n    total = 0\n    with torch.no_grad():\n        for images, labels in val_loader:\n            images = images.to(device)\n            labels = 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        val_acc = 100 * correct / total\n        val_accuracies.append(val_acc)\n        print(f\"Validation Accuracy: {val_acc:.2f}%\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:45:52.037769Z","iopub.execute_input":"2025-09-23T11:45:52.038114Z","iopub.status.idle":"2025-09-23T11:53:15.176916Z","shell.execute_reply.started":"2025-09-23T11:45:52.038086Z","shell.execute_reply":"2025-09-23T11:53:15.176117Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nplt.plot(train_losses, label='Train Loss')\nplt.plot(val_accuracies, label='Val Accuracy')\nplt.legend()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T11:55:17.037306Z","iopub.execute_input":"2025-09-23T11:55:17.037928Z","iopub.status.idle":"2025-09-23T11:55:17.179536Z","shell.execute_reply.started":"2025-09-23T11:55:17.037903Z","shell.execute_reply":"2025-09-23T11:55:17.178974Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pandas as pd\nfrom torchvision import transforms\nfrom PIL import Image\n\nTEST_DIR = '/kaggle/working/test'\ntest_images = sorted(os.listdir(TEST_DIR), key=lambda x: int(x.split('.')[0]))\n\ntest_transform = transforms.Compose([\n    transforms.Resize((32, 32)),\n    transforms.ToTensor(),\n    transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5)),\n])\n\nmodel.eval()\nresults = []\nwith torch.no_grad():\n    for fname in test_images:\n        img_path = os.path.join(TEST_DIR, fname)\n        img = Image.open(img_path).convert('RGB')\n        img = test_transform(img).unsqueeze(0).to(device)\n        output = model(img)\n        _, pred = torch.max(output, 1)\n        results.append(pred.item())\n\nsubmission = pd.DataFrame({\n    'id': [int(x.split('.')[0]) for x in test_images],\n    'label': results\n})\n\nsubmission = submission.sort_values('id')\nsubmission.to_csv('submission.csv', index=False)\nprint(\"submission.csv bana di!\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T12:03:23.533775Z","iopub.execute_input":"2025-09-23T12:03:23.534152Z","iopub.status.idle":"2025-09-23T12:03:23.556887Z","shell.execute_reply.started":"2025-09-23T12:03:23.534128Z","shell.execute_reply":"2025-09-23T12:03:23.555857Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pandas as pd\nfrom torchvision import transforms\nfrom PIL import Image\nimport torch\n\nTEST_DIR = '/kaggle/working/test'   # Make sure this is your test images folder\nmodel.eval()\n\n# Sirf .png files lo, aur name (number) ki sorting karo\ntest_images = sorted(\n    [f for f in os.listdir(TEST_DIR) if f.endswith('.png')],\n    key=lambda x: int(x.split('.')[0])\n)\n\n# Same transforms as train/val (size, tensor, normalize)\ntest_transform = transforms.Compose([\n    transforms.Resize((32, 32)),\n    transforms.ToTensor(),\n    transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5)),\n])\n\nresults = []\n\nwith torch.no_grad():\n    for fname in test_images:\n        img_path = os.path.join(TEST_DIR, fname)\n        img = Image.open(img_path).convert('RGB')\n        img = test_transform(img).unsqueeze(0).to(model.fc2.weight.device)  # send to same device as model\n        output = model(img)\n        pred = torch.argmax(output, 1)\n        results.append(pred.item())\n\n# submission.csv banana\nsubmission = pd.DataFrame({\n    'id': [int(f.split('.')[0]) for f in test_images],\n    'label': results\n})\n\nsubmission = submission.sort_values('id')\nsubmission.to_csv('submission.csv', index=False)\nprint(\"submission.csv ban gaya!\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T12:06:49.84664Z","iopub.execute_input":"2025-09-23T12:06:49.847393Z","iopub.status.idle":"2025-09-23T12:06:49.863352Z","shell.execute_reply.started":"2025-09-23T12:06:49.847368Z","shell.execute_reply":"2025-09-23T12:06:49.862722Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"id,label\n0,6\n1,4\n2,0\n3,1\n4,1\n...\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T12:26:28.10175Z","iopub.execute_input":"2025-09-23T12:26:28.102491Z","iopub.status.idle":"2025-09-23T12:26:28.10703Z","shell.execute_reply.started":"2025-09-23T12:26:28.102465Z","shell.execute_reply":"2025-09-23T12:26:28.106505Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(submission.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T12:28:32.62387Z","iopub.execute_input":"2025-09-23T12:28:32.624447Z","iopub.status.idle":"2025-09-23T12:28:32.629519Z","shell.execute_reply.started":"2025-09-23T12:28:32.624422Z","shell.execute_reply":"2025-09-23T12:28:32.628786Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\ndf = pd.read_csv('/kaggle/working/submission.csv')\nprint(df.head())\nprint(df.shape)   # kitni rows/columns hain\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T12:31:57.140602Z","iopub.execute_input":"2025-09-23T12:31:57.140875Z","iopub.status.idle":"2025-09-23T12:31:57.147808Z","shell.execute_reply.started":"2025-09-23T12:31:57.140856Z","shell.execute_reply":"2025-09-23T12:31:57.147087Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(test_images[:10])\nprint(len(test_images))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T12:35:06.210969Z","iopub.execute_input":"2025-09-23T12:35:06.211515Z","iopub.status.idle":"2025-09-23T12:35:06.215706Z","shell.execute_reply.started":"2025-09-23T12:35:06.211493Z","shell.execute_reply":"2025-09-23T12:35:06.21517Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"TEST_DIR = '/kaggle/working/test'\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T12:36:35.511591Z","iopub.execute_input":"2025-09-23T12:36:35.512158Z","iopub.status.idle":"2025-09-23T12:36:35.515447Z","shell.execute_reply.started":"2025-09-23T12:36:35.512135Z","shell.execute_reply":"2025-09-23T12:36:35.514746Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nprint(os.listdir('/kaggle/working/'))    # Yeh folder dekho pehle\nprint(os.listdir('/kaggle/working/test')) # Phir test folder ke andar kya hai\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T12:36:59.920888Z","iopub.execute_input":"2025-09-23T12:36:59.921241Z","iopub.status.idle":"2025-09-23T12:36:59.925779Z","shell.execute_reply.started":"2025-09-23T12:36:59.921218Z","shell.execute_reply":"2025-09-23T12:36:59.925116Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!apt install libarchive-dev\n!pip install libarchive\n\nimport libarchive.public\n\ncnt = 0\nfor entry in libarchive.public.file_pour('./test.7z'):\n    cnt += 1\n    if cnt % 1000 == 0:\n        print(cnt)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T12:38:55.82622Z","iopub.execute_input":"2025-09-23T12:38:55.826465Z","iopub.status.idle":"2025-09-23T12:39:01.058844Z","shell.execute_reply.started":"2025-09-23T12:38:55.82645Z","shell.execute_reply":"2025-09-23T12:39:01.057745Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nprint(os.listdir('/kaggle/working/'))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T12:40:39.331081Z","iopub.execute_input":"2025-09-23T12:40:39.33138Z","iopub.status.idle":"2025-09-23T12:40:39.336204Z","shell.execute_reply.started":"2025-09-23T12:40:39.331357Z","shell.execute_reply":"2025-09-23T12:40:39.335448Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nprint(os.listdir('/kaggle/working/'))\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T12:42:21.314Z","iopub.execute_input":"2025-09-23T12:42:21.314347Z","iopub.status.idle":"2025-09-23T12:42:21.319227Z","shell.execute_reply.started":"2025-09-23T12:42:21.314322Z","shell.execute_reply":"2025-09-23T12:42:21.318574Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(os.listdir('/kaggle/working/test')[:10])      # Pehle 10 files (images) dikhao\nprint(len(os.listdir('/kaggle/working/test')))      # Total count dikhao\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T12:43:20.379028Z","iopub.execute_input":"2025-09-23T12:43:20.379607Z","iopub.status.idle":"2025-09-23T12:43:20.383929Z","shell.execute_reply.started":"2025-09-23T12:43:20.379587Z","shell.execute_reply":"2025-09-23T12:43:20.383348Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(os.listdir('/kaggle/working/test/test')[:10])      # Pehli 10 files dikhao\nprint(len(os.listdir('/kaggle/working/test/test')))      # Total count dikhao\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T12:45:03.665969Z","iopub.execute_input":"2025-09-23T12:45:03.666283Z","iopub.status.idle":"2025-09-23T12:45:03.96342Z","shell.execute_reply.started":"2025-09-23T12:45:03.666258Z","shell.execute_reply":"2025-09-23T12:45:03.962795Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pandas as pd\nfrom torchvision import transforms\nfrom PIL import Image\nimport torch\n\nTEST_DIR = '/kaggle/working/test/test'      # Ye sahi path hai\n\n# Test images ko sort karo (number-wise)\ntest_images = sorted(\n    [f for f in os.listdir(TEST_DIR) if f.endswith('.png')],\n    key=lambda x: int(x.split('.')[0])\n)\n\n# Same transforms as used in train/val\ntest_transform = transforms.Compose([\n    transforms.Resize((32, 32)),\n    transforms.ToTensor(),\n    transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5)),\n])\n\nmodel.eval()\nresults = []\n\nwith torch.no_grad():\n    for fname in test_images:\n        img_path = os.path.join(TEST_DIR, fname)\n        img = Image.open(img_path).convert('RGB')\n        img = test_transform(img).unsqueeze(0).to(next(model.parameters()).device)\n        output = model(img)\n        pred = torch.argmax(output, 1)\n        results.append(pred.item())\n\nsubmission = pd.DataFrame({\n    'id': [int(f.split('.')[0]) for f in test_images],\n    'label': results,\n})\nsubmission = submission.sort_values('id')\nsubmission.to_csv('submission.csv', index=False)\nprint(\"submission.csv ban gaya! Total:\", len(submission))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T12:46:24.013628Z","iopub.execute_input":"2025-09-23T12:46:24.013872Z","iopub.status.idle":"2025-09-23T12:51:06.526689Z","shell.execute_reply.started":"2025-09-23T12:46:24.013855Z","shell.execute_reply":"2025-09-23T12:51:06.525833Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\ndf = pd.read_csv('/kaggle/working/submission.csv')\nprint(df.head())\nprint(df.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T12:52:44.862842Z","iopub.execute_input":"2025-09-23T12:52:44.863472Z","iopub.status.idle":"2025-09-23T12:52:44.913328Z","shell.execute_reply.started":"2025-09-23T12:52:44.863449Z","shell.execute_reply":"2025-09-23T12:52:44.912664Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\n# Apni banai hui submission.csv ko read karo\ndf = pd.read_csv('/kaggle/working/submission.csv')\n\n# Mapping: 0->airplane, 1->automobile, ..., 9->truck\nidx_to_class = [\n    'airplane', 'automobile', 'bird', 'cat', 'deer',\n    'dog', 'frog', 'horse', 'ship', 'truck'\n]\n\n# Map kar do numbers ko names pe\ndf['label'] = df['label'].map(lambda x: idx_to_class[int(x)])\n\n# Nayi file banao jise submit karna hai\ndf.to_csv('/kaggle/working/submission_fixed.csv', index=False)\n\n# Check karo pehli 5 rows\nprint(df.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T13:05:38.485818Z","iopub.execute_input":"2025-09-23T13:05:38.486183Z","iopub.status.idle":"2025-09-23T13:05:38.822098Z","shell.execute_reply.started":"2025-09-23T13:05:38.486159Z","shell.execute_reply":"2025-09-23T13:05:38.821273Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# STEP 1: Data Augmentation, Normalization, DataLoader setup\n\nimport torch\nfrom torchvision import datasets, transforms\nfrom torch.utils.data import DataLoader\n\n# 1. Data Augmentation + Normalization\ntrain_transform = transforms.Compose([\n    transforms.RandomCrop(32, padding=4),        # 4-pixel padding, then random crop to 32x32\n    transforms.RandomHorizontalFlip(),           # Random horizontal flip\n    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),  # Random color\n    transforms.ToTensor(),\n    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),   # Normalize 0.5 mean/std\n])\n\nval_transform = transforms.Compose([\n    transforms.ToTensor(),\n    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),\n])\n\n# 2. Dataset load (CIFAR10 example, apna custom ho to, usme transforms replace karo)\ntrain_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=train_transform)\nval_dataset   = datasets.CIFAR10(root='./data', train=False, download=True, transform=val_transform)\n\n# 3. DataLoader (Batch size 64/128, jitni GPU RAM allow kare)\ntrain_loader = DataLoader(train_dataset, batch_size=128, shuffle=True, num_workers=2)\nval_loader   = DataLoader(val_dataset, batch_size=128, shuffle=False, num_workers=2)\n\n# 4. Check ek batch (optional)\nimages, labels = next(iter(train_loader))\nprint(f\"Batch images shape: {images.shape}, Batch labels shape: {labels.shape}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T13:25:38.227332Z","iopub.execute_input":"2025-09-23T13:25:38.228182Z","iopub.status.idle":"2025-09-23T13:25:43.927946Z","shell.execute_reply.started":"2025-09-23T13:25:38.228154Z","shell.execute_reply":"2025-09-23T13:25:43.927024Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch.nn as nn\n\n# Baseline CNN with improvements\nclass ImprovedCNN(nn.Module):\n    def __init__(self, num_classes=10):\n        super(ImprovedCNN, self).__init__()\n        self.features = nn.Sequential(\n            nn.Conv2d(3, 64, kernel_size=3, padding=1),\n            nn.BatchNorm2d(64),\n            nn.ReLU(inplace=True),\n            nn.Conv2d(64, 64, kernel_size=3, padding=1),\n            nn.BatchNorm2d(64),\n            nn.ReLU(inplace=True),\n            nn.MaxPool2d(2, 2),          # Output: 64 x 16 x 16\n\n            nn.Conv2d(64, 128, kernel_size=3, padding=1),\n            nn.BatchNorm2d(128),\n            nn.ReLU(inplace=True),\n            nn.Conv2d(128, 128, kernel_size=3, padding=1),\n            nn.BatchNorm2d(128),\n            nn.ReLU(inplace=True),\n            nn.MaxPool2d(2, 2),          # Output: 128 x 8 x 8\n\n            nn.Conv2d(128, 256, kernel_size=3, padding=1),\n            nn.BatchNorm2d(256),\n            nn.ReLU(inplace=True),\n            nn.MaxPool2d(2, 2),          # Output: 256 x 4 x 4\n        )\n        self.classifier = nn.Sequential(\n            nn.Dropout(0.5),\n            nn.Linear(256*4*4, 512),\n            nn.ReLU(inplace=True),\n            nn.Dropout(0.5),\n            nn.Linear(512, num_classes)\n        )\n\n    def forward(self, x):\n        x = self.features(x)\n        x = x.view(x.size(0), -1)\n        x = self.classifier(x)\n        return x\n\n# Instantiate model\nmodel = ImprovedCNN(num_classes=10)\nprint(model)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T13:29:33.867076Z","iopub.execute_input":"2025-09-23T13:29:33.868005Z","iopub.status.idle":"2025-09-23T13:29:33.90185Z","shell.execute_reply.started":"2025-09-23T13:29:33.867959Z","shell.execute_reply":"2025-09-23T13:29:33.901115Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch.optim as optim\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nmodel = model.to(device)\n\n# Loss function\ncriterion = nn.CrossEntropyLoss()\n\n# Optimizer (AdamW recommended)\noptimizer = optim.AdamW(model.parameters(), lr=0.001, weight_decay=1e-4)\n\n# Learning Rate Scheduler (Cosine Annealing)\nscheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=20)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T13:34:54.824738Z","iopub.execute_input":"2025-09-23T13:34:54.825497Z","iopub.status.idle":"2025-09-23T13:34:54.835932Z","shell.execute_reply.started":"2025-09-23T13:34:54.82547Z","shell.execute_reply":"2025-09-23T13:34:54.835192Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tqdm import tqdm\nimport numpy as np\n\nnum_epochs = 25   # Try 20–30 for best results\n\nbest_val_acc = 0.0\n\nfor epoch in range(num_epochs):\n    model.train()\n    train_loss, correct, total = 0.0, 0, 0\n\n    loop = tqdm(train_loader, desc=f\"Epoch [{epoch+1}/{num_epochs}]\", leave=False)\n    for images, labels in loop:\n        images, labels = images.to(device), labels.to(device)\n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n\n        train_loss += loss.item() * images.size(0)\n        _, predicted = outputs.max(1)\n        correct += predicted.eq(labels).sum().item()\n        total += labels.size(0)\n\n    train_acc = correct / total\n    avg_train_loss = train_loss / total\n\n    # --- Validation ---\n    model.eval()\n    val_loss, val_correct, val_total = 0.0, 0, 0\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            val_loss += loss.item() * images.size(0)\n            _, predicted = outputs.max(1)\n            val_correct += predicted.eq(labels).sum().item()\n            val_total += labels.size(0)\n\n    val_acc = val_correct / val_total\n    avg_val_loss = val_loss / val_total\n\n    # LR Scheduler step\n    scheduler.step()\n\n    print(f\"Epoch {epoch+1:02d}: Train Loss={avg_train_loss:.4f}, Train Acc={train_acc:.4f} | Val Loss={avg_val_loss:.4f}, Val Acc={val_acc:.4f}\")\n\n    # Save best model\n    if val_acc > best_val_acc:\n        best_val_acc = val_acc\n        torch.save(model.state_dict(), 'best_model.pth')\n        print(f\"  >> Saved new BEST model (val acc {val_acc:.4f})\")\n\nprint(\"Training complete! Best val acc:\", best_val_acc)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T13:36:19.484462Z","iopub.execute_input":"2025-09-23T13:36:19.484744Z","iopub.status.idle":"2025-09-23T13:47:48.868562Z","shell.execute_reply.started":"2025-09-23T13:36:19.484724Z","shell.execute_reply":"2025-09-23T13:47:48.867545Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Model ko best weights pe reload karo\nmodel.load_state_dict(torch.load('best_model.pth', map_location=device))\nmodel.eval()\nprint(\"Best model loaded!\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T13:50:43.493396Z","iopub.execute_input":"2025-09-23T13:50:43.49374Z","iopub.status.idle":"2025-09-23T13:50:43.520932Z","shell.execute_reply.started":"2025-09-23T13:50:43.49371Z","shell.execute_reply":"2025-09-23T13:50:43.520321Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pandas as pd\nfrom PIL import Image\n\nTEST_DIR = '/kaggle/working/test'\ntest_images = sorted(\n    [f for f in os.listdir(TEST_DIR) if f.endswith('.png')],\n    key=lambda x: int(x.split('.')[0])\n)\n\n# Test images ka transformation (use validation waali)\ntest_transform = val_transform\n\nresults = []\nwith torch.no_grad():\n    for fname in test_images:\n        img_path = os.path.join(TEST_DIR, fname)\n        img = Image.open(img_path).convert('RGB')\n        img = test_transform(img).unsqueeze(0).to(device)\n        output = model(img)\n        pred = output.argmax(1).item()\n        results.append(pred)\n\n# Submission CSV banao\nsubmission = pd.DataFrame({\n    'id': [int(f.split('.')[0]) for f in test_images],\n    'label': results\n})\nsubmission = submission.sort_values('id')\nsubmission.to_csv('submission.csv', index=False)\nprint(\"submission.csv ban gayi! Rows:\", len(submission))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T13:51:01.213372Z","iopub.execute_input":"2025-09-23T13:51:01.214107Z","iopub.status.idle":"2025-09-23T13:51:01.24674Z","shell.execute_reply.started":"2025-09-23T13:51:01.214078Z","shell.execute_reply":"2025-09-23T13:51:01.245844Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(os.listdir('/kaggle/working/test/'))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T13:52:41.270295Z","iopub.execute_input":"2025-09-23T13:52:41.270572Z","iopub.status.idle":"2025-09-23T13:52:41.276066Z","shell.execute_reply.started":"2025-09-23T13:52:41.270554Z","shell.execute_reply":"2025-09-23T13:52:41.275201Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nprint(os.listdir('/kaggle/working/'))        # Root pe kya hai\nprint(os.listdir('/kaggle/working/test/'))   # Test ke andar kya hai\nprint(len(os.listdir('/kaggle/working/test/')))  # Total kitni files hain\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T13:52:51.068958Z","iopub.execute_input":"2025-09-23T13:52:51.069274Z","iopub.status.idle":"2025-09-23T13:52:51.074691Z","shell.execute_reply.started":"2025-09-23T13:52:51.069252Z","shell.execute_reply":"2025-09-23T13:52:51.074025Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"TEST_DIR = '/kaggle/working/test/test'\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T13:54:54.222571Z","iopub.execute_input":"2025-09-23T13:54:54.223212Z","iopub.status.idle":"2025-09-23T13:54:54.22688Z","shell.execute_reply.started":"2025-09-23T13:54:54.223185Z","shell.execute_reply":"2025-09-23T13:54:54.22597Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(os.listdir(TEST_DIR)[:10])\nprint(len(os.listdir(TEST_DIR)))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T13:54:59.429476Z","iopub.execute_input":"2025-09-23T13:54:59.430005Z","iopub.status.idle":"2025-09-23T13:54:59.752044Z","shell.execute_reply.started":"2025-09-23T13:54:59.42998Z","shell.execute_reply":"2025-09-23T13:54:59.751314Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\n\n# SAME model architecture use karo jo train ki thi\nmodel.load_state_dict(torch.load('best_model.pth', map_location='cpu'))\nmodel.eval()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T13:57:05.126023Z","iopub.execute_input":"2025-09-23T13:57:05.126702Z","iopub.status.idle":"2025-09-23T13:57:05.147419Z","shell.execute_reply.started":"2025-09-23T13:57:05.126677Z","shell.execute_reply":"2025-09-23T13:57:05.146765Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport os\nfrom PIL import Image\nfrom tqdm import tqdm\n\nTEST_DIR = '/kaggle/working/test/test'  # already correct!\n\n# Images ko sorted order me rakhna zaroori hai (filename number-wise)\ntest_images = sorted([f for f in os.listdir(TEST_DIR) if f.endswith('.png')],\n                     key=lambda x: int(x.split('.')[0]))\n\n# SAME transforms as validation\ntest_transform = val_transform\n\nresults = []\n\nwith torch.no_grad():\n    for fname in tqdm(test_images[:1000]):  # **PEHLE 1000 images try karo for test!**\n        img_path = os.path.join(TEST_DIR, fname)\n        img = Image.open(img_path).convert('RGB')\n        img = test_transform(img).unsqueeze(0)  # add batch dimension\n        output = model(img)\n        pred = output.argmax(1).item()\n        results.append(pred)\n\nprint(results[:20])  # Pehle 20 predictions check karo\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T13:57:18.150144Z","iopub.execute_input":"2025-09-23T13:57:18.150418Z","iopub.status.idle":"2025-09-23T13:57:18.69543Z","shell.execute_reply.started":"2025-09-23T13:57:18.150401Z","shell.execute_reply":"2025-09-23T13:57:18.694335Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pandas as pd\nfrom PIL import Image\nfrom tqdm import tqdm\n\n# Device setup (already done)\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n\nTEST_DIR = '/kaggle/working/test'\ntest_images = sorted(\n    [f for f in os.listdir(TEST_DIR) if f.endswith('.png')],\n    key=lambda x: int(x.split('.')[0])\n)\n\nresults = []\nwith torch.no_grad():\n    for fname in tqdm(test_images[:1000]):   # Pahle 1000 try, phir all kar lena\n        img_path = os.path.join(TEST_DIR, fname)\n        img = Image.open(img_path).convert('RGB')\n        img = test_transform(img).unsqueeze(0).to(device)    # ← YAHAN FIX\n        output = model(img)\n        pred = output.argmax(1).item()\n        results.append(pred)\nprint(results[:20])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T14:00:47.371797Z","iopub.execute_input":"2025-09-23T14:00:47.372462Z","iopub.status.idle":"2025-09-23T14:00:47.397451Z","shell.execute_reply.started":"2025-09-23T14:00:47.372436Z","shell.execute_reply":"2025-09-23T14:00:47.396591Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nTEST_DIR = '/kaggle/working/test'\nprint(\"Test Images Folder:\", TEST_DIR)\nprint(\"First 10 images:\", os.listdir(TEST_DIR)[:10])\nprint(\"Total count:\", len(os.listdir(TEST_DIR)))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T14:03:54.950996Z","iopub.execute_input":"2025-09-23T14:03:54.951375Z","iopub.status.idle":"2025-09-23T14:03:54.95729Z","shell.execute_reply.started":"2025-09-23T14:03:54.951351Z","shell.execute_reply":"2025-09-23T14:03:54.956438Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"TEST_DIR = '/kaggle/working/test/test'\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T14:09:54.545278Z","iopub.execute_input":"2025-09-23T14:09:54.545574Z","iopub.status.idle":"2025-09-23T14:09:54.54943Z","shell.execute_reply.started":"2025-09-23T14:09:54.545556Z","shell.execute_reply":"2025-09-23T14:09:54.548471Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nTEST_DIR = '/kaggle/working/test/test'\nprint(\"Test Images Folder:\", TEST_DIR)\nprint(\"First 10 images:\", os.listdir(TEST_DIR)[:10])\nprint(\"Total count:\", len(os.listdir(TEST_DIR)))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T14:10:02.383873Z","iopub.execute_input":"2025-09-23T14:10:02.384488Z","iopub.status.idle":"2025-09-23T14:10:02.70038Z","shell.execute_reply.started":"2025-09-23T14:10:02.384465Z","shell.execute_reply":"2025-09-23T14:10:02.699576Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nfrom tqdm import tqdm\n\ntest_images = sorted([f for f in os.listdir(TEST_DIR) if f.endswith('.png')],\n                     key=lambda x: int(x.split('.')[0]))\n\nresults = []\nwith torch.no_grad():\n    for fname in tqdm(test_images[:10]):  # pehle 10 try karo, phir sab par\n        img_path = os.path.join(TEST_DIR, fname)\n        img = Image.open(img_path).convert('RGB')\n        img = val_transform(img).unsqueeze(0).to(device)\n        output = model(img)\n        pred = output.argmax(1).item()\n        results.append(pred)\nprint(results)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T14:10:26.399534Z","iopub.execute_input":"2025-09-23T14:10:26.39977Z","iopub.status.idle":"2025-09-23T14:10:26.798615Z","shell.execute_reply.started":"2025-09-23T14:10:26.399754Z","shell.execute_reply":"2025-09-23T14:10:26.797963Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\nresults = []\nids = []\n\nwith torch.no_grad():\n    for fname in tqdm(test_images):  # Ab poore test set pe chalao\n        img_path = os.path.join(TEST_DIR, fname)\n        img = Image.open(img_path).convert('RGB')\n        img = val_transform(img).unsqueeze(0).to(device)\n        output = model(img)\n        pred = output.argmax(1).item()\n        results.append(pred)\n        ids.append(int(fname.split('.')[0]))\n\n# CSV banao\nsubmission = pd.DataFrame({\n    'id': ids,\n    'label': results\n})\nsubmission = submission.sort_values('id')\nsubmission.to_csv('submission.csv', index=False)\nprint(\"submission.csv ban gayi! Total rows:\", len(submission))\nprint(submission.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T14:13:01.69764Z","iopub.execute_input":"2025-09-23T14:13:01.69853Z","iopub.status.idle":"2025-09-23T14:20:41.062955Z","shell.execute_reply.started":"2025-09-23T14:13:01.698503Z","shell.execute_reply":"2025-09-23T14:20:41.062303Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Mapping numbers to CIFAR-10 class names\nidx_to_class = [\n    'airplane', 'automobile', 'bird', 'cat', 'deer', \n    'dog', 'frog', 'horse', 'ship', 'truck'\n]\n\n# Map numeric predictions to string class labels\nsubmission['label'] = submission['label'].map(lambda x: idx_to_class[x])\nsubmission.to_csv('submission_final.csv', index=False)\nprint(submission.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T14:26:31.706577Z","iopub.execute_input":"2025-09-23T14:26:31.707404Z","iopub.status.idle":"2025-09-23T14:26:32.006603Z","shell.execute_reply.started":"2025-09-23T14:26:31.707366Z","shell.execute_reply":"2025-09-23T14:26:32.005313Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_transform = transforms.Compose([\n    transforms.RandomCrop(32, padding=4),\n    transforms.RandomHorizontalFlip(),\n    transforms.RandomVerticalFlip(p=0.2),\n    transforms.RandomAffine(\n        degrees=12, translate=(0.12, 0.12), scale=(0.9, 1.1), shear=8\n    ),\n    transforms.ColorJitter(brightness=0.3, contrast=0.3, saturation=0.3, hue=0.12),\n    transforms.RandomPerspective(distortion_scale=0.2, p=0.2),\n    transforms.ToTensor(),\n    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),\n])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T14:54:50.928418Z","iopub.execute_input":"2025-09-23T14:54:50.929187Z","iopub.status.idle":"2025-09-23T14:54:50.93466Z","shell.execute_reply.started":"2025-09-23T14:54:50.929163Z","shell.execute_reply":"2025-09-23T14:54:50.933743Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"self.features = nn.Sequential(\n    nn.Conv2d(3, 64, kernel_size=3, padding=1),\n    nn.BatchNorm2d(64),\n    nn.ReLU(),\n    nn.Conv2d(64, 64, kernel_size=3, padding=1),\n    nn.BatchNorm2d(64),\n    nn.ReLU(),\n    nn.MaxPool2d(2),\n    nn.Dropout(0.35),\n\n    nn.Conv2d(64, 128, kernel_size=3, padding=1),\n    nn.BatchNorm2d(128),\n    nn.ReLU(),\n    nn.Conv2d(128, 128, kernel_size=3, padding=1),\n    nn.BatchNorm2d(128),\n    nn.ReLU(),\n    nn.MaxPool2d(2),\n    nn.Dropout(0.4),\n\n    nn.Conv2d(128, 256, kernel_size=3, padding=1),\n    nn.BatchNorm2d(256),\n    nn.ReLU(),\n    nn.Conv2d(256, 256, kernel_size=3, padding=1),\n    nn.BatchNorm2d(256),\n    nn.ReLU(),\n    nn.MaxPool2d(2),\n    nn.Dropout(0.45),\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T14:55:11.525897Z","iopub.execute_input":"2025-09-23T14:55:11.526216Z","iopub.status.idle":"2025-09-23T14:55:11.571358Z","shell.execute_reply.started":"2025-09-23T14:55:11.526191Z","shell.execute_reply":"2025-09-23T14:55:11.570436Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch.nn as nn\n\nclass ImprovedCNN(nn.Module):\n    def __init__(self, num_classes=10):\n        super().__init__()\n        self.features = nn.Sequential(\n            nn.Conv2d(3, 64, kernel_size=3, padding=1),\n            nn.BatchNorm2d(64),\n            nn.ReLU(),\n            nn.Conv2d(64, 64, kernel_size=3, padding=1),\n            nn.BatchNorm2d(64),\n            nn.ReLU(),\n            nn.MaxPool2d(2),\n            nn.Dropout(0.35),\n\n            nn.Conv2d(64, 128, kernel_size=3, padding=1),\n            nn.BatchNorm2d(128),\n            nn.ReLU(),\n            nn.Conv2d(128, 128, kernel_size=3, padding=1),\n            nn.BatchNorm2d(128),\n            nn.ReLU(),\n            nn.MaxPool2d(2),\n            nn.Dropout(0.4),\n\n            nn.Conv2d(128, 256, kernel_size=3, padding=1),\n            nn.BatchNorm2d(256),\n            nn.ReLU(),\n            nn.Conv2d(256, 256, kernel_size=3, padding=1),\n            nn.BatchNorm2d(256),\n            nn.ReLU(),\n            nn.MaxPool2d(2),\n            nn.Dropout(0.45),\n        )\n        self.classifier = nn.Sequential(\n            nn.Flatten(),\n            nn.Linear(256 * 4 * 4, 512),\n            nn.ReLU(),\n            nn.Dropout(0.5),\n            nn.Linear(512, num_classes)\n        )\n\n    def forward(self, x):\n        x = self.features(x)\n        x = self.classifier(x)\n        return x\n\n# Model initialize karo:\nmodel = ImprovedCNN(num_classes=10)\nprint(model)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T14:56:45.825996Z","iopub.execute_input":"2025-09-23T14:56:45.826626Z","iopub.status.idle":"2025-09-23T14:56:45.861224Z","shell.execute_reply.started":"2025-09-23T14:56:45.8266Z","shell.execute_reply":"2025-09-23T14:56:45.860502Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch.optim as optim\nimport torch.nn as nn\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nmodel = model.to(device)\n\ncriterion = nn.CrossEntropyLoss()\n\n# Adam optimizer is best for now, weight_decay=1e-4 (L2 regularization)\noptimizer = optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-4)\n\n# CosineAnnealingLR: Decay LR slowly for better convergence\nscheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=40)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T15:38:16.607344Z","iopub.execute_input":"2025-09-23T15:38:16.607918Z","iopub.status.idle":"2025-09-23T15:38:16.615114Z","shell.execute_reply.started":"2025-09-23T15:38:16.607897Z","shell.execute_reply":"2025-09-23T15:38:16.614449Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\n\nbest_val_acc = 0\npatience = 5    # Early stopping patience\ntrigger_times = 0\n\nEPOCHS = 30     # Try 40–50 for further improvement\n\nfor epoch in range(EPOCHS):\n    model.train()\n    train_loss, train_correct = 0, 0\n    total = 0\n\n    for images, labels in train_loader:\n        images, labels = images.to(device), labels.to(device)\n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n\n        train_loss += loss.item() * images.size(0)\n        _, preds = torch.max(outputs, 1)\n        train_correct += (preds == labels).sum().item()\n        total += images.size(0)\n\n    train_loss /= total\n    train_acc = train_correct / total\n\n    # --- Validation ---\n    model.eval()\n    val_loss, val_correct = 0, 0\n    total = 0\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            val_loss += loss.item() * images.size(0)\n            _, preds = torch.max(outputs, 1)\n            val_correct += (preds == labels).sum().item()\n            total += images.size(0)\n    val_loss /= total\n    val_acc = val_correct / total\n\n    scheduler.step()\n\n    print(f\"Epoch {epoch+1}: Train Loss={train_loss:.4f}, Acc={train_acc:.4f} | Val Loss={val_loss:.4f}, Val Acc={val_acc:.4f}\")\n\n    # --- Early stopping ---\n    if val_acc > best_val_acc:\n        best_val_acc = val_acc\n        torch.save(model.state_dict(), 'best_model.pth')\n        print(f\">> Saved new BEST model (val acc={val_acc:.4f})\")\n        trigger_times = 0\n    else:\n        trigger_times += 1\n        if trigger_times >= patience:\n            print(f\"Early stopping at epoch {epoch+1}\")\n            break\n\nprint(f\"Training complete! Best val acc: {best_val_acc:.4f}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T15:38:23.252726Z","iopub.execute_input":"2025-09-23T15:38:23.253001Z","iopub.status.idle":"2025-09-23T15:52:06.671047Z","shell.execute_reply.started":"2025-09-23T15:38:23.25298Z","shell.execute_reply":"2025-09-23T15:52:06.670149Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torchvision import transforms\n\ntrain_transform = transforms.Compose([\n    transforms.RandomCrop(32, padding=4),\n    transforms.RandomHorizontalFlip(),\n    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),\n    transforms.RandomAffine(degrees=10, translate=(0.1,0.1), scale=(0.9,1.1)),  # <-- NEW\n    transforms.ToTensor(),\n    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),\n    transforms.RandomErasing(p=0.2, scale=(0.02, 0.2))  # <-- NEW\n])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T15:59:48.451909Z","iopub.execute_input":"2025-09-23T15:59:48.452221Z","iopub.status.idle":"2025-09-23T15:59:48.4585Z","shell.execute_reply.started":"2025-09-23T15:59:48.452195Z","shell.execute_reply":"2025-09-23T15:59:48.457682Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pandas as pd\nfrom PIL import Image\nfrom tqdm import tqdm\nimport torch\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nmodel = model.to(device)\nmodel.load_state_dict(torch.load('best_model.pth', map_location=device))\nmodel.eval()\n\nTEST_DIR = '/kaggle/working/test/test'\ntest_images = sorted(\n    [f for f in os.listdir(TEST_DIR) if f.endswith('.png')],\n    key=lambda x: int(x.split('.')[0])\n)\n\nresults = []\nids = []\n\n# SAME transforms as validation\ntest_transform = val_transform\n\nwith torch.no_grad():\n    for fname in tqdm(test_images):\n        img_path = os.path.join(TEST_DIR, fname)\n        img = Image.open(img_path).convert('RGB')\n        img = test_transform(img).unsqueeze(0).to(device)\n        output = model(img)\n        pred = output.argmax(1).item()\n        results.append(pred)\n        ids.append(int(fname.split('.')[0]))\n\n# Submission DataFrame\nsubmission = pd.DataFrame({'id': ids, 'label': results})\nsubmission = submission.sort_values('id')\nsubmission.to_csv('submission.csv', index=False)\nprint(\"submission.csv ban gayi! Total rows:\", len(submission))\nprint(submission.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T16:02:15.16391Z","iopub.execute_input":"2025-09-23T16:02:15.16481Z","iopub.status.idle":"2025-09-23T16:10:46.871595Z","shell.execute_reply.started":"2025-09-23T16:02:15.164774Z","shell.execute_reply":"2025-09-23T16:10:46.870759Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"idx_to_class = [\n    'airplane', 'automobile', 'bird', 'cat', 'deer',\n    'dog', 'frog', 'horse', 'ship', 'truck'\n]\nsubmission['label'] = submission['label'].map(lambda x: idx_to_class[x])\nsubmission.to_csv('submission_final.csv', index=False)\nprint(submission.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T16:16:03.361245Z","iopub.execute_input":"2025-09-23T16:16:03.361542Z","iopub.status.idle":"2025-09-23T16:16:03.665421Z","shell.execute_reply.started":"2025-09-23T16:16:03.361521Z","shell.execute_reply":"2025-09-23T16:16:03.66449Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}