{"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)\nfrom keras import models,layers,optimizers\nfrom keras.layers import BatchNormalization,Dropout\nfrom keras import models\nfrom keras.utils import to_categorical\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt\nfrom keras.datasets import mnist\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.\ntrain = pd.read_csv(\"../input/train.csv\")\ntrain_len = len(train)\ntest = pd.read_csv(\"../input/test.csv\")\n#data.head(10)\ny = train.label\ntrain.drop(labels = 'label',axis = 1,inplace = True)\ndata = pd.concat([train,test])","execution_count":37,"outputs":[{"output_type":"stream","text":"['train.csv', 'test.csv', 'sample_submission.csv']\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"new_data = data.values\nnew_data = new_data.reshape((70000,28,28,1))\nnew_data = new_data.astype('float32') / 255\nnew_data.shape\n","execution_count":38,"outputs":[{"output_type":"execute_result","execution_count":38,"data":{"text/plain":"(70000, 28, 28, 1)"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_data = new_data[:train_len]\ntest_data = new_data[train_len:]\ntrain_labels = to_categorical(y)\ntrain_data.shape","execution_count":39,"outputs":[{"output_type":"execute_result","execution_count":39,"data":{"text/plain":"(42000, 28, 28, 1)"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = models.Sequential()\nmodel.add(layers.Conv2D(32, (5, 5), activation='relu', input_shape=(28, 28, 1)))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(64, (3, 3), activation='relu'))\nmodel.add(layers.MaxPooling2D((2, 2)))\nmodel.add(layers.Conv2D(64, (3, 3), activation='relu'))\nmodel.add(Dropout(0.25))  \nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(64, activation='relu'))\nmodel.add(Dropout(0.5))  \nmodel.add(layers.Dense(10, activation='softmax'))\nmodel.compile(optimizer='rmsprop',\n            loss='categorical_crossentropy',\n            metrics=['accuracy'])\nmodel.summary()","execution_count":40,"outputs":[{"output_type":"stream","text":"_________________________________________________________________\nLayer (type)                 Output Shape              Param #   \n=================================================================\nconv2d_13 (Conv2D)           (None, 24, 24, 32)        832       \n_________________________________________________________________\nmax_pooling2d_9 (MaxPooling2 (None, 12, 12, 32)        0         \n_________________________________________________________________\nconv2d_14 (Conv2D)           (None, 10, 10, 64)        18496     \n_________________________________________________________________\nmax_pooling2d_10 (MaxPooling (None, 5, 5, 64)          0         \n_________________________________________________________________\nconv2d_15 (Conv2D)           (None, 3, 3, 64)          36928     \n_________________________________________________________________\ndropout_7 (Dropout)          (None, 3, 3, 64)          0         \n_________________________________________________________________\nflatten_5 (Flatten)          (None, 576)               0         \n_________________________________________________________________\ndense_9 (Dense)              (None, 64)                36928     \n_________________________________________________________________\ndropout_8 (Dropout)          (None, 64)                0         \n_________________________________________________________________\ndense_10 (Dense)             (None, 10)                650       \n=================================================================\nTotal params: 93,834\nTrainable params: 93,834\nNon-trainable params: 0\n_________________________________________________________________\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ntrain_X, val_X,train_y,val_y = train_test_split(train_data,train_labels, test_size=0.20, random_state=42)\ntotal_train = train_X.shape[0]\nprint(total_train)\ntotal_val = val_X.shape[0]\nbatch_size=40\nepochs = 30\nprint(train_X.shape)","execution_count":41,"outputs":[{"output_type":"stream","text":"33600\n(33600, 28, 28, 1)\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.callbacks import EarlyStopping, ReduceLROnPlateau\nearlystop = EarlyStopping(patience=10)\nlearning_rate_reduction = ReduceLROnPlateau(monitor='val_acc', \n                                            patience=3, \n                                            verbose=1, \n                                            factor=0.5, \n                                            min_lr=0.00001)\ncallbacks = [earlystop, learning_rate_reduction]","execution_count":42,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#history=model.fit(train_X, train_y,validation_data=(val_X,val_y), epochs=epochs, batch_size=batch_size)  (accuracy = 0.99 without augmentation)\n#augmenting\nfrom keras.preprocessing.image import ImageDataGenerator\ntrain_datagen = ImageDataGenerator(\n    #rescale=1./255,\n    rotation_range=40,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=False,)\n\ntrain_datagen.fit(train_X)","execution_count":43,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit_generator(train_datagen.flow(train_X,train_y, batch_size=batch_size),\n                              epochs = epochs, validation_data = (val_X,val_y),\n                              verbose = 2, steps_per_epoch=train_X.shape[0] // batch_size\n                              , callbacks=callbacks)","execution_count":44,"outputs":[{"output_type":"stream","text":"Epoch 1/30\n - 10s - loss: 1.4762 - acc: 0.4864 - val_loss: 0.2428 - val_acc: 0.9364\nEpoch 2/30\n - 11s - loss: 0.6572 - acc: 0.7976 - val_loss: 0.1185 - val_acc: 0.9661\nEpoch 3/30\n - 10s - loss: 0.4176 - acc: 0.8765 - val_loss: 0.1120 - val_acc: 0.9674\nEpoch 4/30\n - 10s - loss: 0.3294 - acc: 0.9059 - val_loss: 0.1132 - val_acc: 0.9674\nEpoch 5/30\n - 11s - loss: 0.2772 - acc: 0.9233 - val_loss: 0.0917 - val_acc: 0.9763\nEpoch 6/30\n - 10s - loss: 0.2669 - acc: 0.9290 - val_loss: 0.0807 - val_acc: 0.9808\nEpoch 7/30\n - 10s - loss: 0.2500 - acc: 0.9340 - val_loss: 0.0787 - val_acc: 0.9825\nEpoch 8/30\n - 10s - loss: 0.2578 - acc: 0.9352 - val_loss: 0.2321 - val_acc: 0.9398\nEpoch 9/30\n - 10s - loss: 0.2537 - acc: 0.9354 - val_loss: 0.0884 - val_acc: 0.9817\nEpoch 10/30\n - 11s - loss: 0.2684 - acc: 0.9332 - val_loss: 0.1193 - val_acc: 0.9817\n\nEpoch 00010: ReduceLROnPlateau reducing learning rate to 0.0005000000237487257.\nEpoch 11/30\n - 10s - loss: 0.2044 - acc: 0.9485 - val_loss: 0.1178 - val_acc: 0.9837\nEpoch 12/30\n - 10s - loss: 0.2305 - acc: 0.9439 - val_loss: 0.1755 - val_acc: 0.9767\nEpoch 13/30\n - 10s - loss: 0.2231 - acc: 0.9464 - val_loss: 0.2164 - val_acc: 0.9696\nEpoch 14/30\n - 10s - loss: 0.2335 - acc: 0.9423 - val_loss: 0.1603 - val_acc: 0.9793\n\nEpoch 00014: ReduceLROnPlateau reducing learning rate to 0.0002500000118743628.\nEpoch 15/30\n - 10s - loss: 0.2118 - acc: 0.9505 - val_loss: 0.1504 - val_acc: 0.9804\nEpoch 16/30\n - 10s - loss: 0.2101 - acc: 0.9501 - val_loss: 0.2860 - val_acc: 0.9685\nEpoch 17/30\n - 10s - loss: 0.2160 - acc: 0.9472 - val_loss: 0.2602 - val_acc: 0.9738\n\nEpoch 00017: ReduceLROnPlateau reducing learning rate to 0.0001250000059371814.\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.save('digit_recognizer.h5')\n\nacc=history.history['acc']\nval_acc = history.history['val_acc']\nloss=history.history['loss']\nval_loss = history.history['val_loss']\nepochs = range(1,len(acc)+1)\n\nplt.plot(epochs, acc, 'b', label='Training acc')\nplt.plot(epochs, val_acc, 'r', label='Validation acc')\nplt.title('Training and validation accuracy')\nplt.legend()\nplt.figure()\n\nplt.plot(epochs, loss, 'b', label='Training loss')\nplt.plot(epochs, val_loss, 'r', label='Validation loss')\nplt.title('Training and validation loss')\nplt.legend()\nplt.show()","execution_count":50,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAXcAAAEICAYAAACktLTqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xl8VOXZ//HPxRr2LSAYUNCCiCgIPICCAlqtWoSKVkWpVUtdKirU9lcX6q71UWvdqBVxX6A8KggtqBSpuFYCEkAWoYoSCBp2kEASuH9/3GfIJEySSTJhMjPf9+t1XnNmzpkz18wk19znPve5jjnnEBGR5FIr3gGIiEjsKbmLiCQhJXcRkSSk5C4ikoSU3EVEkpCSu4hIElJyT2JmVtvMdpnZEbFcN57M7EdmFvPxu2b2YzNbG3Z/lZmdEs26lXitSWZ2a2WfLxKNOvEOQIqY2a6wuw2BvcC+4P7VzrlXK7I959w+oHGs100FzrljYrEdMxsNjHLODQ7b9uhYbFukLEruNYhz7kByDVqGo51z/yptfTOr45wrPBSxiZRHf481i7plEoiZ3WtmfzezyWa2ExhlZieZ2admts3McszscTOrG6xfx8ycmXUM7r8SLJ9tZjvN7BMz61TRdYPlZ5vZl2a23cyeMLOPzOzyUuKOJsarzWyNmW01s8fDnlvbzP5iZpvN7CvgrDI+n9vMbEqJxyaY2SPB/GgzWxG8n/8GrerStpVtZoOD+YZm9nIQ2xdA7xLrjjezr4LtfmFmw4LHjweeBE4Jurw2hX22d4Y9/5rgvW82s+lm1i6az6Yin3MoHjP7l5ltMbONZvb/wl7nj8FnssPMMs3s8EhdYGb2Yeh7Dj7P+cHrbAHGm1lnM5sXvMam4HNrFvb8I4P3mBssf8zM0oKYjw1br52Z7TazVqW9XymHc05TDZyAtcCPSzx2L5APnIv/YW4A/A/QD78XdhTwJTAmWL8O4ICOwf1XgE1AH6Au8HfglUqs2wbYCQwPlv0WKAAuL+W9RBPjW0AzoCOwJfTegTHAF0B7oBUw3//ZRnydo4BdQKOwbX8P9AnunxusY8BpQB5wQrDsx8DasG1lA4OD+YeBfwMtgCOB5SXWvRBoF3wnlwQxHBYsGw38u0ScrwB3BvNnBjH2BNKAvwLvRfPZVPBzbgZ8B9wI1AeaAn2DZbcAWUDn4D30BFoCPyr5WQMfhr7n4L0VAtcCtfF/j12A04F6wd/JR8DDYe9nWfB5NgrWHxAsmwjcF/Y6NwHT4v1/mMhT3APQVMoXU3pyf6+c5/0O+L9gPlLC/lvYusOAZZVY90rgg7BlBuRQSnKPMsb+YcvfBH4XzM/Hd0+Flp1TMuGU2PanwCXB/NnAqjLW/QdwXTBfVnL/Nvy7AH4Tvm6E7S4DfhrMl5fcXwTuD1vWFH+cpX15n00FP+dfAAtKWe+/oXhLPB5Ncv+qnBguCL0ucAqwEagdYb0BwNeABfcXAyNi/X+VSpO6ZRLPuvA7ZtbVzP4Z7GbvAO4G0st4/saw+d2UfRC1tHUPD4/D+f/G7NI2EmWMUb0W8E0Z8QK8BowM5i8J7ofiGGpm/wm6DLbhW81lfVYh7cqKwcwuN7OsoGthG9A1yu2Cf38Htuec2wFsBTLC1onqOyvnc+6AT+KRlLWsPCX/Htua2VQzWx/E8EKJGNY6f/C+GOfcR/i9gIFm1h04AvhnJWMS1OeeiEoOA3wa31L8kXOuKXA7viVdnXLwLUsAzMwonoxKqkqMOfikEFLeUM2pwI/NLAPfbfRaEGMD4HXgT/guk+bAu1HGsbG0GMzsKOApfNdEq2C7K8O2W96wzQ34rp7Q9prgu3/WRxFXSWV9zuuAo0t5XmnLfghiahj2WNsS65R8f/+LH+V1fBDD5SViONLMapcSx0vAKPxexlTn3N5S1pMoKLknvibAduCH4IDU1YfgNf8B9DKzc82sDr4ft3U1xTgVGGtmGcHBtT+UtbJzbiO+6+AFfJfM6mBRfXw/cC6wz8yG4vuGo43hVjNrbv48gDFhyxrjE1wu/nfu1/iWe8h3QPvwA5slTAZ+ZWYnmFl9/I/PB865UveEylDW5zwDOMLMxphZfTNramZ9g2WTgHvN7GjzeppZS/yP2kb8gfvaZnYVYT9EZcTwA7DdzDrgu4ZCPgE2A/ebP0jdwMwGhC1/Gd+Ncwk+0UsVKLknvpuAX+IPcD6NP/BZrZxz3wEXAY/g/1mPBj7Ht9hiHeNTwFxgKbAA3/ouz2v4PvQDXTLOuW3AOGAa/qDkBfgfqWjcgd+DWAvMJizxOOeWAE8AnwXrHAP8J+y5c4DVwHdmFt69Enr+2/juk2nB848ALo0yrpJK/Zydc9uBM4Dz8T84XwKDgsUPAdPxn/MO/MHNtKC77dfArfiD6z8q8d4iuQPoi/+RmQG8ERZDITAUOBbfiv8W/z2Elq/Ff897nXMfV/C9SwmhgxcilRbsZm8ALnDOfRDveCRxmdlL+IO0d8Y7lkSnk5ikUszsLPzIlDz8ULoCfOtVpFKC4xfDgePjHUsyULeMVNZA4Ct8X/NPgPN0AEwqy8z+hB9rf79z7tt4x5MM1C0jIpKE1HIXEUlCcetzT09Pdx07dozXy4uIJKSFCxducs6VNfQYiCK5m9lz+OFL3zvnukdYbsBj+NPCd+NPTV5U3nY7duxIZmZmeauJiEgYMyvvLG0gum6ZFyijEh++fkfnYLoKPy5ZRETiqNzk7pybjz/pozTDgZec9ynQPFSyVERE4iMWB1QzKF48KJtS6oyY2VVBrejM3NzcGLy0iIhEckhHyzjnJjrn+jjn+rRuXe7xABERqaRYJPf1FK+Y157KVbQTEZEYiUVynwFcFlST6w9sd87lxGC7IiJSSdEMhZwMDAbSzSwbX/WtLoBz7m/ALPwwyDX4oZBXVFewIiISnXKTu3NuZDnLHXBdzCKS1LB/PzgHtUu7bkMK2L8f8vLghx+KT7t3R76fnw8dOkCXLtC5M6Sng1X3dVkkUakqpJStsBC+/x5ycmDjRsjN9ckmL6/4tGfPwY+VtXzvXmjUCCZNgosvjve7LLJ8Odx5p3+PsbB/f1FyLpm08/Kqtu3mzX2S79KlKOGHbps2jU38NZlzUFDgf/RCt6GpoAD27YMf/Qjq1493pHGh5J6KnIPt232yDiXt8Cn8sU2b/PqlqVULGjQofWra1N+mpR287F//gpEj/euNG3fo3n9p/v1v+NnP/Hs66qjYbNMMGjaE1q39baNGxadoH2vUyO/lfPMNfPklrF5ddPvBB/Daa8W/p8MOOzjhd+kCRx/tP/uaYv9+/x4yM2HhQliypGgvJVLCDr9fWFj+9hs0gJNOgsGD/dS3b8ok+7hVhezTp49T+YFqtGOH/0dZvNi3RnNyiiftvRGq89arB23bFp/atSt+v3Vrn2hCCbpu3cp3DezZA6NGwRtvwG9/Cw895BNrPLz2Glx+uW/pzZ4NR5Z3NbkaJi8P/vvfgxP/l1/Cd98VrWdWvGsn/LZjR/99Vpf9+32MoUSemQmLFsHOnX55Whocfzy0aOH/FuvV8/FEmi/vft26/vU++wzefx+ysvyPX1paUbIfNAj69fOPJRAzW+ic61PuekruCc45WLfOJ/GsLH+7eDF89VXROs2bQ/v2pSfs0GPNmx/6Ptx9+2DsWHjySd+Kf/75Q9uycg4eeABuvdX/w7/5pk8uyWTHjoMTfmh+27ai9erUgU6dIif+9u0r9sPrnP8bLJnIt2/3y+vXh549oXdv6NPH33br5mOoDlu2+D2c99/3e2iLF/sY69f3yX7QIP/99+8f22RfUAAbNkB2tv8/XbfOz194IQwYUP7zI1ByT0b5+bBiRVECDyXzrVv9cjPf8uzZs2jq0QMOP7xmH3hzDh58EG6+GU47zSfYZs2q/3ULC+G662DiRLjkEnjuuZTZZQf85755c/FkH34bfkwgLc3/bUVK/G3awNq1xRP5woVFPxz16vm/w/BEftxx1buXUJ6tW+HDD32iDyX7/fv999+vX1E3Tv/+pXdjFRb6veHwpB1+u26d30sumWObNoVHH4UrKjewUMn9UNu/P7o+wGjt3AlLlxYl8lD3SkGBX96ggd+FDU/kxx8PjRvHLoZD7eWX4corfQtu9mz/o1Rddu2Ciy6CWbPgllvg3nvj1yVUE+3f71ucJRP+6tW+ayX0dwg+SYfu160LJ5xQlMj79PGJvF69+LyPaG3bVpTs33/f72Xs3+/j7tfPt7L37i2evHNy/DrhGjf23V7t2/vbSPNVPNit5B6NlSthyhQ/imHv3qpN4X/ssda2bVErPJTIO3dOzmGE774L558PLVvC22/DscfG/jVycmDoUP+D+de/wtVXx/41kllhoT+wG0r469b5Vn3v3r6BkQx7P9u3+2Qf6sZZuNC/r1CSLi2BN2tW7XvJSu5lycuD++7zXQEFBX6Xs379qk9VObhYUv360L27T+ht28Zmm4li0SI4+2yfRGbOhJNPjt22ly+Hc87xo4CmTvXzIuXJz4/t/3cVRJvcU28o5Lvvwm9+43ctf/ELePhh32coNUevXvDJJ3DWWXD66X7vavjwqm/3/ff9UMf69f18795V36akhprerRRB6nQy5uT4k2V+8hPfnTF3Lrz0khJ7TXXUUfDRR77/dsQIePrpqm3vtdfgzDP9qKBPP1Vil6SX/Ml93z6YMAG6doXp0+Guu/z479NOi3dkUp7WreG993wXzTXXwB//WPYJVZGEhjpeeqkf8vbRR348t0iSS+7k/vnn/h96zBh/ZtrSpXD77clxwCdVNGrkf5R/9Ss/omX06OgPXhcW+i64W27xY+jfeSf5xrCLlCI5+9x37vRJ/PHHfXGlV1/1/9w14GCIVEKdOvDMM5CRAXff7ccOT53qE39pdu3y3XD//KcfP3/ffRrqmCL27fOH1Fau9O2A2rX9VKtW5NtoHqtTx49ybNYscU5oTa7k7hxMmwY33ODH6F59Ndx/v1prycDMd6llZMC118KQIfCPf0Q+ZrJxox/q+Pnn8NRTvksnge3fDwsW+BF5TZoUnWDcrp0vIVOTSsUcSqGTs5ctKz6tWOErW1SXevV8kg+fmjc/+LGy1jkUnQfJk9zXroXrr/f/8D16wOuv+7PLJLlcdZXPbBdf7E8sefttXwwrZMUK30efmwtvveWTfAIqKID58/3JutOn+7ZKaZo1K15RItJ8u3b+1IHydl727/d1u3bs8DvAJadIj+/e7WNo0+bgqXVraNWq6qdk5OYenMSXLfPxhBx+uB9mf9ppfhTxscf6Vvb+/b41H7oNn4/2trDQ7wxu2+aHwJecVq0qWrZrV/nvZ8IE32NYnRI/uRcUwF/+4lt1Zn5o4403Vl+NCom/YcP8aKehQ/0Y+H/+058JOX++HzIZGurYp9yhwDVKXp4fqTttGsyY4c+Qb9DAjwgdMcLfFhRELt4Zml+wwM9Hqlhcp45v6bdr53sr9+49OFlHk5jA/0g0aeKnhg19Ytu06eATNsH/W6anF0/4pf0QNGsGX3/tE/fSpUVJ/Pvvi7bXooVP4qNG+STevbs/CbZly8p97rG2b5//XMOTf8kfhUPR7kzsk5g+/th3vSxb5scvP/YYHHFEbAKUmm/VKj+0ddMm3xX35z/7IZSzZvkCWAlg2zb/2zRtmq+4sHu3330/91w47zz/9ho2rPh2d+2KnPzDy/Knpfnk3LRpUaKO9n6DBgcfwtq3z9fn+v57P+XmFs1Heiy8ZlkkDRsWJe/wqW3b1D58ltxnqG7Z4g+SPfOMP+X3ySd9a05ST06O74bJyoJTT/VZsqY04UqxcaPvMZo2zY/0LCjwremf/cy30AcNim9NrUMlP78o2Ydut2zxI1W7d/e3OgZ+sOQ9Q3X6dN/vumUL/O53cMcdiV0sS8rlnO9CyM8vKuVTNN+Owkfm0+S9t/h+8IXsX1of5/xzQlfyK28quV7o+hqNG/sBOY0bF803bFi5hPP11z6Zv/mm3+F0zh8qGDvWt9D79Uu9RFavnj8+npER70iSU+Il99q1/X/FnDn+wKnUaPn5/mDg+vVFt6H5777zoxrC669FSuDlD2tvCvwC7jsEb4iiCyNFSv4l5wsKfC/R4sX+uT16+Kv4nXeeb52mcveCVK/ES+7nngs//WnqNXNqGOd8V3d4wo6UwHNzD35u/fq+tda2re+7bdbMt+JC9dfC50veL22+bl3/J2Hmp/D5sqZI6zlXdLnTXbv8FGk+/LFdu3x3S/jju3f77Z18sj8c8LOfxe7qfSLlSbzkDkrsh8D27b6q67ffFk3ffOPHFYcSd35+8eeY+VEPhx/uD4X07++T+OGHF+1+Z2T40Q6p0GLdv9+33HVCtMRDYiZ3qZLQBWQiJe/QfPj4YfAt4w4d/GCkAQOKEnV44m7XLjUOBEarVi0ldokfJfck5pw/eDd7tj/HK5TA16/3w9bCtWzpE/fRR/uTP484wk9HHulvDztMO0wiiUTJPQmtWeOvWPfKK/4axbVrF7W6Tz21KGGHkneHDhpwJJJslNyTxJYt8Pe/+6T+ySe+T/u003z9tBEj/MknIpI6lNwT2N69fpjdyy/7kjoFBf407P/9X7jkEn9ZRxFJTUruCcY5fyGhl1/2V5/butX3h48Z468a2LNnaoxEEZGyKbkniK++8n3oL7/s+9QbNPDjpi+7DH78Y9VJE5HilBJqsK1b4f/+z1/q9aOPfIt88GC47Tbfj960abwjFJGaKqrBbWZ2lpmtMrM1ZnZzhOVHmtlcM1tiZv82M/X2VsHixfDzn/szOK++2if5P/3JD2N87z24/HIldhEpW7ktdzOrDUwAzgCygQVmNsM5tzxstYeBl5xzL5rZacCfgF9UR8DJbMcOP7rliSf8WZzXXuv70Xv1Uj+6iFRMNN0yfYE1zrmvAMxsCjAcCE/u3YDfBvPzgOmxDDLZOee7X8aN82eOXnONv+Snrg4oIpUVTbdMBrAu7H528Fi4LGBEMH8e0MTMWlU9vOS3Zo2/ws5FF/lumE8/hb/+VYldRKomVieU/w4YZGafA4OA9cC+kiuZ2VVmlmlmmbmRygWmkD17fOnX7t19Qn/iCfjsM+jbN96RiUgyiKZbZj3QIex+++CxA5xzGwha7mbWGDjfOXfQRbSccxOBieCvxFTJmBPeu+/Cddf5VvvIkb4cbLt28Y5KRJJJNC33BUBnM+tkZvWAi4EZ4SuYWbqZhbZ1C/BcbMNMDuvX++6Xn/zEF+GaMwdee02JXURir9zk7pwrBMYA7wArgKnOuS/M7G4zC124dDCwysy+BA7jkF0TJzEUFsKjj8Kxx/prZ959NyxZ4k8+EhGpDol5gewE8umnfkjj4sX+wOmTT/qyuiIilRHtBbJVobuabNniT0A6+WR/qbnXX/dFvpTYReRQUHKPMefghRfgmGPg2Wf92PUVK+D883UikogcOqotE0NffOG7YD74AE46Cf72NzjhhHhHJSKpSC33GJk+3Zfb/eILeOYZ+PBDJXYRiR+13GNgxw74zW/8CUlz5kB6erwjEpFUp+QeA3feCRs3wrRpSuwiUjOoW6aKli6Fxx+H0aOhX794RyMi4im5V4FzvjumeXNfb11EpKZQt0wVvPSSP3D6zDPQSjUwRaQGUcu9krZuhd//Hvr3hyuvjHc0IiLFqeVeSePHw+bN8M47vgiYiEhNorRUCQsXwlNP+f72E0+MdzQiIgdTcq+g/ft9Um/TBu65J97RiIhEpm6ZCpo0yV8x6eWX/SgZEZGaSC33Cti0CW65BQYNgksvjXc0IiKlU3KvgJtv9qUGJkxQhUcRqdmU3KP0ySe+hO/YsXDccfGORkSkbEruUSgs9AdRMzLgjjviHY2ISPl0QDUKTz3lL5M3dSo0bhzvaEREyqeWezk2bvQnLJ1xBlxwQbyjERGJjpJ7OX7/e9izx1/YWgdRRSRRKLmX4f334ZVXfILv0iXe0YiIRE/JvRQFBXDddXDkkXDrrfGORkSkYnRAtRSPPeavhzpjBjRsGO9oREQqRi33CLKz/aXzzj3XTyIiiUbJPYJx42DfPt96FxFJREruJbz7Lrz+Otx2G3TqFO9oREQqR8k9zN69MGYMdO7sR8iIiCQqHVAN89BDsHq1v7pS/frxjkZEpPLUcg98/TXcd58/C/XMM+MdjYhI1Si5B268EWrXhr/8Jd6RiIhUXVTJ3czOMrNVZrbGzG6OsPwIM5tnZp+b2RIzOyf2oVafmTP9dMcd0L59vKMREam6cpO7mdUGJgBnA92AkWbWrcRq44GpzrkTgYuBv8Y60OqyezfccAN06+ZrtYuIJINoDqj2BdY4574CMLMpwHBgedg6DmgazDcDNsQyyOr0pz/B2rUwbx7UrRvvaEREYiOabpkMYF3Y/ezgsXB3AqPMLBuYBVwfaUNmdpWZZZpZZm5ubiXCja3Vq+HBB2HUKBg8ON7RiIjETqwOqI4EXnDOtQfOAV42s4O27Zyb6Jzr45zr07p16xi9dOX9/e+Qn+8TvIhIMokmua8HOoTdbx88Fu5XwFQA59wnQBqQHosAq9PKlXDEEdCuXbwjERGJrWiS+wKgs5l1MrN6+AOmM0qs8y1wOoCZHYtP7vHvdynHqlVwzDHxjkJEJPbKTe7OuUJgDPAOsAI/KuYLM7vbzIYFq90E/NrMsoDJwOXOOVddQceCc77lruQuIskoqvIDzrlZ+AOl4Y/dHja/HBgQ29CqV04O7NoFXbvGOxIRkdhL2TNUV670t2q5i0gyStnkvmqVv1XLXUSSUUon90aNIKPkiH0RkSSQssl95Uro0gXM4h2JiEjspWxyX7VKXTIikrxSMrnn5cE33+hgqogkr5RM7qtX+3HuSu4ikqxSMrlrpIyIJLuUTO6hMe6dO8c3DhGR6pKSyX3VKl8wrFGjeEciIlI9Uja5q79dRJJZyiV3FQwTkVSQcsldBcNEJBWkXHIPjZRRy11EklnKJXdVgxSRVJByyV0Fw0QkFaRccg8VDKuVcu9cRFJJyqU4FQwTkVSQUsldBcNEJFWkVHJXwTARSRUpldxVMExEUkVKJncVDBORZJdSyX3lSujQQQXDRCT5pVRy10gZEUkVKZPcVTBMRFJJyiT3UMEwJXcRSQUpk9w1UkZEUknKJHcVDBORVJIyyV0Fw0QklaRUclfBMBFJFSmT6jRSRkRSSVTJ3czOMrNVZrbGzG6OsPwvZrY4mL40s22xD7XyQgXDdDBVRFJFnfJWMLPawATgDCAbWGBmM5xzy0PrOOfGha1/PXBiNcRaaSoYJiKpJpqWe19gjXPuK+dcPjAFGF7G+iOBybEILlZ03VQRSTXRJPcMYF3Y/ezgsYOY2ZFAJ+C9UpZfZWaZZpaZm5tb0VgrLZTcu3Q5ZC8pIhJXsT6gejHwunNuX6SFzrmJzrk+zrk+rVu3jvFLl04Fw0Qk1UST3NcDHcLutw8ei+RialiXDKhgmIiknmiS+wKgs5l1MrN6+AQ+o+RKZtYVaAF8EtsQq8Y5n9zV3y4iqaTc5O6cKwTGAO8AK4CpzrkvzOxuMxsWturFwBTnnKueUCsnJwd27lRyF5HUUu5QSADn3CxgVonHbi9x/87YhRU7KhgmIqko6c9QVcEwEUlFSZ/cV62Chg1VMExEUktKJPdjjlHBMBFJLUmf8lQwTERSUVIndxUME5FUldTJfc0aFQwTkdSU1MldI2VEJFUldXJXwTARSVVJndxVMExEUlVSJ3fVlBGRVJW0yT1UMEwjZUQkFSVtclfBMBFJZUmb3FUwTERSWdInd7XcRSQVJW1yX7lSBcNEJHUlbXJXwTARSWVJm/pUMExEUllSJvdQwTAldxFJVUmZ3EMFwzRSRkRSVVImdxUME5FUl5TJXQXDRCTVJW1yV8EwEUllSZncNVJGRFJd0iV3FQwTEUnC5K6CYSIiSZjcVVNGRCSJk7u6ZUQklSVdclfBMBGRJEzuq1b58e0qGCYiqSzpUqBGyoiIJFlyz8uDtWt1MFVEJKrkbmZnmdkqM1tjZjeXss6FZrbczL4ws9diG2Z0VDBMRMSrU94KZlYbmACcAWQDC8xshnNuedg6nYFbgAHOua1m1qa6Ai6LCoaJiHjRtNz7Amucc1855/KBKcDwEuv8GpjgnNsK4Jz7PrZhRkcFw0REvGiSewawLux+dvBYuC5AFzP7yMw+NbOzIm3IzK4ys0wzy8zNza1cxGVQwTARES9WB1TrAJ2BwcBI4Bkza15yJefcROdcH+dcn9atW8fopYuoYJiIiBdNcl8PdAi73z54LFw2MMM5V+Cc+xr4Ep/sD5lQwTAldxGR6JL7AqCzmXUys3rAxcCMEutMx7faMbN0fDfNVzGMs1wbN/qCYRopIyISRXJ3zhUCY4B3gBXAVOfcF2Z2t5kNC1Z7B9hsZsuBecDvnXObqyvoSDRSRkSkSLlDIQGcc7OAWSUeuz1s3gG/Daa4UMEwEZEiSXOGqgqGiYgUSZrkroJhIiJFkiYVqmCYiEiRpEjuKhgmIlJcUiT3UMEwJXcRES8pkrtGyoiIFJcUyT00xl0Fw0REvKRI7ioYJiJSXFIkdxUMExEpLuGTuwqGiYgcLOGTuwqGiYgcLKraMjWZCoaJVExBQQHZ2dns2bMn3qFIGdLS0mjfvj1169at1PMTPrmHhkEquYtEJzs7myZNmtCxY0fMLN7hSATOOTZv3kx2djadOnWq1DYSvltm1SpfMKx9+3hHIpIY9uzZQ6tWrZTYazAzo1WrVlXau0r45L5ypQqGiVSUEnvNV9XvKOFTogqGiYgcLKGTuwqGiSSezZs307NnT3r27Enbtm3JyMg4cD8/Pz+qbVxxxRWsCh1wK8WECRN49dVXYxFyQkroA6oqGCaSeFq1asXixYsBuPPOO2ncuDG/+93viq3jnMM5R61S+luff/75cl/nuuuuq3qwCSyhk7sKholUzdixEOTZmOnZEx59tOLPW7NmDcOGDePEE0/k888/Z86cOdx1110sWrSIvLw8LrroIm6/3V/dc+DAgTz55JN0796d9PR0rrnmGmbPnk3Dhg156623aNOmDePHjycS+ZavAAAN30lEQVQ9PZ2xY8cycOBABg4cyHvvvcf27dt5/vnnOfnkk/nhhx+47LLLWLFiBd26dWPt2rVMmjSJnj17FovtjjvuYNasWeTl5TFw4ECeeuopzIwvv/ySa665hs2bN1O7dm3efPNNOnbsyP3338/kyZOpVasWQ4cO5b777ovFR1shCd0to4JhIsll5cqVjBs3juXLl5ORkcEDDzxAZmYmWVlZzJkzh+XLlx/0nO3btzNo0CCysrI46aSTeO655yJu2znHZ599xkMPPcTdd98NwBNPPEHbtm1Zvnw5f/zjH/n8888jPvfGG29kwYIFLF26lO3bt/P2228DMHLkSMaNG0dWVhYff/wxbdq0YebMmcyePZvPPvuMrKwsbrrpphh9OhWT8C339u1VMEyksirTwq5ORx99NH369Dlwf/LkyTz77LMUFhayYcMGli9fTrdu3Yo9p0GDBpx99tkA9O7dmw8++CDitkeMGHFgnbVr1wLw4Ycf8oc//AGAHj16cNxxx0V87ty5c3nooYfYs2cPmzZtonfv3vTv359NmzZx7rnnAv6kI4B//etfXHnllTRo0ACAli1bVuajqLKET+7qkhFJHo3CWmqrV6/mscce47PPPqN58+aMGjUq4rjvevXqHZivXbs2hYWFEbddv379cteJZPfu3YwZM4ZFixaRkZHB+PHjE+Ls3oTtlnFO1SBFktmOHTto0qQJTZs2JScnh3feeSfmrzFgwACmTp0KwNKlSyN2++Tl5VGrVi3S09PZuXMnb7zxBgAtWrSgdevWzJw5E/Anh+3evZszzjiD5557jry8PAC2bNkS87ijkbAt91DBMCV3keTUq1cvunXrRteuXTnyyCMZMGBAzF/j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\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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afz6178mIyODCy644Jj1lGbJkiX06tWLrl27MnjwYHbt2lW0fv8QwP4Byz777LOik5V0796dvXv3Vvq1LU2t7rWfng4FBbB2LXQu89hZY8xxPBjzt0WLFvTo0YOPPvqIQYMGMW3aNC6//HJEhISEBN5++22aNGnCjh076NWrFwMHDizzPKLPP/88DRs2ZOXKlSxduvSYIXsfeeQRWrRoQUFBAeeddx5Lly7llltu4cknn2T27NkkJycfs6xFixbx2muvMX/+fFSVnj170qdPH5o3b87atWuZOnUqL7/8MpdffjkzZswod3z2q666imeeeYY+ffrw4IMP8r//+7+MHz+esWPHsmHDBurXr1/UFDRu3DgmTpxI79692bdvHwkJCRV5tYOq9VvuYE0zxtQWgU0zgU0yqsp9991H165d6d+/P1u2bOHHH38sczlz5swpCtmuXbvStWvXovumT59OZmYm3bt3Z/ny5UEHBfviiy8YPHgwjRo1onHjxlx22WV8/vnnALRv354zfN3xyhtWGNz48rt376ZPnz4AXH311cyZM6eoxuHDhzN58uSiI2F79+7N7bffzoQJE9i9e3fYj5Ct1Vvup58OdepYuBtTYR6N+Tto0CBuu+02Fi9ezIEDBzjzzDMBmDJlCjk5OSxatIi6deuSmppa6jC/wWzYsIFx48axYMECmjdvzjXXXFOp5fj5hwsGN2RwsGaZsnzwwQfMmTOH9957j0ceeYRly5YxatQoLr74Yj788EN69+7NrFmz6NSpU6VrLalWb7k3aACnnGLhbkxt0bhxY/r27ct11113zI7UvLw8WrVqRd26dZk9ezabNm0qdzk//elPefPNNwH49ttvWbp0KeCGC27UqBFNmzblxx9/5KOPPip6TGJiYqnt2ueccw7vvPMOBw4cYP/+/bz99tucc845FX5uTZs2pXnz5kVb/X/729/o06cPhYWFbN68mb59+/Loo4+Sl5fHvn37+O677+jSpQv33HMPZ511FqvCPIZ5rd5yB+sxY0xtM2zYMAYPHnxMz5nhw4dz6aWX0qVLF7KysoJuwd54441ce+21pKWlkZaWVvQLoFu3bnTv3p1OnTrRtm3bY4YLvuGGGxgwYAAnnXQSs2fPLro9MzOTa665hh49egAwcuRIunfvXm4TTFlef/11fvvb33LgwAFOOeUUXnvtNQoK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\n"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit(train_data,train_labels,epochs=21,batch_size=batch_size)","execution_count":46,"outputs":[{"output_type":"stream","text":"Epoch 1/21\n42000/42000 [==============================] - 6s 150us/step - loss: 0.1009 - acc: 0.9783\nEpoch 2/21\n42000/42000 [==============================] - 6s 143us/step - loss: 0.0871 - acc: 0.9801\nEpoch 3/21\n42000/42000 [==============================] - 6s 134us/step - loss: 0.0793 - acc: 0.9816\nEpoch 4/21\n42000/42000 [==============================] - 6s 135us/step - loss: 0.0753 - acc: 0.9824\nEpoch 5/21\n42000/42000 [==============================] - 6s 135us/step - loss: 0.0707 - acc: 0.9832\nEpoch 6/21\n42000/42000 [==============================] - 6s 135us/step - loss: 0.0678 - acc: 0.9840\nEpoch 7/21\n42000/42000 [==============================] - 6s 135us/step - loss: 0.0644 - acc: 0.9842\nEpoch 8/21\n42000/42000 [==============================] - 6s 135us/step - loss: 0.0638 - acc: 0.9850\nEpoch 9/21\n42000/42000 [==============================] - 6s 135us/step - loss: 0.0682 - acc: 0.9841\nEpoch 10/21\n42000/42000 [==============================] - 6s 134us/step - loss: 0.0642 - acc: 0.9846\nEpoch 11/21\n42000/42000 [==============================] - 6s 135us/step - loss: 0.0649 - acc: 0.9842\nEpoch 12/21\n42000/42000 [==============================] - 6s 135us/step - loss: 0.0655 - acc: 0.9846\nEpoch 13/21\n42000/42000 [==============================] - 6s 135us/step - loss: 0.0636 - acc: 0.9851\nEpoch 14/21\n42000/42000 [==============================] - 6s 136us/step - loss: 0.0677 - acc: 0.9848\nEpoch 15/21\n42000/42000 [==============================] - 6s 150us/step - loss: 0.0595 - acc: 0.9859\nEpoch 16/21\n42000/42000 [==============================] - 6s 143us/step - loss: 0.0593 - acc: 0.9850\nEpoch 17/21\n42000/42000 [==============================] - 6s 135us/step - loss: 0.0627 - acc: 0.9849\nEpoch 18/21\n42000/42000 [==============================] - 6s 134us/step - loss: 0.0649 - acc: 0.9849\nEpoch 19/21\n42000/42000 [==============================] - 6s 135us/step - loss: 0.0648 - acc: 0.9848\nEpoch 20/21\n42000/42000 [==============================] - 6s 134us/step - loss: 0.0633 - acc: 0.9854\nEpoch 21/21\n42000/42000 [==============================] - 6s 134us/step - loss: 0.0637 - acc: 0.9850\n","name":"stdout"},{"output_type":"execute_result","execution_count":46,"data":{"text/plain":"<keras.callbacks.History at 0x7f40141b8da0>"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\ntest_preds = model.predict(test_data)\n","execution_count":47,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predictions = [i.tolist().index(max(i)) for i in test_preds]","execution_count":48,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"output = pd.DataFrame({'ImageId': range(1,len(test_data)+1),\n                      'Label': predictions})\noutput.to_csv('submission.csv', index=False)","execution_count":49,"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}