{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"scrolled":true},"cell_type":"code","source":"import torch\nimport numpy as np\nimport pandas as pd\n\ntrain_df = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')\ntest_df = pd.read_csv('/kaggle/input/digit-recognizer/test.csv')\nsample_df = pd.read_csv('/kaggle/input/digit-recognizer/sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Preparing Data"},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"from torch.utils.data.dataset import Dataset\n\nclass MnistDataset(Dataset):\n    def __init__(self, df, transforms=None, train=True):\n        self.train = train\n        self.transforms = transforms\n        \n        self.X = df.loc[:, df.columns != 'label'].to_numpy(float)\n        self.X = torch.from_numpy(self.X)\n        if train:\n            self.y = df.get('label').to_numpy()\n            self.y = torch.from_numpy(self.y)\n    \n    def __len__(self):\n        return self.X.shape[0]\n    \n    def __getitem__(self, i):\n        x = self.X[i].view(1, 28, 28).expand(3, 28, 28)\n        \n        if self.transforms: x = self.transforms(x)\n        \n        if self.train: return x, self.y[i]\n        return x\n\n#Convert GrayScale to RGB: https://discuss.pytorch.org/t/grayscale-to-rgb-transform/18315/7","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#https://pytorch.org/docs/stable/torchvision/models.html\nimport  torchvision.transforms as transforms\nnormalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],\n                                 std=[0.229, 0.224, 0.225])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"ds = MnistDataset(train_df, normalize)\nlen(ds)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"val_len = int(len(ds)*0.01) # 0.01 percent of data\ntrain_len = len(ds) - val_len # all other are in training\n\nfrom torch.utils.data import random_split\ntrain_ds, val_ds = random_split(ds, [train_len, val_len])\n\nlen(train_ds), len(val_ds)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"from torch.utils.data.dataloader import DataLoader\n\nbs = 512\nnum_workers = 2\ntrain_dl = DataLoader(train_ds, bs, num_workers=num_workers)\nval_dl = DataLoader(val_ds, bs, num_workers=num_workers)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"images, labels = next(iter(train_dl))\nimages.shape, labels.shape","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Model creation"},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"import torchvision.models as models\nresnet18 = models.resnet18(pretrained=True)\n\nresnet18.fc","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"lin_in = resnet18.fc.in_features\n\nimport torch.nn as nn\n\nresnet18.fc = nn.Sequential(\n    nn.Linear(lin_in, 10)\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"net = resnet18\nout = net(images.float())\nout.shape","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Using GPU"},{"metadata":{"trusted":true},"cell_type":"code","source":"device = torch.device('cuda:0') if torch.cuda.is_available() else 'cpu'\nnet = net.to(device)\ndevice","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Training Loop"},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"epochs = 10\nloss_fn = nn.CrossEntropyLoss()\n\nimport torch.optim as optim\no = optim.Adam(net.parameters(),lr=0.001)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"from datetime import datetime\n\nlosses = []\naccuracies = []\nfor i in range(epochs):\n    e_loss = 0\n    start = datetime.now()\n    # training\n    for images, labels in train_dl:\n        o.zero_grad()\n        \n        images, labels = images.to(device,dtype=torch.float), labels.to(device)\n        \n        out = net(images)\n        loss = loss_fn(out.float(), labels.long())\n        loss.backward()\n        \n        e_loss += loss.item()\n        \n        o.step()\n\n    #validation\n    with torch.no_grad():\n        accuracy = 0\n        for images, labels in val_dl:\n            images, labels = images.to(device,dtype=torch.float), labels.to(device)\n            out = net(images)\n            accuracy+=(out.argmax(dim=1) == labels).sum().item()\n        accuracies.append(accuracy/len(val_ds) * 100)\n\n    end = datetime.now()\n\n    print(f'Epoch: {i}\\tTime: {(end - start).total_seconds():.2f}s\\tLoss: {e_loss:.2f}\\tAccuracy: {accuracies[-1]:.2f}')\n    losses.append(e_loss)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.plot(range(epochs), accuracies)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Exporting for submision"},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"bs = 640\ntest_ds = MnistDataset(test_df, normalize, train = False)\ntest_dl = DataLoader(test_ds, bs)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"outputs = []\nwith torch.no_grad():\n    for images in test_dl:\n        images = images.to(device, dtype=torch.float)\n        out = net(images)\n        outputs.extend(out.argmax(dim=1).tolist())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"len(outputs)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"test_df.shape, sample_df.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"sample_df['Label'] = outputs\nsample_df.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}