{"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 tensorflow as tf\nimport numpy as np\nimport pandas as pd \nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-05-18T13:30:55.907116Z","iopub.execute_input":"2022-05-18T13:30:55.90744Z","iopub.status.idle":"2022-05-18T13:31:01.372487Z","shell.execute_reply.started":"2022-05-18T13:30:55.907353Z","shell.execute_reply":"2022-05-18T13:31:01.371744Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Load Data","metadata":{}},{"cell_type":"code","source":"# Load data train\ntrain = pd.read_csv('../input/digit-recognizer/train.csv')\nXtrain = train.iloc[:, 1:].values \nytrain = train.iloc[:, 0].values \nXtrain = np.array(Xtrain)\nytrain = np.array(ytrain)\nprint(Xtrain.shape, ytrain.shape)","metadata":{"execution":{"iopub.status.busy":"2022-05-18T13:31:04.458472Z","iopub.execute_input":"2022-05-18T13:31:04.459031Z","iopub.status.idle":"2022-05-18T13:31:07.528361Z","shell.execute_reply.started":"2022-05-18T13:31:04.458988Z","shell.execute_reply":"2022-05-18T13:31:07.5274Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load test data\ntest = pd.read_csv('../input/digit-recognizer/test.csv')\nX_test = test.iloc[:,:]\nX_test = np.array(X_test)\nX_test.shape","metadata":{"execution":{"iopub.status.busy":"2022-05-18T13:31:09.559337Z","iopub.execute_input":"2022-05-18T13:31:09.559617Z","iopub.status.idle":"2022-05-18T13:31:11.506343Z","shell.execute_reply.started":"2022-05-18T13:31:09.559585Z","shell.execute_reply":"2022-05-18T13:31:11.50559Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Reshape image\nXtrain = np.reshape(Xtrain, (-1, 28, 28, 1))\nX_test = np.reshape(X_test, (-1, 28, 28, 1))\n\n# One Hot Encoding \nytrain = tf.keras.utils.to_categorical(ytrain, 10)\n\nprint(Xtrain.shape, ytrain.shape)\nprint(X_test.shape)","metadata":{"execution":{"iopub.status.busy":"2022-05-18T13:31:15.35012Z","iopub.execute_input":"2022-05-18T13:31:15.350725Z","iopub.status.idle":"2022-05-18T13:31:16.273226Z","shell.execute_reply.started":"2022-05-18T13:31:15.350666Z","shell.execute_reply":"2022-05-18T13:31:16.272371Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Normalize data\nXtrain = Xtrain / 255.0\nX_test = X_test / 255.0","metadata":{"execution":{"iopub.status.busy":"2022-05-18T13:31:18.555558Z","iopub.execute_input":"2022-05-18T13:31:18.5563Z","iopub.status.idle":"2022-05-18T13:31:18.745816Z","shell.execute_reply.started":"2022-05-18T13:31:18.556262Z","shell.execute_reply":"2022-05-18T13:31:18.74489Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualize one image \nplt.imshow(Xtrain[1313])\nplt.title(ytrain[1313])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-05-18T13:31:21.172158Z","iopub.execute_input":"2022-05-18T13:31:21.172459Z","iopub.status.idle":"2022-05-18T13:31:21.383275Z","shell.execute_reply.started":"2022-05-18T13:31:21.172426Z","shell.execute_reply":"2022-05-18T13:31:21.382544Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Split data train","metadata":{}},{"cell_type":"code","source":"X_train, X_val, y_train, y_val = train_test_split(Xtrain, ytrain, test_size = 0.3, random_state = 42)\nprint(X_train.shape, y_train.shape)\nprint(X_val.shape, y_val.shape)","metadata":{"execution":{"iopub.status.busy":"2022-05-18T13:31:29.290354Z","iopub.execute_input":"2022-05-18T13:31:29.293366Z","iopub.status.idle":"2022-05-18T13:31:29.702259Z","shell.execute_reply.started":"2022-05-18T13:31:29.293314Z","shell.execute_reply":"2022-05-18T13:31:29.701359Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Define Model","metadata":{}},{"cell_type":"code","source":"input_layer = tf.keras.layers.InputLayer(input_shape=(28, 28, 1)).output\nX = tf.keras.layers.Conv2D(128, kernel_size=(1,1), padding='same', activation='relu')(input_layer)\n\nx1 = tf.keras.layers.Conv2D(32, kernel_size=(1,1), padding='same', activation='relu')(X)\n\nx2 = tf.keras.layers.Conv2D(16, kernel_size=(1,1), padding='same', activation='relu')(X) \nx2 = tf.keras.layers.Conv2D(32, kernel_size=(2,2), padding='same', activation='relu')(x2)\n\nx3 = tf.keras.layers.Conv2D(16, kernel_size=(1,1), padding='same', activation='relu')(X)\nx3 = tf.keras.layers.Conv2D(32, kernel_size=(3,3), padding='same', activation='relu')(x3)\n\nx4 = tf.keras.layers.MaxPooling2D(pool_size=(2,2), strides=(1,1), padding='same')(X)\nx4 = tf.keras.layers.Conv2D(32, kernel_size=(1,1), padding='same', activation='relu')(x4)\n\nX = tf.keras.layers.Concatenate(axis=1)([x1, x2, x3, x4])\n\nx1 = tf.keras.layers.Conv2D(32, kernel_size=(1,1), padding='same', activation='relu')(X)\n\nx2 = tf.keras.layers.Conv2D(16, kernel_size=(1,1), padding='same', activation='relu')(X) \nx2 = tf.keras.layers.Conv2D(32, kernel_size=(2,2), padding='same', activation='relu')(x2)\n\nx3 = tf.keras.layers.Conv2D(16, kernel_size=(1,1), padding='same', activation='relu')(X)\nx3 = tf.keras.layers.Conv2D(32, kernel_size=(3,3), padding='same', activation='relu')(x3)\n\nx4 = tf.keras.layers.MaxPooling2D(pool_size=(2,2), strides=(1,1), padding='same')(X)\nx4 = tf.keras.layers.Conv2D(32, kernel_size=(1,1), padding='same', activation='relu')(x4)\n\nX = tf.keras.layers.Concatenate(axis=1)([x1, x2, x3, x4])\n\nx1 = tf.keras.layers.Conv2D(32, kernel_size=(1,1), padding='same', activation='relu')(X)\n\nx2 = tf.keras.layers.Conv2D(16, kernel_size=(1,1), padding='same', activation='relu')(X) \nx2 = tf.keras.layers.Conv2D(32, kernel_size=(2,2), padding='same', activation='relu')(x2)\n\nx3 = tf.keras.layers.Conv2D(16, kernel_size=(1,1), padding='same', activation='relu')(X)\nx3 = tf.keras.layers.Conv2D(32, kernel_size=(3,3), padding='same', activation='relu')(x3)\n\nx4 = tf.keras.layers.MaxPooling2D(pool_size=(2,2), strides=(1,1), padding='same')(X)\nx4 = tf.keras.layers.Conv2D(32, kernel_size=(1,1), padding='same', activation='relu')(x4)\n\nX = tf.keras.layers.Concatenate(axis=1)([x1, x2, x3, x4])\nX = tf.keras.layers.Conv2D(32, kernel_size=(1,1), activation='relu', padding='same')(X)\nX = tf.keras.layers.MaxPooling2D(pool_size=(3,3))(X)\nX = tf.keras.layers.Conv2D(32, kernel_size=(3,3), activation='relu')(X)\nX = tf.keras.layers.Flatten()(X) \nX = tf.keras.layers.Dense(512, activation='relu')(X)\nX = tf.keras.layers.BatchNormalization()(X)\nX = tf.keras.layers.Dropout(0.5)(X)\nX = tf.keras.layers.Dense(10, activation='softmax')(X)\n\nmodel = tf.keras.models.Model(input_layer, X)\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2022-05-18T15:19:47.443364Z","iopub.execute_input":"2022-05-18T15:19:47.443637Z","iopub.status.idle":"2022-05-18T15:19:47.661465Z","shell.execute_reply.started":"2022-05-18T15:19:47.443605Z","shell.execute_reply":"2022-05-18T15:19:47.660742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Training","metadata":{}},{"cell_type":"code","source":"model.compile(\n    loss = 'categorical_crossentropy',\n    optimizer = tf.keras.optimizers.Adam(learning_rate = 1e-4),\n    metrics = ['accuracy']\n)\n\nhistory = model.fit(\n    X_train, y_train,\n    epochs = 50, batch_size=64,\n    validation_data=(X_val, y_val)\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Evaluation","metadata":{}},{"cell_type":"code","source":"pd.DataFrame(history.history).plot(grid=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Predictions","metadata":{}},{"cell_type":"code","source":"y_pred = model.predict(X_test)\ny_pred = np.argmax(y_pred, axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-05-18T13:42:20.720474Z","iopub.execute_input":"2022-05-18T13:42:20.720774Z","iopub.status.idle":"2022-05-18T13:42:23.641026Z","shell.execute_reply.started":"2022-05-18T13:42:20.720741Z","shell.execute_reply":"2022-05-18T13:42:23.640156Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Check first 30 data test\nplt.figure(figsize=(20, 20))\n\nfor i in range(30):\n    plt.subplot(10,10, i+1)\n    plt.imshow(X_test[i])\n    plt.title(y_pred[i], fontsize=16)\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Save predictions","metadata":{}},{"cell_type":"code","source":"submission = pd.DataFrame({'imageId': np.arange(1, len(X_test)+1), 'Label': y_pred})\nsubmission.to_csv('my_submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-05-18T14:02:47.931826Z","iopub.execute_input":"2022-05-18T14:02:47.932378Z","iopub.status.idle":"2022-05-18T14:02:47.97739Z","shell.execute_reply.started":"2022-05-18T14:02:47.932336Z","shell.execute_reply":"2022-05-18T14:02:47.976727Z"},"trusted":true},"execution_count":null,"outputs":[]}]}