{"cells":[{"metadata":{},"cell_type":"markdown","source":"## Importing Libraries"},{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nimport torch\nimport torch.nn as nn\nimport torchvision\nimport torchvision.transforms as transforms\nimport matplotlib.pyplot as plt\n# from scipy.ndimage.interpolation import rotate\n# from sklearn.model_selection import KFold","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.rcParams['image.cmap']='gray'","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Importing data"},{"metadata":{"trusted":true},"cell_type":"code","source":"train=pd.read_csv('../input/digit-recognizer/train.csv')\ntest=pd.read_csv('../input/digit-recognizer/test.csv')","execution_count":null,"outputs":[]},{"metadata":{"heading_collapsed":true},"cell_type":"markdown","source":"## Enquiring data"},{"metadata":{"hidden":true,"trusted":true},"cell_type":"code","source":"print(\"Train data size:\",train.shape,\"\\nTest data size:\",test.shape)","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"trusted":true},"cell_type":"code","source":"train.head()","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"trusted":true},"cell_type":"code","source":"test.head()","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"trusted":true},"cell_type":"code","source":"train.describe()","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"trusted":true},"cell_type":"code","source":"test.describe()","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"trusted":true},"cell_type":"code","source":"# L1,L2=[],[]\n# for i in range(len(train)):\n#     if len(train.iloc[i][1:][train.iloc[i][1:]>255])>0 or len(train.iloc[i][1:][train.iloc[i][1:]<0])>0:\n#         L1.append(train.iloc[i][1:][train.iloc[i][1:]>255])\n\n# for i in range(len(test)):\n#     if len(test.iloc[i][1:][test.iloc[i][1:]>255])>0 or len(test.iloc[i][1:][test.iloc[i][1:]<0])>0:\n#         L2.append(train.iloc[i][1:][train.iloc[i][1:]>255])\n    \n# print(\"Number of data points in train data having invlaid pixel value = %d\\\n# \\nNumber of data points in test data having invalid pixel value = %d\"%(len(L1),len(L2)))","execution_count":null,"outputs":[]},{"metadata":{"heading_collapsed":true},"cell_type":"markdown","source":"## Visualization"},{"metadata":{"trusted":true},"cell_type":"code","source":"x=np.array(train[train.columns[1::]])\nx=x.reshape(x.shape[0],28,28)\ny=np.array(train[train.columns[:1:]])","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"trusted":true},"cell_type":"code","source":"digits=[str(i) for i in range(10)]\nplt.figure(figsize=(7,7))\nnum_digits=8\nfor i,digit in enumerate(digits):\n    selection=np.flatnonzero(y==i)\n    selection=np.random.choice(selection,num_digits,replace=False)\n    for j,selected in enumerate(selection):\n        idx=num_digits*i+j+1\n        plt.subplot(len(digits),num_digits,idx)\n        plt.imshow(x[selected])\n        plt.axis('off')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<i>I tried doing some processing in the below cells but did not yield much difference. You may uncomment and use for yourself.</i>"},{"metadata":{"trusted":true},"cell_type":"code","source":"# def crop_img(array,original_width=32,crop_to_width=28,original_height=32,crop_to_height=28):\n#     return array[(original_width-crop_to_width)//2:original_width-((original_width-crop_to_width)//2),(original_height-crop_to_height)//2:original_height-((original_height-crop_to_height)//2)]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# plt.figure(figsize=(5,10))\n# for i,digit in enumerate(digits):\n#     selection=np.flatnonzero(y==i)\n#     selection=np.random.choice(selection,2,replace=False)\n#     idx=2*i+1\n#     plt.subplot(len(digits),2,idx)\n#     plt.imshow(x[selection[0]])\n#     plt.axis('off')\n#     idx=2*i+2\n#     plt.subplot(len(digits),2,idx)\n#     plt.imshow(crop_img(rotate(x[selection[0]],20)))\n#     plt.axis('off')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# plt.figure(figsize=(5,10))\n# for i,digit in enumerate(digits):\n#     selection=np.flatnonzero(y==i)\n#     selection=np.random.choice(selection,2,replace=False)\n#     idx=2*i+1\n#     plt.subplot(len(digits),2,idx)\n#     plt.imshow(x[selection[0]])\n#     plt.axis('off')\n#     idx=2*i+2\n#     plt.subplot(len(digits),2,idx)\n#     plt.imshow(crop_img(rotate(x[selection[0]],-20)))\n#     plt.axis('off')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Data Processing"},{"metadata":{"trusted":true},"cell_type":"code","source":"# x1=x\n# L=[]\n# for i in range(len(x)):\n#     L.append(crop_img(rotate(x[i],20)))\n# x=np.append(x,L,axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# L=[]\n# for i in range(len(x1)):\n#     L.append(crop_img(rotate(x[i],-20)))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# x=np.append(x,L,axis=0)\n# y1=y\n# y=np.append(y,y,axis=0)\n# y=np.append(y,y1,axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Normalize from 0 to 1\nx=x/255","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x.shape,y.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x=x.reshape(x.shape[0],1,28,28)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x.shape,y.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train,X_test,y_train,y_test=train_test_split(x,y,test_size=0.10,random_state=42)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Model Creation"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Hyperparameters\nnum_epochs = 25\nnum_classes = 10","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Device configuration\ndevice=torch.device('cuda' if torch.cuda.is_available() else 'cpu') # used to run on GPU\ndevice","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# class Flatten(nn.Module):\n#     def forward(self, input):\n#         return input.view(input.size(0), -1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class ConvNet(nn.Module):\n    def __init__(self):\n        super(ConvNet, self).__init__()\n        self.passconv=nn.Sequential(\n        nn.Conv2d(1, 32, kernel_size=3, stride=1),\n        nn.ReLU(inplace=True),\n        nn.BatchNorm2d(32),\n        nn.Conv2d(32, 32, kernel_size=3, stride=1),\n        nn.ReLU(inplace=True),\n        nn.BatchNorm2d(32),\n#         nn.Dropout(),\n        nn.MaxPool2d(kernel_size=2, stride=2),\n        nn.Conv2d(32,64,kernel_size=3,stride=1),\n        nn.ReLU(inplace=True),\n        nn.BatchNorm2d(64),\n        nn.Conv2d(64,64,kernel_size=3,stride=1),\n        nn.ReLU(inplace=True),\n        nn.BatchNorm2d(64),\n#         nn.Dropout(),\n        nn.MaxPool2d(kernel_size=2,stride=2)\n        )\n        self.fcpass=nn.Sequential(\n        nn.Linear(4*4*64, 256),\n        nn.Linear(256,10)\n        )\n\n\n    def forward(self,x):\n        out=self.passconv(x)\n        out=out.reshape(-1,out.shape[0]*out.shape[1]*out.shape[2]*out.shape[3])\n        out=self.fcpass(out)\n        return out","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model=ConvNet().to(device)\n\n# Loss and optimizer\ncriterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# X_train.shape[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# X_train=X_train.reshape(X_train.shape[0],1,28,28)\n# X_train.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# y_train.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# cv = KFold(n_splits=5, random_state=42, shuffle=False)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Training the model"},{"metadata":{"trusted":true},"cell_type":"code","source":"# for train_index,test_index in cv.split(x):\n#     print(\"Train Index: \", train_index)\n#     print(\"Test Index: \", test_index)\n#     X_train, X_test, y_train, y_test = x[train_index], x[test_index], y[train_index], y[test_index]\n    # Train the model\ntotal_step = len(X_train)\nloss_list = []\nacc_list = []\nlabels=torch.tensor(y_train,dtype=torch.long)\nX_train=torch.tensor(X_train,dtype=torch.float)\nfor epoch in range(num_epochs):\n    total_ans=0\n    correct_ans=0\n    for i,images in enumerate(X_train):\n        # Run the forward pass\n        images=images.unsqueeze(0)\n        image,label=images.to(device),labels[i].to(device)\n        outputs = model(image)\n        loss = criterion(outputs, label)\n        loss_list.append(loss.item())\n\n        # Backprop and perform Adam optimisation\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        # Track the accuracy\n        total_ans+=1\n        _, predicted = torch.max(outputs.data, 1)\n        correct = (predicted == label).sum().item()\n        correct_ans+=correct\n        acc_list.append(correct_ans/total_ans)\n        if (i + 1) % 100 == 0:\n            print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}, Accuracy: {:.2f}%'\n                    .format(epoch + 1, num_epochs, i + 1, total_step, loss.item(),\n                            (correct_ans / total_ans) * 100))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"total_ans","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"# Test the model\ntotal_step = len(X_test)\nlabels=torch.tensor(y_test,dtype=torch.long)\nX_test=torch.tensor(X_test,dtype=torch.float)\nwith torch.no_grad():\n    total_ans=0\n    correct_ans=0\n    for i,images in enumerate(X_test):\n        # Run the forward pass\n        images=images.unsqueeze(0)\n        image,label=images.to(device),labels[i].to(device)\n        outputs = model(image)\n\n\n        # Track the accuracy\n        total_ans+=1\n        _, predicted = torch.max(outputs.data, 1)\n        correct = (predicted == label).sum().item()\n        correct_ans+=correct\n\n        if (i + 1) % 100 == 0:\n            print('Step [{}/{}], Loss: {:.4f}, Accuracy: {:.2f}%'\n                  .format(i + 1, total_step, loss.item(),\n                          (correct_ans / total_ans) * 100))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test.shape","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Predicting for test data"},{"metadata":{"trusted":true},"cell_type":"code","source":"x=test\nx=x/255","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x=x.values.reshape(x.shape[0],1,28,28)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Test the model\ntotal_step = len(x)\nx=torch.tensor(x,dtype=torch.float)\nwith torch.no_grad():\n    predictions=[]\n    for i,images in enumerate(x):\n        # Run the forward pass\n        image=images.unsqueeze(0)\n        image=image.to(device)\n        outputs = model(image)\n\n\n        # Track the accuracy\n        _, predicted = torch.max(outputs.data, 1)\n        predictions.append(predicted.item())\n\n        if (i + 1) % 100 == 0:\n            print('Step [{}/{}]'\n                  .format(i + 1, total_step))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"pd.read_csv('../input/digit-recognizer/sample_submission.csv').head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"index=[i for i in range(1,test.shape[0]+1)]\nindex[-1]","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"df=pd.DataFrame({'ImageId':index,'Label':predictions})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# import the modules we'll need\nfrom IPython.display import HTML\nimport pandas as pd\nimport numpy as np\nimport base64\n\n# function that takes in a dataframe and creates a text link to  \n# download it (will only work for files < 2MB or so)\ndef create_download_link(df, title = \"Download CSV file\", filename = \"cnn_ans.csv\"):  \n    csv = df.to_csv(index=False)\n    b64 = base64.b64encode(csv.encode())\n    payload = b64.decode()\n    html = '<a download=\"{filename}\" href=\"data:text/csv;base64,{payload}\" target=\"_blank\">{title}</a>'\n    html = html.format(payload=payload,title=title,filename=filename)\n    return HTML(html)\n\n\n# create a link to download the dataframe\ncreate_download_link(df)\n\n# ↓ ↓ ↓  Yay, download link! ↓ ↓ ↓","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Reference: https://www.kaggle.com/rtatman/download-a-csv-file-from-a-kernel"},{"metadata":{"trusted":true},"cell_type":"code","source":"df.to_csv('cnn_ans.csv',index=False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.6.5"}},"nbformat":4,"nbformat_minor":1}