{"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":"# Imports ","metadata":{}},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing\nimport matplotlib.pyplot as plt # visuals \nimport seaborn as sns # visuals\nfrom keras.utils.np_utils import to_categorical # to categorical\nfrom sklearn.model_selection import train_test_split # train test split \n\n\n# Model\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D, BatchNormalization\n\nfrom tensorflow.keras.callbacks import EarlyStopping # Early Stopping\n\nfrom sklearn.metrics import classification_report, confusion_matrix # Evaluation\n\nfrom keras.preprocessing.image import ImageDataGenerator # Image Data Generator","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-01-06T22:00:13.652507Z","iopub.execute_input":"2022-01-06T22:00:13.652818Z","iopub.status.idle":"2022-01-06T22:00:19.090963Z","shell.execute_reply.started":"2022-01-06T22:00:13.652738Z","shell.execute_reply":"2022-01-06T22:00:19.090239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load the Data ","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv('../input/digit-recognizer/train.csv')\ntest = pd.read_csv('../input/digit-recognizer/test.csv')","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:00:24.333389Z","iopub.execute_input":"2022-01-06T22:00:24.333907Z","iopub.status.idle":"2022-01-06T22:00:29.020378Z","shell.execute_reply.started":"2022-01-06T22:00:24.333873Z","shell.execute_reply":"2022-01-06T22:00:29.019623Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prepare the data ","metadata":{}},{"cell_type":"code","source":"# Seprate X from y\ny_train = train[\"label\"]\nX_train = train.drop(\"label\",axis = 1)\n\n# Normalize the data \nX_train = X_train / 255.0\nX_test = test / 255.0\n\n# Reshape the data \nX_train = X_train.values.reshape(-1,28,28,1)\nX_test = X_test.values.reshape(-1,28,28,1)\n\n# Convert y to categorical \ny_train = to_categorical(y_train, num_classes = 10)","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:00:29.024243Z","iopub.execute_input":"2022-01-06T22:00:29.024886Z","iopub.status.idle":"2022-01-06T22:00:29.277544Z","shell.execute_reply.started":"2022-01-06T22:00:29.024841Z","shell.execute_reply":"2022-01-06T22:00:29.276802Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Print some Images ","metadata":{}},{"cell_type":"code","source":"single_img = X_train[10]\nplt.imshow(single_img, cmap=plt.cm.binary)\nplt.axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:00:29.278993Z","iopub.execute_input":"2022-01-06T22:00:29.279549Z","iopub.status.idle":"2022-01-06T22:00:29.374495Z","shell.execute_reply.started":"2022-01-06T22:00:29.279510Z","shell.execute_reply":"2022-01-06T22:00:29.373682Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(15,5))\nfor i in range(30):  \n    plt.subplot(3, 10, i+1)\n    plt.imshow(X_train[i],cmap=plt.cm.binary)\n    plt.axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:00:29.376630Z","iopub.execute_input":"2022-01-06T22:00:29.377167Z","iopub.status.idle":"2022-01-06T22:00:30.487732Z","shell.execute_reply.started":"2022-01-06T22:00:29.377128Z","shell.execute_reply":"2022-01-06T22:00:30.487044Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train Validation Split ","metadata":{}},{"cell_type":"code","source":" X_train2, X_val2, y_train2, y_val2 = train_test_split(X_train, y_train, test_size = 0.2)","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:15:58.612865Z","iopub.execute_input":"2022-01-06T22:15:58.613111Z","iopub.status.idle":"2022-01-06T22:15:58.983595Z","shell.execute_reply.started":"2022-01-06T22:15:58.613083Z","shell.execute_reply":"2022-01-06T22:15:58.982837Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Augmentation ","metadata":{}},{"cell_type":"code","source":"# Create more images \ndatagen = ImageDataGenerator(\n        rotation_range=10,  \n        zoom_range = 0.10,  \n        width_shift_range=0.1, \n        height_shift_range=0.1)","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:15:59.057717Z","iopub.execute_input":"2022-01-06T22:15:59.058302Z","iopub.status.idle":"2022-01-06T22:15:59.061936Z","shell.execute_reply.started":"2022-01-06T22:15:59.058266Z","shell.execute_reply":"2022-01-06T22:15:59.061258Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train the Model","metadata":{}},{"cell_type":"code","source":"model = Sequential()\n\nmodel.add(Conv2D(filters = 32, kernel_size = 3, input_shape = (28,28,1), activation = 'relu'))\nmodel.add(MaxPool2D(pool_size = (2,2)))\nmodel.add(BatchNormalization())\nmodel.add(Dropout(0.4))\n\nmodel.add(Conv2D(filters = 64, kernel_size = 3, activation = 'relu'))\nmodel.add(MaxPool2D(pool_size = (2,2)))\nmodel.add(BatchNormalization())\nmodel.add(Dropout(0.4))\n\nmodel.add(Conv2D(filters = 128, kernel_size = 3, padding='same', activation='relu'))\nmodel.add(MaxPool2D(pool_size = (2,2)))\nmodel.add(BatchNormalization())\nmodel.add(Dropout(0.4))\n\nmodel.add(Flatten())\nmodel.add(Dense(128, activation = 'relu'))\nmodel.add(Dense(512, activation = 'relu'))\nmodel.add(Dense(10, activation = 'softmax'))\n\nmodel.compile(optimizer=\"adam\", loss=\"categorical_crossentropy\", metrics=[\"accuracy\"]);","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-01-06T22:35:53.806793Z","iopub.execute_input":"2022-01-06T22:35:53.807053Z","iopub.status.idle":"2022-01-06T22:35:53.915905Z","shell.execute_reply.started":"2022-01-06T22:35:53.807023Z","shell.execute_reply":"2022-01-06T22:35:53.915238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:35:56.055916Z","iopub.execute_input":"2022-01-06T22:35:56.056167Z","iopub.status.idle":"2022-01-06T22:35:56.069995Z","shell.execute_reply.started":"2022-01-06T22:35:56.056136Z","shell.execute_reply":"2022-01-06T22:35:56.069368Z"},"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"early_stop = EarlyStopping(monitor = 'val_loss', patience = 2)\nmodel.fit(datagen.flow(X_train2, y_train2, batch_size=64), epochs = 20, validation_data = (X_val2,y_val2), callbacks = [early_stop]);","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-01-06T22:35:57.381219Z","iopub.execute_input":"2022-01-06T22:35:57.381592Z","iopub.status.idle":"2022-01-06T22:38:25.970511Z","shell.execute_reply.started":"2022-01-06T22:35:57.381559Z","shell.execute_reply":"2022-01-06T22:38:25.969809Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"metrics = pd.DataFrame(model.history.history)","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:38:30.859558Z","iopub.execute_input":"2022-01-06T22:38:30.860019Z","iopub.status.idle":"2022-01-06T22:38:30.866221Z","shell.execute_reply.started":"2022-01-06T22:38:30.859984Z","shell.execute_reply":"2022-01-06T22:38:30.865386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model Evaluation","metadata":{}},{"cell_type":"code","source":"metrics[['loss', 'val_loss']].plot();","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:38:31.653275Z","iopub.execute_input":"2022-01-06T22:38:31.653596Z","iopub.status.idle":"2022-01-06T22:38:31.862866Z","shell.execute_reply.started":"2022-01-06T22:38:31.653562Z","shell.execute_reply":"2022-01-06T22:38:31.862186Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"metrics[['accuracy', 'val_accuracy']].plot();","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:38:32.142302Z","iopub.execute_input":"2022-01-06T22:38:32.142951Z","iopub.status.idle":"2022-01-06T22:38:32.363819Z","shell.execute_reply.started":"2022-01-06T22:38:32.142914Z","shell.execute_reply":"2022-01-06T22:38:32.363117Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred = model.predict(X_val2)\npredictions = np.round(y_pred).astype(int)\nprint(classification_report(y_val2, predictions));","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:38:36.422751Z","iopub.execute_input":"2022-01-06T22:38:36.423600Z","iopub.status.idle":"2022-01-06T22:38:36.912836Z","shell.execute_reply.started":"2022-01-06T22:38:36.423562Z","shell.execute_reply":"2022-01-06T22:38:36.912062Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submit the results","metadata":{}},{"cell_type":"code","source":"preds = model.predict(X_test)\npreds = np.argmax(preds,axis = 1)\n\noutput = pd.read_csv(\"../input/digit-recognizer/sample_submission.csv\")\noutput['Label'] = preds\noutput.to_csv('submission.csv',index=False)","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:38:42.526561Z","iopub.execute_input":"2022-01-06T22:38:42.527243Z","iopub.status.idle":"2022-01-06T22:38:44.250739Z","shell.execute_reply.started":"2022-01-06T22:38:42.527205Z","shell.execute_reply":"2022-01-06T22:38:44.249923Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"output.head(20)","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:38:44.252409Z","iopub.execute_input":"2022-01-06T22:38:44.252941Z","iopub.status.idle":"2022-01-06T22:38:44.263268Z","shell.execute_reply.started":"2022-01-06T22:38:44.252903Z","shell.execute_reply":"2022-01-06T22:38:44.262618Z"},"trusted":true},"execution_count":null,"outputs":[]}]}