{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":16017,"databundleVersionId":708189,"sourceType":"competition"}],"dockerImageVersionId":30665,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport os\nimport configparser\nfrom pathlib import Path\nimport torch\nfrom sklearn.model_selection import train_test_split\nfrom torch.utils.data import DataLoader, Dataset\nfrom torchvision import transforms\nimport torch.optim as optim\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.optim import lr_scheduler\nimport gc\nimport matplotlib.pyplot as plt\nfrom tqdm.notebook import tqdm","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-03-15T17:39:57.231451Z","iopub.execute_input":"2024-03-15T17:39:57.232360Z","iopub.status.idle":"2024-03-15T17:39:57.238388Z","shell.execute_reply.started":"2024-03-15T17:39:57.232326Z","shell.execute_reply":"2024-03-15T17:39:57.237463Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CharData(Dataset):\n\n    def __init__(self,\n                 images,\n                 labels=None,\n                 transform=None,\n                 ):\n        self.X = images\n        self.y = labels\n\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.X)\n\n    def __getitem__(self, idx):\n        img = np.array(self.X.iloc[idx, :], dtype='uint8').reshape([28, 28, 1])\n        if self.transform is not None:\n            img = self.transform(img)\n\n        if self.y is not None:\n            y = np.zeros(10, dtype='float32')\n            y[self.y.iloc[idx]] = 1\n            return img, y\n        else:\n            return img","metadata":{"execution":{"iopub.status.busy":"2024-03-15T17:39:57.240252Z","iopub.execute_input":"2024-03-15T17:39:57.240497Z","iopub.status.idle":"2024-03-15T17:39:57.253794Z","shell.execute_reply.started":"2024-03-15T17:39:57.240465Z","shell.execute_reply":"2024-03-15T17:39:57.252929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Net(nn.Module):\n    def __init__(self):\n        super(Net, self).__init__()\n        self.conv1 = nn.Conv2d(1, 16, 3, 1)\n        self.conv2 = nn.Conv2d(16, 64, 3, 1)\n        self.dropout1 = nn.Dropout(0.25)\n        self.dropout2 = nn.Dropout(0.5)\n        self.fc1 = nn.Linear(9216, 128)\n        self.fc2 = nn.Linear(128, 10)\n\n    def forward(self, x):\n        x = self.conv1(x)\n        x = F.relu(x)\n        x = self.conv2(x)\n        x = F.relu(x)\n        x = F.max_pool2d(x, 2)\n        x = self.dropout1(x)\n        x = torch.flatten(x, 1)\n        x = self.fc1(x)\n        x = F.relu(x)\n        x = self.dropout2(x)\n        x = self.fc2(x)\n        output = F.log_softmax(x, dim=1)\n        return output","metadata":{"execution":{"iopub.status.busy":"2024-03-15T17:39:57.254911Z","iopub.execute_input":"2024-03-15T17:39:57.255612Z","iopub.status.idle":"2024-03-15T17:39:57.266576Z","shell.execute_reply.started":"2024-03-15T17:39:57.255564Z","shell.execute_reply":"2024-03-15T17:39:57.265783Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def criterion(input, target, size_average=True):\n    l = -(target * torch.log(F.softmax(input, dim=1) + 1e-10)).sum(1)\n    if size_average:\n        l = l.mean()\n    else:\n        l = l.sum()\n    return l\ndef train(epoch, history=None):\n    model.train()\n\n    for batch_idx, (data, target) in enumerate(train_loader):\n        data = data.to(device)\n        target = target.to(device)\n\n        optimizer.zero_grad()\n        output = model(data)\n        loss = criterion(output, target)\n        if history is not None:\n            history.loc[epoch + batch_idx / len(train_loader), 'train_loss'] = loss.data.cpu().numpy()\n\n        loss.backward()\n        optimizer.step()\n\n        if (batch_idx + 1) % 100 == 0:\n            print('Train Epoch: {} [{}/{} ({:.0f}%)]\\tLR: {:.6f}\\tLoss: {:.6f}'.format(\n                epoch, (batch_idx + 1) * len(data), len(train_loader.dataset),\n                       100. * (batch_idx + 1) / len(train_loader),\n                optimizer.state_dict()['param_groups'][0]['lr'],\n                loss.data))\n    exp_lr_scheduler.step()\n\n\ndef evaluate(epoch, history=None):\n    model.eval()\n    loss = 0\n    correct = 0\n\n    with torch.no_grad():\n        for data, target in val_loader:\n            data = data.to(device)\n            target = target.to(device)\n\n            output = model(data)\n\n            loss += criterion(output, target, size_average=False).data\n\n            pred = output.data.max(1, keepdim=True)[1]\n            correct += pred.eq(target.max(1, keepdim=True)[1].data.view_as(pred)).cpu().sum().numpy()\n\n    loss /= len(val_loader.dataset)\n    accuracy = correct / len(val_loader.dataset)\n\n    if history is not None:\n        history.loc[epoch, 'val_loss'] = loss.cpu().numpy()\n        history.loc[epoch, 'val_accuracy'] = accuracy\n\n    print('Val loss: {:.4f}, Val accuracy: {}/{} ({:.3f}%)\\n'.format(\n        loss, correct, len(val_loader.dataset),\n        100. * accuracy))","metadata":{"execution":{"iopub.status.busy":"2024-03-15T17:39:57.269021Z","iopub.execute_input":"2024-03-15T17:39:57.269287Z","iopub.status.idle":"2024-03-15T17:39:57.283144Z","shell.execute_reply.started":"2024-03-15T17:39:57.269264Z","shell.execute_reply":"2024-03-15T17:39:57.282220Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = pd.read_csv('../input/Kannada-MNIST/train.csv')\ntarget = df_train['label']\ndf_train.drop('label', axis=1, inplace=True)\n\nX_test = pd.read_csv('../input/Kannada-MNIST/test.csv')\nX_test.drop('id', axis=1, inplace=True)\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(device)\nBATCH_SIZE = 594\nn_epochs = 100\n\nX_train, X_val, y_train, y_val = train_test_split(df_train, target, stratify=target, random_state=42, test_size=0.01)\n\ntrain_transform = transforms.Compose([\n    transforms.ToPILImage(),\n    transforms.RandomAffine(degrees=5, translate=(0.1, 0.1), scale=(0.9, 1.1), shear=5),\n    transforms.ToTensor()\n])\n\ntest_transform = transforms.Compose([\n    transforms.ToPILImage(),\n    transforms.ToTensor()\n])\n\ntrain_dataset = CharData(X_train, y_train, train_transform)\nval_dataset = CharData(X_val, y_val, test_transform)\ntest_dataset = CharData(X_test, transform=test_transform)\n\ntrain_loader = DataLoader(dataset=train_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=4)\nval_loader = DataLoader(dataset=val_dataset, batch_size=BATCH_SIZE, shuffle=False, num_workers=4)\ntest_loader = DataLoader(dataset=test_dataset, batch_size=BATCH_SIZE, shuffle=False, num_workers=4)","metadata":{"execution":{"iopub.status.busy":"2024-03-15T17:39:57.285311Z","iopub.execute_input":"2024-03-15T17:39:57.285634Z","iopub.status.idle":"2024-03-15T17:40:02.873630Z","shell.execute_reply.started":"2024-03-15T17:39:57.285575Z","shell.execute_reply":"2024-03-15T17:40:02.872859Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Net().to(device)\n\n\noptimizer = optim.Adam(model.parameters(), lr=0.001)\nexp_lr_scheduler = lr_scheduler.StepLR(optimizer, step_size=n_epochs // 4, gamma=0.1)\n\nhistory = pd.DataFrame()\n\nfor epoch in range(n_epochs):\n    torch.cuda.empty_cache()\n    gc.collect()\n    train(epoch, history)\n    evaluate(epoch, history)","metadata":{"execution":{"iopub.status.busy":"2024-03-15T17:40:02.874737Z","iopub.execute_input":"2024-03-15T17:40:02.875030Z","iopub.status.idle":"2024-03-15T17:58:04.556886Z","shell.execute_reply.started":"2024-03-15T17:40:02.875005Z","shell.execute_reply":"2024-03-15T17:58:04.555637Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.eval()\npredictions = []\n\nfor idx,data in enumerate(tqdm(test_loader)):\n    data = data.to(device)\n    output = model(data).max(dim=1)[1]\n    predictions += list(output.data.cpu().numpy())\n\nsubmission = pd.read_csv('../input/Kannada-MNIST/sample_submission.csv')\nsubmission['label'] = predictions\nsubmission.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-03-15T18:09:05.445856Z","iopub.execute_input":"2024-03-15T18:09:05.446565Z","iopub.status.idle":"2024-03-15T18:09:06.226130Z","shell.execute_reply.started":"2024-03-15T18:09:05.446530Z","shell.execute_reply":"2024-03-15T18:09:06.225108Z"},"trusted":true},"execution_count":null,"outputs":[]}]}