{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Digit Recognizer"},{"metadata":{},"cell_type":"markdown","source":"###### CNN on classic dataset of handwritten images"},{"metadata":{},"cell_type":"markdown","source":"### Importing important libraries"},{"metadata":{"trusted":true},"cell_type":"code","source":"import math\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nimport os\nprint(os.listdir(\"../input\"))\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import confusion_matrix\n\nimport tensorflow as tf","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Reading Datasets"},{"metadata":{},"cell_type":"markdown","source":"##### Train Dataset"},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pd.read_csv('../input/train.csv')\ntrain.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.describe()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"##### Test Dataset"},{"metadata":{"trusted":true},"cell_type":"code","source":"test = pd.read_csv('../input/test.csv')\ntest.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test.describe()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Exploratory Data Analsysis"},{"metadata":{},"cell_type":"markdown","source":"#### Checking for NULL values"},{"metadata":{"trusted":true},"cell_type":"code","source":"train.melt(id_vars=\"label\")['value'].isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test.melt()['value'].isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Count of each labels"},{"metadata":{"trusted":true},"cell_type":"code","source":"train['label'].value_counts().sort_index()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Plot\nplt.figure(figsize=(8, 4))\nsns.set_style(\"whitegrid\")\nsns.countplot(x=\"label\", data=train)\nplt.xlabel(\"Label\")\nplt.ylabel(\"Count\")\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Dividing the training dataset into X and y"},{"metadata":{"trusted":true},"cell_type":"code","source":"y = train['label']\nX = train.drop(['label'], axis = 1)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Normalize the pixel data, i.e. converting values from 0 - 254 to 0 - 1 "},{"metadata":{"trusted":true},"cell_type":"code","source":"X = X / 255\ntest = test / 255","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Converting labels to numpy array"},{"metadata":{"trusted":true},"cell_type":"code","source":"y = np.array(y)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Reshaping image to 28px X 28px dimension"},{"metadata":{"trusted":true},"cell_type":"code","source":"X = X.values.reshape(-1,28,28,1)\ntest = test.values.reshape(-1,28,28,1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.imshow(X[0][:,:,0])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Modelling CNN"},{"metadata":{},"cell_type":"markdown","source":"#### Creating train and test datasets"},{"metadata":{"trusted":true},"cell_type":"code","source":"random_seed = 4","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Split the train and test set for the fitting\ntrain_X, test_X, train_y, test_y = train_test_split(X, y, test_size = 0.1, random_state=random_seed)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Tensorflow Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Tensorflow Keras CNN Model\nmodel = tf.keras.models.Sequential()\n\nmodel.add(tf.keras.layers.Conv2D(32, (3,3), padding = \"same\", activation = \"relu\", input_shape = train_X.shape[1:]))\nmodel.add(tf.keras.layers.MaxPool2D(2,2))\n\nmodel.add(tf.keras.layers.Conv2D(64, (3,3), padding = \"same\", activation = \"relu\"))\nmodel.add(tf.keras.layers.MaxPool2D(2,2))\n\nmodel.add(tf.keras.layers.Conv2D(128, (3,3), padding = \"same\", activation = \"relu\"))\nmodel.add(tf.keras.layers.MaxPool2D(2,2))\n\nmodel.add(tf.keras.layers.Flatten())\nmodel.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax))\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Optimizer and loss function"},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(optimizer='adam', \n              loss='sparse_categorical_crossentropy', \n              metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Fitting the train dataset"},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit(train_X, train_y, epochs=3)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Finding the loss and accuracy of the model"},{"metadata":{"trusted":true},"cell_type":"code","source":"val_loss, val_acc = model.evaluate(test_X, test_y) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"val_acc","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Predicting the submission dataframe"},{"metadata":{},"cell_type":"markdown","source":"#### Fitting the full train data"},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit(X, y, epochs=3)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Predicting on given test data"},{"metadata":{"trusted":true},"cell_type":"code","source":"test_pred = model.predict(test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.DataFrame()\nsubmission['ImageId'] = range(1, (len(test)+1))\nsubmission['Label'] = np.argmax(test_pred, axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission.shape","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Saving in a csv file"},{"metadata":{"trusted":true},"cell_type":"code","source":"submission.to_csv(\"submission.csv\", index=False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.7.3"}},"nbformat":4,"nbformat_minor":1}