{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"dockerImageVersionId":28755,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\n\nprint(\"PyTorch:\", torch.__version__)\nprint(\"CUDA available:\", torch.cuda.is_available())\n\nif torch.cuda.is_available():\n    print(\"GPU:\", torch.cuda.get_device_name(0))\n    print(\"Number of GPUs:\", torch.cuda.device_count())\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(\"Using:\", device)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-24T00:58:15.752181Z","iopub.execute_input":"2026-09-24T00:58:15.752467Z","iopub.status.idle":"2026-09-24T00:58:21.165065Z","shell.execute_reply.started":"2026-09-24T00:58:15.752443Z","shell.execute_reply":"2026-09-24T00:58:21.164222Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torchvision\nimport torchvision.transforms as transforms\n\ntransform = transforms.ToTensor()\n\nprint(\"Downloading CIFAR-10...\")\n\ntrain_dataset = torchvision.datasets.CIFAR10(\n    root=\"/kaggle/working/data\",\n    train=True,\n    download=True,\n    transform=transform\n)\n\ntest_dataset = torchvision.datasets.CIFAR10(\n    root=\"/kaggle/working/data\",\n    train=False,\n    download=True,\n    transform=transform\n)\n\nprint(\"Download complete!\")\nprint(\"Train:\", len(train_dataset))\nprint(\"Test:\", len(test_dataset))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-24T09:51:10.804695Z","iopub.execute_input":"2026-09-24T09:51:10.805436Z","iopub.status.idle":"2026-09-24T10:31:53.870174Z","shell.execute_reply.started":"2026-09-24T09:51:10.805398Z","shell.execute_reply":"2026-09-24T10:31:53.869442Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom torch.utils.data import DataLoader\n\ntrain_loader = DataLoader(\n    train_dataset,\n    batch_size=128,\n    shuffle=True,\n    num_workers=2,\n    pin_memory=True\n)\n\ntest_loader = DataLoader(\n    test_dataset,\n    batch_size=128,\n    shuffle=False,\n    num_workers=2,\n    pin_memory=True\n)\n\nclasses = [\n    \"airplane\", \"automobile\", \"bird\", \"cat\", \"deer\",\n    \"dog\", \"frog\", \"horse\", \"ship\", \"truck\"\n]\n\nprint(\"Data ready ✅\")\nprint(\"Training batches:\", len(train_loader))\nprint(\"Test batches:\", len(test_loader))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-24T10:32:43.689374Z","iopub.execute_input":"2026-09-24T10:32:43.689975Z","iopub.status.idle":"2026-09-24T10:32:43.697479Z","shell.execute_reply.started":"2026-09-24T10:32:43.68994Z","shell.execute_reply":"2026-09-24T10:32:43.696535Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torchvision.models as models\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(\"Using:\", device)\n\nmodel = models.resnet18(weights=None)\nmodel.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False)\nmodel.maxpool = nn.Identity()\nmodel.fc = nn.Linear(model.fc.in_features, 10)\n\nmodel = model.to(device)\n\ncriterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=5e-4)\n\nprint(\"Model ready ✅\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-24T10:34:16.308242Z","iopub.execute_input":"2026-09-24T10:34:16.308682Z","iopub.status.idle":"2026-09-24T10:34:16.992688Z","shell.execute_reply.started":"2026-09-24T10:34:16.308649Z","shell.execute_reply":"2026-09-24T10:34:16.991814Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tqdm.auto import tqdm\n\nEPOCHS = 20\n\nfor epoch in range(EPOCHS):\n    model.train()\n    running_loss = 0\n    correct = 0\n    total = 0\n\n    progress = tqdm(\n        train_loader,\n        desc=f\"Epoch {epoch+1}/{EPOCHS}\"\n    )\n\n    for images, labels in progress:\n        images = images.to(device)\n        labels = labels.to(device)\n\n        optimizer.zero_grad()\n\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n\n        loss.backward()\n        optimizer.step()\n\n        running_loss += loss.item()\n        _, predicted = outputs.max(1)\n\n        total += labels.size(0)\n        correct += predicted.eq(labels).sum().item()\n\n        progress.set_postfix(\n            loss=f\"{running_loss/(progress.n+1):.3f}\",\n            acc=f\"{100*correct/total:.1f}%\"\n        )\n\n    print(\n        f\"Epoch {epoch+1}: \"\n        f\"Accuracy = {100*correct/total:.2f}%\"\n    )\n\n# SAVE IT so we don't lose the model\ntorch.save(model.state_dict(), \"/kaggle/working/cifar10_model.pth\")\n\nprint(\"TRAINING FINISHED ✅\")\nprint(\"MODEL SAVED ✅\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-25T07:29:34.430365Z","iopub.execute_input":"2026-09-25T07:29:34.430785Z","iopub.status.idle":"2026-09-25T07:29:34.441247Z","shell.execute_reply.started":"2026-09-25T07:29:34.430756Z","shell.execute_reply":"2026-09-25T07:29:34.439758Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.eval()\n\ncorrect = 0\ntotal = 0\n\nwith torch.no_grad():\n    for images, labels in test_loader:\n        images = images.to(device)\n        labels = labels.to(device)\n\n        outputs = model(images)\n        _, predicted = outputs.max(1)\n\n        total += labels.size(0)\n        correct += predicted.eq(labels).sum().item()\n\naccuracy = 100 * correct / total\n\nprint(f\"Test Accuracy: {accuracy:.2f}%\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-25T07:29:10.494773Z","iopub.execute_input":"2026-09-25T07:29:10.495633Z","iopub.status.idle":"2026-09-25T07:29:10.504049Z","shell.execute_reply.started":"2026-09-25T07:29:10.495596Z","shell.execute_reply":"2026-09-25T07:29:10.5029Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport subprocess\n\nDATA_DIR = \"/kaggle/input/competitions/cifar-10\"\nOUT_DIR = \"/kaggle/working/cifar10\"\n\nos.makedirs(OUT_DIR, exist_ok=True)\n\nprint(\"Extracting 300,000 competition test images...\")\n\nsubprocess.run([\n    \"7z\", \"x\",\n    f\"{DATA_DIR}/test.7z\",\n    f\"-o{OUT_DIR}\",\n    \"-y\"\n])\n\ntest_path = f\"{OUT_DIR}/test\"\n\nprint(\"DONE ✅\")\nprint(\"Competition test images:\", len(os.listdir(test_path)))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-24T12:18:44.386297Z","iopub.execute_input":"2026-09-24T12:18:44.386657Z","iopub.status.idle":"2026-09-24T16:44:11.778415Z","shell.execute_reply.started":"2026-09-24T12:18:44.386612Z","shell.execute_reply":"2026-09-24T16:44:11.777342Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torchvision\nimport torchvision.transforms as transforms\nfrom torch.utils.data import DataLoader\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(\"Using:\", device)\n\nmean = (0.4914, 0.4822, 0.4465)\nstd = (0.2470, 0.2435, 0.2616)\n\ntrain_transform = transforms.Compose([\n    transforms.RandomCrop(32, padding=4),\n    transforms.RandomHorizontalFlip(),\n    transforms.ToTensor(),\n    transforms.Normalize(mean, std),\n])\n\ntrain_dataset = torchvision.datasets.CIFAR10(\n    root=\"/kaggle/working/data\",\n    train=True,\n    download=True,\n    transform=train_transform\n)\n\ntrain_loader = DataLoader(\n    train_dataset,\n    batch_size=128,\n    shuffle=True,\n    num_workers=2,\n    pin_memory=True\n)\n\nprint(\"Train images:\", len(train_dataset))\nprint(\"Training batches:\", len(train_loader))\nprint(\"READY ✅\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-25T03:32:35.938899Z","iopub.execute_input":"2026-09-25T03:32:35.939323Z","iopub.status.idle":"2026-09-25T03:54:07.799286Z","shell.execute_reply.started":"2026-09-25T03:32:35.939294Z","shell.execute_reply":"2026-09-25T03:54:07.798581Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torchvision.models as models\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(\"Using:\", device)\n\nmodel = models.resnet18(weights=None)\n\nmodel.conv1 = nn.Conv2d(\n    3, 64, kernel_size=3, stride=1, padding=1, bias=False\n)\nmodel.maxpool = nn.Identity()\nmodel.fc = nn.Linear(model.fc.in_features, 10)\n\nmodel = model.to(device)\n\ncriterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.AdamW(\n    model.parameters(),\n    lr=0.001,\n    weight_decay=5e-4\n)\n\nprint(\"MODEL READY ✅\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-25T07:28:13.804781Z","iopub.execute_input":"2026-09-25T07:28:13.805129Z","iopub.status.idle":"2026-09-25T07:28:26.915582Z","shell.execute_reply.started":"2026-09-25T07:28:13.805102Z","shell.execute_reply":"2026-09-25T07:28:26.914845Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torchvision\nimport torchvision.transforms as transforms\nimport torchvision.models as models\nfrom torch.utils.data import DataLoader\nfrom tqdm.auto import tqdm\n\n# GPU\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(\"Using:\", device)\n\n# DATA\ntransform = transforms.Compose([\n    transforms.RandomCrop(32, padding=4),\n    transforms.RandomHorizontalFlip(),\n    transforms.ToTensor(),\n    transforms.Normalize(\n        (0.4914, 0.4822, 0.4465),\n        (0.2470, 0.2435, 0.2616)\n    )\n])\n\ntrain_dataset = torchvision.datasets.CIFAR10(\n    root=\"/kaggle/working/data\",\n    train=True,\n    download=True,\n    transform=transform\n)\n\ntrain_loader = DataLoader(\n    train_dataset,\n    batch_size=128,\n    shuffle=True,\n    num_workers=2,\n    pin_memory=True\n)\n\n# MODEL\nmodel = models.resnet18(weights=None)\nmodel.conv1 = nn.Conv2d(3, 64, 3, 1, 1, bias=False)\nmodel.maxpool = nn.Identity()\nmodel.fc = nn.Linear(model.fc.in_features, 10)\nmodel = model.to(device)\n\ncriterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.AdamW(\n    model.parameters(),\n    lr=0.001,\n    weight_decay=5e-4\n)\n\nprint(\"Everything ready ✅\")\n\n# TRAIN\nEPOCHS = 20\n\nfor epoch in range(EPOCHS):\n    model.train()\n    correct = 0\n    total = 0\n\n    pbar = tqdm(train_loader, desc=f\"Epoch {epoch+1}/{EPOCHS}\")\n\n    for images, labels in pbar:\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\n        predicted = outputs.argmax(1)\n        total += labels.size(0)\n        correct += predicted.eq(labels).sum().item()\n\n        pbar.set_postfix(\n            loss=f\"{loss.item():.3f}\",\n            acc=f\"{100*correct/total:.1f}%\"\n        )\n\n    torch.save(\n        model.state_dict(),\n        \"/kaggle/working/cifar10_model.pth\"\n    )\n\n    print(\n        f\"Epoch {epoch+1}: {100*correct/total:.2f}% — SAVED ✅\"\n    )\n\nprint(\"TRAINING COMPLETE ✅\")\nprint(\"MODEL SAVED ✅\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-25T07:30:54.805224Z","iopub.execute_input":"2026-09-25T07:30:54.805907Z","iopub.status.idle":"2026-09-25T08:18:16.714338Z","shell.execute_reply.started":"2026-09-25T07:30:54.805873Z","shell.execute_reply":"2026-09-25T08:18:16.713184Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\npath = \"/kaggle/working/cifar10_model.pth\"\n\nprint(\"Model exists:\", os.path.exists(path))\n\nif os.path.exists(path):\n    print(\"Model size:\", round(os.path.getsize(path) / 1024 / 1024, 2), \"MB\")\n    print(\"SAFE ✅\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-25T08:24:23.460263Z","iopub.execute_input":"2026-09-25T08:24:23.461176Z","iopub.status.idle":"2026-09-25T08:24:23.468186Z","shell.execute_reply.started":"2026-09-25T08:24:23.461125Z","shell.execute_reply":"2026-09-25T08:24:23.467342Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport subprocess\n\nDATA_DIR = \"/kaggle/input/competitions/cifar-10\"\nOUT_DIR = \"/kaggle/working/cifar10\"\n\nos.makedirs(OUT_DIR, exist_ok=True)\n\nprint(\"Extracting test images...\")\n\nresult = subprocess.run([\n    \"7z\", \"x\",\n    f\"{DATA_DIR}/test.7z\",\n    f\"-o{OUT_DIR}\",\n    \"-y\"\n])\n\ntest_path = f\"{OUT_DIR}/test\"\n\nprint(\"Extraction finished.\")\nprint(\"Test folder exists:\", os.path.exists(test_path))\n\nif os.path.exists(test_path):\n    print(\"Images:\", len(os.listdir(test_path)))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-25T08:25:34.954026Z","iopub.execute_input":"2026-09-25T08:25:34.954371Z","iopub.status.idle":"2026-09-25T12:41:11.131153Z","shell.execute_reply.started":"2026-09-25T08:25:34.95433Z","shell.execute_reply":"2026-09-25T12:41:11.130375Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(\"MODEL:\", os.path.exists(\"/kaggle/working/cifar10_model.pth\"))\nprint(\"TEST:\", os.path.exists(\"/kaggle/working/cifar10/test\"))\nprint(\"SUBMISSION:\", os.path.exists(\"/kaggle/working/submission.csv\"))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-25T12:48:04.355101Z","iopub.execute_input":"2026-09-25T12:48:04.355531Z","iopub.status.idle":"2026-09-25T12:48:04.360495Z","shell.execute_reply.started":"2026-09-25T12:48:04.355502Z","shell.execute_reply":"2026-09-25T12:48:04.35963Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torchvision.models as models\nfrom torchvision import transforms\nfrom torch.utils.data import Dataset, DataLoader\nfrom PIL import Image\nimport pandas as pd\nfrom tqdm.auto import tqdm\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(\"Using:\", device)\n\n# Rebuild model and load SAVED weights\nmodel = models.resnet18(weights=None)\nmodel.conv1 = nn.Conv2d(3, 64, 3, 1, 1, bias=False)\nmodel.maxpool = nn.Identity()\nmodel.fc = nn.Linear(model.fc.in_features, 10)\n\nmodel.load_state_dict(\n    torch.load(\"/kaggle/working/cifar10_model.pth\",\n               map_location=device)\n)\n\nmodel = model.to(device)\nmodel.eval()\n\n# Competition submission template\nsample = pd.read_csv(\n    \"/kaggle/input/competitions/cifar-10/sampleSubmission.csv\"\n)\n\ntest_path = \"/kaggle/working/cifar10/test\"\n\ntransform = transforms.Compose([\n    transforms.ToTensor(),\n    transforms.Normalize(\n        (0.4914, 0.4822, 0.4465),\n        (0.2470, 0.2435, 0.2616)\n    )\n])\n\nclass TestData(Dataset):\n    def __init__(self, ids):\n        self.ids = list(ids)\n\n    def __len__(self):\n        return len(self.ids)\n\n    def __getitem__(self, i):\n        img_id = self.ids[i]\n        image = Image.open(\n            f\"{test_path}/{img_id}.png\"\n        ).convert(\"RGB\")\n        return transform(image)\n\nloader = DataLoader(\n    TestData(sample[\"id\"]),\n    batch_size=512,\n    shuffle=False,\n    num_workers=4,\n    pin_memory=True\n)\n\nclasses = [\n    \"airplane\", \"automobile\", \"bird\", \"cat\", \"deer\",\n    \"dog\", \"frog\", \"horse\", \"ship\", \"truck\"\n]\n\npredictions = []\n\nprint(\"Predicting...\")\n\nwith torch.no_grad():\n    for images in tqdm(loader):\n        images = images.to(device)\n        outputs = model(images)\n        predictions.extend(outputs.argmax(1).cpu().tolist())\n\nsample[\"label\"] = [classes[i] for i in predictions]\n\nsample.to_csv(\n    \"/kaggle/working/submission.csv\",\n    index=False\n)\n\nprint(\"SUBMISSION CREATED ✅\")\nprint(\"Rows:\", len(sample))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-25T12:48:39.728589Z","iopub.execute_input":"2026-09-25T12:48:39.729168Z","iopub.status.idle":"2026-09-25T12:49:46.95749Z","shell.execute_reply.started":"2026-09-25T12:48:39.729138Z","shell.execute_reply":"2026-09-25T12:49:46.956531Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from IPython.display import FileLink, display\n\ndisplay(FileLink(\n    \"/kaggle/working/submission.csv\",\n    result_html_prefix=\"CLICK HERE: \"\n))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-25T12:58:42.895621Z","iopub.execute_input":"2026-09-25T12:58:42.896408Z","iopub.status.idle":"2026-09-25T12:58:42.902799Z","shell.execute_reply.started":"2026-09-25T12:58:42.89634Z","shell.execute_reply":"2026-09-25T12:58:42.902206Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!kaggle competitions submit \\\n-c cifar-10 \\\n-f /kaggle/working/submission.csv \\\n-m \"ResNet18 CIFAR-10 submission\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-25T13:00:01.854117Z","iopub.execute_input":"2026-09-25T13:00:01.854582Z","iopub.status.idle":"2026-09-25T13:00:03.865899Z","shell.execute_reply.started":"2026-09-25T13:00:01.854546Z","shell.execute_reply":"2026-09-25T13:00:03.865191Z"}},"outputs":[],"execution_count":null}]}