{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torchvision.transforms as transforms\nfrom torch.utils.data import TensorDataset, DataLoader\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt\nimport torch.nn.functional as F","metadata":{"execution":{"iopub.status.busy":"2023-08-12T21:31:15.232344Z","iopub.execute_input":"2023-08-12T21:31:15.232707Z","iopub.status.idle":"2023-08-12T21:31:15.239425Z","shell.execute_reply.started":"2023-08-12T21:31:15.232679Z","shell.execute_reply":"2023-08-12T21:31:15.238020Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')","metadata":{"execution":{"iopub.status.busy":"2023-08-12T21:31:15.241109Z","iopub.execute_input":"2023-08-12T21:31:15.241588Z","iopub.status.idle":"2023-08-12T21:31:17.801144Z","shell.execute_reply.started":"2023-08-12T21:31:15.241557Z","shell.execute_reply":"2023-08-12T21:31:17.799947Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(min(df['label']))\nprint(max(df['label']))","metadata":{"execution":{"iopub.status.busy":"2023-08-12T21:31:17.804258Z","iopub.execute_input":"2023-08-12T21:31:17.804758Z","iopub.status.idle":"2023-08-12T21:31:17.820843Z","shell.execute_reply.started":"2023-08-12T21:31:17.804714Z","shell.execute_reply":"2023-08-12T21:31:17.819436Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X, y = df.drop(columns=['label']), df['label']","metadata":{"execution":{"iopub.status.busy":"2023-08-12T21:31:17.822203Z","iopub.execute_input":"2023-08-12T21:31:17.822926Z","iopub.status.idle":"2023-08-12T21:31:17.948856Z","shell.execute_reply.started":"2023-08-12T21:31:17.822894Z","shell.execute_reply":"2023-08-12T21:31:17.947724Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2023-08-12T21:31:17.952284Z","iopub.execute_input":"2023-08-12T21:31:17.953408Z","iopub.status.idle":"2023-08-12T21:31:18.242712Z","shell.execute_reply.started":"2023-08-12T21:31:17.953362Z","shell.execute_reply":"2023-08-12T21:31:18.241447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class SimpleCNN(nn.Module):\n    def __init__(self, dropout_prob=0.5):\n        super(SimpleCNN, self).__init__()\n        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)\n        self.pool = nn.MaxPool2d(2, 2)\n        self.fc1 = nn.Linear(32 * 14 * 14, 128)\n        self.fc2 = nn.Linear(128, 10)\n        self.dropout = nn.Dropout(dropout_prob)\n\n    def forward(self, x):\n        x = self.pool(F.relu(self.conv1(x)))\n        x = x.view(-1, 32 * 14 * 14)\n        x = F.relu(self.fc1(x))\n        x = self.dropout(x) \n        x = self.fc2(x)\n        return x\n\nsimple_model = SimpleCNN()","metadata":{"execution":{"iopub.status.busy":"2023-08-12T21:31:18.244385Z","iopub.execute_input":"2023-08-12T21:31:18.244731Z","iopub.status.idle":"2023-08-12T21:31:18.263068Z","shell.execute_reply.started":"2023-08-12T21:31:18.244701Z","shell.execute_reply":"2023-08-12T21:31:18.261917Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"criterion = nn.CrossEntropyLoss()\noptimizer_simple = optim.Adam(simple_model.parameters(), lr=0.0001)\n#optimizer_deep = optim.Adam(deep_model.parameters(), lr=0.0001)\nnum_epochs = 15\n\ntransform = transforms.Compose([\n    transforms.ToTensor(),  # Convert image to PyTorch tensor\n    transforms.Normalize((0.5,), (0.5,))  # Normalize pixel values to [-1, 1]\n])","metadata":{"execution":{"iopub.status.busy":"2023-08-12T21:31:18.264521Z","iopub.execute_input":"2023-08-12T21:31:18.265736Z","iopub.status.idle":"2023-08-12T21:31:18.273090Z","shell.execute_reply.started":"2023-08-12T21:31:18.265695Z","shell.execute_reply":"2023-08-12T21:31:18.271794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train_tensor = torch.tensor(X_train.values, dtype=torch.float32).unsqueeze(1)\ny_train_tensor = torch.tensor(y_train.values, dtype=torch.long)\n\nX_val_tensor = torch.tensor(X_val.values, dtype=torch.float32).unsqueeze(1)\ny_val_tensor = torch.tensor(y_val.values, dtype=torch.long)\n\ntrain_dataset = TensorDataset(X_train_tensor, y_train_tensor)\nval_dataset = TensorDataset(X_val_tensor, y_val_tensor)\n\ntrain_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)\nval_loader = DataLoader(val_dataset, batch_size=16, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2023-08-12T21:31:18.274523Z","iopub.execute_input":"2023-08-12T21:31:18.274913Z","iopub.status.idle":"2023-08-12T21:31:18.360897Z","shell.execute_reply.started":"2023-08-12T21:31:18.274883Z","shell.execute_reply":"2023-08-12T21:31:18.360025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_losses_simple = []\nval_losses_simple = []\ntrain_accuracies_simple = []\nval_accuracies_simple = []\n\n# Training loop for simple model\nfor epoch in range(num_epochs):\n    simple_model.train()\n    tloss = 0\n    total = 0\n    correct = 0\n    for inputs, labels in train_loader:\n        optimizer_simple.zero_grad()\n        \n        # Reshape the input data to match the expected input shape of the convolutional layer\n        inputs = inputs.view(inputs.size(0), 1, 28, 28)\n        \n        outputs = simple_model(inputs)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer_simple.step()\n        tloss += loss.item()\n        _, predicted = torch.max(outputs.data, 1)\n        total += labels.size(0)\n        correct += (predicted == labels).sum().item()\n        \n    train_loss = tloss / len(train_loader)\n    train_accuracy = 100 * correct / total\n    train_losses_simple.append(train_loss)\n    train_accuracies_simple.append(train_accuracy)\n\n    # Validation\n    simple_model.eval()\n    val_loss = 0.0\n    correct = 0\n    total = 0\n    with torch.no_grad():\n        correct = 0\n        total = 0\n        for inputs, labels in val_loader:\n            inputs = inputs.view(inputs.size(0), 1, 28, 28)\n            outputs = simple_model(inputs)\n            loss = criterion(outputs, labels)\n            \n            val_loss += loss.item()\n            _, predicted = torch.max(outputs.data, 1)\n            total += labels.size(0)\n            correct += (predicted == labels).sum().item()\n        \n        val_loss /= len(val_loader)\n        val_accuracy = 100 * correct / total\n        val_losses_simple.append(val_loss)\n        val_accuracies_simple.append(val_accuracy)\n        print(f'Epoch [{epoch+1}/{num_epochs}], Simple Model - Train Loss: {train_loss:.4f}, Val Loss: {val_loss:.4f}, Train Accuracy: {train_accuracy:.2f}%, Val Accuracy: {val_accuracy:.2f}%')","metadata":{"execution":{"iopub.status.busy":"2023-08-12T21:31:18.362114Z","iopub.execute_input":"2023-08-12T21:31:18.362674Z","iopub.status.idle":"2023-08-12T21:38:02.840772Z","shell.execute_reply.started":"2023-08-12T21:31:18.362644Z","shell.execute_reply":"2023-08-12T21:38:02.839554Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12, 4))\n\nplt.subplot(1, 2, 1)\nplt.plot(train_losses_simple, label='Train')\nplt.plot(val_losses_simple, label='Validation')\nplt.xlabel('Epoch')\nplt.ylabel('Loss')\nplt.title('Simple Model - Training and Validation Loss')\nplt.legend()\n\nplt.subplot(1, 2, 2)\nplt.plot(train_accuracies_simple, label='Train')\nplt.plot(val_accuracies_simple, label='Validation')\nplt.xlabel('Epoch')\nplt.ylabel('Accuracy')\nplt.title('Simple Model - Training and Validation Accuracy')\nplt.legend()\n\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-08-12T21:38:02.843210Z","iopub.execute_input":"2023-08-12T21:38:02.843528Z","iopub.status.idle":"2023-08-12T21:38:03.469101Z","shell.execute_reply.started":"2023-08-12T21:38:02.843502Z","shell.execute_reply":"2023-08-12T21:38:03.468054Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plt.figure(figsize=(12, 4))\n\n# plt.subplot(1, 2, 1)\n# plt.plot(train_losses_d, label='Train')\n# plt.plot(val_losses_d, label='Validation')\n# plt.xlabel('Epoch')\n# plt.ylabel('Loss')\n# plt.title('Deep Model - Training and Validation Loss')\n# plt.legend()\n\n# plt.subplot(1, 2, 2)\n# plt.plot(train_accuracies_d, label='Train')\n# plt.plot(val_accuracies_d, label='Validation')\n# plt.xlabel('Epoch')\n# plt.ylabel('Accuracy')\n# plt.title('Deep Model - Training and Validation Accuracy')\n# plt.legend()\n\n# plt.tight_layout()\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-08-12T21:38:03.471673Z","iopub.execute_input":"2023-08-12T21:38:03.472037Z","iopub.status.idle":"2023-08-12T21:38:03.476727Z","shell.execute_reply.started":"2023-08-12T21:38:03.472007Z","shell.execute_reply":"2023-08-12T21:38:03.475574Z"},"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test = pd.read_csv('/kaggle/input/digit-recognizer/test.csv')\nX_test_tensor = torch.tensor(X_test.values, dtype=torch.float32).view(-1, 1, 28, 28)\n\ntest_dataset = TensorDataset(X_test_tensor)\ntest_loader = DataLoader(test_dataset, batch_size=16, shuffle=False)\n\nsimple_model.eval()\n\nall_predictions = []\n\nwith torch.no_grad():\n    for inputs in test_loader:\n        inp = inputs[0]  \n        outputs = simple_model(inp)\n        _, predicted = torch.max(outputs.data, 1)\n        all_predictions.extend(predicted.cpu().numpy())\n\nall_predictions = np.array(all_predictions)\n\nsubmission_df = pd.DataFrame({\n    'ImageId': range(1, len(all_predictions) + 1), \n    'Label': all_predictions\n})\n\nsubmission_df.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-08-12T21:55:24.376426Z","iopub.execute_input":"2023-08-12T21:55:24.376847Z","iopub.status.idle":"2023-08-12T21:55:30.242590Z","shell.execute_reply.started":"2023-08-12T21:55:24.376817Z","shell.execute_reply":"2023-08-12T21:55:30.241194Z"},"trusted":true},"execution_count":null,"outputs":[]}]}