{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":30761,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"#### Importing necessary libraries","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.metrics import confusion_matrix\nimport itertools\nfrom sklearn.model_selection import train_test_split\nfrom subprocess import check_output\n\nimport keras\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D, BatchNormalization\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom keras.callbacks import ReduceLROnPlateau","metadata":{"execution":{"iopub.status.busy":"2024-08-26T14:04:16.632504Z","iopub.execute_input":"2024-08-26T14:04:16.633741Z","iopub.status.idle":"2024-08-26T14:04:16.726649Z","shell.execute_reply.started":"2024-08-26T14:04:16.633682Z","shell.execute_reply":"2024-08-26T14:04:16.725405Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Loading the data","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv(\"/kaggle/input/digit-recognizer/train.csv\")\nprint(train.shape)\ntrain.head()","metadata":{"execution":{"iopub.status.busy":"2024-08-26T13:52:02.107060Z","iopub.execute_input":"2024-08-26T13:52:02.107564Z","iopub.status.idle":"2024-08-26T13:52:05.524777Z","shell.execute_reply.started":"2024-08-26T13:52:02.107519Z","shell.execute_reply":"2024-08-26T13:52:05.523197Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['label'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-08-26T13:52:46.148113Z","iopub.execute_input":"2024-08-26T13:52:46.148710Z","iopub.status.idle":"2024-08-26T13:52:46.168672Z","shell.execute_reply.started":"2024-08-26T13:52:46.148660Z","shell.execute_reply":"2024-08-26T13:52:46.166561Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.countplot(x=train['label'])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-08-26T13:53:39.715688Z","iopub.execute_input":"2024-08-26T13:53:39.716765Z","iopub.status.idle":"2024-08-26T13:53:39.971967Z","shell.execute_reply.started":"2024-08-26T13:53:39.716709Z","shell.execute_reply":"2024-08-26T13:53:39.970490Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test= pd.read_csv(\"/kaggle/input/digit-recognizer/test.csv\")\nprint(test.shape)\ntest.head()","metadata":{"execution":{"iopub.status.busy":"2024-08-26T13:54:00.107562Z","iopub.execute_input":"2024-08-26T13:54:00.108153Z","iopub.status.idle":"2024-08-26T13:54:02.751572Z","shell.execute_reply.started":"2024-08-26T13:54:00.108100Z","shell.execute_reply":"2024-08-26T13:54:02.750206Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train = (train.iloc[:, 1:].values).astype('float32')  # all pixel values except the first column\ny_train = train.iloc[:, 0].values.astype('int32')  # only labels i.e., target digits\nx_test = test.values.astype('float32')  # test data has no label column","metadata":{"execution":{"iopub.status.busy":"2024-08-26T13:55:18.275309Z","iopub.execute_input":"2024-08-26T13:55:18.275856Z","iopub.status.idle":"2024-08-26T13:55:18.467673Z","shell.execute_reply.started":"2024-08-26T13:55:18.275813Z","shell.execute_reply":"2024-08-26T13:55:18.465990Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12,10))\nx, y = 10, 4\nfor i in range(40):  \n    plt.subplot(y, x, i+1)\n    plt.imshow(x_train[i].reshape((28,28)),interpolation='nearest')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-08-26T13:55:36.699711Z","iopub.execute_input":"2024-08-26T13:55:36.701186Z","iopub.status.idle":"2024-08-26T13:55:41.602113Z","shell.execute_reply.started":"2024-08-26T13:55:36.701114Z","shell.execute_reply":"2024-08-26T13:55:41.600582Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Normalizing the data","metadata":{}},{"cell_type":"code","source":"x_train = x_train/255.0\nx_test = x_test/255.0","metadata":{"execution":{"iopub.status.busy":"2024-08-26T13:56:11.924133Z","iopub.execute_input":"2024-08-26T13:56:11.924592Z","iopub.status.idle":"2024-08-26T13:56:12.021124Z","shell.execute_reply.started":"2024-08-26T13:56:11.924546Z","shell.execute_reply":"2024-08-26T13:56:12.018687Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('x_train shape:', x_train.shape)\n\nprint(x_train.shape[0], 'train samples')\nprint(x_test.shape[0], 'test samples')","metadata":{"execution":{"iopub.status.busy":"2024-08-26T13:59:18.824867Z","iopub.execute_input":"2024-08-26T13:59:18.826329Z","iopub.status.idle":"2024-08-26T13:59:18.833477Z","shell.execute_reply.started":"2024-08-26T13:59:18.826274Z","shell.execute_reply":"2024-08-26T13:59:18.831727Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Reshaping the data to match keras's expectations","metadata":{}},{"cell_type":"code","source":"X_train = x_train.reshape(x_train.shape[0], 28, 28,1)\nX_test = x_test.reshape(x_test.shape[0], 28, 28,1)","metadata":{"execution":{"iopub.status.busy":"2024-08-26T14:01:09.656196Z","iopub.execute_input":"2024-08-26T14:01:09.657630Z","iopub.status.idle":"2024-08-26T14:01:09.664949Z","shell.execute_reply.started":"2024-08-26T14:01:09.657560Z","shell.execute_reply":"2024-08-26T14:01:09.663077Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 64\nnum_classes = 10\nepochs = 20\ninput_shape = (28, 28, 1)","metadata":{"execution":{"iopub.status.busy":"2024-08-26T14:04:21.891435Z","iopub.execute_input":"2024-08-26T14:04:21.891909Z","iopub.status.idle":"2024-08-26T14:04:21.898689Z","shell.execute_reply.started":"2024-08-26T14:04:21.891866Z","shell.execute_reply":"2024-08-26T14:04:21.897104Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### One Hot Encoding - Converting class vectors to binary class matrices","metadata":{}},{"cell_type":"code","source":"y_train = keras.utils.to_categorical(y_train, num_classes)\nX_train, X_val, Y_train, Y_val = train_test_split(X_train, y_train, test_size = 0.1, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2024-08-26T14:04:59.390341Z","iopub.execute_input":"2024-08-26T14:04:59.390824Z","iopub.status.idle":"2024-08-26T14:04:59.984242Z","shell.execute_reply.started":"2024-08-26T14:04:59.390781Z","shell.execute_reply":"2024-08-26T14:04:59.982755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Model","metadata":{}},{"cell_type":"code","source":"#Linear model\nmodel = Sequential()\n\n#Adding layers to the model\nmodel.add(Conv2D(32, kernel_size=(3, 3),activation='relu',kernel_initializer='he_normal',input_shape=input_shape))\nmodel.add(Conv2D(32, kernel_size=(3, 3),activation='relu',kernel_initializer='he_normal'))\nmodel.add(MaxPool2D((2, 2)))\nmodel.add(Dropout(0.20))\nmodel.add(Conv2D(64, (3, 3), activation='relu',padding='same',kernel_initializer='he_normal'))\nmodel.add(Conv2D(64, (3, 3), activation='relu',padding='same',kernel_initializer='he_normal'))\nmodel.add(MaxPool2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\nmodel.add(Conv2D(128, (3, 3), activation='relu',padding='same',kernel_initializer='he_normal'))\nmodel.add(Dropout(0.25))\nmodel.add(Flatten())\nmodel.add(Dense(128, activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(Dropout(0.25))\nmodel.add(Dense(num_classes, activation='softmax'))\n\n#Compiling the model\nmodel.compile(loss=keras.losses.categorical_crossentropy,\n              optimizer=keras.optimizers.RMSprop(),\n              metrics=['accuracy'])\n\n#Learning rate reduction callback\nlearning_rate_reduction = ReduceLROnPlateau(monitor='val_acc', \n                                            patience=3, \n                                            verbose=1, \n                                            factor=0.5, \n                                            min_lr=0.0001)","metadata":{"execution":{"iopub.status.busy":"2024-08-26T14:09:54.871441Z","iopub.execute_input":"2024-08-26T14:09:54.872008Z","iopub.status.idle":"2024-08-26T14:09:55.219769Z","shell.execute_reply.started":"2024-08-26T14:09:54.871956Z","shell.execute_reply":"2024-08-26T14:09:55.218092Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### Data Augmentation","metadata":{}},{"cell_type":"code","source":"datagen = ImageDataGenerator(\n        featurewise_center=False,\n        samplewise_center=False,\n        featurewise_std_normalization=False,\n        samplewise_std_normalization=False,\n        zca_whitening=False,\n        rotation_range=15,\n        zoom_range=0.1,\n        width_shift_range=0.1,\n        height_shift_range=0.1,\n        horizontal_flip=False,\n        vertical_flip=False)","metadata":{"execution":{"iopub.status.busy":"2024-08-26T14:10:14.176644Z","iopub.execute_input":"2024-08-26T14:10:14.177111Z","iopub.status.idle":"2024-08-26T14:10:14.184395Z","shell.execute_reply.started":"2024-08-26T14:10:14.177064Z","shell.execute_reply":"2024-08-26T14:10:14.182647Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2024-08-26T14:10:39.333541Z","iopub.execute_input":"2024-08-26T14:10:39.334216Z","iopub.status.idle":"2024-08-26T14:10:39.377851Z","shell.execute_reply.started":"2024-08-26T14:10:39.334165Z","shell.execute_reply":"2024-08-26T14:10:39.376383Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datagen.fit(X_train)\n\nmodel.fit(datagen.flow(X_train,Y_train, batch_size=batch_size),\n                            epochs = epochs, validation_data = (X_val,Y_val),\n                            verbose = 1, steps_per_epoch=X_train.shape[0],\n                            callbacks=[learning_rate_reduction])","metadata":{"execution":{"iopub.status.busy":"2024-08-26T14:18:36.075272Z","iopub.execute_input":"2024-08-26T14:18:36.075729Z","iopub.status.idle":"2024-08-26T14:47:00.327196Z","shell.execute_reply.started":"2024-08-26T14:18:36.075689Z","shell.execute_reply":"2024-08-26T14:47:00.325899Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Model Evaluation","metadata":{}},{"cell_type":"code","source":"final_loss, final_acc = model.evaluate(X_val, Y_val, verbose=0)\nprint(\"Final loss: {0:.6f}, final accuracy: {1:.6f}\".format(final_loss, final_acc))","metadata":{"execution":{"iopub.status.busy":"2024-08-26T14:47:00.329978Z","iopub.execute_input":"2024-08-26T14:47:00.330384Z","iopub.status.idle":"2024-08-26T14:47:02.735266Z","shell.execute_reply.started":"2024-08-26T14:47:00.330343Z","shell.execute_reply":"2024-08-26T14:47:02.733759Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_confusion_matrix(cm, classes,\n                          normalize=False,\n                          title='Confusion matrix',\n                          cmap=plt.cm.Blues):\n    plt.imshow(cm, interpolation='nearest', cmap=cmap)\n    plt.title(title)\n    plt.colorbar()\n    tick_marks = np.arange(len(classes))\n    plt.xticks(tick_marks, classes, rotation=45)\n    plt.yticks(tick_marks, classes)\n\n    if normalize:\n        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n\n    thresh = cm.max() / 2.\n    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n        plt.text(j, i, cm[i, j],\n                 horizontalalignment=\"center\",\n                 color=\"white\" if cm[i, j] > thresh else \"black\")\n\n    plt.tight_layout()\n    plt.ylabel('True label')\n    plt.xlabel('Predicted label')\n    \n    \nY_pred = model.predict(X_val)\nY_pred_classes = np.argmax(Y_pred, axis = 1) \nY_true = np.argmax(Y_val, axis = 1) \nconfusion_mtx = confusion_matrix(Y_true, Y_pred_classes) \nplot_confusion_matrix(confusion_mtx, classes = range(10))","metadata":{"execution":{"iopub.status.busy":"2024-08-26T14:47:02.737291Z","iopub.execute_input":"2024-08-26T14:47:02.737741Z","iopub.status.idle":"2024-08-26T14:47:06.376114Z","shell.execute_reply.started":"2024-08-26T14:47:02.737697Z","shell.execute_reply":"2024-08-26T14:47:06.374555Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}