{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":3649,"databundleVersionId":46718,"sourceType":"competition"}],"dockerImageVersionId":31011,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from torchvision.models import resnet18, ResNet18_Weights\nimport torchvision\nfrom torchvision.transforms import v2\nimport torch\nimport torch.nn as nn\n\nweights = ResNet18_Weights.DEFAULT\nmodel = resnet18(weights=weights)  ","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:33:11.313056Z","iopub.execute_input":"2025-04-13T08:33:11.313725Z","iopub.status.idle":"2025-04-13T08:33:19.340091Z","shell.execute_reply.started":"2025-04-13T08:33:11.313702Z","shell.execute_reply":"2025-04-13T08:33:19.339245Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_transform = v2.Compose([\n    v2.ToImage(),\n    v2.ToDtype(torch.float32, scale=True),\n    v2.RandomHorizontalFlip(),\n    v2.RandomVerticalFlip(),\n    v2.RandomCrop(32, padding=4),\n    v2.Normalize(mean=[0.485, 0.456, 0.406],\n                 std=[0.229, 0.224, 0.225])\n])\n\ndev_transform = v2.Compose([\n    v2.ToImage(),\n    v2.Resize((32, 32)),\n    v2.ToDtype(torch.float32, scale=True),\n    v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n])\n\ntest_transform = v2.Compose([\n    v2.ToImage(),\n    v2.ToDtype(torch.float32, scale=True),\n    v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n])\n\ntrain_datasets = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=train_transform)\ndev_datasets = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=dev_transform)\ntest_datasets = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=test_transform)\n\ntrain_loader = torch.utils.data.DataLoader(train_datasets, batch_size=256, shuffle=True)\ndev_loader = torch.utils.data.DataLoader(dev_datasets, batch_size=256, shuffle=True)\ntest_loader = torch.utils.data.DataLoader(test_datasets, batch_size=256, shuffle=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:33:19.341367Z","iopub.execute_input":"2025-04-13T08:33:19.341652Z","iopub.status.idle":"2025-04-13T08:33:32.151287Z","shell.execute_reply.started":"2025-04-13T08:33:19.341634Z","shell.execute_reply":"2025-04-13T08:33:32.150717Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"classes = train_datasets.classes","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:33:32.151960Z","iopub.execute_input":"2025-04-13T08:33:32.152180Z","iopub.status.idle":"2025-04-13T08:33:32.155743Z","shell.execute_reply.started":"2025-04-13T08:33:32.152163Z","shell.execute_reply":"2025-04-13T08:33:32.155201Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\nmodel = resnet18(weights=ResNet18_Weights.DEFAULT)\nmodel.fc = nn.Linear(model.fc.in_features, 10)  \nmodel = model.to(device)\n\n#Optimizer\nlr = 0.1\nepochs = 50\ncriterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.SGD(model.parameters(), lr=lr, momentum=0.9, weight_decay= 0.0001)\n\n\nbest_accuracy = 0.0\npatience = 10\nepochs_no_improve = 0\nbest_model_path = \"best_model.pt\"\n\n#Training\nn_total_steps = len(train_loader)\nfor epoch in range(epochs):\n    running_loss = 0.0\n    model.train()\n    for i, (images, labels) in enumerate(train_loader):\n        images = images.to(device)\n        labels = labels.to(device)\n\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n\n        running_loss += loss.item()\n\n    print(f\"Epoch [{epoch+1}/{epochs}], Loss: {running_loss/len(train_loader):.4f}\")\n\n    # Evaluate on dev set\n    model.eval()\n    n_correct = 0\n    n_samples = 0\n    with torch.no_grad():\n        for images, labels in dev_loader:\n            images = images.to(device)\n            labels = labels.to(device)\n            outputs = model(images)\n            _, predicted = torch.max(outputs, 1)\n            n_correct += (predicted == labels).sum().item()\n            n_samples += labels.size(0)\n\n    dev_acc = 100.0 * n_correct / n_samples\n    print(f\"Accuracy on Dev set: {dev_acc:.2f}%\")\n\n    # Early stopping check\n    if dev_acc > best_accuracy:\n        best_accuracy = dev_acc\n        epochs_no_improve = 0\n        torch.save(model.state_dict(), best_model_path)\n    else:\n        epochs_no_improve += 1\n        \n    if epochs_no_improve >= patience:\n        print(\"Early stopping\")\n        break\n\nprint(\"Training done\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:33:32.156344Z","iopub.execute_input":"2025-04-13T08:33:32.156525Z","iopub.status.idle":"2025-04-13T09:04:28.484872Z","shell.execute_reply.started":"2025-04-13T08:33:32.156510Z","shell.execute_reply":"2025-04-13T09:04:28.484122Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Testing\n\nwith torch.no_grad():\n    n_correct = 0\n    n_samples = 0\n    n_class_correct = [0 for _ in range(10)]\n    n_class_samples = [0 for _ in range(10)]\n\n    for images, labels in test_loader:\n        images = images.to(device)\n        labels = labels.to(device)\n\n        output = model(images)\n        _, predicted = torch.max(output, 1)\n\n        n_samples += labels.size(0)\n        n_correct += (predicted==labels).sum().item()\n\n        for i in range(labels.size(0)):\n            label = labels[i]\n            pred = predicted[i]\n            if label == pred:\n                n_class_correct[label] += 1\n            n_class_samples[label] += 1\n\n    acc = 100.0 * n_correct / n_samples\n    print(f'Accuracy of the network: {acc:.2f}%')\n\n    for i in range(10):\n        acc = 100.0 * n_class_correct[i] / n_class_samples[i]\n        print(f'Accuracy of {classes[i]}: {acc:.2f}%')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T09:04:28.486528Z","iopub.execute_input":"2025-04-13T09:04:28.486750Z","iopub.status.idle":"2025-04-13T09:04:32.437785Z","shell.execute_reply.started":"2025-04-13T09:04:28.486732Z","shell.execute_reply":"2025-04-13T09:04:32.437196Z"}},"outputs":[],"execution_count":null}]}