{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\nimport torch\nfrom torch import nn, optim\n\nimport torch.nn.functional as F\n\nfrom torch.utils.data import DataLoader, Dataset\n\nimport torchvision\nfrom torchvision import transforms\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"efa1877ced4a5d96a4d5078519ddb31ba9f98ee9"},"cell_type":"code","source":"if torch.cuda.is_available():\n    cuda_is_available = True\nelse:\n    cuda_is_available = False","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"class DatasetMNIST(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    \n    def __getitem__(self, index):\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","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true,"_uuid":"258a10dcb71ce26d979b90645662e50f4871dee5"},"cell_type":"code","source":"transform = torchvision.transforms.Compose([torchvision.transforms.ToPILImage(),\n                                            torchvision.transforms.RandomHorizontalFlip(),\n                                            torchvision.transforms.RandomRotation((-45,45)),\n                                            torchvision.transforms.ToTensor()])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c311819fca4191857db22c4323fa2d2247a30cb3"},"cell_type":"code","source":"train_dataset = DatasetMNIST('../input/train.csv', transform=transform)\n\ntrain_loader = DataLoader(train_dataset, batch_size=40, shuffle=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7fb462cddfbdbbc10d3461742927e244f2424ad3"},"cell_type":"code","source":"class CNNetwork(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.conv1 = nn.Conv2d(1, 5, 3, padding=1)\n        self.conv2 = nn.Conv2d(5, 10, 3, padding=1)\n        self.pool1 = nn.MaxPool2d(2, 2)\n        self.conv3 = nn.Conv2d(10, 20, 3, padding=1)\n        self.conv4 = nn.Conv2d(20, 30, 3, padding=1)\n        self.pool2 = nn.MaxPool2d(2, 2)\n        \n        self.fc1 = nn.Linear(30*7*7, 512)\n        self.fc2 = nn.Linear(512, 256)\n        self.fc3 = nn.Linear(256, 10)\n        \n        self.dropout = nn.Dropout(0.5)\n        \n    def forward(self, x):\n        x = F.relu(self.conv1(x))\n        x = F.relu(self.conv2(x))\n        x = self.pool1(x)\n        x = F.relu(self.conv3(x))\n        x = F.relu(self.conv4(x))\n        x = self.pool2(x)\n        x = x.view(x.shape[0], -1)\n        x = self.dropout(F.relu(self.fc1(x)))\n        x = self.dropout(F.relu(self.fc2(x)))\n        x = F.relu(self.fc3(x))\n\n        return x\n        ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b6c040911f3f172b69d94a2ea5805492f93daba4"},"cell_type":"code","source":"model = CNNetwork()         \nif cuda_is_available:\n    model = model.cuda()\n\ncriterion = nn.CrossEntropyLoss()\n\noptimizer = optim.SGD(model.parameters(), lr=0.01)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"781a87edee5496029d3d259fef62d28d0fb462fe","scrolled":true},"cell_type":"code","source":"epochs = 100\nfor e in range(epochs):\n    running_loss = 0\n    running_accuracy = []\n    for images, labels in train_loader:\n        if cuda_is_available:\n            images, labels = images.cuda(), labels.cuda()\n\n        optimizer.zero_grad()\n        \n        output = model(images)\n        loss = criterion(output, labels)\n        loss.backward()\n        optimizer.step()\n        \n        running_loss += loss.item()\n        running_accuracy.append(torch.sum((torch.max(output,1)[1] == labels)).double().item()/labels.shape[0])\n    else:\n        print(f\"Epochs: {e+1}/{epochs}; Training loss: {running_loss/len(train_loader)}; Training accuracy: {sum(running_accuracy)/len(running_accuracy)}\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"280fcd8e0a3eea28b104ed37a98ca1917c672653"},"cell_type":"code","source":"class TestDatasetMNIST(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    \n    def __getitem__(self, index):\n        image = self.data.iloc[index, :].values.astype(np.uint8).reshape((28, 28, 1))\n        \n        if self.transform is not None:\n            image = self.transform(image)\n            \n        return image","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"cbf1965dd04776e892255fb796d3536a8ab879ea"},"cell_type":"code","source":"test_dataset = TestDatasetMNIST('../input/test.csv', transform=torchvision.transforms.ToTensor())\ntest_loader = DataLoader(test_dataset, batch_size=40, shuffle=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b57f7d09b415856a63efbaf7a0239d385c5eceff"},"cell_type":"code","source":"predictions = []\n\nmodel.eval()\nfor images in test_loader:\n    if cuda_is_available:\n        images = images.cuda()\n            \n    with torch.no_grad():\n        output = model(images)\n        _, prediction = torch.topk(output, 1)\n        \n    predictions += [prediction[ii].item() for ii in range(len(prediction))]\n    \nmodel.train()\n\ndt_dict = {'ImageId':[ii for ii in range(1, len(predictions)+1)], 'Label': predictions}\ndt = pd.DataFrame(data=dt_dict)\ndt.to_csv('my_submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"50de9e05913b4f928602444622774a7cd7989711"},"cell_type":"code","source":"import matplotlib.pyplot as plt\ndef göster(x):\n    print(prediction[x].item())\n    plt.imshow(images[x].view(28,28))","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}