{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Import packages"},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport csv\nimport torch \nfrom torch.utils.data.sampler import SubsetRandomSampler\nfrom torch.utils.data import DataLoader, TensorDataset\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nimport warnings\nwarnings.filterwarnings('ignore')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Load data"},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pd.read_csv('../input/Kannada-MNIST/train.csv')\ntest = pd.read_csv('../input/Kannada-MNIST/test.csv')\nsample = pd.read_csv('../input/Kannada-MNIST/sample_submission.csv')\ndig = pd.read_csv('../input/Kannada-MNIST/Dig-MNIST.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.head(3)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(train.shape)\nprint(test.shape)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Plot a number"},{"metadata":{"trusted":true},"cell_type":"code","source":"num = 4\nplot_num = train.iloc[num, 1:]\nplot_num = np.array(plot_num).reshape(28, -1)\nplt.imshow(plot_num, cmap='gray')\nplt.title(f'Label: {train.iloc[num, 0]}')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Split train indices"},{"metadata":{"trusted":true},"cell_type":"code","source":"def split_indices(n, val_pct):\n    n_val = int(n*val_pct)\n    idx = np.random.permutation(n)\n    return idx[:n_val], idx[n_val:]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"val_idx, train_idx = split_indices(len(train), 0.1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"labels = train.pop('label')\nlabels_train = labels[train_idx]\nlabels_val = labels[val_idx]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Setting hyperparameters"},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_size_train = 64\nbatch_size_val = 1024\n\nlearning_rate = 0.01\nmomentum=0.5\nlog_interval = 10\n\nrandom_seed = 42\ntorch.backends.cudnn.enabled = False\ntorch.manual_seed(random_seed)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_sampler = SubsetRandomSampler(train_idx)\ntrain_loader = DataLoader(train, batch_size_train, sampler = train_sampler)\n\nval_sampler = SubsetRandomSampler(val_idx)\nval_loader = DataLoader(train, batch_size_val, sampler = val_sampler)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_X = train.iloc[train_idx, :].values\nval_X = train.iloc[val_idx, :].values\n\ntrain_X = torch.Tensor(train_X.reshape(train_X.shape[0],1,28,-1))\ntrain_y = torch.Tensor(labels_train)\n\nval_X = torch.Tensor(val_X.reshape(val_X.shape[0],1,28,-1))\nval_y = torch.Tensor(labels_val.values)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dataset = TensorDataset(train_X, train_y)\nval_dataset = TensorDataset(val_X, val_y)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_loader = DataLoader(train_dataset, batch_size = batch_size_train, shuffle = True)\nval_loader = DataLoader(val_dataset, batch_size = batch_size_val, shuffle = True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample = enumerate(val_loader)\nidx, (sample_data, sample_labels) = next(sample)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = plt.figure()\nfor i in range(6):\n    plt.subplot(2,3,i+1)\n    plt.tight_layout()\n    plt.imshow(sample_data[i+11].view(28, -1), cmap = 'gray', interpolation='none')\n    plt.title(f'Ground truth: {sample_labels[i+11]}')\n    plt.xticks([])\n    plt.yticks([])    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"input_size = 28 * 28\nnum_classes = 10\n\nmodel = nn.Linear(input_size, num_classes)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Custom class for CNN"},{"metadata":{"trusted":true},"cell_type":"code","source":"class net(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.conv1 = nn.Conv2d(1, 20, kernel_size = 5)\n        self.conv2 = nn.Conv2d(20, 40, kernel_size = 5)\n        self.conv2_drop = nn.Dropout2d()\n        self.fc1 = nn.Linear(640, 120)\n        self.fc2 = nn.Linear(120, 10)\n        \n    def forward(self, x):\n        x = F.relu(F.max_pool2d(self.conv1(x), 2))\n        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))\n        x = x.view(-1, 640)\n        x = F.relu(self.fc1(x))\n        x = F.dropout(x, training = self.training)\n        x = self.fc2(x)\n        return F.log_softmax(x)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"network = net() #instantiate network\noptimizer = optim.SGD(network.parameters(), lr = learning_rate, momentum = momentum)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_losses = [] \ntrain_counter = []\nval_losses = []\nval_counter = []","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def train(epoch):\n    network.train()\n    for batch_idx, (data, target) in enumerate(train_loader):\n        optimizer.zero_grad()\n        output = network(data)\n        loss = F.nll_loss(output, target.type(torch.LongTensor))\n        loss.backward()\n        optimizer.step()\n        \n        if batch_idx % log_interval == 0:\n            print(f'Train Epoch: {epoch} [{batch_idx*len(data)}/{len(train_loader.dataset)}] \\\n            {100*batch_idx/len(train_loader):.0f},\\tLoss: {loss.item():.6f}')\n            train_losses.append(loss.item())\n            train_counter.append(batch_idx*64 + (epoch-1)*len(train_loader.dataset))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def val():\n    network.eval()\n    val_loss = 0\n    correct = 0\n    \n    with torch.no_grad():\n        for data, target in val_loader:\n            output = network(data)\n            val_loss += F.nll_loss(output, target.type(torch.LongTensor), size_average=False).item()\n            pred = output.data.max(1, keepdim=True)[1]\n            correct += pred.eq(target.data.view_as(pred)).sum()\n            \n    val_loss /= len(val_loader.dataset)\n    val_losses.append(val_loss)\n    print(f'Val set: Avg loss {val_loss:.4f}, Accuracy: {correct}/{len(val_loader.dataset)}, \\\n    ({100*correct/len(val_loader.dataset)})')    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"n_epochs = 3\nval()\nfor epoch in range(1, n_epochs + 1):\n    train(epoch)\n    val()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Generate test predictions"},{"metadata":{"trusted":true},"cell_type":"code","source":"test_ids = test.pop('id')\n\ntest_pred = test.values.reshape(test.shape[0], 1, 28, -1)\ntest_pred = torch.Tensor(test_pred)\n\noutput = network(test_pred)\n\npreds = output.data.max(1)[1]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Make submission"},{"metadata":{"trusted":true},"cell_type":"code","source":"sub = pd.DataFrame()\nsub['id'] = test_ids\nsub['label'] = preds\nsub.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}