{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np # linear algebra\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt\n\ntorch.manual_seed(11)\nnp.random.seed(11)\n\ntrain_dataframes = pd.read_csv(\"../input/train.csv\")\ntest_dataframes = pd.read_csv(\"../input/test.csv\")","execution_count":8,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"MINI_BATCH = 10\n\nX_train = [x[1:] for x in train_dataframes.values]\nY_train = [x[0] for x in train_dataframes.values]\nX_train, X_validation, Y_train, Y_validation = train_test_split(X_train, Y_train, random_state=0)\nX_test = test_dataframes.values\n\nX_train = torch.tensor(X_train, dtype=torch.float32)\nX_validation = torch.tensor(X_validation, dtype=torch.float32)\nX_test = torch.tensor(X_test, dtype=torch.float32)\nY_train = torch.tensor(Y_train)\nY_validation = torch.tensor(Y_validation)\n\nX_train = X_train / 128 - 1\nX_validation = X_validation / 128 - 1\nX_test = X_test / 128 - 1\n\nX_train = X_train.view([-1, MINI_BATCH, 1, 28, 28])\nX_validation = X_validation.view([-1, 1, 28, 28])\nX_test = X_test.view([-1, 1, 28, 28])\nY_train = Y_train.view([-1, MINI_BATCH])","execution_count":9,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class Net(nn.Module):\n    def __init__(self):\n        super(Net, self).__init__()\n        self._conv1 = nn.Conv2d(1, 6, 5)\n        self._pool = nn.MaxPool2d(2)\n        self._conv2 = nn.Conv2d(6, 16, 5)\n        self._fc1 = nn.Linear(256, 128)\n        self._fc2 = nn.Linear(128, 64)\n        self._fc3 = nn.Linear(64, 10)\n    def forward(self, x):\n        # m x 1 x 28 x 28\n        x = self._conv1(x)\n        x = F.relu(x)\n        # m x 6 x 24 x 24\n        x = self._pool(x)\n        # m x 6 x 12 x 12\n        x = self._conv2(x)\n        x = F.relu(x)\n        # m x 16 x 8 x 8\n        x = self._pool(x)\n        # m x 16 x 4 x 4\n        x = x.view([-1, 256])\n        # m x 640\n        x = F.relu(self._fc1(x))\n        x = F.relu(self._fc2(x))\n        x = F.relu(self._fc3(x))\n        return x","execution_count":10,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"net = Net()\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)\n\nPRINT_EVERY = 10000 // MINI_BATCH\nloss_plot_data = ([], [], [], [])\nrunning_batches = 0\nrunning_loss = 0\nfor epoch in range(0, 30):\n    for i in range(0, len(X_train)):\n        inputs = X_train[i]\n        labels = Y_train[i]\n        optimizer.zero_grad()\n        outputs = net(inputs)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n        running_batches += 1\n        if running_batches % PRINT_EVERY == 0:\n            validation_loss = 0\n            with torch.no_grad():\n                inputs = X_validation\n                outputs = net(inputs)\n                labels = Y_validation\n                validation_loss = criterion(outputs, labels)\n                \n            print('[%d, %5d] loss: %.3f %.3f' % (epoch, i, running_loss / PRINT_EVERY, validation_loss))\n            loss_plot_data[0].append((running_batches - 0.5 * PRINT_EVERY) * MINI_BATCH)\n            loss_plot_data[1].append(running_loss / PRINT_EVERY)\n            loss_plot_data[2].append(running_batches * MINI_BATCH)\n            loss_plot_data[3].append(validation_loss)\n            running_loss = 0\n            \nplt.plot(loss_plot_data[0], loss_plot_data[1])\nplt.plot(loss_plot_data[2], loss_plot_data[3])\nplt.show()","execution_count":11,"outputs":[{"output_type":"stream","text":"[0,   999] loss: 2.192 1.522\n[0,  1999] loss: 0.726 0.503\n[0,  2999] loss: 0.453 0.411\n[1,   849] loss: 0.392 0.363\n[1,  1849] loss: 0.353 0.350\n[1,  2849] loss: 0.340 0.329\n[2,   699] loss: 0.312 0.318\n[2,  1699] loss: 0.311 0.328\n[2,  2699] loss: 0.305 0.312\n[3,   549] loss: 0.157 0.109\n[3,  1549] loss: 0.069 0.084\n[3,  2549] loss: 0.069 0.079\n[4,   399] loss: 0.065 0.088\n[4,  1399] loss: 0.058 0.086\n[4,  2399] loss: 0.049 0.076\n[5,   249] loss: 0.054 0.072\n[5,  1249] loss: 0.048 0.064\n[5,  2249] loss: 0.040 0.069\n[6,    99] loss: 0.045 0.069\n[6,  1099] loss: 0.041 0.072\n[6,  2099] loss: 0.033 0.063\n[6,  3099] loss: 0.041 0.069\n[7,   949] loss: 0.033 0.067\n[7,  1949] loss: 0.029 0.060\n[7,  2949] loss: 0.031 0.055\n[8,   799] loss: 0.028 0.059\n[8,  1799] loss: 0.022 0.067\n[8,  2799] loss: 0.028 0.059\n[9,   649] loss: 0.025 0.074\n[9,  1649] loss: 0.019 0.073\n[9,  2649] loss: 0.022 0.064\n[10,   499] loss: 0.021 0.063\n[10,  1499] loss: 0.017 0.065\n[10,  2499] loss: 0.017 0.064\n[11,   349] loss: 0.018 0.070\n[11,  1349] loss: 0.016 0.078\n[11,  2349] loss: 0.013 0.054\n[12,   199] loss: 0.017 0.070\n[12,  1199] loss: 0.012 0.063\n[12,  2199] loss: 0.012 0.066\n[13,    49] loss: 0.013 0.070\n[13,  1049] loss: 0.010 0.092\n[13,  2049] loss: 0.009 0.067\n[13,  3049] loss: 0.013 0.076\n[14,   899] loss: 0.007 0.062\n[14,  1899] loss: 0.007 0.090\n[14,  2899] loss: 0.011 0.067\n[15,   749] loss: 0.007 0.070\n[15,  1749] loss: 0.005 0.072\n[15,  2749] loss: 0.008 0.088\n[16,   599] loss: 0.011 0.081\n[16,  1599] loss: 0.007 0.077\n[16,  2599] loss: 0.009 0.065\n[17,   449] loss: 0.009 0.073\n[17,  1449] loss: 0.008 0.086\n[17,  2449] loss: 0.007 0.073\n[18,   299] loss: 0.014 0.072\n[18,  1299] loss: 0.010 0.082\n[18,  2299] loss: 0.010 0.065\n[19,   149] loss: 0.011 0.067\n[19,  1149] loss: 0.009 0.078\n[19,  2149] loss: 0.006 0.069\n[19,  3149] loss: 0.011 0.080\n[20,   999] loss: 0.007 0.076\n[20,  1999] loss: 0.005 0.076\n[20,  2999] loss: 0.010 0.077\n[21,   849] loss: 0.009 0.074\n[21,  1849] loss: 0.003 0.080\n[21,  2849] loss: 0.005 0.075\n[22,   699] loss: 0.004 0.076\n[22,  1699] loss: 0.003 0.087\n[22,  2699] loss: 0.004 0.077\n[23,   549] loss: 0.004 0.070\n[23,  1549] loss: 0.003 0.078\n[23,  2549] loss: 0.004 0.072\n[24,   399] loss: 0.004 0.069\n[24,  1399] loss: 0.003 0.078\n[24,  2399] loss: 0.002 0.070\n[25,   249] loss: 0.003 0.070\n[25,  1249] loss: 0.003 0.083\n[25,  2249] loss: 0.005 0.082\n[26,    99] loss: 0.005 0.071\n[26,  1099] loss: 0.003 0.085\n[26,  2099] loss: 0.002 0.077\n[26,  3099] loss: 0.005 0.073\n[27,   949] loss: 0.002 0.090\n[27,  1949] loss: 0.003 0.084\n[27,  2949] loss: 0.003 0.091\n[28,   799] loss: 0.004 0.104\n[28,  1799] loss: 0.005 0.084\n[28,  2799] loss: 0.003 0.089\n[29,   649] loss: 0.002 0.088\n[29,  1649] loss: 0.002 0.088\n[29,  2649] loss: 0.002 0.074\n","name":"stdout"},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"Y_test = net(X_test)\nY_test = [x.argmax().item() for x in Y_test ]\n\ndf = pd.DataFrame([(i + 1, Y_test[i]) for i in range(0, len(Y_test))], columns=['ImageId', 'Label'])\n\ndf.to_csv('submission.csv', index=None, header=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}