{"metadata":{"kernelspec":{"language":"python","name":"python3","display_name":"Python 3"},"language_info":{"name":"python","version":"3.10.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":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":30746,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nimport pandas as pd\nimport numpy as np\nfrom torch.utils.data import DataLoader, TensorDataset\n\nclass SimpleCNN(nn.Module):\n    def __init__(self, num_classes: int = 10) -> None:\n        super(SimpleCNN, self).__init__()\n        self.features = nn.Sequential(\n            nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, stride=1, padding=1),\n            nn.ReLU(inplace=True),\n            nn.MaxPool2d(kernel_size=3, stride=1),\n        )\n\n        self.classifier = nn.Sequential(\n            nn.Dropout(),\n            nn.Linear(676, 2048),\n            nn.ReLU(inplace=True),\n            nn.Linear(2048, num_classes),\n        )\n\n    def forward(self, x: torch.Tensor) -> torch.Tensor:\n        x = self.features(x)\n        x = torch.flatten(x, 1)\n        x = self.classifier(x)\n        return x\n\n\ntrain_dataset = pd.read_csv(\"/kaggle/input/digit-recognizer/train.csv\")\n\nX_train = train_dataset.drop('label', axis=1).values.reshape(-1, 1, 28, 28).astype(np.float32)\ny_train = train_dataset['label'].values.astype(np.int64)\n\nX_train = X_train / 255.0\n\nX_train = torch.tensor(X_train)\ny_train = torch.tensor(y_train)\n\ntrain_loader = DataLoader(TensorDataset(X_train, y_train), batch_size=64, shuffle=True)\n\nmodel = SimpleCNN(num_classes=10)\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=0.001)\n\nnum_epochs = 10\n\nfor epoch in range(num_epochs):\n    model.train()\n    running_loss = 0.0\n    correct = 0\n    total = 0\n    \n    for images, labels in train_loader:\n\n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        \n        running_loss += loss.item()\n        _, predicted = torch.max(outputs, 1)\n        total += labels.size(0)\n        correct += (predicted == labels).sum().item()\n    \n    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}, Accuracy: {100 * correct / total:.2f}%')\n\nprint(\"Training complete.\")","metadata":{"execution":{"iopub.status.busy":"2024-08-10T13:37:46.430176Z","iopub.execute_input":"2024-08-10T13:37:46.430567Z","iopub.status.idle":"2024-08-10T13:39:26.396675Z","shell.execute_reply.started":"2024-08-10T13:37:46.430539Z","shell.execute_reply":"2024-08-10T13:39:26.395647Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataset = pd.read_csv(\"/kaggle/input/digit-recognizer/test.csv\")\n\nX_test = test_dataset.values.reshape(-1, 1, 28, 28).astype(np.float32)\nX_test = X_test / 255.0  # Normalize\n\n# Convert to torch tensor\nX_test = torch.tensor(X_test)\n\nmodel.eval()\n\nwith torch.no_grad():\n    outputs = model(X_test)  # Forward pass\n    _, predicted = torch.max(outputs, 1)  # Get the index of the max log-probability\n\nresults = [(i, predicted[i].item()) for i in range(len(predicted))]\n\nresults_df = pd.DataFrame(results, columns=['ImageId', 'Label'])\nresults_df['ImageId'] = results_df['ImageId'] + 1  # ImageId should start from 1\nresults_df.to_csv('/kaggle/working/submission.csv', index=False)\n\nprint(\"Inference complete. Results saved to 'submission.csv'.\")","metadata":{"execution":{"iopub.status.busy":"2024-08-10T13:53:13.726390Z","iopub.execute_input":"2024-08-10T13:53:13.727009Z","iopub.status.idle":"2024-08-10T13:53:17.226600Z","shell.execute_reply.started":"2024-08-10T13:53:13.726979Z","shell.execute_reply":"2024-08-10T13:53:17.225589Z"},"trusted":true},"execution_count":null,"outputs":[]}]}