{"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":"none","dataSources":[{"sourceId":16017,"databundleVersionId":708189,"sourceType":"competition"}],"dockerImageVersionId":30635,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nfrom torch.utils.data import DataLoader, Dataset\nimport torchvision\nimport torchvision.transforms as transforms\nfrom torch.utils.data.sampler import SubsetRandomSampler\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-01-13T04:12:39.321483Z","iopub.execute_input":"2024-01-13T04:12:39.321819Z","iopub.status.idle":"2024-01-13T04:12:43.990766Z","shell.execute_reply.started":"2024-01-13T04:12:39.321791Z","shell.execute_reply":"2024-01-13T04:12:43.989596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class TrainKannada(Dataset):\n    \n    def __init__(self, file_path, transform=None):\n        \n        self.data = pd.read_csv(file_path)\n        self.transform = transform\n        \n    def __len__(self):\n        return len(self.data)\n    \n    def __getitem__(self, index):\n        \n        image = self.data.iloc[index, 1:].values.astype(np.uint8).reshape((28, 28, 1))\n        label = self.data.iloc[index, 0]\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-01-13T04:12:43.993586Z","iopub.execute_input":"2024-01-13T04:12:43.994169Z","iopub.status.idle":"2024-01-13T04:12:44.001416Z","shell.execute_reply.started":"2024-01-13T04:12:43.994131Z","shell.execute_reply":"2024-01-13T04:12:44.000440Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class TestKannada(Dataset):\n    \n    def __init__(self, file_path, transform = None):\n        self.data = pd.read_csv(file_path)\n        self.transform = transform\n        \n    def __len__(self):\n        return len(self.data)\n    def __getitem__(self, index):\n        image = self.data.iloc[index, 1:].values.astype(np.uint8).reshape((28,28,1))\n        \n        if self.transform is not None:\n            image = self.transform(image)\n        return image","metadata":{"execution":{"iopub.status.busy":"2024-01-13T04:12:44.003103Z","iopub.execute_input":"2024-01-13T04:12:44.003690Z","iopub.status.idle":"2024-01-13T04:12:44.025976Z","shell.execute_reply.started":"2024-01-13T04:12:44.003645Z","shell.execute_reply":"2024-01-13T04:12:44.024505Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = TrainKannada('/kaggle/input/Kannada-MNIST/train.csv', transform = transforms.ToTensor())\ntest_data = TestKannada('/kaggle/input/Kannada-MNIST/test.csv', transform = transforms.ToTensor())","metadata":{"execution":{"iopub.status.busy":"2024-01-13T04:12:44.029156Z","iopub.execute_input":"2024-01-13T04:12:44.030483Z","iopub.status.idle":"2024-01-13T04:12:47.677554Z","shell.execute_reply.started":"2024-01-13T04:12:44.030440Z","shell.execute_reply":"2024-01-13T04:12:47.675920Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_workers = 0\nbatch_size = 20\n\ntrain_loader = torch.utils.data.DataLoader(train_data, batch_size = batch_size, num_workers = num_workers)\ntest_loader = torch.utils.data.DataLoader(test_data, batch_size = batch_size, num_workers = num_workers)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T04:12:47.679049Z","iopub.execute_input":"2024-01-13T04:12:47.680037Z","iopub.status.idle":"2024-01-13T04:12:47.686437Z","shell.execute_reply.started":"2024-01-13T04:12:47.679970Z","shell.execute_reply":"2024-01-13T04:12:47.684904Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n%matplotlib inline\n\ndataiter = iter(train_loader)\nimages, labels = next(dataiter)\nimages = images.numpy()\n\nfig = plt.figure(figsize=(25, 4))\nfor idx in np.arange(20):\n    ax = fig.add_subplot(2, 10, idx+1, xticks=[], yticks=[])\n    ax.imshow(np.squeeze(images[idx]), cmap ='gray')\n    \n    ax.set_title(str(labels[idx].item()))","metadata":{"execution":{"iopub.status.busy":"2024-01-13T04:12:47.687892Z","iopub.execute_input":"2024-01-13T04:12:47.688197Z","iopub.status.idle":"2024-01-13T04:12:48.884526Z","shell.execute_reply.started":"2024-01-13T04:12:47.688173Z","shell.execute_reply":"2024-01-13T04:12:48.882697Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch.nn as nn\nimport torch.nn.functional as F\n\nclass Net(nn.Module):\n    def __init__(self):\n        super(Net, self).__init__()\n        hidden_1 = 512\n        hidden_2 = 512\n        hidden_3 = 256\n        \n        self.fc1 = nn.Linear(28*28, hidden_1)\n        self.fc2 = nn.Linear(hidden_1,hidden_2)\n        self.fc3 = nn.Linear(hidden_2, hidden_3)\n        self.fc4 = nn.Linear(hidden_3, 10)\n        \n    def forward(self, x):\n        x = x.view(-1, 28*28)\n        x = F.relu(self.fc1(x))\n        x = F.relu(self.fc2(x))\n        x = F.relu(self.fc3(x))\n        x = self.fc4(x)\n        return x\nmodel = Net()\nprint(model)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T04:12:48.887319Z","iopub.execute_input":"2024-01-13T04:12:48.887799Z","iopub.status.idle":"2024-01-13T04:12:48.907246Z","shell.execute_reply.started":"2024-01-13T04:12:48.887759Z","shell.execute_reply":"2024-01-13T04:12:48.905799Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(model(torch.zeros((20,28,28,1))))","metadata":{"execution":{"iopub.status.busy":"2024-01-13T04:12:48.908820Z","iopub.execute_input":"2024-01-13T04:12:48.909245Z","iopub.status.idle":"2024-01-13T04:12:48.975385Z","shell.execute_reply.started":"2024-01-13T04:12:48.909205Z","shell.execute_reply":"2024-01-13T04:12:48.974660Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"criterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr = 0.001)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T04:12:48.976382Z","iopub.execute_input":"2024-01-13T04:12:48.977769Z","iopub.status.idle":"2024-01-13T04:12:48.984179Z","shell.execute_reply.started":"2024-01-13T04:12:48.977708Z","shell.execute_reply":"2024-01-13T04:12:48.982716Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\n\nn_epochs = 20\n\ntrain_loss_min = np.Inf\n\nfor epoch in range(n_epochs):\n    train_loss = 0.0\n    \n    model.train()\n    for data, target in tqdm(train_loader):\n        optimizer.zero_grad()\n        \n        data = data\n        target = target\n        \n        output = model(data)\n        loss = criterion(output, target)\n        \n        loss.backward()\n        optimizer.step()\n        train_loss += loss.item()*data.size(0)\n        \n    train_loss = train_loss/len(train_loader.dataset)\n    print(\"Epoch: {} \\tTraining Loss: {:.6f}\".format(epoch+1, train_loss,))\n    \n    if train_loss <= train_loss_min:\n        print(\"Training loss decreased ({:6f} --> {:.6f}).  saving model ...\".format(\n        train_loss_min,\n        train_loss))\n        torch.save(model.state_dict(), 'model.pt')\n        train_loss_min = train_loss","metadata":{"execution":{"iopub.status.busy":"2024-01-13T04:12:48.988025Z","iopub.execute_input":"2024-01-13T04:12:48.988383Z","iopub.status.idle":"2024-01-13T04:21:35.977522Z","shell.execute_reply.started":"2024-01-13T04:12:48.988353Z","shell.execute_reply":"2024-01-13T04:21:35.976117Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.load_state_dict(torch.load('model.pt'))","metadata":{"execution":{"iopub.status.busy":"2024-01-13T04:21:35.978841Z","iopub.execute_input":"2024-01-13T04:21:35.979202Z","iopub.status.idle":"2024-01-13T04:21:35.994509Z","shell.execute_reply.started":"2024-01-13T04:21:35.979173Z","shell.execute_reply":"2024-01-13T04:21:35.993238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_loader = torch.utils.data.DataLoader(test_data, batch_size = 1, num_workers=num_workers)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T04:21:35.995833Z","iopub.execute_input":"2024-01-13T04:21:35.996264Z","iopub.status.idle":"2024-01-13T04:21:36.003479Z","shell.execute_reply.started":"2024-01-13T04:21:35.996232Z","shell.execute_reply":"2024-01-13T04:21:36.002188Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_loader","metadata":{"execution":{"iopub.status.busy":"2024-01-13T04:21:36.005360Z","iopub.execute_input":"2024-01-13T04:21:36.005712Z","iopub.status.idle":"2024-01-13T04:21:36.025599Z","shell.execute_reply.started":"2024-01-13T04:21:36.005677Z","shell.execute_reply":"2024-01-13T04:21:36.024139Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict(model, dataloader):\n\n    prediction_list = []\n    for i, data in enumerate(dataloader):\n    \n        outputs = model(data)\n        _, predicted = torch.max(outputs.data, 1) \n        prediction_list.append(predicted.cpu().item())\n    return prediction_list","metadata":{"execution":{"iopub.status.busy":"2024-01-13T04:21:36.027172Z","iopub.execute_input":"2024-01-13T04:21:36.028070Z","iopub.status.idle":"2024-01-13T04:21:36.040767Z","shell.execute_reply.started":"2024-01-13T04:21:36.027990Z","shell.execute_reply":"2024-01-13T04:21:36.039205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = predict(model,test_loader)\npredictions = np.array(predictions)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T04:22:25.433292Z","iopub.execute_input":"2024-01-13T04:22:25.433743Z","iopub.status.idle":"2024-01-13T04:22:35.749613Z","shell.execute_reply.started":"2024-01-13T04:22:25.433705Z","shell.execute_reply":"2024-01-13T04:22:35.748063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data = pd.read_csv('/kaggle/input/Kannada-MNIST/test.csv')\n\nsubmission = pd.DataFrame(data={\n    \"id\": test_data.index,\n    \"label\": predictions\n})\nsubmission.to_csv(\"submission.csv\", index = None)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T04:22:46.422939Z","iopub.execute_input":"2024-01-13T04:22:46.423393Z","iopub.status.idle":"2024-01-13T04:22:46.674852Z","shell.execute_reply.started":"2024-01-13T04:22:46.423356Z","shell.execute_reply":"2024-01-13T04:22:46.673398Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission","metadata":{"execution":{"iopub.status.busy":"2024-01-13T04:22:49.664699Z","iopub.execute_input":"2024-01-13T04:22:49.665105Z","iopub.status.idle":"2024-01-13T04:22:49.689980Z","shell.execute_reply.started":"2024-01-13T04:22:49.665075Z","shell.execute_reply":"2024-01-13T04:22:49.688775Z"},"trusted":true},"execution_count":null,"outputs":[]}]}