{"cells":[{"metadata":{"_uuid":"98bee7eaf09d225730006f2b24ca5662d28cfb65"},"cell_type":"markdown","source":"# Kaggle- Multilayered Perceptron (MLP) implemention on MNIST dataset\nUntill now we were using the MNIST dataset that is available in torchvision.dataset.Let us now load the dataset from Kaggle repo and train our model"},{"metadata":{"_uuid":"4e83a9e422c10eb07cbfb779be01803d2b8a5334","trusted":true},"cell_type":"code","source":"import os\nfrom pathlib import Path\nimport torch\nfrom torch.utils.data import TensorDataset ,DataLoader\nfrom torch import nn,optim\nimport torch.nn.functional as F\nimport numpy as np\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split\nPATH=Path(\"../input/digit-recognizer\")\nprint(os.listdir(\"../input/digit-recognizer\"))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"661e23266c2c882d34cdae4c9074d26c0d2ac040"},"cell_type":"markdown","source":"## Load Data "},{"metadata":{"_uuid":"72b61aac15c29fc295d77130b07d1110c9cb1825","trusted":true},"cell_type":"code","source":"train=pd.read_csv(PATH/'train.csv')\ntest=pd.read_csv(PATH/'test.csv')\ntrain.shape,test.shape","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"6d5eb02dbfc5e385ffd113560494e0b2275e5f66"},"cell_type":"markdown","source":"## Extracting Input and Target Variable"},{"metadata":{"_uuid":"858a074c0e1dea92562d0f1bd93ff5302f861643","trusted":true},"cell_type":"code","source":"x=train.drop(\"label\",axis=1)\ny=np.array(train['label'])\nx.shape,y.shape","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"387109d77b8c6f76d4de868158340faf1a38b2dc"},"cell_type":"markdown","source":"## Normalization "},{"metadata":{"_uuid":"b8ff683f50227c31ee39ec05a7bb8b4e2a8c5f94","trusted":true},"cell_type":"code","source":"#x_train=x/255","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"614e6245bdf2e3372dca00d5111b3fbe8e993a64"},"cell_type":"markdown","source":"## Train Test Split"},{"metadata":{"trusted":true,"_uuid":"65e189e8b8c6232146d0dde1fceb773353ad8389"},"cell_type":"code","source":"#x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.15)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8f37069db924850a07cd3e98378ae9c61bab1f8f"},"cell_type":"markdown","source":"## Train Test in Pytorch"},{"metadata":{"trusted":true,"_uuid":"709aaea373c664fad6fd42d8779ae091145b8308"},"cell_type":"code","source":"'''\n# create feature and targets tensor for train set.\ntorch_X_train = torch.from_numpy(x_train.values).type(torch.FloatTensor)\ntorch_y_train = torch.from_numpy(y_train).type(torch.LongTensor)\n\n# create feature and targets tensor for test set.\ntorch_X_test = torch.from_numpy(x_test.values).type(torch.FloatTensor)\ntorch_y_test = torch.from_numpy(y_test).type(torch.LongTensor)\n\n# Pytorch train and test sets\ntrain = torch.utils.data.TensorDataset(torch_X_train,torch_y_train)\ntest = torch.utils.data.TensorDataset(torch_X_test,torch_y_test)\n'''","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"80525db377fe319e7a3fc538ef8b76639c28c995"},"cell_type":"code","source":"'''\nBATCH_SIZE=64\n# data loader\ntrain_loader = torch.utils.data.DataLoader(train, batch_size = BATCH_SIZE, shuffle = False)\ntest_loader = torch.utils.data.DataLoader(test, batch_size = BATCH_SIZE, shuffle = False)\n'''","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"454f4fb8e0a416e60aed471a49850c01a64a77e6"},"cell_type":"markdown","source":"## Train -Test Split -Pytorch"},{"metadata":{"trusted":true,"_uuid":"d616496f4e453322efe8aecfa71b17fcdddaa8dd"},"cell_type":"code","source":"torch_X_train = torch.from_numpy(x.values).type(torch.FloatTensor)/255\ntorch_y_train = torch.from_numpy(y).type(torch.LongTensor)\nmyDataset = torch.utils.data.TensorDataset(torch_X_train,torch_y_train)\nvalid_no  = int(0.2 * len(myDataset))\n# so divide the data into trainset and testset\ntrainSet,testSet = torch.utils.data.random_split(myDataset,(len(myDataset)-valid_no,valid_no))\nprint(f\"len of trainSet {len(trainSet)} , len of testSet {len(testSet)}\")\nbatch_size=64\ntrain_loader  = DataLoader(trainSet , batch_size=batch_size ,shuffle=True) \ntest_loader  = DataLoader(testSet , batch_size=batch_size ,shuffle=True)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"a06249ad57104d74d0258fd5972961f720bdc3cf","trusted":true},"cell_type":"markdown","source":"trainData = torch.from_numpy(x_train.values)\ntrainLabel=torch.from_numpy(y_train)\ntestData = torch.from_numpy(x_test.values)\ntestLabel = torch.from_numpy(y_test)\ntrainData, testData = trainData.type(torch.FloatTensor), testData.type(torch.LongTensor)\ntrainLabel, testLabel = trainLabel.type(torch.FloatTensor), testLabel.type(torch.LongTensor)\ntrainData.shape,testData.shape\ntrainData = trainData.unsqueeze_(dim=1)\ntestData = testData.unsqueeze_(dim=1)\ntrainData.shape,testData.shape\n#transforms =transforms.Compose(transforms.ToTensor())\ntrain_dataset = TensorDataset(trainData,trainLabel)\ntrain_loader = DataLoader(train_dataset,batch_size=64,shuffle=True)\n\ntest_dataset = TensorDataset(testData,testLabel)\ntest_loader = DataLoader(test_dataset,batch_size=64,shuffle=True)"},{"metadata":{"_uuid":"97b2925a24f59b10a16864a76f00e02a4c92b36f"},"cell_type":"markdown","source":"## Network"},{"metadata":{"trusted":true,"_uuid":"8cbe1c508bacadbb875014318a35fed17ab6a3a1"},"cell_type":"code","source":"class Network(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.fc1 = nn.Linear(784,90)\n        #self.fc2 = nn.Linear(150, 50)\n        #self.fc2 = nn.Linear(128, 64)\n        self.fc2 = nn.Linear(90, 10)\n\n        # Dropout module with 0.2 drop probability\n        self.dropout = nn.Dropout(p=0.2)\n\n    def forward(self, x):\n        # make sure input tensor is flattened\n        x = x.view(x.shape[0], -1)\n\n        # Now with dropout\n        x = self.dropout(F.relu(self.fc1(x)))\n        #x = self.dropout(F.relu(self.fc2(x)))\n        #x = self.dropout(F.relu(self.fc3(x)))\n\n        # output so no dropout here\n        x = F.log_softmax(self.fc2(x), dim=1)\n\n        return x\n        \nmodel=Network()\noptimizer=optim.Adam(model.parameters(),lr=0.001)\ncriterion=nn.NLLLoss()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"2bea512cd5bd9f4f41bd77044f471e644505a5fa"},"cell_type":"markdown","source":"## Train "},{"metadata":{"_uuid":"2df4882ed86f9b17b4bba52d56adfde46d1f718d","trusted":true},"cell_type":"code","source":"epochs=9\ntrain_losses,test_losses=[],[]\nfor e in range(epochs):\n    running_loss=0\n    for images,labels in train_loader:\n        optimizer.zero_grad()\n        log_ps=model(images)\n        loss=criterion(log_ps,labels)\n        loss.backward()\n        optimizer.step()\n        running_loss+=loss.item()\n        \n    else:\n        test_loss=0\n        accuracy=0\n        \n        with torch.no_grad():\n            model.eval()\n            for images,labels in test_loader:\n                log_ps=model(images)\n                test_loss+=criterion(log_ps,labels)\n                ps=torch.exp(log_ps)\n                top_p,top_class=ps.topk(1,dim=1)\n                equals=top_class==labels.view(*top_class.shape)\n                accuracy+=torch.mean(equals.type(torch.FloatTensor))\n        model.train()\n        train_losses.append(running_loss/len(train_loader))\n        test_losses.append(test_loss/len(test_loader))\n\n        print(\"Epoch: {}/{}.. \".format(e+1, epochs),\n              \"Training Loss: {:.3f}.. \".format(running_loss/len(train_loader)),\n              \"Test Loss: {:.3f}.. \".format(test_loss/len(test_loader)),\n              \"Test Accuracy: {:.3f}\".format(accuracy/len(test_loader)))    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for param in model.parameters():\n  print(type(param), param.size())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Counting the number of parameters used\nk = 0\nfor i in model.parameters():\n    k = k + i.numel()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"The number of parameters used is :\", k)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"177c548a264bbaaa76e216eeaf1d747db88b1030"},"cell_type":"markdown","source":"# Reference \n\n[Introduction to Pytorch-Udacity](https://github.com/udacity/deep-learning-v2-pytorch/tree/master/intro-to-pytorch)"}],"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}