{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":16017,"databundleVersionId":708189,"sourceType":"competition"}],"dockerImageVersionId":30919,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nimport pandas as pd\nimport numpy as np\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision.transforms import transforms\nimport matplotlib.pyplot as plt\nfrom torch import nn\nfrom tqdm import tqdm","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-24T19:05:03.547360Z","iopub.execute_input":"2025-02-24T19:05:03.547802Z","iopub.status.idle":"2025-02-24T19:05:03.552164Z","shell.execute_reply.started":"2025-02-24T19:05:03.547774Z","shell.execute_reply":"2025-02-24T19:05:03.551270Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class KannadaMNIST(Dataset):\n    def __init__(self, file_path, transform = None, is_train = True):\n        self.data = pd.read_csv(file_path)\n        self.transform = transform\n        self.is_train = is_train\n    def __len__(self):\n        return len(self.data)\n    def __getitem__(self, index):\n        if self.is_train:\n            image = self.data.iloc[index, 1:].values.astype(np.uint8).reshape(28, 28, 1)\n            label = self.data.iloc[index, 0]\n        else:\n            image = self.data.iloc[index, 1:].values.astype(np.uint8).reshape(28, 28, 1)\n        if self.transform:\n            image = self.transform(image)\n        if self.is_train:\n            return image, label\n        return image","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-24T19:05:03.553517Z","iopub.execute_input":"2025-02-24T19:05:03.553768Z","iopub.status.idle":"2025-02-24T19:05:03.567018Z","shell.execute_reply.started":"2025-02-24T19:05:03.553748Z","shell.execute_reply":"2025-02-24T19:05:03.566334Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"trainDataset = KannadaMNIST(file_path = '/kaggle/input/Kannada-MNIST/train.csv', transform = transforms.ToTensor(), is_train = True)\ntestDataset = KannadaMNIST(file_path = '/kaggle/input/Kannada-MNIST/test.csv', transform = transforms.ToTensor(), is_train = False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-24T19:05:03.568612Z","iopub.execute_input":"2025-02-24T19:05:03.568808Z","iopub.status.idle":"2025-02-24T19:05:06.650600Z","shell.execute_reply.started":"2025-02-24T19:05:03.568791Z","shell.execute_reply":"2025-02-24T19:05:06.649891Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"trainDataloader = DataLoader(\n    dataset = trainDataset,\n    batch_size = 32,\n    shuffle = True,\n    num_workers = 3\n)\ntestDataloader = DataLoader(\n    dataset = testDataset,\n    batch_size = 1,\n    num_workers = 3\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-24T19:05:06.651805Z","iopub.execute_input":"2025-02-24T19:05:06.652088Z","iopub.status.idle":"2025-02-24T19:05:06.656121Z","shell.execute_reply.started":"2025-02-24T19:05:06.652055Z","shell.execute_reply":"2025-02-24T19:05:06.655483Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataIter = iter(trainDataloader)\nimages, labels = next(dataIter)\nimages = images.numpy()\n\nfig = plt.figure(figsize=(30,4))\nfor idx in np.arange(32):\n    ax = fig.add_subplot(2, 16, idx + 1, xticks=[], yticks=[])\n    ax.imshow(np.squeeze(images[idx]), cmap='gray')\n    ax.set_title(str(labels[idx].item()))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-24T19:05:06.656901Z","iopub.execute_input":"2025-02-24T19:05:06.657185Z","iopub.status.idle":"2025-02-24T19:05:08.324102Z","shell.execute_reply.started":"2025-02-24T19:05:06.657153Z","shell.execute_reply":"2025-02-24T19:05:08.323037Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class MLP(nn.Module):\n    def __init__(self, num_classes):\n        super(MLP, self).__init__()\n        self.layer1 = nn.Sequential(\n            nn.Linear(28*28, 512),\n            nn.ReLU()\n        )\n        self.layer2 = nn.Sequential(\n            nn.Linear(512, 256),\n            nn.ReLU()\n        )\n        self.layer3 = nn.Sequential(\n            nn.Linear(256, 128),\n            nn.ReLU()\n        )\n        self.layer4 = nn.Sequential(\n            nn.Linear(128, 64),\n            nn.ReLU()\n        )\n        self.output = nn.Sequential(\n            nn.Linear(64, num_classes)\n        )\n    def forward(self, x):\n        x =x.view(-1, 784)\n        x = self.layer1(x)\n        x = self.layer2(x)\n        x = self.layer3(x)\n        x = self.layer4(x)\n        x = self.output(x)\n        return x","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-24T19:05:08.325170Z","iopub.execute_input":"2025-02-24T19:05:08.325552Z","iopub.status.idle":"2025-02-24T19:05:08.331559Z","shell.execute_reply.started":"2025-02-24T19:05:08.325509Z","shell.execute_reply":"2025-02-24T19:05:08.330828Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = MLP(10)\nprint(model)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-24T19:05:08.332501Z","iopub.execute_input":"2025-02-24T19:05:08.332775Z","iopub.status.idle":"2025-02-24T19:05:08.354815Z","shell.execute_reply.started":"2025-02-24T19:05:08.332755Z","shell.execute_reply":"2025-02-24T19:05:08.354138Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"criterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr = 0.001)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-24T19:05:08.355726Z","iopub.execute_input":"2025-02-24T19:05:08.356008Z","iopub.status.idle":"2025-02-24T19:05:08.360091Z","shell.execute_reply.started":"2025-02-24T19:05:08.355979Z","shell.execute_reply":"2025-02-24T19:05:08.359482Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"num_epochs = 20\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nmodel = model.to(device)\ntrain_loss_min = np.Inf\nfor epoch in range(num_epochs):\n    train_loss = 0.0\n    model.train()\n    for images, labels in tqdm(trainDataloader):\n        optimizer.zero_grad()\n        images = images.to(device)\n        labels = labels.to(device)\n        output = model(images)\n        loss = criterion(output, labels)\n        loss.backward()\n        optimizer.step()\n        train_loss += loss.item()*images.size(0)\n\n    train_loss = train_loss / len(trainDataloader.dataset)\n\n    print('Epoch: {} \\tTraining Loss: {:.4f}'.format(\n        epoch+1, \n        train_loss,\n        ))\n    \n    if train_loss <= train_loss_min:\n        print('Training loss decreased ({:.4f} --> {:.4f}).  Saving model ...'.format(\n        train_loss_min,\n        train_loss))\n        torch.save(model.state_dict(), 'model.pt')\n        train_loss_min = train_loss\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-24T19:05:08.362297Z","iopub.execute_input":"2025-02-24T19:05:08.362570Z","iopub.status.idle":"2025-02-24T19:06:33.790105Z","shell.execute_reply.started":"2025-02-24T19:05:08.362550Z","shell.execute_reply":"2025-02-24T19:06:33.789128Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.load_state_dict(torch.load('model.pt', weights_only=True))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-24T19:06:33.791446Z","iopub.execute_input":"2025-02-24T19:06:33.791709Z","iopub.status.idle":"2025-02-24T19:06:33.803199Z","shell.execute_reply.started":"2025-02-24T19:06:33.791685Z","shell.execute_reply":"2025-02-24T19:06:33.802325Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def predict(model, dataloader):\n    prediction_list = []\n    for i, batch in enumerate(dataloader):\n        outputs = model(batch.to(device))\n        _, predicted = torch.max(outputs.data, 1) \n        prediction_list.append(predicted.cpu())\n    return prediction_list\n    \npredictions = predict(model,testDataloader)\npredictions = np.array(predictions)\npredictions = np.squeeze(predictions)\nprint(predictions)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-24T19:06:33.804392Z","iopub.execute_input":"2025-02-24T19:06:33.804730Z","iopub.status.idle":"2025-02-24T19:06:40.582766Z","shell.execute_reply.started":"2025-02-24T19:06:33.804687Z","shell.execute_reply":"2025-02-24T19:06:40.581761Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data = pd.read_csv(\"/kaggle/input/Kannada-MNIST/test.csv\")\n\n\nsubmission = pd.DataFrame(data={\n    \"id\": test_data.index,\n    \"label\": predictions\n})\nprint(submission)\nsubmission.to_csv(\"submission.csv\", index=None)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-24T19:06:40.584072Z","iopub.execute_input":"2025-02-24T19:06:40.584446Z","iopub.status.idle":"2025-02-24T19:06:40.905811Z","shell.execute_reply.started":"2025-02-24T19:06:40.584388Z","shell.execute_reply":"2025-02-24T19:06:40.904911Z"}},"outputs":[],"execution_count":null}]}