{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3649,"databundleVersionId":46718,"isSourceIdPinned":false,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install py7zr","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T10:44:20.425881Z","iopub.execute_input":"2025-04-02T10:44:20.426183Z","iopub.status.idle":"2025-04-02T10:44:28.144227Z","shell.execute_reply.started":"2025-04-02T10:44:20.426149Z","shell.execute_reply":"2025-04-02T10:44:28.143178Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport torch\nimport os\nimport shutil\nfrom py7zr import unpack_7zarchive\nfrom torchvision.io import read_image\nfrom torchvision.transforms import ToTensor, Normalize, Resize, Compose\nfrom torch.utils.data import Dataset, DataLoader\nimport torch.nn as nn\nfrom torchvision.models import resnet18, ResNet18_Weights\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T10:44:28.145493Z","iopub.execute_input":"2025-04-02T10:44:28.145834Z","iopub.status.idle":"2025-04-02T10:44:36.356635Z","shell.execute_reply.started":"2025-04-02T10:44:28.145792Z","shell.execute_reply":"2025-04-02T10:44:36.355968Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"shutil.register_unpack_format('7zip', ['.7z'], unpack_7zarchive)\n\n# Unpack training images\nshutil.unpack_archive('/kaggle/input/cifar-10/train.7z', '/kaggle/temp/')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T10:44:36.35851Z","iopub.execute_input":"2025-04-02T10:44:36.358915Z","iopub.status.idle":"2025-04-02T10:44:59.350702Z","shell.execute_reply.started":"2025-04-02T10:44:36.358891Z","shell.execute_reply":"2025-04-02T10:44:59.349598Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T10:44:59.352353Z","iopub.execute_input":"2025-04-02T10:44:59.352632Z","iopub.status.idle":"2025-04-02T10:44:59.444105Z","shell.execute_reply.started":"2025-04-02T10:44:59.352608Z","shell.execute_reply":"2025-04-02T10:44:59.443366Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_labels = pd.read_csv(\"/kaggle/input/cifar-10/trainLabels.csv\")\nclasses = train_labels['label'].unique()\n\n# Creating label mapping\nname2num = {name: i for i, name in enumerate(classes)}\nnum2name = {i: name for i, name in enumerate(classes)}\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T10:44:59.44507Z","iopub.execute_input":"2025-04-02T10:44:59.445396Z","iopub.status.idle":"2025-04-02T10:44:59.547987Z","shell.execute_reply.started":"2025-04-02T10:44:59.445364Z","shell.execute_reply":"2025-04-02T10:44:59.547166Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class TrainDataset(Dataset):\n    def __init__(self, imgpath, labelpath):\n        super().__init__()\n        self.imgpath = imgpath\n        self.labels = pd.read_csv(labelpath)\n        self.transform = Compose([\n            Resize((224, 224), antialias=True), \n            Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n        ])\n        \n    def __len__(self):\n        return self.labels.shape[0]\n    \n    def __getitem__(self, idx):\n        finalpath = os.path.join(self.imgpath, str(idx+1) + '.png')\n        img = read_image(finalpath) / 255.0\n        img = self.transform(img)\n        label = name2num[self.labels.iloc[idx, 1]]\n        return img, label\n\ntraindataset = TrainDataset('/kaggle/temp/train', '/kaggle/input/cifar-10/trainLabels.csv')\ntraindataloader = DataLoader(dataset=traindataset, batch_size=64)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T10:44:59.548895Z","iopub.execute_input":"2025-04-02T10:44:59.549201Z","iopub.status.idle":"2025-04-02T10:44:59.564621Z","shell.execute_reply.started":"2025-04-02T10:44:59.549171Z","shell.execute_reply":"2025-04-02T10:44:59.563794Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class Cifar10ResNet(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.pretrainednet = resnet18(weights=ResNet18_Weights.DEFAULT)\n        self.pretrainednet.fc = nn.Linear(in_features=512, out_features=10)\n\n    def forward(self, x):\n        return self.pretrainednet(x)\n\nmodel = Cifar10ResNet().to(device)\n\n# Freeze the feature extractor layers\nfor param in model.pretrainednet.parameters():\n    param.requires_grad = False\n\n# Ensure the final fully connected layer is trainable\nfor param in model.pretrainednet.fc.parameters():\n    param.requires_grad = True\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T10:44:59.565339Z","iopub.execute_input":"2025-04-02T10:44:59.565552Z","iopub.status.idle":"2025-04-02T10:45:00.470559Z","shell.execute_reply.started":"2025-04-02T10:44:59.565533Z","shell.execute_reply":"2025-04-02T10:45:00.469634Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def train_one_epoch(dataloader, model, loss_fn, optimizer):\n    model.train()\n    track_loss = 0\n    num_correct = 0\n\n    for i, (imgs, labels) in enumerate(dataloader):\n        imgs, labels = imgs.to(device), labels.to(device)\n        pred = model(imgs)\n                    \n        loss = loss_fn(pred, labels)\n        track_loss += loss.item()\n        num_correct += (torch.argmax(pred, dim=1) == labels).sum().item()\n        \n        loss.backward()\n        optimizer.step()\n        optimizer.zero_grad()\n\n        if i % 100 == 0:\n            print(f\"Batch: {i+1}/{len(dataloader)} | Running Loss: {round(track_loss/(i+1), 2)} | Accuracy: {round((num_correct/((i+1)*64))*100, 2)}%\")\n\n    return round(track_loss / len(dataloader), 2), round((num_correct / len(dataloader.dataset)) * 100, 2)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T10:45:00.471485Z","iopub.execute_input":"2025-04-02T10:45:00.471727Z","iopub.status.idle":"2025-04-02T10:45:00.477117Z","shell.execute_reply.started":"2025-04-02T10:45:00.471706Z","shell.execute_reply":"2025-04-02T10:45:00.476444Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"loss_fn = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=0.001)\nn_epochs = 10\n\nfor i in range(n_epochs):\n    print(f\"Epoch {i+1}\")\n    train_loss, train_acc = train_one_epoch(traindataloader, model, loss_fn, optimizer)\n    print(f\"Training - Loss: {train_loss}, Accuracy: {train_acc}%\\n{'-'*50}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T10:45:00.479549Z","iopub.execute_input":"2025-04-02T10:45:00.479751Z","iopub.status.idle":"2025-04-02T11:04:23.628607Z","shell.execute_reply.started":"2025-04-02T10:45:00.479733Z","shell.execute_reply":"2025-04-02T11:04:23.627646Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for param in model.pretrainednet.parameters():\n    param.requires_grad = True\n\nfor i in range(n_epochs):\n    print(f\"Epoch {i+1}\")\n    train_loss, train_acc = train_one_epoch(traindataloader, model, loss_fn, optimizer)\n    print(f\"Fine-Tuning - Loss: {train_loss}, Accuracy: {train_acc}%\\n{'-'*50}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T11:04:23.629849Z","iopub.execute_input":"2025-04-02T11:04:23.630112Z","iopub.status.idle":"2025-04-02T11:32:08.540169Z","shell.execute_reply.started":"2025-04-02T11:04:23.63009Z","shell.execute_reply":"2025-04-02T11:32:08.539295Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"shutil.unpack_archive('/kaggle/input/cifar-10/test.7z', '/kaggle/temp/')\n\nclass TestDataset(Dataset):\n    def __init__(self, imgpath):\n        super().__init__()\n        self.imgpath = imgpath\n        _, _, self.files = next(os.walk(imgpath))\n        self.length = len(self.files)\n        self.transform = Compose([\n            Resize((224, 224), antialias=True),\n            Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n        ])\n    \n    def __len__(self):\n        return self.length\n    \n    def __getitem__(self, idx):\n        finalpath = os.path.join(self.imgpath, str(idx+1) + '.png')\n        img = read_image(finalpath) / 255.0\n        img = self.transform(img)\n        return img\n\ntestdataset = TestDataset('/kaggle/temp/test/')\ntestdataloader = DataLoader(dataset=testdataset, batch_size=64)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T11:32:08.541336Z","iopub.execute_input":"2025-04-02T11:32:08.541701Z","iopub.status.idle":"2025-04-02T11:34:24.329307Z","shell.execute_reply.started":"2025-04-02T11:32:08.541667Z","shell.execute_reply":"2025-04-02T11:34:24.328587Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def eval(dataloader, model, path):\n    model.eval()\n    data = pd.read_csv(path)\n    \n    with torch.no_grad():\n        for i, imgs in enumerate(dataloader):\n            finalbatchpred = np.zeros(imgs.shape[0], dtype='object')\n            imgs = imgs.to(device)\n            pred = model(imgs)\n            pred = torch.argmax(pred, dim=1).cpu()\n\n            for j, p in enumerate(pred):\n                finalbatchpred[j] = num2name[p.item()]\n                \n            data.iloc[i*64:i*64+64, 1] = finalbatchpred\n    \n    data.to_csv('submission.csv', index=False)\n    print(data.head())\n\neval(testdataloader, model, '/kaggle/input/cifar-10/sampleSubmission.csv')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T11:34:24.330072Z","iopub.execute_input":"2025-04-02T11:34:24.330294Z","iopub.status.idle":"2025-04-02T11:44:30.929823Z","shell.execute_reply.started":"2025-04-02T11:34:24.330275Z","shell.execute_reply":"2025-04-02T11:44:30.928879Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"shutil.unregister_unpack_format('7zip')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T11:44:30.930919Z","iopub.execute_input":"2025-04-02T11:44:30.931248Z","iopub.status.idle":"2025-04-02T11:44:30.935167Z","shell.execute_reply.started":"2025-04-02T11:44:30.931215Z","shell.execute_reply":"2025-04-02T11:44:30.934338Z"}},"outputs":[],"execution_count":null}]}