{"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":"code","source":"import numpy as np \nimport pandas as pd\nfrom random import sample\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nfrom sklearn.preprocessing import MinMaxScaler\n\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom keras import Sequential\nfrom keras.layers import Dense, Conv2D, Flatten, BatchNormalization, Activation, MaxPooling2D\nfrom keras.utils.np_utils import to_categorical\nfrom keras.callbacks import ReduceLROnPlateau\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.model_selection import train_test_split","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-04-26T14:19:06.940049Z","iopub.execute_input":"2022-04-26T14:19:06.940656Z","iopub.status.idle":"2022-04-26T14:19:06.947674Z","shell.execute_reply.started":"2022-04-26T14:19:06.940604Z","shell.execute_reply":"2022-04-26T14:19:06.946641Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')\ndf_test = pd.read_csv('/kaggle/input/digit-recognizer/test.csv')\n\ndf_train.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-26T14:19:07.024721Z","iopub.execute_input":"2022-04-26T14:19:07.025261Z","iopub.status.idle":"2022-04-26T14:19:10.742723Z","shell.execute_reply.started":"2022-04-26T14:19:07.025224Z","shell.execute_reply":"2022-04-26T14:19:10.741843Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"============== Training Dataset ==============\\n\")\nprint(\"Total rows    :\", df_train.shape[0])\nprint(\"Total features:\", df_train.shape[1])\nprint()\nprint(\"============== Testing Dataset ==============\\n\")\nprint(\"Total rows    :\", df_test.shape[0])\nprint(\"Total features:\", df_test.shape[1])","metadata":{"execution":{"iopub.status.busy":"2022-04-26T14:19:10.744365Z","iopub.execute_input":"2022-04-26T14:19:10.744820Z","iopub.status.idle":"2022-04-26T14:19:10.751803Z","shell.execute_reply.started":"2022-04-26T14:19:10.744775Z","shell.execute_reply":"2022-04-26T14:19:10.751125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(15,7))\nsns.countplot(data=df_train, x='label', palette='viridis')\nplt.title('Count plot of Label')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-04-26T14:19:10.752721Z","iopub.execute_input":"2022-04-26T14:19:10.753612Z","iopub.status.idle":"2022-04-26T14:19:10.925945Z","shell.execute_reply.started":"2022-04-26T14:19:10.753558Z","shell.execute_reply":"2022-04-26T14:19:10.924929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = df_train.drop('label', axis=1)\ny_train = df_train['label']\nX_test = df_test.copy()","metadata":{"execution":{"iopub.status.busy":"2022-04-26T14:19:10.928077Z","iopub.execute_input":"2022-04-26T14:19:10.928728Z","iopub.status.idle":"2022-04-26T14:19:11.273178Z","shell.execute_reply.started":"2022-04-26T14:19:10.928675Z","shell.execute_reply":"2022-04-26T14:19:11.272151Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in sample(range(0, X_train.shape[0]),5):\n    \n    plt.figure(figsize=(18,6))\n    plt.subplot(121)\n    plt.imshow(X_train.iloc[i].values.reshape((28,28)), cmap=plt.cm.binary)\n    plt.title(\"Record No: {} \\n Label: {}\".format(i, y_train.iloc[i]))\n    plt.subplot(122)\n    sns.histplot(X_train.iloc[i].values)\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-04-26T14:19:11.274517Z","iopub.execute_input":"2022-04-26T14:19:11.274743Z","iopub.status.idle":"2022-04-26T14:19:12.604217Z","shell.execute_reply.started":"2022-04-26T14:19:11.274717Z","shell.execute_reply":"2022-04-26T14:19:12.603380Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"scaler = MinMaxScaler(feature_range=(0,1))\n\nX_train_scaled = scaler.fit_transform(X_train)\nX_test_scaled = scaler.transform(X_test)\n\n\nX_train = X_train_scaled.reshape(-1,28,28,1)\nX_test = X_test_scaled.reshape(-1,28,28,1)\ny_train = to_categorical(y_train)","metadata":{"execution":{"iopub.status.busy":"2022-04-26T14:19:12.605471Z","iopub.execute_input":"2022-04-26T14:19:12.605715Z","iopub.status.idle":"2022-04-26T14:19:13.586229Z","shell.execute_reply.started":"2022-04-26T14:19:12.605686Z","shell.execute_reply":"2022-04-26T14:19:13.585374Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(f\"X train: {X_train.shape}\")\nprint(f\"X test : {X_test.shape}\")","metadata":{"execution":{"iopub.status.busy":"2022-04-26T14:19:13.587280Z","iopub.execute_input":"2022-04-26T14:19:13.587745Z","iopub.status.idle":"2022-04-26T14:19:13.595577Z","shell.execute_reply.started":"2022-04-26T14:19:13.587707Z","shell.execute_reply":"2022-04-26T14:19:13.593388Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_val, y_train, y_val= train_test_split(X_train, y_train, test_size=0.2, random_state=21)","metadata":{"execution":{"iopub.status.busy":"2022-04-26T14:19:13.597378Z","iopub.execute_input":"2022-04-26T14:19:13.597629Z","iopub.status.idle":"2022-04-26T14:19:14.455853Z","shell.execute_reply.started":"2022-04-26T14:19:13.597598Z","shell.execute_reply":"2022-04-26T14:19:14.454786Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cnn = Sequential()\n\ncnn.add(Conv2D(filters=30, kernel_size=(3,3), strides=(1,1), padding='valid', activation=None, use_bias=False, input_shape=(X_train.shape[1:])))\ncnn.add(BatchNormalization())\ncnn.add(Activation('relu'))\n\ncnn.add(Conv2D(filters=75, kernel_size=(3,3), strides=(1,1), padding='valid', activation=None, use_bias=False, input_shape=(X_train.shape[1:])))\ncnn.add(BatchNormalization())\ncnn.add(Activation('relu'))\n\ncnn.add(MaxPooling2D(pool_size=(2,2)))\n\ncnn.add(Conv2D(filters=140, kernel_size=(3,3), strides=(1,1), padding='valid', activation=None, use_bias=False, input_shape=(X_train.shape[1:])))\ncnn.add(BatchNormalization())\ncnn.add(Activation('relu'))\n\ncnn.add(MaxPooling2D(pool_size=(2,2)))\n\ncnn.add(Conv2D(filters=300, kernel_size=(3,3), strides=(1,1), padding='valid', activation=None, use_bias=False, input_shape=(X_train.shape[1:])))\ncnn.add(BatchNormalization())\ncnn.add(Activation('relu'))\n\ncnn.add(Flatten())\n\ncnn.add(Dense(units=50))\ncnn.add(BatchNormalization())\ncnn.add(Activation('relu'))\n\ncnn.add(Dense(units=10))\ncnn.add(BatchNormalization())\ncnn.add(Activation('softmax'))\n\ncnn.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2022-04-26T14:19:14.458000Z","iopub.execute_input":"2022-04-26T14:19:14.458365Z","iopub.status.idle":"2022-04-26T14:19:15.204192Z","shell.execute_reply.started":"2022-04-26T14:19:14.458326Z","shell.execute_reply":"2022-04-26T14:19:15.203362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cnn.summary()","metadata":{"execution":{"iopub.status.busy":"2022-04-26T14:19:15.206015Z","iopub.execute_input":"2022-04-26T14:19:15.206908Z","iopub.status.idle":"2022-04-26T14:19:15.222038Z","shell.execute_reply.started":"2022-04-26T14:19:15.206869Z","shell.execute_reply":"2022-04-26T14:19:15.221156Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"keras.utils.plot_model(cnn)","metadata":{"execution":{"iopub.status.busy":"2022-04-26T14:19:15.223752Z","iopub.execute_input":"2022-04-26T14:19:15.224306Z","iopub.status.idle":"2022-04-26T14:19:16.644242Z","shell.execute_reply.started":"2022-04-26T14:19:15.224241Z","shell.execute_reply":"2022-04-26T14:19:16.643199Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rotation_range=15, zoom_range=0.15, width_shift_range=0.1, height_shift_range=0.1)\ntrain_generator = train_datagen.flow(X_train, y_train, batch_size=120, shuffle=True)\n\nval_datagen = ImageDataGenerator()\nval_generator = val_datagen.flow(X_val, y_val, batch_size=120, shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2022-04-26T14:19:16.646630Z","iopub.execute_input":"2022-04-26T14:19:16.647306Z","iopub.status.idle":"2022-04-26T14:19:16.733663Z","shell.execute_reply.started":"2022-04-26T14:19:16.647246Z","shell.execute_reply":"2022-04-26T14:19:16.732759Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"reduceLROnPlateau = ReduceLROnPlateau(monitor='val_acc', patience=3, verbose=1, factor=0.5, min_lr=0.00001)","metadata":{"execution":{"iopub.status.busy":"2022-04-26T14:19:16.734892Z","iopub.execute_input":"2022-04-26T14:19:16.735117Z","iopub.status.idle":"2022-04-26T14:19:16.740186Z","shell.execute_reply.started":"2022-04-26T14:19:16.735091Z","shell.execute_reply":"2022-04-26T14:19:16.739299Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cnn.fit(train_generator, epochs=120, callbacks=[reduceLROnPlateau], validation_data=val_generator)","metadata":{"execution":{"iopub.status.busy":"2022-04-26T14:19:16.741571Z","iopub.execute_input":"2022-04-26T14:19:16.742262Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions_prob = cnn.predict(X_test)\npredictions_final = np.argmax(predictions_prob, axis=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i, x in enumerate(X_test.reshape(-1,28,28)[:5]):\n    \n    plt.figure(figsize=(18,6))\n    plt.imshow(x.reshape((28,28)), cmap=plt.cm.binary)\n    plt.title(f\"Prediction: {predictions_final[i]}\")\n    plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# My Score: 0.99410\n\nsubmission = pd.read_csv('/kaggle/input/digit-recognizer/sample_submission.csv')\nsubmission[\"Label\"] = predictions_final\nsubmission.to_csv('submission_cnn.csv',index=False)\\\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}