{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport seaborn as sns\n%matplotlib inline\n\nnp.random.seed(2)\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import confusion_matrix\nimport itertools\n\nfrom keras.utils.np_utils import to_categorical # convert to one-hot-encoding\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D, AvgPool2D\nfrom keras.optimizers import RMSprop\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.callbacks import ReduceLROnPlateau","execution_count":36,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pd.read_csv(\"../input/train.csv\")\ntest = pd.read_csv(\"../input/test.csv\")","execution_count":37,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Y_train = train[\"label\"]\nX_train = train.drop(labels = [\"label\"],axis = 1) ","execution_count":40,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train.isnull().any().describe()\ntest.isnull().any().describe()","execution_count":41,"outputs":[{"output_type":"execute_result","execution_count":41,"data":{"text/plain":"count       784\nunique        1\ntop       False\nfreq        784\ndtype: object"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train = X_train / 255.0\ntest = test / 255.0","execution_count":42,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train = X_train.values.reshape(-1,28,28,1)\ntest = test.values.reshape(-1,28,28,1)","execution_count":43,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Y_train = to_categorical(Y_train, num_classes = 10)","execution_count":45,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train, X_val, Y_train, Y_val = train_test_split(X_train, Y_train, test_size = 0.1, random_state=2)","execution_count":46,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"g = plt.imshow(X_train[0][:,:,0])","execution_count":47,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAP8AAAD8CAYAAAC4nHJkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAADgJJREFUeJzt3X+s3XV9x/HXa93lNlZgdGVNrV1RgRpCtjqvBSNZaphCC0lxMcRmId1SW2JonMaYERYR2T9kmxIghNhCtZCKLgqhs/UHNjXEBDsurCsgVBi2s6X0YupsnbG09b0/7rfmAvd8v6fnfM/5nnvfz0dyc8/5fr7f833fA69+zznv7/l+HBECkM8fNF0AgGYQfiApwg8kRfiBpAg/kBThB5Ii/EBShB9IivADSf1hP3d2hodjpmb1c5dAKr/V/+m1OOZ21u0q/LavlHSHpBmS7o2I28rWn6lZusSXd7NLACV2xva21+34Zb/tGZLulrRM0kWSVtq+qNPHA9Bf3bznXyLpxYh4KSJek/R1SSvqKQtAr3UT/vmSfj7h/v5i2evYXmt71PbocR3rYncA6tTzT/sjYn1EjETEyJCGe707AG3qJvwHJC2YcP/txTIAU0A34X9C0gW232H7DEkfk7SlnrIA9FrHrb6IOGF7naTvabzVtzEinq2tMgA91VWfPyK2SdpWUy0A+ojTe4GkCD+QFOEHkiL8QFKEH0iK8ANJEX4gKcIPJEX4gaQIP5AU4QeSIvxAUoQfSIrwA0kRfiApwg8kRfiBpAg/kBThB5Ii/EBShB9IivADSRF+ICnCDyRF+IGkCD+QFOEHkiL8QFKEH0iqq1l6be+VdFTSSUknImKkjqIwOI4te1/p+L6/Lt/+Z1dtaDn2yZfLH/s/xhaWjs+865zS8eHvPFE6nl1X4S98MCJ+UcPjAOgjXvYDSXUb/pD0fdtP2l5bR0EA+qPbl/2XRcQB238i6VHbz0fEYxNXKP5RWCtJM/WWLncHoC5dHfkj4kDxe0zSw5KWTLLO+ogYiYiRIQ13szsANeo4/LZn2T7z1G1JH5b0TF2FAeitbl72z5X0sO1Tj/O1iPhuLVUB6LmOwx8RL0n68xprQQP23fr+0vFj806Uji98qPzxr1izuGT0eOm2x68/t3T8c3d9pXR83Y7rWo5duIZzAGj1AUkRfiApwg8kRfiBpAg/kBThB5JyRPRtZ2d5dlziy/u2vyxmLDq/5djh28u3/d/R8nbawpsf76Skvij7u6Xqv73M2ctf7HzjBu2M7ToSh93Ouhz5gaQIP5AU4QeSIvxAUoQfSIrwA0kRfiCpOq7ei4adv3lfy7F//8+yr9RKFw5wH7/KyT3lvfjZn259HsANW79duu3di67uat9TAUd+ICnCDyRF+IGkCD+QFOEHkiL8QFKEH0iKPv8UUDVN9hV/9EDLsT1ryi+PPZ0dWtr6WgVXveW3pdveOQ36+FU48gNJEX4gKcIPJEX4gaQIP5AU4QeSIvxAUpV9ftsbJV0taSwiLi6WzZb0DUnnSdor6dqI+GXvyszth/dtKB1funpNy7FhTd+pqKvOf3jy8/d0/Njfe3lX6filuz5aOj4VrvvfzpH/q5KufMOyGyVtj4gLJG0v7gOYQirDHxGPSTr8hsUrJG0qbm+SdE3NdQHosU7f88+NiIPF7Vckza2pHgB90vUHfjE+2V/LCf9sr7U9anv0uI51uzsANek0/Idsz5Ok4vdYqxUjYn1EjETEyJCGO9wdgLp1Gv4tklYVt1dJeqSecgD0S2X4bT8o6XFJi2zvt71a0m2SPmT7BUl/VdwHMIVU9vkjYmWLoctrriWtqn61VN5zHv7O9OzlVz0vVec/dKOqjz/70+Xbn6yxll7hDD8gKcIPJEX4gaQIP5AU4QeSIvxAUly6ewAc/dPp+5+hrF33Z/9U3sK8823dtfI++XLrfe/+XPnU5WdXtE+nQiuvCkd+ICnCDyRF+IGkCD+QFOEHkiL8QFKEH0hq+jaYp5Az/+dEV9uX9dK7/brvjEXnl46fv3lf6XhZr37rb2aWbvvuez9ROv7Oza+Wjp8smWZ7Ol/SvF0c+YGkCD+QFOEHkiL8QFKEH0iK8ANJEX4gKY/PttUfZ3l2XGKu+H26frWtvNf+48XfbDm2/IPll6B+6W/OLR1//uOdT3MtSe/9Qute/ZwvP97VY+PNdsZ2HYnDbmddjvxAUoQfSIrwA0kRfiApwg8kRfiBpAg/kFTl9/ltb5R0taSxiLi4WHaLpDWSTn2h+qaI2NarIrM7e3nr76VLkl5uPbRtR+tzANrR7Xfq5+yhlz+o2jnyf1XSlZMsvz0iFhc/BB+YYirDHxGPSTrch1oA9FE37/nX2d5te6Ptc2qrCEBfdBr+eyS9S9JiSQclfbHVirbX2h61PXpcxzrcHYC6dRT+iDgUEScj4neSNkhaUrLu+ogYiYiRIQ13WieAmnUUftvzJtz9iKRn6ikHQL+00+p7UNJSSXNs75f0eUlLbS+WFJL2Srq+hzUC6IHK8EfEykkW39eDWtDCvlvfX7FG63nuy+aol6Q731Z+/fpuro2PwcYZfkBShB9IivADSRF+ICnCDyRF+IGkmKJ7ACwaHSod/9VYebtt6eo1Lceqpuheuqz1tpL02a0PlI6v23Fd6fiFa5gKe1Bx5AeSIvxAUoQfSIrwA0kRfiApwg8kRfiBpOjz12DGovIptA8tLZ8Gu6qPX3np7i5UnQdw91VXl47/bMeG0vErtPi0a0J/cOQHkiL8QFKEH0iK8ANJEX4gKcIPJEX4gaTo89fghq3fLh2/+V/+rnS8l338bnFp7umLIz+QFOEHkiL8QFKEH0iK8ANJEX4gKcIPJFXZ57e9QNL9kuZKCknrI+IO27MlfUPSeZL2Sro2In7Zu1KbVT5N9vOl28758uP1FtNHVdcqKJseHIOtnSP/CUmfiYiLJF0q6QbbF0m6UdL2iLhA0vbiPoApojL8EXEwIp4qbh+V9Jyk+ZJWSNpUrLZJ0jW9KhJA/U7rPb/t8yS9R9JOSXMj4mAx9IrG3xYAmCLaDr/tt0r6lqRPRcSRiWMRERr/PGCy7dbaHrU9elzHuioWQH3aCr/tIY0Hf3NEPFQsPmR7XjE+T9LYZNtGxPqIGImIkSEN11EzgBpUht+2Jd0n6bmI+NKEoS2SVhW3V0l6pP7yAPRKO1/p/YCk6yQ9bftUX+cmSbdJ+jfbqyXtk3Rtb0ocfFVf2Z2jwW31VbXyqr6uvPU3M+ssB31UGf6I+JEktxi+vN5yAPQLZ/gBSRF+ICnCDyRF+IGkCD+QFOEHkuLS3W16/uP3tBxbunpNHys5PceWva90/LN3PdDV41dN4S1x6e9BxZEfSIrwA0kRfiApwg8kRfiBpAg/kBThB5Kiz9+m937hEy3Hbr3rK6XbVn3fv8rQildLx3+8+Jslo+WX1n73va3/LklaeHPVtQjo409VHPmBpAg/kBThB5Ii/EBShB9IivADSRF+ICmPz7TVH2d5dlzi6Xe1759uKP/O/Nz55TOXl/fppUt3fbR0/Pgj57be9w/LzxE4uYc+/XSyM7brSBxudan91+HIDyRF+IGkCD+QFOEHkiL8QFKEH0iK8ANJVfb5bS+QdL+kuZJC0vqIuMP2LZLWSDrVSL4pIraVPdZ07fMDg+J0+vztXMzjhKTPRMRTts+U9KTtR4ux2yPiXzstFEBzKsMfEQclHSxuH7X9nKT5vS4MQG+d1nt+2+dJeo+kncWidbZ3295o+5wW26y1PWp79LiOdVUsgPq0HX7bb5X0LUmfiogjku6R9C5JizX+yuCLk20XEesjYiQiRoY0XEPJAOrQVvhtD2k8+Jsj4iFJiohDEXEyIn4naYOkJb0rE0DdKsNv25Luk/RcRHxpwvJ5E1b7iKRn6i8PQK+082n/ByRdJ+lp26euA32TpJW2F2u8/bdX0vU9qRBAT7Tzaf+PJE3WNyzt6QMYbJzhByRF+IGkCD+QFOEHkiL8QFKEH0iK8ANJEX4gKcIPJEX4gaQIP5AU4QeSIvxAUoQfSKqvU3TbflXSvgmL5kj6Rd8KOD2DWtug1iVRW6fqrG1hRLSes32Cvob/TTu3RyNipLECSgxqbYNal0RtnWqqNl72A0kRfiCppsO/vuH9lxnU2ga1LonaOtVIbY2+5wfQnKaP/AAa0kj4bV9pe4/tF23f2EQNrdjea/tp27tsjzZcy0bbY7afmbBstu1Hbb9Q/J50mrSGarvF9oHiudtle3lDtS2wvcP2T2w/a/vvi+WNPncldTXyvPX9Zb/tGZJ+KulDkvZLekLSyoj4SV8LacH2XkkjEdF4T9j2X0r6taT7I+LiYtk/SzocEbcV/3CeExH/MCC13SLp103P3FxMKDNv4szSkq6R9Ldq8LkrqetaNfC8NXHkXyLpxYh4KSJek/R1SSsaqGPgRcRjkg6/YfEKSZuK25s0/j9P37WobSBExMGIeKq4fVTSqZmlG33uSupqRBPhny/p5xPu79dgTfkdkr5v+0nba5suZhJzi2nTJekVSXObLGYSlTM399MbZpYemOeukxmv68YHfm92WUT8haRlkm4oXt4OpBh/zzZI7Zq2Zm7ul0lmlv69Jp+7Tme8rlsT4T8gacGE+28vlg2EiDhQ/B6T9LAGb/bhQ6cmSS1+jzVcz+8N0szNk80srQF47gZpxusmwv+EpAtsv8P2GZI+JmlLA3W8ie1ZxQcxsj1L0oc1eLMPb5G0qri9StIjDdbyOoMyc3OrmaXV8HM3cDNeR0TffyQt1/gn/v8t6R+bqKFFXe+U9F/Fz7NN1ybpQY2/DDyu8c9GVkv6Y0nbJb0g6QeSZg9QbQ9IelrSbo0HbV5DtV2m8Zf0uyXtKn6WN/3cldTVyPPGGX5AUnzgByRF+IGkCD+QFOEHkiL8QFKEH0iK8ANJEX4gqf8Hat9beTv8/18AAAAASUVORK5CYII=\n"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D\n\nmodel = Sequential()\n\nmodel.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', \n                 activation ='relu', input_shape = (28,28,1)))\nmodel.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', \n                 activation ='relu'))\nmodel.add(AvgPool2D(pool_size=(2,2)))\nmodel.add(Dropout(0.25))","execution_count":52,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', \n                 activation ='relu'))\nmodel.add(AvgPool2D(pool_size=(2,2)))","execution_count":53,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', \n                 activation ='relu'))\nmodel.add(AvgPool2D(pool_size=(2,2)))\nmodel.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', \n                 activation ='relu'))\nmodel.add(AvgPool2D(pool_size=(2,2), strides=(2,2)))\nmodel.add(Dropout(0.25))","execution_count":54,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.add(Flatten())\nmodel.add(Dense(256, activation = \"relu\"))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(10, activation = \"softmax\"))\n","execution_count":55,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"optimizer = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)","execution_count":56,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(optimizer = optimizer , loss = \"categorical_crossentropy\", metrics=[\"accuracy\"])","execution_count":57,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learning_rate_reduction = ReduceLROnPlateau(monitor='val_acc', \n                                            patience=3, \n                                            verbose=1, \n                                            factor=0.5, \n                                            min_lr=0.00001)","execution_count":58,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"epochs = 30\nbatch_size = 64","execution_count":59,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit(X_train, Y_train, batch_size = batch_size, epochs = epochs, \n          validation_data = (X_val, Y_val),callbacks=[learning_rate_reduction])","execution_count":null,"outputs":[{"output_type":"stream","text":"WARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.\nInstructions for updating:\nUse tf.cast instead.\nTrain on 37800 samples, validate on 4200 samples\nEpoch 1/30\n17984/37800 [=============>................] - ETA: 1:17 - loss: 1.0600 - acc: 0.6348","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"results = model.predict(test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"results = np.argmax(results,axis = 1)\nresults = pd.Series(results,name=\"Label\")\nprint(len(results))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.concat([pd.Series(range(1,28001),name = \"ImageId\"),results],axis = 1)\nsubmission.to_csv(\"SM.csv\",index=False)","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}