{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":30646,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nfrom torchvision import datasets\nfrom torch.utils.data import Dataset,DataLoader\nfrom torchvision.transforms import ToTensor\nimport torch.nn as nn\nfrom matplotlib import pyplot as plt\nimport pandas as pd\nimport numpy as np","metadata":{"execution":{"iopub.status.busy":"2024-02-03T13:55:43.854916Z","iopub.execute_input":"2024-02-03T13:55:43.855890Z","iopub.status.idle":"2024-02-03T13:55:43.861275Z","shell.execute_reply.started":"2024-02-03T13:55:43.855852Z","shell.execute_reply":"2024-02-03T13:55:43.860472Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if torch.cuda.is_available():\n    device = torch.device('cuda')\nelse:\n    device = torch.device('cpu')\nprint(device)","metadata":{"execution":{"iopub.status.busy":"2024-02-03T13:55:45.613397Z","iopub.execute_input":"2024-02-03T13:55:45.614123Z","iopub.status.idle":"2024-02-03T13:55:45.620658Z","shell.execute_reply.started":"2024-02-03T13:55:45.614084Z","shell.execute_reply":"2024-02-03T13:55:45.619129Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CustomTrainDataset(Dataset):\n    def __init__(self,path,transform):\n        super().__init__()\n        self.data = pd.read_csv(path,header='infer').values\n        self.length = self.data.shape[0]\n        self.transform = transform\n    \n    def __len__(self):\n        return self.length\n    \n    def __getitem__(self,idx):\n        flatimage = self.data[idx,1:].astype(np.float32)\n        image = self.transform(np.reshape(flatimage,(28,28,1)))\n        label = self.data[idx,0]\n        return image,label\n    \n\n\nclass CustomTestDataset(Dataset):\n    def __init__(self,path,transform):\n        super().__init__()\n        self.data = pd.read_csv(path,header = 'infer').values\n        self.length = self.data.shape[0]\n        self.transform = transform\n    \n    def __len__(self):\n        return self.length\n    \n    def __getitem__(self,idx):\n        flatimage = self.data[idx,:].astype(np.float32)\n        image = self.transform(np.reshape(flatimage,(28,28,1)))\n        return image","metadata":{"execution":{"iopub.status.busy":"2024-02-03T13:56:09.968039Z","iopub.execute_input":"2024-02-03T13:56:09.968729Z","iopub.status.idle":"2024-02-03T13:56:09.978906Z","shell.execute_reply.started":"2024-02-03T13:56:09.968693Z","shell.execute_reply":"2024-02-03T13:56:09.977877Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = CustomTrainDataset('/kaggle/input/digit-recognizer/train.csv',ToTensor())\ntest_dataset = CustomTestDataset('/kaggle/input/digit-recognizer/test.csv',ToTensor())","metadata":{"execution":{"iopub.status.busy":"2024-02-03T13:56:11.721667Z","iopub.execute_input":"2024-02-03T13:56:11.722086Z","iopub.status.idle":"2024-02-03T13:56:14.260707Z","shell.execute_reply.started":"2024-02-03T13:56:11.722057Z","shell.execute_reply":"2024-02-03T13:56:14.259194Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 64\ntrain_dl = DataLoader(\n    dataset = train_dataset,\n    batch_size = batch_size,\n    shuffle = True\n)\ntest_dl = DataLoader(\n    dataset = test_dataset,\n    batch_size = batch_size\n)","metadata":{"execution":{"iopub.status.busy":"2024-02-03T13:56:23.398645Z","iopub.execute_input":"2024-02-03T13:56:23.399939Z","iopub.status.idle":"2024-02-03T13:56:23.405775Z","shell.execute_reply.started":"2024-02-03T13:56:23.399904Z","shell.execute_reply":"2024-02-03T13:56:23.404231Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CNN_Model(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.relu = nn.ReLU()\n        self.conv1 = nn.Conv2d(in_channels = 1, out_channels = 8, stride = 1, kernel_size = (3,3), padding = 0)\n        self.batch1 = nn.BatchNorm2d(8)\n        self.pool1 = nn.MaxPool2d(stride = 2, kernel_size = (2,2), padding = 0)\n        self.conv2 = nn.Conv2d(in_channels = 8, out_channels = 16, stride = 1, kernel_size = (3,3), padding = 0)\n        self.batch2 = nn.BatchNorm2d(16)\n        self.conv3 = nn.Conv2d(in_channels = 16, out_channels = 32, stride = 1, kernel_size = (3,3), padding = 0)\n        self.batch3 = nn.BatchNorm2d(32)\n        self.conv4 = nn.Conv2d(in_channels = 32, out_channels = 64, stride = 1, kernel_size = (3,3), padding = 0)\n        self.batch4 = nn.BatchNorm2d(64)\n        self.flatten = nn.Flatten()\n        self.linear = nn.Linear(in_features = 3136,out_features = 10)\n        self.batch5 = nn.BatchNorm1d(10)\n    \n    def forward(self,x):\n        x = self.conv1(x)\n        x = self.batch1(x)\n        x = self.relu(x)\n        x = self.pool1(x)\n        x = self.conv2(x)\n        x = self.batch2(x)\n        x = self.relu(x)\n        x = self.conv3(x)\n        x = self.batch3(x)\n        x = self.relu(x)\n        x = self.conv4(x)\n        x = self.batch4(x)\n        x = self.relu(x)\n        x = self.flatten(x)\n        x = self.linear(x)\n        x = self.batch5(x)\n        return x\n        \n        ","metadata":{"execution":{"iopub.status.busy":"2024-02-03T13:56:25.676318Z","iopub.execute_input":"2024-02-03T13:56:25.676677Z","iopub.status.idle":"2024-02-03T13:56:25.688376Z","shell.execute_reply.started":"2024-02-03T13:56:25.676650Z","shell.execute_reply":"2024-02-03T13:56:25.686151Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train_one_epoch(model,train,loss_fn,optimizer):\n    model.train()\n    track_loss = 0\n    num_corr = 0\n    for i,(imgs,labels) in enumerate(train):\n        imgs = imgs.to(device)\n        labels = labels.to(device)\n        pred = model(imgs)\n        loss = loss_fn(pred,labels)\n        track_loss = track_loss + loss.item()\n        num_corr = num_corr + (torch.argmax(pred,dim = 1)==labels).type(torch.float).sum().item()\n        loss.backward()\n        optimizer.step()\n        optimizer.zero_grad()\n    \n    if i%100:\n        running_loss = round(track_loss/(i+1),2)\n        running_acc=round((num_corr/((i+1)*batch_size))*100,2)\n\n        print(\"Batch:\", i+1, \"/\",len(train), \"Running Loss:\",running_loss, \"Running Accuracy:\",running_acc)\n    epoch_loss=track_loss/len(train) \n    epoch_acc=(num_corr/len(train.dataset))*100    \n    return round(epoch_loss,2), round(epoch_acc,2)\n                            \n                            \ndef eval(model,test,loss_fn,path):\n    model.eval()\n    data = pd.read_csv(path)\n    with torch.no_grad():\n        for i, imgs in enumerate(test):\n            imgs=imgs.to(device)\n            pred=model(imgs)\n            \n            pred=torch.argmax(pred,dim=1).type(torch.int).cpu()\n            data.iloc[i*batch_size:i*batch_size+batch_size ,1]=pred.numpy()\n    \n    data.to_csv('submission.csv', index=False)\n    data.head()\n                            \n \n                    \n                            \n","metadata":{"execution":{"iopub.status.busy":"2024-02-03T13:46:54.697408Z","iopub.execute_input":"2024-02-03T13:46:54.697824Z","iopub.status.idle":"2024-02-03T13:46:54.711427Z","shell.execute_reply.started":"2024-02-03T13:46:54.697775Z","shell.execute_reply":"2024-02-03T13:46:54.709047Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model=CNN_Model()\nmodel=model.to(device)\nloss_fn=nn.CrossEntropyLoss()\nlr=0.001\n\noptimizer=torch.optim.Adam(params=model.parameters(), lr=lr)\nn_epochs=30\n\nfor i in range(n_epochs):\n    print(\"Epoch No:\",i+1)\n    train_epoch_loss, train_epoch_acc=train_one_epoch(model,train_dl,loss_fn,optimizer)\n    print(\"Training:\", \"Epoch Loss:\", train_epoch_loss, \"Epoch Accuracy:\", train_epoch_acc)\n    print(\"--------------------------------------------------\")\n\neval(model,test_dl,loss_fn, '/kaggle/input/digit-recognizer/sample_submission.csv')\n                            ","metadata":{"execution":{"iopub.status.busy":"2024-02-03T13:59:28.735416Z","iopub.execute_input":"2024-02-03T13:59:28.735751Z","iopub.status.idle":"2024-02-03T14:05:04.801292Z","shell.execute_reply.started":"2024-02-03T13:59:28.735724Z","shell.execute_reply":"2024-02-03T14:05:04.799832Z"},"trusted":true},"execution_count":null,"outputs":[]}]}