{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Simple Digit Recognizer Using CNN","metadata":{}},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport tensorflow as tf # deep learning library\nfrom matplotlib import pyplot as plt # data visualization","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-09-16T04:06:21.472158Z","iopub.execute_input":"2021-09-16T04:06:21.472522Z","iopub.status.idle":"2021-09-16T04:06:25.820211Z","shell.execute_reply.started":"2021-09-16T04:06:21.472429Z","shell.execute_reply":"2021-09-16T04:06:25.819495Z"}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv('../input/digit-recognizer/train.csv')\ntest_df = pd.read_csv('../input/digit-recognizer/test.csv')\n\nprint('Train data shape: ', train_df.shape)\nprint('Test data shape: ', test_df.shape)","metadata":{"execution":{"iopub.status.busy":"2021-09-16T04:06:25.823581Z","iopub.execute_input":"2021-09-16T04:06:25.823787Z","iopub.status.idle":"2021-09-16T04:06:31.030093Z","shell.execute_reply.started":"2021-09-16T04:06:25.823758Z","shell.execute_reply":"2021-09-16T04:06:31.029362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Is train data has null value? ', train_df.isnull().any().any())\nprint('Is test data has null value? ', test_df.isnull().any().any())\n\nprint('Is train data has duplicate? ', train_df.duplicated().any())\nprint('Is test data has duplicate? ', test_df.duplicated().any())","metadata":{"execution":{"iopub.status.busy":"2021-09-16T04:06:31.031427Z","iopub.execute_input":"2021-09-16T04:06:31.031832Z","iopub.status.idle":"2021-09-16T04:06:32.071803Z","shell.execute_reply.started":"2021-09-16T04:06:31.031796Z","shell.execute_reply":"2021-09-16T04:06:32.071033Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_features = train_df.copy().drop('label', axis=1)\ntrain_target = train_df.copy().loc[:, ['label']]","metadata":{"execution":{"iopub.status.busy":"2021-09-16T04:06:32.073827Z","iopub.execute_input":"2021-09-16T04:06:32.074523Z","iopub.status.idle":"2021-09-16T04:06:32.349963Z","shell.execute_reply.started":"2021-09-16T04:06:32.074487Z","shell.execute_reply":"2021-09-16T04:06:32.349230Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_target.hist()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-09-16T04:06:32.351075Z","iopub.execute_input":"2021-09-16T04:06:32.351414Z","iopub.status.idle":"2021-09-16T04:06:32.565683Z","shell.execute_reply.started":"2021-09-16T04:06:32.351359Z","shell.execute_reply":"2021-09-16T04:06:32.564979Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_features = train_features / 255.0\ntrain_features.head(3)","metadata":{"execution":{"iopub.status.busy":"2021-09-16T04:06:32.566808Z","iopub.execute_input":"2021-09-16T04:06:32.567055Z","iopub.status.idle":"2021-09-16T04:06:32.842611Z","shell.execute_reply.started":"2021-09-16T04:06:32.567020Z","shell.execute_reply":"2021-09-16T04:06:32.841940Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tensor_features = tf.convert_to_tensor(train_features)\ntensor_target = tf.convert_to_tensor(train_target)","metadata":{"execution":{"iopub.status.busy":"2021-09-16T04:06:32.843751Z","iopub.execute_input":"2021-09-16T04:06:32.843992Z","iopub.status.idle":"2021-09-16T04:06:34.778855Z","shell.execute_reply.started":"2021-09-16T04:06:32.843962Z","shell.execute_reply":"2021-09-16T04:06:34.778123Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tensor_features = tf.reshape(tensor_features, (tensor_features.shape[0], 28, 28, 1))\ntensor_features.shape","metadata":{"execution":{"iopub.status.busy":"2021-09-16T04:06:34.780238Z","iopub.execute_input":"2021-09-16T04:06:34.780531Z","iopub.status.idle":"2021-09-16T04:06:35.128346Z","shell.execute_reply.started":"2021-09-16T04:06:34.780494Z","shell.execute_reply":"2021-09-16T04:06:35.127558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.preprocessing import OneHotEncoder\n\nenc = OneHotEncoder(sparse=False)\ntarget_encoded = enc.fit_transform(tensor_target)\ntarget_encoded","metadata":{"execution":{"iopub.status.busy":"2021-09-16T04:06:35.129795Z","iopub.execute_input":"2021-09-16T04:06:35.130061Z","iopub.status.idle":"2021-09-16T04:06:35.648040Z","shell.execute_reply.started":"2021-09-16T04:06:35.130027Z","shell.execute_reply":"2021-09-16T04:06:35.647185Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = tf.keras.Sequential([\n    tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation='relu', input_shape=(28, 28, 1)),\n    tf.keras.layers.MaxPooling2D(pool_size=(2,2)),\n    tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation='relu'),\n    tf.keras.layers.MaxPooling2D(pool_size=(2,2)),\n    tf.keras.layers.Flatten(),\n    tf.keras.layers.Dense(128, activation='relu'),\n    tf.keras.layers.Dense(64, activation='relu'),\n    tf.keras.layers.Dense(10, activation='softmax'),\n])","metadata":{"execution":{"iopub.status.busy":"2021-09-16T04:06:35.650746Z","iopub.execute_input":"2021-09-16T04:06:35.651004Z","iopub.status.idle":"2021-09-16T04:06:35.740174Z","shell.execute_reply.started":"2021-09-16T04:06:35.650972Z","shell.execute_reply":"2021-09-16T04:06:35.739485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer='adam', loss='categorical_crossentropy', metrics='accuracy')\nmodel_history = model.fit(x=tensor_features, y=target_encoded, epochs=25, validation_split=0.8)","metadata":{"execution":{"iopub.status.busy":"2021-09-16T04:06:35.741519Z","iopub.execute_input":"2021-09-16T04:06:35.741762Z","iopub.status.idle":"2021-09-16T04:07:59.389174Z","shell.execute_reply.started":"2021-09-16T04:06:35.741730Z","shell.execute_reply":"2021-09-16T04:07:59.388457Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_model_history(model_hist, history_type, plot_title, plot_y, plot_x, plot_legend):\n    for history in history_type:\n        plt.plot(model_hist.history[history])\n        \n    plt.title(plot_title)\n    plt.ylabel(plot_y)\n    plt.xlabel(plot_x)\n    plt.legend(plot_legend, loc='upper left')\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-09-16T04:07:59.390895Z","iopub.execute_input":"2021-09-16T04:07:59.391149Z","iopub.status.idle":"2021-09-16T04:07:59.398293Z","shell.execute_reply.started":"2021-09-16T04:07:59.391113Z","shell.execute_reply":"2021-09-16T04:07:59.397505Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_model_history(model_history, ['accuracy', 'val_accuracy'], \n                   'Model Accuracy', 'Accuracy', \n                   'Epochs', ['Train', 'Val'])\n\nplot_model_history(model_history, ['loss', 'val_loss'], \n                   'Model Loss', 'Loss', \n                   'Epochs', ['Train', 'Val'])","metadata":{"execution":{"iopub.status.busy":"2021-09-16T04:07:59.399653Z","iopub.execute_input":"2021-09-16T04:07:59.399922Z","iopub.status.idle":"2021-09-16T04:07:59.782421Z","shell.execute_reply.started":"2021-09-16T04:07:59.399885Z","shell.execute_reply":"2021-09-16T04:07:59.781774Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tensor_test = tf.convert_to_tensor(test_df)\ntensor_test = tf.reshape(tensor_test, (tensor_test.shape[0], 28, 28, 1))\npred_result = model.predict(tensor_test)\npred_result = pred_result.argmax(1)","metadata":{"execution":{"iopub.status.busy":"2021-09-16T04:12:45.062891Z","iopub.execute_input":"2021-09-16T04:12:45.063159Z","iopub.status.idle":"2021-09-16T04:12:46.308335Z","shell.execute_reply.started":"2021-09-16T04:12:45.063130Z","shell.execute_reply":"2021-09-16T04:12:46.307611Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df = pd.read_csv('../input/digit-recognizer/sample_submission.csv')\nsubmission_df['Label'] = pred_result\nsubmission_df.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2021-09-16T04:12:51.405519Z","iopub.execute_input":"2021-09-16T04:12:51.406207Z","iopub.status.idle":"2021-09-16T04:12:51.464675Z","shell.execute_reply.started":"2021-09-16T04:12:51.406172Z","shell.execute_reply":"2021-09-16T04:12:51.463941Z"},"trusted":true},"execution_count":null,"outputs":[]}]}