{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 5GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import torch\nfrom torch import nn\nfrom torch import optim\nimport torch.nn.functional as F\n\nfrom sklearn.model_selection import train_test_split\n\nimport matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.read_csv(\"../input/digit-recognizer/train.csv\",dtype=np.float32)\nprint(df.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_np = df.loc[:,df.columns != \"label\"].values / 255\ny_np = df.loc[:,\"label\"].values","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"feature_train,feature_test,target_train,target_test = train_test_split(X_np,y_np,test_size=0.2,random_state=62)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train = torch.from_numpy(feature_train)\ny_train = torch.from_numpy(target_train).type(torch.LongTensor)\nX_test = torch.from_numpy(feature_test)\ny_test = torch.from_numpy(target_test).type(torch.LongTensor)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = torch.utils.data.TensorDataset(X_train,y_train)\ntest = torch.utils.data.TensorDataset(X_test,y_test)\n\ntrain_loader = torch.utils.data.DataLoader(train,batch_size=256,shuffle=True)\ntest_loader= torch.utils.data.DataLoader(test,batch_size=32,shuffle=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.imshow(X_np[0].reshape(28,28))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class Classifier(nn.Module):\n    \n    def __init__(self):\n        super().__init__()\n        \n        self.fc1 = nn.Linear(784, 512)\n        self.fc2 = nn.Linear(512, 256)\n        self.fc3 = nn.Linear(256, 128)\n        self.fc4 = nn.Linear(128, 64)\n        self.fc5 = nn.Linear(64, 10)\n        \n        self.dropout = nn.Dropout(p=0.2)\n        \n        self.log_softmax = F.log_softmax\n        \n    def forward(self,x):\n        \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        x = self.dropout(F.relu(self.fc4(x)))\n        \n        x = self.log_softmax(self.fc5(x),dim=1)\n        \n        return x","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = Classifier()\n\ncriterion = nn.NLLLoss()\n\noptimizer = optim.Adam(model.parameters(),lr=0.0015)\n\nepoch = 25\nsteps = 0\nprint_every = 50\ntrain_losses, test_losses = [],[]\n\nfor e in range(epoch):\n    running_loss = 0\n    \n    for images,labels in train_loader:\n        \n        steps += 1\n        \n        optimizer.zero_grad()\n        \n        log_ps = model(images)\n        loss = criterion(log_ps,labels)\n        \n        loss.backward()\n        optimizer.step()\n        \n        running_loss += loss.item()\n        \n        \n        \n        if steps % print_every == 0:\n            test_loss = 0\n            accuracy = 0\n            \n            with torch.no_grad():\n                \n                model.eval()\n                \n                for images, labels in test_loader:\n                    \n                    log_ps = model(images)\n                    test_loss += criterion(log_ps,labels)\n                    ps = torch.exp(log_ps)\n                    \n                    top_p, top_class = ps.topk(1,dim=1)\n                    \n                    equal = top_class == labels.view(*top_class.shape)\n                    \n                    accuracy += torch.mean(equal.type(torch.FloatTensor))\n                \n                model.train()\n            \n            train_losses.append(running_loss/len(train_loader))\n            test_losses.append(test_loss/len(test_loader))\n            \n            \n            print(\"Epoch : {} / {}\".format(e+1,epoch),\n                 \"train_loss : {:.3f}\".format(train_losses[-1]),\n                 \"test_loss : {:.3f}\".format(test_losses[-1]),\n                 \"test accuracy : {:.3f}\".format(accuracy / len(test_loader)))               ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for img, label in train_loader:\n    \n    with torch.no_grad():\n        logps = model(img)\n    \n    ps = torch.exp(logps)\n    \ntop_p,top_class = ps.topk(1,dim=1)   \n\n\nfig, ax = plt.subplots(4,4,figsize=(32,32))\n\n\narg = ps[0].argmax()\n\nn1 = 0\n\nfor i in range(0,4):\n    \n    for j in range(0,4):\n        \n        ax[i][j].imshow(img[n1].reshape(28,28))\n        ax[i][j].axis(\"off\")\n        ax[i][j].set_title(\"{}\".format(top_class[n1]),fontsize=15,color=\"Green\")\n        n1 += 1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"result_np = pd.read_csv(\"../input/digit-recognizer/test.csv\",dtype=np.float32).values / 255\nsubmission = pd.read_csv(\"../input/digit-recognizer/sample_submission.csv\")\nresult = torch.from_numpy(result_np)\n\nresult_loader = torch.utils.data.DataLoader(result,batch_size=100,shuffle=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(result_np.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"results = []\nwith torch.no_grad():\n    \n    for img in result_loader:\n        \n        logps = model(img)\n        ps = torch.exp(logps)\n        top_k,top_class = ps.topk(1,dim=1)\n      \n        \n        results += top_class.numpy().tolist()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission.drop(labels=[\"Label\"],axis=1,inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"results_frame = pd.DataFrame(results,columns=[\"Label\"])\nfinal = submission.join(results_frame)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"final","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"final.to_csv('mnist_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}