{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"from torchvision import datasets,transforms\nfrom torch.utils.data import TensorDataset, DataLoader,Dataset\nfrom torch import nn,optim\nimport torch.nn.functional as F\nimport torchvision.transforms.functional as FF\nimport torch \nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class NeuralNetwork(nn.Module):\n    def __init__(self):\n        # Super function. It inherits from nn.Module and we can access everythink in nn.Module\n        super().__init__()\n        \n        self.conv1 = nn.Sequential(\n            nn.Conv2d(1, 32, kernel_size=3),\n            nn.BatchNorm2d(32),\n            nn.ReLU(inplace=True), # inplace=True helps to save some memory\n            \n            nn.Conv2d(32, 32, kernel_size=3),\n            nn.BatchNorm2d(32),\n            nn.ReLU(inplace=True),\n            \n            nn.Conv2d(32, 32, kernel_size=5, stride=2, padding=14), # compute same padding by hand\n            nn.BatchNorm2d(32),\n            nn.ReLU(inplace=True),\n            \n            nn.MaxPool2d(2, 2),\n            nn.Dropout2d(0.25)\n        )\n        \n        self.conv2 = nn.Sequential(\n            nn.Conv2d(32, 64, kernel_size=3),\n            nn.BatchNorm2d(64),\n            nn.ReLU(inplace=True), # inplace=True helps to save some memory\n            \n            nn.Conv2d(64, 64, kernel_size=3),\n            nn.BatchNorm2d(64),\n            nn.ReLU(inplace=True),\n            \n            nn.Conv2d(64, 64, kernel_size=5, stride=2, padding=6), # compute same padding by hand\n            nn.BatchNorm2d(64),\n            nn.ReLU(inplace=True),\n            \n            nn.MaxPool2d(2, 2),\n            nn.Dropout2d(0.25)\n        )\n        \n        self.conv3 = nn.Sequential(\n            nn.Conv2d(64, 128, kernel_size=4),\n            nn.BatchNorm2d(128),\n            nn.ReLU(inplace=True),\n            nn.Dropout2d(0.25)\n        )\n        \n        self.fc = nn.Sequential(\n            nn.Linear(128*1*1, 10)\n        )\n        \n    def forward(self, x):\n        x = self.conv1(x)\n        x = self.conv2(x)\n        x = self.conv3(x)\n        x = x.view(-1, 128*1*1)\n        x = self.fc(x)\n        \n        return x","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class MNIST_data(Dataset):\n    \"\"\"MNIST dtaa set\"\"\"\n    \n    def __init__(self, file_path, \n                 transform = transforms.Compose([transforms.ToPILImage(), transforms.ToTensor(), \n                     transforms.Normalize(mean=(0.5,), std=(0.5,))])\n                ):\n        \n        df = pd.read_csv(file_path)\n        \n        if len(df.columns) == 784:\n            # test data\n            self.X = df.values.reshape((-1,28,28)).astype(np.uint8)[:,:,:,None]\n            self.y = None\n        else:\n            # training data\n            self.X = df.iloc[:,1:].values.reshape((-1,28,28)).astype(np.uint8)[:,:,:,None]\n            self.y = torch.from_numpy(df.iloc[:,0].values)\n            \n        self.transform = transform\n    \n    def __len__(self):\n        return len(self.X)\n\n    def __getitem__(self, idx):\n        if self.y is not None:\n            return self.transform(self.X[idx]), self.y[idx]\n        else:\n            return self.transform(self.X[idx])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!ls \"../input/\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_size = 64\n\ntrain_dataset = MNIST_data('../input/digit-recognizer/train.csv', transform= transforms.Compose(\n                            [transforms.ToPILImage(),transforms.ToTensor(), transforms.Normalize(mean=(0.5,), std=(0.5,))]))\ntest_dataset = MNIST_data('../input/digit-recognizer/test.csv')\n\ntrain_size = int(0.85 * len(train_dataset))\nvalid_size=int(0.15*len(train_dataset))\n\ntrain_dataset,valid_dataset = torch.utils.data.random_split(train_dataset, [train_size,valid_size])\n\ntrain_loader = torch.utils.data.DataLoader(dataset=train_dataset,\n                                           batch_size=batch_size, shuffle=True)\n\nvalid_loader = torch.utils.data.DataLoader(dataset=valid_dataset,\n                                           batch_size=batch_size, shuffle=True)\n\n\ntest_loader = torch.utils.data.DataLoader(dataset=test_dataset,\n                                           batch_size=batch_size, shuffle=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dftrain=pd.read_csv(\"../input/digit-recognizer/train.csv\")\ndftest=pd.read_csv(\"../input/digit-recognizer/test.csv\")\nsubmission=pd.read_csv(\"../input/digit-recognizer/sample_submission.csv\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dftrain.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train=np.array(dftrain.iloc[:,1:])\nlabels=dftrain['label']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = plt.figure()\nfor i in range(3):\n    plt.subplot(2,3,i+1)\n    plt.tight_layout()\n    plt.imshow(train[i].reshape(28,28), cmap='gray', interpolation='none')\n    plt.title(\"Ground Truth: {}\".format(labels[i]))\n    plt.xticks([])\n    plt.yticks([])\nfig","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model=NeuralNetwork().cuda()\nprint(model)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"optimizer=optim.Adam(model.parameters(),lr=0.0003)\ncrit=nn.CrossEntropyLoss()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Train Data\n\nepochs=30\nstep=0\ntrain_losses,test_losses,accu=[],[],[]\nfor i in range(epochs):\n    running_loss=0\n    for images,labels in train_loader:\n        images,labels=images.cuda(),labels.cuda()\n        optimizer.zero_grad()\n        logps=model(images)\n        loss=crit(logps,labels)\n        loss.backward()\n        optimizer.step()\n        running_loss+=loss.item()\n    else:\n        test_loss=0\n        accuracy=0\n        \n        #Turn off gradient for validation ,saves momery and computation\n        \n        with torch.no_grad():\n            model.eval()\n            for images,labels in valid_loader:\n                images,labels=images.cuda(),labels.cuda()\n                logps=model(images)\n                test_loss+=crit(logps,labels)\n                ps=torch.exp(logps)\n                topp,topc=ps.topk(1,dim=1)\n                equal=topc==labels.view(*topc.shape)\n                accuracy+=torch.mean(equal.type(torch.FloatTensor))\n        model.train()\n        \n        train_losses.append(running_loss/len(train_loader))\n        test_losses.append(test_loss/len(valid_loader))\n        accu.append(accuracy)\n        \n        print(\"Epoch: {}/{}\".format(i+1,epochs),\n        \"Training Loss {}\".format(running_loss/len(train_loader)),\n        \"Testing Loss {}\".format(test_loss/len(valid_loader)),\n        \"Accuracy {}\".format(accuracy/len(valid_loader)))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%matplotlib inline\n%config InlineBackend.figure_format='retina'\nplt.plot(train_losses,label='Traning Loss')\nplt.plot(test_losses,label='Validation Loss')\nplt.legend(frameon=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"pred=[]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"with torch.no_grad():\n    \n    model.eval()\n    for images in test_loader:\n        logps=model(images.cuda())\n        ps=torch.exp(logps)\n        topp,topc=ps.topk(1,dim=1)\n        for i in topc:\n            pred.append(i[0].item())\n        ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission['Label']=pred","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission.to_csv(\"submissionD1.csv\",index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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":1}