{"cells":[{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torchvision\nimport matplotlib.pyplot as plt\nimport torchvision.transforms as transforms\nfrom PIL import Image\nfrom pathlib import Path","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d1088e85cb4268950a46671b4b4fc2fd58863fad"},"cell_type":"code","source":"PATH = Path('../input/')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a8b539a8b87e1c93eab2c317ccd92ef30aaa778c"},"cell_type":"code","source":"def return_label(fileName):\n    df = pd.read_csv(filepath_or_buffer=PATH/fileName)\n    if fileName!='test.csv':\n        label = np.array(df['label'])\n        data = np.array(df[df.columns[1:]], dtype=np.float)\n        new_data = np.reshape(a=data, newshape=(data.shape[0], 28, 28))\n        return new_data, label\n    else:\n        data = np.array(df, dtype=np.float)\n        new_data = np.reshape(a=data, newshape=(data.shape[0], 28, 28))\n        return new_data","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1a1ea6781395827604ac40abb4494890eb9267d8"},"cell_type":"code","source":"trainData, trainLabel = return_label('train.csv')\ntestData = return_label('test.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"39ac8d6d95cdc8b7f7b451b5cf6598b2672719e6"},"cell_type":"code","source":"trainData = trainData/255.\ntrainData = (trainData-0.5)/0.5\n\ntestData = testData/255.\ntestData = (testData-0.5)/0.5\n\ntrainData = torch.from_numpy(trainData).cuda()\ntestData = torch.from_numpy(testData).cuda()\ntrainData, testData = trainData.type(torch.FloatTensor), testData.type(torch.FloatTensor)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c1c1910830c88c2ed06454c352db0910bb097a3c"},"cell_type":"code","source":"trainData","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"efb38eb01ab9a819e6dd2e2d3cd5eb3aa581b3a6"},"cell_type":"code","source":"trainData.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"60b74380f5cf8907d6a418b74ead14b732115308"},"cell_type":"code","source":"trainData = trainData.unsqueeze_(dim=1)\ntestData = testData.unsqueeze_(dim=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"bc2f61efe1b43682c3cb4fc9ac67abeeb93b7b6f"},"cell_type":"code","source":"trainData.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"660933d5f203b6b5e6fa674111821323f6437ac3"},"cell_type":"code","source":"trainDataset = torch.utils.data.TensorDataset(trainData, torch.from_numpy(trainLabel))\ntrain_dl = torch.utils.data.DataLoader(trainDataset, batch_size=100, shuffle=False, num_workers=4)\n\ntest_dl = torch.utils.data.DataLoader(testData, batch_size=100, shuffle=False, num_workers=4)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"dff35af3903abaf6124265335a60f7584be48c7b"},"cell_type":"code","source":"print(len(trainData), len(testData))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"23b60ff931ea4d97c7330fbfc371133d985a056f"},"cell_type":"code","source":"def num_classes(loader):\n    classCount = [0]*10\n    for batch_id, (images, labels) in enumerate(loader):\n        for label in labels:\n            classCount[int(label)]+=1\n    return classCount","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"541b4dc4cd6a06baba0c8ba543ebdae3d85a162c"},"cell_type":"code","source":"classes = [i for i in range(10)]\nclassCount = num_classes(train_dl)\nfig, ax = plt.subplots()\nax.barh(y=classes, width=classCount)\nax.set_xlabel('# of Examples')\nax.set_ylabel('# of Digit Class')\nax.set_title('Train Set')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"69f44d8ab8430075be7cd87eb5588b9a48bc0728"},"cell_type":"code","source":"temp = train_dl.dataset[0][0].numpy()\ntemp = np.reshape(temp, (temp.shape[1], temp.shape[2]))\nplt.imshow(temp)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1213b07e5159da3d64f44ded365af8f2eababf7b"},"cell_type":"code","source":"class Model(nn.Module):\n    def __init__(self):\n        super(Model, self).__init__()\n        self.conv1 = nn.Conv2d(1, 6, 5)\n        self.conv2 = nn.Conv2d(6, 16, 5)\n        self.fc1 = nn.Linear(1024, 120)\n        self.fc2 = nn.Linear(120, 84)\n        self.fc3 = nn.Linear(84, 10)\n    def forward(self, x):\n        x = F.max_pool2d(F.relu(self.conv1(x)), 2)\n        x = F.max_pool2d(F.relu(self.conv2(x)), 1)\n        x = x.view(x.size()[0], -1)\n        x = F.relu(self.fc1(x))\n        x = F.relu(self.fc2(x))\n        x = self.fc3(x)\n        return x","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"be0f65e9bb9be5600375facf79d6fc52c30b0a03"},"cell_type":"code","source":"n1 = Model().cuda()\nn1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3fccee5fa35896332c3b0b63cd05d76ec74fe8d5"},"cell_type":"code","source":"def train(model, mode, decay, criterion, dataloader, optimizer, dictionary, num_epochs=30):    \n    totalLoss = []\n    totalLRs = []\n    correct = 0\n    total = 0\n    LR = 0\n    for epoch in range(num_epochs):\n        if(decay == True):\n            for param in optimizer.param_groups:\n                LR = param['lr'] * (0.1**(epoch//7))\n                param['lr'] = LR\n            totalLRs.append(LR)\n        print(\"Epoch = {}/{} \".format(epoch,num_epochs),end=\" \")\n        for batch_id,(image, label) in enumerate(dataloader):\n            if(mode == True):\n                optimizer.zero_grad()\n                image = torch.autograd.Variable(image)\n                label = torch.autograd.Variable(label)\n                image = image.cuda()\n                label = label.cuda()\n            else:\n                image = torch.autograd.Variable(image)\n                image = image.cuda()\n            output = model.forward(image)\n            if(mode == True):\n                loss = criterion(output,label)\n            _, predictated = torch.max(output.data,1)   \n            if(mode == True):\n                correct += (predictated == label.data).sum()\n                total += label.size(0)\n                loss.backward()\n                optimizer.step()\n            del image,label\n        torch.cuda.empty_cache()\n        print(\"Loss = {:.5f}\".format(loss.item()))\n        totalLoss.append(loss.item())\n    dictionary['totalLoss'] = totalLoss\n    dictionary['correct'] = correct\n    dictionary['totalSize'] = total\n    dictionary['totalLRs'] = totalLRs\n    return model,dictionary","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4b4ef0e60a57c05be6c1e8dd085a33878b7a662a"},"cell_type":"code","source":"optimizer = torch.optim.SGD(n1.parameters(), lr=0.1)\ncriterion = nn.CrossEntropyLoss().cuda()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3e275f2a55c673f287f409a893ad70c725da03ee","scrolled":true},"cell_type":"code","source":"dictModel = {}\nn1, dictModel = train(model=n1, mode=True, decay=True, \n                      criterion=criterion, dataloader=train_dl, optimizer=optimizer, \n                      dictionary=dictModel, num_epochs=50)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"aefe649d2e41253a37d29d8c2d7654a434f4ab65"},"cell_type":"code","source":"plt.plot(dictModel['totalLoss'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"4d65119bf69006300e6ab41145f3946e783048b6"},"cell_type":"code","source":"optimizer = torch.optim.SGD(n1.parameters(),lr=0.01)\ncriterion = nn.CrossEntropyLoss().cuda()\n\ndictModel = {}\nn1, dictModel = train(model=n1,mode=True,decay=False,criterion=criterion,dataloader=train_dl,\n                            optimizer=optimizer,dictionary=dictModel,num_epochs=20)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e189c28522f0f382880dfb61a94bf0eba6b99237"},"cell_type":"code","source":"plt.plot(dictModel['totalLoss'])\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.title('Train Dataset')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f12178a5b86b51f49c35e005314f4d9ceef8ad63"},"cell_type":"code","source":"avgLossTest = []\ntotalPrediction = []\nfor id, image in enumerate(test_dl):\n    image = torch.autograd.Variable(image).cuda()\n    output = n1(image)\n    _, predictated = torch.max(output.data, 1)\n    totalPrediction.append(predictated)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"87f1aeb6d85ffb2e4b79d5e43a6e81914d3bf79c"},"cell_type":"code","source":"len(totalPrediction)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"41b778d52f47da30c21b0d62142c001c659c2c2f"},"cell_type":"code","source":"len(testData)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"22bc72bca1aea9c51443e97a6aba4864ab1b3685"},"cell_type":"code","source":"plt.imshow(test_dl.dataset[0][0]), totalPrediction[0][0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6366ff6a90ab2ab96d4554293e61ba336fd0e0b3"},"cell_type":"code","source":"test_dl.dataset","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5f53c301f5e4c4ef5c6de7851ed68b4e5d8f960e"},"cell_type":"code","source":"plt.imshow(test_dl.dataset[1][0]), totalPrediction[1][0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6cb22d4a6e73db02445c94fa91c5a6dab1673dd5"},"cell_type":"code","source":"temp = [list(x.cpu().numpy()) for x in totalPrediction]\nLabel = []\nfor x in temp:\n    for y in x:\n        Label.append(y)\nImageId = [t for t in range(1, 28001)]\nlen(ImageId)\ndfDict = {'ImageId':ImageId, 'Label':Label}\ndf = pd.DataFrame(dfDict)\ndf.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"85f1e2d8d4e2c10bdcf8afecaf655f6938a1c469"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}