{"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":"<h1  style='color:white; background:#8D8F8A; border:0;text-align: center' class=\"list-group-item list-group-item-action active\">KANNADA MNIST CHARACTER RECOGNITION </h1><a id = \"1\" ></a>","metadata":{"papermill":{"duration":0.012128,"end_time":"2022-05-29T08:52:55.256316","exception":false,"start_time":"2022-05-29T08:52:55.244188","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h3 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='color:white; background:#8D8F8A; border:0' role=\"tab\" aria-controls=\"home\"><center>Quick Navigation</center></h3>\n\n* [Importing Libraries](#1.1)\n* [Data Preprocessing](#2)\n    - [Load Training Dataset](#2.1)\n    - [Split Data](#2.2)\n    - [Image Preprocessing](#2.3)\n* [Data Visualization](#3)\n* [Activation function](#4)\n* [Model Summary](#5)\n* [Data Augmentation](#6)\n* [Save and Load Model](#6.2)\n* [Plot Accuracy and Loss curve](#7)\n* [Evaluation](#8)","metadata":{"papermill":{"duration":0.014376,"end_time":"2022-05-29T08:52:55.281533","exception":false,"start_time":"2022-05-29T08:52:55.267157","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"<h1  style='color:white; background:#8D8F8A; border:0' class=\"list-group-item list-group-item-action active\">IMPORTING LIBRARIES</h1><a id = \"1.1\" ></a>","metadata":{"papermill":{"duration":0.019937,"end_time":"2022-05-29T08:52:55.319362","exception":false,"start_time":"2022-05-29T08:52:55.299425","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt\nimport keras\nimport tensorflow\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Flatten, Conv2D, Dropout,MaxPool2D, LSTM, BatchNormalization\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau\nfrom tensorflow.keras.layers import ELU,Activation\nfrom tensorflow.keras.losses import sparse_categorical_crossentropy, categorical_crossentropy, binary_crossentropy","metadata":{"papermill":{"duration":6.001131,"end_time":"2022-05-29T08:53:01.337575","exception":false,"start_time":"2022-05-29T08:52:55.336444","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:27.446792Z","iopub.execute_input":"2022-06-22T13:05:27.448091Z","iopub.status.idle":"2022-06-22T13:05:35.021107Z","shell.execute_reply.started":"2022-06-22T13:05:27.447936Z","shell.execute_reply":"2022-06-22T13:05:35.020135Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"papermill":{"duration":0.020693,"end_time":"2022-05-29T08:53:01.369509","exception":false,"start_time":"2022-05-29T08:53:01.348816","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:35.022825Z","iopub.execute_input":"2022-06-22T13:05:35.023530Z","iopub.status.idle":"2022-06-22T13:05:35.030389Z","shell.execute_reply.started":"2022-06-22T13:05:35.023494Z","shell.execute_reply":"2022-06-22T13:05:35.029329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h1 style='color:white; background:#8D8F8A; border:0;text-align: center' class=\"list-group-item list-group-item-action active\">2. DATA PREPROCESSING</h1><a id = \"2\" ></a>","metadata":{"papermill":{"duration":0.010706,"end_time":"2022-05-29T08:53:01.392226","exception":false,"start_time":"2022-05-29T08:53:01.38152","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"<h2  style='color:white; background:#8D8F8A; border:0;text-align: center' class=\"list-group-item list-group-item-action active\">2.1 LOAD TRAINING DATASET</h2><a id = \"2.1\" ></a>","metadata":{"papermill":{"duration":0.010541,"end_time":"2022-05-29T08:53:01.413449","exception":false,"start_time":"2022-05-29T08:53:01.402908","status":"completed"},"tags":[]}},{"cell_type":"code","source":"train_data = pd.read_csv(\"../input/Kannada-MNIST/train.csv\")","metadata":{"papermill":{"duration":3.015034,"end_time":"2022-05-29T08:53:04.439296","exception":false,"start_time":"2022-05-29T08:53:01.424262","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:35.033468Z","iopub.execute_input":"2022-06-22T13:05:35.034690Z","iopub.status.idle":"2022-06-22T13:05:40.577563Z","shell.execute_reply.started":"2022-06-22T13:05:35.034588Z","shell.execute_reply":"2022-06-22T13:05:40.576440Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_file = \"../input/Kannada-MNIST/test.csv\"\ntest_data = pd.read_csv(test_file)","metadata":{"papermill":{"duration":1.784715,"end_time":"2022-05-29T08:53:06.235334","exception":false,"start_time":"2022-05-29T08:53:04.450619","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:40.579315Z","iopub.execute_input":"2022-06-22T13:05:40.580071Z","iopub.status.idle":"2022-06-22T13:05:41.021727Z","shell.execute_reply.started":"2022-06-22T13:05:40.580021Z","shell.execute_reply":"2022-06-22T13:05:41.020515Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_data = pd.read_csv('../input/Kannada-MNIST/Dig-MNIST.csv')","metadata":{"execution":{"iopub.status.busy":"2022-06-22T13:05:41.023390Z","iopub.execute_input":"2022-06-22T13:05:41.023873Z","iopub.status.idle":"2022-06-22T13:05:41.910939Z","shell.execute_reply.started":"2022-06-22T13:05:41.023826Z","shell.execute_reply":"2022-06-22T13:05:41.909940Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Shape**","metadata":{"papermill":{"duration":0.010559,"end_time":"2022-05-29T08:53:06.257296","exception":false,"start_time":"2022-05-29T08:53:06.246737","status":"completed"},"tags":[]}},{"cell_type":"code","source":"print(f\"train.csv size is {train_data.shape}\")\nprint(f\"test.csv size is {test_data.shape}\")\nprint(f\"val_data size is {val_data.shape}\")","metadata":{"papermill":{"duration":0.018661,"end_time":"2022-05-29T08:53:06.286777","exception":false,"start_time":"2022-05-29T08:53:06.268116","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:41.912355Z","iopub.execute_input":"2022-06-22T13:05:41.912905Z","iopub.status.idle":"2022-06-22T13:05:41.919163Z","shell.execute_reply.started":"2022-06-22T13:05:41.912861Z","shell.execute_reply":"2022-06-22T13:05:41.918004Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h2  style='color:white; background:#8D8F8A; border:0;text-align: center' class=\"list-group-item list-group-item-action active\">2.2 SPLIT DATA</h2><a id = \"2.2\" ></a>","metadata":{"papermill":{"duration":0.01086,"end_time":"2022-05-29T08:53:06.308291","exception":false,"start_time":"2022-05-29T08:53:06.297431","status":"completed"},"tags":[]}},{"cell_type":"code","source":"img_rows, img_cols = 28,28\nnum_classes = 10","metadata":{"papermill":{"duration":0.017326,"end_time":"2022-05-29T08:53:06.336358","exception":false,"start_time":"2022-05-29T08:53:06.319032","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:41.920404Z","iopub.execute_input":"2022-06-22T13:05:41.920719Z","iopub.status.idle":"2022-06-22T13:05:41.933812Z","shell.execute_reply.started":"2022-06-22T13:05:41.920692Z","shell.execute_reply":"2022-06-22T13:05:41.932433Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h2  style='color:white; background:#8D8F8A; border:0;text-align: center' class=\"list-group-item list-group-item-action active\">2.3 PREPROCESSING</h2><a id = \"2.3\" ></a>","metadata":{"papermill":{"duration":0.010587,"end_time":"2022-05-29T08:53:06.357937","exception":false,"start_time":"2022-05-29T08:53:06.34735","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"\n**ONE HOT ENCODING:**\n\nOne hot encoding is one method of converting data to prepare it for an algorithm and get a better prediction. With one-hot, we convert each categorical value into a new categorical column and assign a binary value of 1 or 0 to those columns. Each integer value is represented as a binary vector.","metadata":{"papermill":{"duration":0.010561,"end_time":"2022-05-29T08:53:06.37997","exception":false,"start_time":"2022-05-29T08:53:06.369409","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def data_prep(raw):\n    out_y = tensorflow.keras.utils.to_categorical(raw.label, num_classes)\n\n    num_images = raw.shape[0]\n    x_as_array = raw.values[:,1:]\n    x_shaped_array = x_as_array.reshape(num_images, img_rows, img_cols, 1)\n    # normalization\n    out_x = x_shaped_array / 255\n    return out_x, out_y\n\nx_train, y_train = data_prep(train_data)\nx_val,y_val = data_prep(val_data)\n","metadata":{"papermill":{"duration":0.125728,"end_time":"2022-05-29T08:53:06.517144","exception":false,"start_time":"2022-05-29T08:53:06.391416","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:41.935297Z","iopub.execute_input":"2022-06-22T13:05:41.935793Z","iopub.status.idle":"2022-06-22T13:05:42.164263Z","shell.execute_reply.started":"2022-06-22T13:05:41.935759Z","shell.execute_reply":"2022-06-22T13:05:42.163131Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train, x_test, y_train, y_test = train_test_split(np.concatenate((x_train, x_val)),np.concatenate((y_train, y_val)),\n                                                   test_size=0.1,shuffle=True)","metadata":{"papermill":{"duration":0.466542,"end_time":"2022-05-29T08:53:06.995252","exception":false,"start_time":"2022-05-29T08:53:06.52871","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:42.165603Z","iopub.execute_input":"2022-06-22T13:05:42.165989Z","iopub.status.idle":"2022-06-22T13:05:43.090025Z","shell.execute_reply.started":"2022-06-22T13:05:42.165955Z","shell.execute_reply":"2022-06-22T13:05:43.087988Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Data Dimension**","metadata":{"papermill":{"duration":0.011201,"end_time":"2022-05-29T08:53:07.11876","exception":false,"start_time":"2022-05-29T08:53:07.107559","status":"completed"},"tags":[]}},{"cell_type":"code","source":"print(f\"Training data size is {x_train.shape}\")\nprint(f\"Training data size is {y_train.shape}\")\nprint(f\"Testing data size is {x_test.shape}\")\nprint(f\"Training data size is {y_test.shape}\")","metadata":{"papermill":{"duration":0.019673,"end_time":"2022-05-29T08:53:07.149248","exception":false,"start_time":"2022-05-29T08:53:07.129575","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:43.093583Z","iopub.execute_input":"2022-06-22T13:05:43.094012Z","iopub.status.idle":"2022-06-22T13:05:43.102430Z","shell.execute_reply.started":"2022-06-22T13:05:43.093975Z","shell.execute_reply":"2022-06-22T13:05:43.100250Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h1  style='color:white; background:#8D8F8A; border:0;text-align: center' class=\"list-group-item list-group-item-action active\">3. VISUALIZE DATA</h1><a id = \"3\" ></a>","metadata":{"papermill":{"duration":0.010676,"end_time":"2022-05-29T08:53:07.171849","exception":false,"start_time":"2022-05-29T08:53:07.161173","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def get_image(row, dataset):\n    row_values = dataset.iloc[row].values\n    image_matrix = row_values.reshape(img_rows, img_cols)\n    return image_matrix\n\nfig, ax = plt.subplots(1, 5, figsize=(12, 9), dpi=120)\nplt.setp(ax, xticks=[], yticks=[])\n\nax_n=0\nfor i in range(1,6,1):\n    ax[ax_n].imshow(get_image(i, train_data.drop('label',axis=1)))\n    ax_n+=1","metadata":{"papermill":{"duration":0.624752,"end_time":"2022-05-29T08:53:07.807433","exception":false,"start_time":"2022-05-29T08:53:07.182681","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:43.104131Z","iopub.execute_input":"2022-06-22T13:05:43.104634Z","iopub.status.idle":"2022-06-22T13:05:44.071380Z","shell.execute_reply.started":"2022-06-22T13:05:43.104597Z","shell.execute_reply":"2022-06-22T13:05:44.070209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"title=[]\nfor i in range(1, 10):\n    for j in range(0,10):\n        if y_train[i][j] == 1:\n            title.append(j)\ntitle","metadata":{"papermill":{"duration":0.032933,"end_time":"2022-05-29T08:53:07.861319","exception":false,"start_time":"2022-05-29T08:53:07.828386","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:44.073971Z","iopub.execute_input":"2022-06-22T13:05:44.074844Z","iopub.status.idle":"2022-06-22T13:05:44.087421Z","shell.execute_reply.started":"2022-06-22T13:05:44.074782Z","shell.execute_reply":"2022-06-22T13:05:44.085574Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(7,9))\nfor i in range(1, 10):\n    plt.subplot(330 + i)\n    plt.imshow(x_train[i], cmap=plt.get_cmap('Greys'))\n    plt.title(title[i-1])\n    plt.axis('off')\nplt.tight_layout()","metadata":{"papermill":{"duration":0.683149,"end_time":"2022-05-29T08:53:08.55557","exception":false,"start_time":"2022-05-29T08:53:07.872421","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:44.089234Z","iopub.execute_input":"2022-06-22T13:05:44.089611Z","iopub.status.idle":"2022-06-22T13:05:44.623368Z","shell.execute_reply.started":"2022-06-22T13:05:44.089578Z","shell.execute_reply":"2022-06-22T13:05:44.622319Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h1  style='color:white; background:#8D8F8A; border:0;text-align: center' class=\"list-group-item list-group-item-action active\">4. ACTIVATION FUNCTION</h1><a id = \"4\" ></a>\n","metadata":{"papermill":{"duration":0.012569,"end_time":"2022-05-29T08:53:08.590193","exception":false,"start_time":"2022-05-29T08:53:08.577624","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"- **LeakyReLu**","metadata":{"papermill":{"duration":0.012499,"end_time":"2022-05-29T08:53:11.808193","exception":false,"start_time":"2022-05-29T08:53:11.795694","status":"completed"},"tags":[]}},{"cell_type":"code","source":"leakyrelu = tensorflow.keras.layers.LeakyReLU(alpha=0.01)","metadata":{"papermill":{"duration":0.03627,"end_time":"2022-05-29T08:53:11.886783","exception":false,"start_time":"2022-05-29T08:53:11.850513","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:44.624753Z","iopub.execute_input":"2022-06-22T13:05:44.625093Z","iopub.status.idle":"2022-06-22T13:05:44.663340Z","shell.execute_reply.started":"2022-06-22T13:05:44.625047Z","shell.execute_reply":"2022-06-22T13:05:44.662520Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h2  style='color:white; background:#8D8F8A; border:0;text-align: center' class=\"list-group-item list-group-item-action active\">5. MODEL SUMMARY</h2><a id = \"5\" ></a>\n","metadata":{"papermill":{"duration":0.011491,"end_time":"2022-05-29T08:53:11.910311","exception":false,"start_time":"2022-05-29T08:53:11.89882","status":"completed"},"tags":[]}},{"cell_type":"code","source":"model = Sequential()\n\nmodel.add(Conv2D(64, kernel_size=3, padding='same',input_shape=(img_rows, img_cols, 1)))\nmodel.add(BatchNormalization(scale=False, center=True))\nmodel.add(Activation('relu'))\nmodel.add(Conv2D(64, kernel_size=3, padding = 'same'))\nmodel.add(BatchNormalization(scale=False, center=True))\nmodel.add(Activation('relu'))\nmodel.add(MaxPool2D(pool_size=(2,2)))\nmodel.add(Dropout(0.2))\n\nmodel.add(Conv2D(128, kernel_size=(3,3), padding = 'same'))\nmodel.add(BatchNormalization(scale=False,center=True))\nmodel.add(Activation('relu'))\nmodel.add(Conv2D(128, kernel_size=(3, 3), padding = 'same'))\nmodel.add(BatchNormalization(scale=False,center=True))\nmodel.add(Activation('relu'))\nmodel.add(MaxPool2D(pool_size=(2,2)))\nmodel.add(Dropout(0.2))\n\nmodel.add(Flatten())\n\nmodel.add(Dense(256))\nmodel.add(BatchNormalization(scale=False,center=True))\nmodel.add(Activation('relu'))\nmodel.add(Dense(num_classes, activation='softmax'))\n\nmodel.summary()\n","metadata":{"execution":{"iopub.status.busy":"2022-06-22T13:05:44.664910Z","iopub.execute_input":"2022-06-22T13:05:44.665814Z","iopub.status.idle":"2022-06-22T13:05:44.957710Z","shell.execute_reply.started":"2022-06-22T13:05:44.665766Z","shell.execute_reply":"2022-06-22T13:05:44.955741Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.utils import plot_model\nplot_model(model, to_file='model.png', show_shapes=True)\nfrom IPython.display import Image\nImage(\"model.png\")","metadata":{"papermill":{"duration":1.150881,"end_time":"2022-05-29T08:53:13.457152","exception":false,"start_time":"2022-05-29T08:53:12.306271","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:44.959327Z","iopub.execute_input":"2022-06-22T13:05:44.959823Z","iopub.status.idle":"2022-06-22T13:05:46.511609Z","shell.execute_reply.started":"2022-06-22T13:05:44.959775Z","shell.execute_reply":"2022-06-22T13:05:46.510606Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h1  style='color:white; background:#8D8F8A; border:0;text-align: center' class=\"list-group-item list-group-item-action active\">6. DATA AUGMENTATION</h1><a id = \"6\" ></a>\n\nOne way to avoid overfitting and improve the accuracy is to increase the variability of existing samples. Which is also helps to compensate lack of data. Data augmentation generates data from existing samples by applying various transformations to the original dataset. This method aims to increase the number of unique input samples, which, in turn, will allow the model to show better accuracy on the validation dataset.","metadata":{"papermill":{"duration":0.0147,"end_time":"2022-05-29T08:53:13.48698","exception":false,"start_time":"2022-05-29T08:53:13.47228","status":"completed"},"tags":[]}},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator","metadata":{"papermill":{"duration":0.022398,"end_time":"2022-05-29T08:53:13.524638","exception":false,"start_time":"2022-05-29T08:53:13.50224","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:46.513514Z","iopub.execute_input":"2022-06-22T13:05:46.514149Z","iopub.status.idle":"2022-06-22T13:05:46.521279Z","shell.execute_reply.started":"2022-06-22T13:05:46.514106Z","shell.execute_reply":"2022-06-22T13:05:46.519814Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# use data augmentation to improve accuracy and prevent overfitting\naugs_gen = 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=10,  \n        zoom_range = 0.2, \n        width_shift_range=0.2,  \n        height_shift_range=0.2, \n        horizontal_flip=False,  \n        vertical_flip=False) \n\ntrain_generator = augs_gen.flow(x_train, y_train, batch_size=128)\nvalid_generator = augs_gen.flow(x_val, y_val, batch_size=128)","metadata":{"papermill":{"duration":0.063782,"end_time":"2022-05-29T08:53:13.603243","exception":false,"start_time":"2022-05-29T08:53:13.539461","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:46.523275Z","iopub.execute_input":"2022-06-22T13:05:46.524153Z","iopub.status.idle":"2022-06-22T13:05:46.641741Z","shell.execute_reply.started":"2022-06-22T13:05:46.524091Z","shell.execute_reply":"2022-06-22T13:05:46.640531Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h2  style='color:white; background:#8D8F8A; border:0;text-align: center' class=\"list-group-item list-group-item-action active\"> CallBacks</h2><a id = \"6.1\" ></a>","metadata":{"papermill":{"duration":0.015255,"end_time":"2022-05-29T08:53:13.633792","exception":false,"start_time":"2022-05-29T08:53:13.618537","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"**EarlyStopping**","metadata":{"papermill":{"duration":0.014446,"end_time":"2022-05-29T08:53:13.662947","exception":false,"start_time":"2022-05-29T08:53:13.648501","status":"completed"},"tags":[]}},{"cell_type":"code","source":"from keras.callbacks import EarlyStopping\nearly_stop = EarlyStopping(monitor='val_accuracy', min_delta=0.00001, patience=6, mode='auto', restore_best_weights=True)","metadata":{"papermill":{"duration":0.022343,"end_time":"2022-05-29T08:53:13.699951","exception":false,"start_time":"2022-05-29T08:53:13.677608","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:46.643170Z","iopub.execute_input":"2022-06-22T13:05:46.643625Z","iopub.status.idle":"2022-06-22T13:05:46.650526Z","shell.execute_reply.started":"2022-06-22T13:05:46.643591Z","shell.execute_reply":"2022-06-22T13:05:46.649232Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Learning Rate Reduction**","metadata":{"papermill":{"duration":0.014485,"end_time":"2022-05-29T08:53:13.729132","exception":false,"start_time":"2022-05-29T08:53:13.714647","status":"completed"},"tags":[]}},{"cell_type":"code","source":"lr_reduction = ReduceLROnPlateau(monitor='val_accuracy', min_lr=0.0001 ,patience=6, verbose=1,  factor=0.6)","metadata":{"papermill":{"duration":0.021106,"end_time":"2022-05-29T08:53:13.764839","exception":false,"start_time":"2022-05-29T08:53:13.743733","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:46.651968Z","iopub.execute_input":"2022-06-22T13:05:46.652509Z","iopub.status.idle":"2022-06-22T13:05:46.667032Z","shell.execute_reply.started":"2022-06-22T13:05:46.652471Z","shell.execute_reply":"2022-06-22T13:05:46.665267Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epochs = 25\nBATCH = 128","metadata":{"papermill":{"duration":0.022491,"end_time":"2022-05-29T08:53:13.80178","exception":false,"start_time":"2022-05-29T08:53:13.779289","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:46.668494Z","iopub.execute_input":"2022-06-22T13:05:46.668881Z","iopub.status.idle":"2022-06-22T13:05:46.683147Z","shell.execute_reply.started":"2022-06-22T13:05:46.668848Z","shell.execute_reply":"2022-06-22T13:05:46.682100Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer = 'adam',loss = binary_crossentropy,metrics=['accuracy'])\nmodel_fit = model.fit(train_generator, epochs=epochs,batch_size =BATCH ,validation_data= valid_generator, verbose =1,callbacks=[early_stop,lr_reduction])","metadata":{"papermill":{"duration":232.837171,"end_time":"2022-05-29T08:57:06.656069","exception":false,"start_time":"2022-05-29T08:53:13.818898","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2022-06-22T13:05:46.684369Z","iopub.execute_input":"2022-06-22T13:05:46.684722Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h2  style='color:white; background:#8D8F8A; border:0;text-align: center' class=\"list-group-item list-group-item-action active\">SAVE MODEL</h2><a id = \"6.2\" ></a>","metadata":{"papermill":{"duration":0.184017,"end_time":"2022-05-29T08:57:07.022383","exception":false,"start_time":"2022-05-29T08:57:06.838366","status":"completed"},"tags":[]}},{"cell_type":"code","source":"!mkdir -p saved_model\nmodel.save('saved_model/my_model')","metadata":{"papermill":{"duration":4.455461,"end_time":"2022-05-29T08:57:11.710083","exception":false,"start_time":"2022-05-29T08:57:07.254622","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"load_model = tensorflow.keras.models.load_model('saved_model/my_model')\nload_model.summary()","metadata":{"papermill":{"duration":1.543862,"end_time":"2022-05-29T08:57:13.43515","exception":false,"start_time":"2022-05-29T08:57:11.891288","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h2  style='color:white; background:#8D8F8A; border:0;text-align: center' class=\"list-group-item list-group-item-action active\">7. PLOT ACCURACY AND LOSS CURVE</h2><a id = \"7\" ></a>","metadata":{"papermill":{"duration":0.179711,"end_time":"2022-05-29T08:57:13.824446","exception":false,"start_time":"2022-05-29T08:57:13.644735","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# Defining Figure\nf = plt.figure(figsize=(20,7))\n\n#For Accuracy - subplot\nf.add_subplot(121)\n\nplt.plot(model_fit.epoch,model_fit.history['accuracy'],label = \"training accuracy\") # Accuracy curve for training set\nplt.plot(model_fit.epoch,model_fit.history['val_accuracy'],label = \"validation accuracy\")\n\nplt.title(\"Accuracy Curve\",fontsize=18)\nplt.xlabel(\"Epochs\",fontsize=15)\nplt.ylabel(\"Accuracy\",fontsize=15)\nplt.grid(alpha=0.3)\nplt.legend()","metadata":{"papermill":{"duration":0.384921,"end_time":"2022-05-29T08:57:14.389641","exception":false,"start_time":"2022-05-29T08:57:14.00472","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Adding Subplot (For Loss)\nf.add_subplot(122)\n\nplt.plot(model_fit.epoch,model_fit.history['loss'],label=\"training loss\") # Loss curve for training set\nplt.plot(model_fit.epoch,model_fit.history['val_loss'],label=\"validation loss\")\n\nplt.title(\"Loss Curve\",fontsize=18)\nplt.xlabel(\"Epochs\",fontsize=15)\nplt.ylabel(\"Loss\",fontsize=15)\nplt.grid(alpha=0.3)\nplt.legend()\n\nplt.show()","metadata":{"papermill":{"duration":0.393759,"end_time":"2022-05-29T08:57:14.962897","exception":false,"start_time":"2022-05-29T08:57:14.569138","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n<h1  style='color:white; background:#8D8F8A; border:0;text-align: center' class=\"list-group-item list-group-item-action active\">8. EVALUATION</h1><a id = \"8\" ></a>","metadata":{"papermill":{"duration":0.182729,"end_time":"2022-05-29T08:57:15.365435","exception":false,"start_time":"2022-05-29T08:57:15.182706","status":"completed"},"tags":[]}},{"cell_type":"code","source":"evaluate_test = model.evaluate(x_test, y_test, verbose=1)\n\nprint(\"\\nAccuracy =\", \"{:.7f}%\".format(evaluate_test[1]*100))\nprint(\"Loss     =\" ,\"{:.9f}\".format(evaluate_test[0]))","metadata":{"papermill":{"duration":1.029542,"end_time":"2022-05-29T08:57:16.580851","exception":false,"start_time":"2022-05-29T08:57:15.551309","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_predict = model.predict(x_test)","metadata":{"papermill":{"duration":0.587857,"end_time":"2022-05-29T08:57:17.350701","exception":false,"start_time":"2022-05-29T08:57:16.762844","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_predict_max = np.argmax(y_predict,axis=1) \ny_predict_max","metadata":{"papermill":{"duration":0.191429,"end_time":"2022-05-29T08:57:17.729578","exception":false,"start_time":"2022-05-29T08:57:17.538149","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n<h2  style='color:white; background:#8D8F8A; border:0;text-align: center' class=\"list-group-item list-group-item-action active\">8.1 SUBMISSION</h2><a id = \"8.1\" ></a>","metadata":{"papermill":{"duration":0.180884,"end_time":"2022-05-29T08:57:18.092996","exception":false,"start_time":"2022-05-29T08:57:17.912112","status":"completed"},"tags":[]}},{"cell_type":"markdown","source":"**Test Data Preprocessing**","metadata":{}},{"cell_type":"code","source":"def data_prep(raw):\n    num_images = raw.shape[0]\n    x_as_array = raw.values[:,1:]\n    x_shaped_array = x_as_array.reshape(num_images, img_rows, img_cols, 1)\n    \n    return x_shaped_array\n\ntest_x = data_prep(test_data)\ntest_x.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_generator = augs_gen.flow(test_x)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_hat = model.predict_generator(test_generator)","metadata":{"papermill":{"duration":3.326298,"end_time":"2022-05-29T08:57:21.599042","exception":false,"start_time":"2022-05-29T08:57:18.272744","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_label = np.argmax(y_hat, axis=1)\nsubmission_label = pd.Series(submission_label, name=\"label\")\n\nimage_id = pd.Series(range(0,len(test_data)))\nimage_id = pd.Series(image_id, name=\"id\")","metadata":{"papermill":{"duration":3.326298,"end_time":"2022-05-29T08:57:21.599042","exception":false,"start_time":"2022-05-29T08:57:18.272744","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.concat([image_id,submission_label],axis = 1)\nsubmission.to_csv(\"submission.csv\", index=False)\npd.read_csv(\"submission.csv\").head()","metadata":{"papermill":{"duration":0.274194,"end_time":"2022-05-29T08:57:22.072766","exception":false,"start_time":"2022-05-29T08:57:21.798572","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]}]}