{"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,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torchvision\nimport torchvision.transforms as transforms\nimport matplotlib.pyplot as plt","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-04-08T12:20:21.771067Z","iopub.execute_input":"2025-04-08T12:20:21.771440Z","iopub.status.idle":"2025-04-08T12:20:21.776539Z","shell.execute_reply.started":"2025-04-08T12:20:21.771410Z","shell.execute_reply":"2025-04-08T12:20:21.775088Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nprint(device)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T12:20:21.777790Z","iopub.execute_input":"2025-04-08T12:20:21.778160Z","iopub.status.idle":"2025-04-08T12:20:21.798761Z","shell.execute_reply.started":"2025-04-08T12:20:21.778127Z","shell.execute_reply":"2025-04-08T12:20:21.797693Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"transform = transforms.Compose([transforms.RandomHorizontalFlip(), transforms.RandomCrop(32, padding=4), transforms.ToTensor(), transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5))])\n\ntrain_dataset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)\ntest_dataset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)\ntrain_loader = torch.utils.data.DataLoader(train_dataset, batch_size=4, shuffle=True)\ntest_loader = torch.utils.data.DataLoader(test_dataset, batch_size=4, shuffle=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T12:20:21.800419Z","iopub.execute_input":"2025-04-08T12:20:21.800749Z","iopub.status.idle":"2025-04-08T12:20:23.757668Z","shell.execute_reply.started":"2025-04-08T12:20:21.800722Z","shell.execute_reply":"2025-04-08T12:20:23.756594Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(train_dataset.classes)\nclasses = ('airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T12:20:23.759131Z","iopub.execute_input":"2025-04-08T12:20:23.759498Z","iopub.status.idle":"2025-04-08T12:20:23.764400Z","shell.execute_reply.started":"2025-04-08T12:20:23.759465Z","shell.execute_reply":"2025-04-08T12:20:23.763465Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#CNN\nclass ConvNet(nn.Module):\n    def __init__(self):\n        super(ConvNet, self).__init__()\n        self.conv1 = nn.Conv2d(3, 6, 5)\n        self.bn1 = nn.BatchNorm2d(6)          \n        self.pool = nn.MaxPool2d(2, 2)\n        self.conv2 = nn.Conv2d(6, 16, 5)\n        self.bn2 = nn.BatchNorm2d(16)         \n\n        self.dropout = nn.Dropout(0.5)        \n\n        self.fc1 = nn.Linear(16 * 5 * 5, 120)\n        self.fc2 = nn.Linear(120, 84)\n        self.fc3 = nn.Linear(84, 10)\n\n    def forward(self, x):\n        x = self.pool(F.relu(self.bn1(self.conv1(x))))  \n        x = self.pool(F.relu(self.bn2(self.conv2(x)))) \n        x = x.view(-1, 16 * 5 * 5)\n        x = F.relu(self.fc1(x))\n        x = self.dropout(x)                             \n        x = F.relu(self.fc2(x))\n        x = self.fc3(x)\n        return x\n\nmodel = ConvNet().to(device)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T12:20:23.765433Z","iopub.execute_input":"2025-04-08T12:20:23.765721Z","iopub.status.idle":"2025-04-08T12:20:23.784728Z","shell.execute_reply.started":"2025-04-08T12:20:23.765699Z","shell.execute_reply":"2025-04-08T12:20:23.783783Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Loss, Optimizer\nepochs = 30\n\ncriterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n# Training\nn_total_steps = len(train_loader)\nfor epoch in range(epochs):\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        if (i+1) % 2000 == 0:\n            print(f'Epoch [{epoch+1}/ {epochs}], Step [{i+1}/{n_total_steps}], Loss: {loss.item():.4f}')\n\nprint('Training done!')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-08T12:20:23.785751Z","iopub.execute_input":"2025-04-08T12:20:23.786100Z","iopub.status.idle":"2025-04-08T13:07:13.702783Z","shell.execute_reply.started":"2025-04-08T12:20:23.786066Z","shell.execute_reply":"2025-04-08T13:07:13.701743Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Testing\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        outputs = model(images)\n\n        _, predicted = torch.max(outputs, 1)\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-08T13:07:13.704767Z","iopub.execute_input":"2025-04-08T13:07:13.705052Z","iopub.status.idle":"2025-04-08T13:07:22.121415Z","shell.execute_reply.started":"2025-04-08T13:07:13.705029Z","shell.execute_reply":"2025-04-08T13:07:22.120563Z"}},"outputs":[],"execution_count":null}]}