{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import keras\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport torch\nfrom torch import nn, optim","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test = pd.read_csv(\"../input/digit-recognizer/test.csv\")\ntrain = pd.read_csv(\"../input/digit-recognizer/train.csv\")\n\n# Convert ino numpy arrays\ntrain_y_np = train[\"label\"].to_numpy()\ntrain_x_np = train.drop(columns = [\"label\"], axis = 1).to_numpy()\ntrain_x_np = train_x_np.astype(\"float32\")\n\ntrain_y_np.dtype, train_x_np.dtype, train_x_np.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_x, val_x, train_y, val_y = train_test_split(train_x_np,train_y_np,test_size=0.2,random_state=42)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_x = train_x.reshape(-1,28,28,1)\nval_x = val_x.reshape(-1,28,28,1)\n\ntrain_x.shape, val_x.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img = train_x[7].reshape(28,28)\nplt.imshow(img,cmap='gray')\nplt.title(train_y[7])\nplt.axis(\"off\")\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_x_tensor = torch.from_numpy(train_x)\ntrain_y_tensor = torch.from_numpy(train_y)\n\nval_x_tensor = torch.from_numpy(val_x)\nval_y_tensor = torch.from_numpy(val_y)\n\ntrain_x_tensor = train_x_tensor.permute(0,3,1,2)\nval_x_tensor = val_x_tensor.permute(0,3,1,2)\n\n#Normalize\ntrain_x_tensor = train_x_tensor / 255.0\nval_x_tensor = val_x_tensor / 255.0\n\ntrain = torch.utils.data.TensorDataset(train_x_tensor,train_y_tensor)\ntrain_loader = torch.utils.data.DataLoader(train, batch_size = 256, shuffle = True)\n\nval = torch.utils.data.TensorDataset(val_x_tensor,val_y_tensor)\nval_loader = torch.utils.data.DataLoader(val, batch_size = 256, shuffle = False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Create CNN Model\nclass Net(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, stride=1, padding=1)\n        self.act1 = nn.ReLU()\n        self.pool1 = nn.MaxPool2d(kernel_size=2)\n        \n        self.conv2 = nn.Conv2d(in_channels=32, out_channels=16, kernel_size=3, stride=1, padding=1)\n        self.act2 = nn.ReLU()\n        self.pool2 = nn.MaxPool2d(kernel_size=2)\n        \n        self.fc1 = nn.Linear(16 * 7 * 7, 10) \n    \n    def forward(self, x):\n        out = self.pool1(self.act1(self.conv1(x)))\n        out = self.pool2(self.act2(self.conv2(out)))\n        \n        #Flatten\n        out = out.view(out.size(0), -1)\n\n        #Dense\n        out = self.fc1(out)\n        \n        return out","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import datetime\n\ndef train(n_epochs, optimizer, model, loss_fn, train_loader, val_loader):\n    for epoch in range(1, n_epochs + 1):\n        loss_train = 0.0\n        val_loss = 0.0\n        correct = 0\n        \n        for imgs, labels in train_loader:\n            #imgs, labels = imgs.to(device), labels.to(device)\n            \n            outputs = model(imgs)\n            loss = loss_fn(outputs, labels)\n            \n            optimizer.zero_grad()\n            loss.backward()\n            optimizer.step()\n            \n            loss_train += loss.item() \n            \n        with torch.no_grad():\n            model.eval()\n            for imgs, labels in val_loader:                \n                val_output = model(imgs)\n                val_loss += loss_fn(val_output, labels).item() # sum up batch loss\n                pred = val_output.argmax(dim=1, keepdim= True) # get index of max log-probability\n                correct += pred.eq(labels.view_as(pred)).sum().item() #\n                        \n        if epoch == 1 or epoch % 10 == 0:\n            print('Epoch: {}, Training loss: {}, Validation loss: {}, Accuracy: {}'.format(\n                epoch,\n                loss_train / len(train_loader.dataset),\n                val_loss / len(val_loader.dataset),\n                correct / len(val_loader.dataset)))  ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = Net()\noptimizer = torch.optim.SGD(model.parameters(), lr=0.001)\n#optimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n\nloss_fn = nn.CrossEntropyLoss() \n\ntrain(\n    n_epochs = 200,\n    optimizer = optimizer,\n    model = model,\n    loss_fn = loss_fn,\n    train_loader = train_loader,\n    val_loader = val_loader\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_x = test.to_numpy()\ntest_x = test_x.astype(\"float32\")\n\ntest_x = test_x.reshape(-1,28,28,1)\n\ntest_x.dtype, test_x.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_x_tensor = torch.from_numpy(test_x)/255.0\ntest_x_tensor = test_x_tensor.permute(0,3,1,2)\ntest_x_tensor.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test = torch.utils.data.TensorDataset(test_x_tensor)\ntest_loader = torch.utils.data.DataLoader(test, batch_size = 16, shuffle = False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_predictions(data_loader):\n    model.eval()\n    test_preds = torch.LongTensor()\n    \n    for i, data in enumerate(test_loader):\n        data = data.unsqueeze(1)\n        \n        if torch.cuda.is_available():\n            data = data.cuda()\n            \n        output = conv_model(data)\n        \n        preds = output.cpu().data.max(1, keepdim=True)[1]\n        test_preds = torch.cat((test_preds, preds), dim=0)\n        \n    return test_preds","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n\nmodel.eval()   \nwith torch.no_grad():   \n    ps = model(test_x_tensor)\n    prediction = torch.argmax(ps, 1)\n    print('Prediction',prediction)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_submission = pd.DataFrame(prediction.cpu().tolist(), columns = ['Label'])\ndf_submission['ImageId'] = df_submission.index +1\ndf_submission = df_submission[['ImageId', 'Label']]\ndf_submission.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_submission.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}