{"cells":[{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","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 the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"61cf74ce931fde6cd26384e25a778cfb5365d95b","trusted":true},"cell_type":"code","source":"%matplotlib inline\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\n\n#import torchvision.transforms as transforms\nfrom torch.utils.data import DataLoader,TensorDataset\n\nimport pandas as pd\nimport numpy as np\n\nfrom sklearn.metrics import classification_report,confusion_matrix\n\nimport matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"98ffc0abf2ac46c68a0f3f6f0da396a8a650b389"},"cell_type":"markdown","source":"The data has already been split into train/data, so let's observe the dimensions."},{"metadata":{"_uuid":"bb5fb405ba99e07a7683c3e575c28a255f97e6bd","trusted":true},"cell_type":"code","source":"X_train = pd.read_csv('../input/train.csv')\nX_test = pd.read_csv('../input/test.csv')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"a0d963eb5ac16aadbe86c73de11f0c1d22003720","trusted":true},"cell_type":"code","source":"print('Shape of training dataset: ',X_train.shape)\nprint('Shape of testing dataset: ',X_test.shape)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"1af57dfacfe6c121f9e560283f4668721df0ee65","trusted":true},"cell_type":"code","source":"X_train.describe()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"6be9d0457f54aed319ce364c71b1ad6c0980ae82","trusted":true},"cell_type":"code","source":"X_test.describe()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"a5d74c0b31566681997416c2214b554d005642dd","trusted":true},"cell_type":"code","source":"y_train = X_train.pop('label')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"ef2d900688bec7af603c0689268f914f2c3eac55","trusted":true},"cell_type":"code","source":"X_train = X_train.values.reshape(-1,1,28,28)\nX_test = X_test.values.reshape(-1,1,28,28)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d44228ec3200a1fefa963bba490b7b71132a1a5a","trusted":true},"cell_type":"code","source":"print('Shape of training dataset: ',X_train.shape)\nprint('Shape of testing dataset: ',X_test.shape)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"71038dccd08f2b4b85814f8f3bfab50d5a3aa835","scrolled":true,"trusted":true},"cell_type":"code","source":"plt.bar(y_train.unique(),y_train.value_counts())\nplt.title('Counts of each class (0-9)')\nplt.xticks(y_train.unique(),y_train.unique())\nplt.grid()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"416dea6c655ad87a634633e7a2bf580a23fe1d16"},"cell_type":"code","source":"import torchvision.transforms as transforms","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"fb270c9d3781018d4ee86460352b74d3bb54d5fd"},"cell_type":"code","source":"transform = transforms.Compose([\n    transforms.ToPILImage(),\n    transforms.RandomAffine(15,(.1,.1)),\n    transforms.ToTensor()\n])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"fe4cb0c881759102497279109d9ffe02842f45d6"},"cell_type":"code","source":"X_train = [transform(X.transpose(1,2,0).astype(np.uint8)).unsqueeze(0) for X in X_train]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"acea56fee419772e8fd1c9c616e407794008d96c"},"cell_type":"code","source":"X_train = torch.cat(X_train,0) * 255","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f6c0e5ed00dce6c57cc9c1eaa8d831e919b710f9","trusted":true},"cell_type":"code","source":"y_train,X_test = map(torch.tensor,(y_train,X_test))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d13825dd2dab2f91ea40085b79993d5488610bfa","trusted":true},"cell_type":"code","source":"X_train = (X_train).float()\ny_train = y_train.long()\nX_test = (X_test).float()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"cb6bc1bd6b9f93b721b4681653911a94538b882b","trusted":true},"cell_type":"code","source":"train_dl = DataLoader(TensorDataset(X_train,y_train),\n                                    batch_size=1024)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8643941aa51d099d26bb4be0caefcb597e8a9e2c","trusted":true},"cell_type":"code","source":"class CNN(nn.Module):\n    def __init__(self):\n        super(CNN,self).__init__()\n        self.conv1 = nn.Conv2d(1,16,(3,3),padding=1)\n        self.conv2 = nn.Conv2d(16,32,(3,3))\n        self.conv3 = nn.Conv2d(32,64,(3,3),padding=1)\n        self.conv4 = nn.Conv2d(64,128,(3,3))\n        \n        self.fc1 = nn.Linear(5*5*128,128)\n        self.fc2 = nn.Linear(128,64)\n        self.fc3 = nn.Linear(64,10)\n    def forward(self,X):\n        X = F.relu(self.conv1(X))\n        X  = F.max_pool2d(F.leaky_relu(self.conv2(X)),(2,2))\n        X = F.relu(self.conv3(X))\n        X  = F.max_pool2d(F.leaky_relu(self.conv4(X)),(2,2))\n        X = F.relu(self.fc1(X.view(-1,5*5*128)))\n        X = F.relu(self.fc2(X))\n        return self.fc3(X)\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"5cd42dac70737d5b0477f31cefba37ee1cd37d4a","trusted":true},"cell_type":"code","source":"net = CNN()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"56ed28092118c63fdd750ce156889852f1974e69","trusted":true},"cell_type":"code","source":"lr = .005\noptimizer = optim.Adam(net.parameters(),lr=lr)\nloss_fn = nn.CrossEntropyLoss()\nscheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"2e8b3d2fd0c8bd31da817515893e8da0743dc5dd","scrolled":true,"trusted":true},"cell_type":"code","source":"epochs = 20\nfor epoch in range(epochs):\n    epoch_loss = 0\n    scheduler.step()\n    for xb,yb in train_dl:\n        outcome = net(xb);\n        loss = loss_fn(outcome,yb)\n        loss.backward()\n        optimizer.step()\n        optimizer.zero_grad()\n        with torch.no_grad():\n            epoch_loss += len(xb) * loss\n    print(epoch+1,\"/\",epochs,\" loss: \",epoch_loss/len(X_train))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5e276a72409e29a0021312575e1a311911a08c01"},"cell_type":"code","source":"with torch.no_grad():\n    y_pred = net(X_test)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"c23f83b8272955ebe7e0899f2557fb8321e35e9a","trusted":true},"cell_type":"code","source":"submission_df = pd.DataFrame()\nsubmission_df['ImageId'] = np.arange(len(X_test))+1\nsubmission_df['Label'] =  y_pred.argmax(dim=1)\nsubmission_df.to_csv('submission.csv',index=False)","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}