{"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":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom matplotlib import pyplot as plt\n\nfrom sklearn.model_selection import train_test_split\n\nimport torch\nfrom torch import nn\nfrom torch.nn import functional as F\n\nimport torchvision.transforms as tfs\nfrom torch.utils.data import TensorDataset, DataLoader, Dataset","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-04-20T17:59:15.121515Z","iopub.execute_input":"2024-04-20T17:59:15.121973Z","iopub.status.idle":"2024-04-20T17:59:15.129276Z","shell.execute_reply.started":"2024-04-20T17:59:15.121919Z","shell.execute_reply":"2024-04-20T17:59:15.128021Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_tfs = tfs.Compose([\n    tfs.ToTensor(),\n    tfs.Normalize(0.5, 0.5)\n])","metadata":{"execution":{"iopub.status.busy":"2024-04-20T17:59:15.132249Z","iopub.execute_input":"2024-04-20T17:59:15.132753Z","iopub.status.idle":"2024-04-20T17:59:15.141043Z","shell.execute_reply.started":"2024-04-20T17:59:15.132705Z","shell.execute_reply":"2024-04-20T17:59:15.140259Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = pd.read_csv(\"/kaggle/input/digit-recognizer/train.csv\")\nlabels = train_data['label']\ntrain_data = train_data.drop(columns=[\"label\"])\ntrain_data.head()","metadata":{"execution":{"iopub.status.busy":"2024-04-20T17:59:15.142078Z","iopub.execute_input":"2024-04-20T17:59:15.142501Z","iopub.status.idle":"2024-04-20T17:59:18.432424Z","shell.execute_reply.started":"2024-04-20T17:59:15.142461Z","shell.execute_reply":"2024-04-20T17:59:18.431198Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(8, 8))\nplt.imshow(train_data.to_numpy()[0].reshape((28, 28)), cmap='gray')","metadata":{"execution":{"iopub.status.busy":"2024-04-20T17:59:18.434166Z","iopub.execute_input":"2024-04-20T17:59:18.434565Z","iopub.status.idle":"2024-04-20T17:59:19.058522Z","shell.execute_reply.started":"2024-04-20T17:59:18.434532Z","shell.execute_reply":"2024-04-20T17:59:19.057323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class TrainDataset(Dataset):\n    def __init__(self, data, labels=None, transform=None):\n        self.data, self.labels = data, labels\n        self.transform = transform\n\n    def __len__(self):\n        return self.data.shape[0]\n    \n    def __getitem__(self, index):\n        image = np.expand_dims((self.data[index].reshape(28, 28)), axis=-1)\n        label = None\n        \n        if self.labels is not None:\n            label = self.labels[index]\n            \n        if self.transform is not None:\n            image = self.transform(image)\n            \n        return image, label\n    ","metadata":{"execution":{"iopub.status.busy":"2024-04-20T17:59:19.062805Z","iopub.execute_input":"2024-04-20T17:59:19.063304Z","iopub.status.idle":"2024-04-20T17:59:19.072077Z","shell.execute_reply.started":"2024-04-20T17:59:19.063258Z","shell.execute_reply":"2024-04-20T17:59:19.070880Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = TrainDataset(train_data.to_numpy().astype(np.float32), labels.to_numpy().astype(np.float32), transform=data_tfs)\n\ntrain_size = int(len(train_data) * 0.8)\nval_size = len(train_data) - train_size\n\ntrain_dataset, val_dataset = torch.utils.data.random_split(train_dataset, [train_size, val_size])\n\ntrain_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True, pin_memory=True)\nval_loader = torch.utils.data.DataLoader(val_dataset, batch_size=64, shuffle=False, pin_memory=False)\n\nloaders = {\"train\": train_loader, \"valid\": val_loader}","metadata":{"execution":{"iopub.status.busy":"2024-04-20T17:59:19.073583Z","iopub.execute_input":"2024-04-20T17:59:19.074461Z","iopub.status.idle":"2024-04-20T17:59:19.154501Z","shell.execute_reply.started":"2024-04-20T17:59:19.074419Z","shell.execute_reply":"2024-04-20T17:59:19.153029Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = \"cuda\" if torch.cuda.is_available() else \"cpu\"","metadata":{"execution":{"iopub.status.busy":"2024-04-20T17:59:19.158691Z","iopub.execute_input":"2024-04-20T17:59:19.159595Z","iopub.status.idle":"2024-04-20T17:59:19.165001Z","shell.execute_reply.started":"2024-04-20T17:59:19.159558Z","shell.execute_reply":"2024-04-20T17:59:19.163771Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = nn.Sequential(\n    nn.Conv2d(1, 6, 3, padding=1), #28x28\n    nn.ReLU(),\n    nn.MaxPool2d(2), #14x14\n    nn.Conv2d(6, 16, 3, padding=1), #14x14\n    nn.ReLU(),\n    nn.MaxPool2d(2), #7x7\n    nn.Flatten(),\n    nn.Linear(16 * 7 * 7, 480),\n    nn.ReLU(),\n    nn.Linear(480, 480),\n    nn.ReLU(),\n    nn.Linear(480, 10)\n)\n\nmodel.to(device)\nfLoss = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters())","metadata":{"execution":{"iopub.status.busy":"2024-04-20T17:59:19.166763Z","iopub.execute_input":"2024-04-20T17:59:19.167211Z","iopub.status.idle":"2024-04-20T17:59:19.184726Z","shell.execute_reply.started":"2024-04-20T17:59:19.167172Z","shell.execute_reply":"2024-04-20T17:59:19.183280Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"accurancy = {\"train\": [], \"valid\": []}\nlosses = {\"train\": [], \"valid\": []}\n\nmax_epochs = 10\nfor epoch in range(max_epochs):\n    print(f'Epoch: {epoch + 1}')\n    for k, dataloader in loaders.items():\n        epoch_all = 0\n        epoch_currect = 0\n        epoch_loss = []\n        for x_batch, y_batch in dataloader:\n            x_batch = x_batch.to(device)\n            y_batch = y_batch.type(torch.LongTensor).to(device)\n            if k == \"train\":\n                model.train()\n                outp = model(x_batch)\n            else:\n                model.eval()\n                with torch.no_grad():\n                    outp = model(x_batch)\n            \n            loss = fLoss(outp, y_batch)\n            epoch_loss.append(loss.detach().item())\n            \n            if k == \"train\":\n                optimizer.zero_grad()\n                loss.backward()\n                optimizer.step()\n                    \n            preds = outp.argmax(1)\n            epoch_currect += (preds.flatten() == y_batch).type(torch.float32).sum().item()\n            epoch_all += y_batch.shape[0]\n            \n        acc = epoch_currect/epoch_all\n        loss = np.mean(epoch_loss)\n        losses[k].append(loss)\n        accurancy[k].append(acc)\n        print(f'Loader: {k}, accuracy {acc}, loss: {loss}')","metadata":{"execution":{"iopub.status.busy":"2024-04-20T17:59:19.186322Z","iopub.execute_input":"2024-04-20T17:59:19.186741Z","iopub.status.idle":"2024-04-20T18:01:39.386753Z","shell.execute_reply.started":"2024-04-20T17:59:19.186711Z","shell.execute_reply":"2024-04-20T18:01:39.385646Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(16, 10))\nplt.title(\"accuracy\")\nplt.plot(range(max_epochs), accurancy['train'], label='train', linewidth=2)\nplt.plot(range(max_epochs), accurancy['valid'], label='valid', linewidth=2)\nplt.legend()\nplt.xlabel('epoch')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-04-20T18:01:39.388216Z","iopub.execute_input":"2024-04-20T18:01:39.388573Z","iopub.status.idle":"2024-04-20T18:01:39.760007Z","shell.execute_reply.started":"2024-04-20T18:01:39.388545Z","shell.execute_reply":"2024-04-20T18:01:39.758922Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(16, 10))\nplt.title(\"loss\")\nplt.plot(range(max_epochs), losses['train'], label='train', linewidth=2)\nplt.plot(range(max_epochs), losses['valid'], label='valid', linewidth=2)\nplt.legend()\nplt.xlabel('epoch')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-04-20T18:01:39.761760Z","iopub.execute_input":"2024-04-20T18:01:39.762469Z","iopub.status.idle":"2024-04-20T18:01:40.136598Z","shell.execute_reply.started":"2024-04-20T18:01:39.762430Z","shell.execute_reply":"2024-04-20T18:01:40.135567Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data = pd.read_csv(\"/kaggle/input/digit-recognizer/test.csv\")\ntest_data.head()","metadata":{"execution":{"iopub.status.busy":"2024-04-20T18:01:40.138288Z","iopub.execute_input":"2024-04-20T18:01:40.138908Z","iopub.status.idle":"2024-04-20T18:01:42.082074Z","shell.execute_reply.started":"2024-04-20T18:01:40.138870Z","shell.execute_reply":"2024-04-20T18:01:42.081041Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class TestDataset(Dataset):\n    def __init__(self, data, transform=None):\n        self.data = data\n        self.transform = transform\n\n    def __len__(self):\n        return self.data.shape[0]\n    \n    def __getitem__(self, index):\n        image = np.expand_dims((self.data[index].reshape(28, 28)), axis=-1)\n            \n        if self.transform is not None:\n            image = self.transform(image)\n            \n        return image","metadata":{"execution":{"iopub.status.busy":"2024-04-20T18:01:42.083388Z","iopub.execute_input":"2024-04-20T18:01:42.083700Z","iopub.status.idle":"2024-04-20T18:01:42.091157Z","shell.execute_reply.started":"2024-04-20T18:01:42.083672Z","shell.execute_reply":"2024-04-20T18:01:42.090297Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataset = TestDataset(test_data.to_numpy().astype(np.float32), transform=data_tfs)\ntest_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False, pin_memory=True)","metadata":{"execution":{"iopub.status.busy":"2024-04-20T18:01:42.094904Z","iopub.execute_input":"2024-04-20T18:01:42.095535Z","iopub.status.idle":"2024-04-20T18:01:42.162164Z","shell.execute_reply.started":"2024-04-20T18:01:42.095506Z","shell.execute_reply":"2024-04-20T18:01:42.161106Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result = []\n\nmodel.eval()\nfor x_batch in test_loader:\n    with torch.no_grad():\n        outp = model(x_batch)\n        preds = outp.argmax(1)\n        result += preds.tolist()","metadata":{"execution":{"iopub.status.busy":"2024-04-20T18:01:42.163886Z","iopub.execute_input":"2024-04-20T18:01:42.164326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.read_csv(\"/kaggle/input/digit-recognizer/sample_submission.csv\")\nsubmission.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission['Label'] = result\nsubmission","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv(\"/kaggle/working/submission.csv\", index=None)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}