{"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\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport torch\nfrom torchvision import transforms    \nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.data import DataLoader, Dataset","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class MNIST_data(Dataset):    \n    def __init__(self, file_path, test = False, \n                 transform = transforms.Compose([transforms.ToPILImage(), transforms.ToTensor(), \n                     transforms.Normalize(mean=(0.5,), std=(0.5,))])\n                ):\n        \n        df = pd.read_csv(file_path)\n        \n        if test:\n            # test data\n            self.X = df.values.reshape(-1,28,28,1).astype(np.uint8)\n            self.y = None\n        else:\n            # training data\n            self.X = df.iloc[:,1:].values.reshape((-1,28,28)).astype(np.uint8)[:,:,:,None]\n            self.y = torch.from_numpy(df.iloc[:,0].values)\n            \n        self.transform = transform\n    \n    def __len__(self):\n        return len(self.X)\n\n    def __getitem__(self, idx):\n        if self.y is not None:\n            return self.transform(self.X[idx]), self.y[idx]\n        else:\n            return self.transform(self.X[idx])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = MNIST_data('/kaggle/input/digit-recognizer/train.csv')\ndf_test = MNIST_data('/kaggle/input/digit-recognizer/test.csv', test=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_loader = DataLoader(df, batch_size=48, shuffle=True)\ntest_loader = DataLoader(df_test, batch_size=len(df_test), shuffle=False)\ntrain_loader","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for i, (image, label) in enumerate(train_loader):\n    break\nlabel","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class ConvolutionalNetwork(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.conv1 = nn.Conv2d(1, 32, 5, 1, padding=(2,2)) \n        self.conv2 = nn.Conv2d(32, 32, 5, 1, padding=(2,2))\n        self.conv3 = nn.Conv2d(32, 64, 3, 1, padding=(1,1))\n        self.conv4 = nn.Conv2d(64, 64, 3, 1, padding=(1,1))\n\n        self.fc1 = nn.Linear(7*7*64, 256)\n        self.fc2 = nn.Linear(256, 10)\n        \n        self.drop = nn.Dropout(p=0.3)\n\n\n\n    def forward(self, X):\n        X = F.relu(self.conv1(X)) #28\n        X = F.relu(self.conv2(X)) #28\n        X = F.max_pool2d(X, 2, 2) #14\n        X = self.drop(X)\n        X = F.relu(self.conv3(X)) #14\n        X = F.relu(self.conv4(X)) #14\n        X = F.max_pool2d(X, 2, 2) #7\n        X = self.drop(X)\n        X = X.view(-1, 7*7*64)\n        X = F.relu(self.fc1(X))\n        X = self.drop(X)\n\n        X = self.fc2(X)\n        return F.log_softmax(X, dim=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"torch.manual_seed(42)\nmodel = ConvolutionalNetwork()\nmodel","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"criterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=0.001)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import time\nstart_time = time.time()\n\nepochs = 8\ntrain_losses = []\ntrain_correct = []\n\nfor i in range(epochs):\n    trn_corr = 0\n    tst_corr = 0\n    \n    # Run the training batches\n    for b, (X_train, y_train) in enumerate(train_loader):\n        b+=1\n        \n        # Apply the model\n        y_pred = model(X_train) \n        loss = criterion(y_pred, y_train)\n        # Tally the number of correct predictions\n        predicted = torch.max(y_pred.data, 1)[1]\n        batch_corr = (predicted == y_train).sum()\n        trn_corr += batch_corr\n        \n        # Update parameters\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        \n        # Print interim results\n        if b%200 == 0:\n            print(f'epoch: {i:2}  batch: {b:4} [{48*b:6}/60000]  loss: {loss.item():10.8f}  \\\naccuracy: {trn_corr.item()*100/(48*b):7.3f}%')\n        \n    train_losses.append(loss)\n    train_correct.append(trn_corr)\n    \nprint(f'\\nDuration: {time.time() - start_time:.0f} seconds') # print the time elapsed            ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample = pd.read_csv(\"/kaggle/input/digit-recognizer/sample_submission.csv\")\nsample[\"Label\"].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(sample.head())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = [['ImageId', 'Label']]\n\nwith torch.no_grad():\n    model.eval()\n    image_id = 1\n\n    for i, (images) in enumerate(test_loader):\n        log_ps = model(images)\n        ps = torch.exp(log_ps)\n        top_p, top_class = ps.topk(1, dim=1)\n        \n        for prediction in top_class:\n            submission.append([image_id, prediction.item()])\n            image_id += 1\n            \nprint(len(submission) - 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import csv\n\nwith open('/kaggle/working/submission.csv', 'w') as submissionFile:\n    writer = csv.writer(submissionFile)\n    writer.writerows(submission)\n    \nprint('Submission Complete!')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nos.chdir(r'/kaggle/working')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from IPython.display import FileLink\nFileLink(r'submission.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}