{"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"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":30527,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# ☀️ Imports and Setup","metadata":{"papermill":{"duration":0.006719,"end_time":"2023-08-22T08:46:23.668031","exception":false,"start_time":"2023-08-22T08:46:23.661312","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nimport time\nimport sys\n\nfrom tensorflow import keras\nfrom tensorflow.keras import layers, callbacks\nfrom tensorflow.keras.layers.experimental import preprocessing\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.model_selection import train_test_split, StratifiedKFold\nfrom sklearn.metrics import accuracy_score\n\n%matplotlib inline","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","papermill":{"duration":11.369557,"end_time":"2023-08-22T08:46:35.044921","exception":false,"start_time":"2023-08-22T08:46:23.675364","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-24T10:43:07.551371Z","iopub.execute_input":"2023-08-24T10:43:07.552212Z","iopub.status.idle":"2023-08-24T10:43:17.535106Z","shell.execute_reply.started":"2023-08-24T10:43:07.552167Z","shell.execute_reply":"2023-08-24T10:43:17.533761Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 🦆 Hyperparameters","metadata":{"papermill":{"duration":0.006678,"end_time":"2023-08-22T08:46:35.059123","exception":false,"start_time":"2023-08-22T08:46:35.052445","status":"completed"},"tags":[]}},{"cell_type":"code","source":"TRAIN_PATH = '/kaggle/input/digit-recognizer/train.csv'\nTEST_PATH = '/kaggle/input/digit-recognizer/test.csv'\nIMG_SIZE = 28\nBATCH_SIZE = 512\nEPOCHS = 300\nFOLDS = 3","metadata":{"papermill":{"duration":0.014445,"end_time":"2023-08-22T08:46:35.079960","exception":false,"start_time":"2023-08-22T08:46:35.065515","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-23T20:13:52.972631Z","iopub.execute_input":"2023-08-23T20:13:52.973504Z","iopub.status.idle":"2023-08-23T20:13:52.979124Z","shell.execute_reply.started":"2023-08-23T20:13:52.973464Z","shell.execute_reply":"2023-08-23T20:13:52.977969Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 🔨 Prepare Dataset","metadata":{"papermill":{"duration":0.006104,"end_time":"2023-08-22T08:46:35.092582","exception":false,"start_time":"2023-08-22T08:46:35.086478","status":"completed"},"tags":[]}},{"cell_type":"code","source":"train = pd.read_csv(TRAIN_PATH)\ntest = pd.read_csv(TEST_PATH)\ntrain","metadata":{"papermill":{"duration":5.506356,"end_time":"2023-08-22T08:46:40.605206","exception":false,"start_time":"2023-08-22T08:46:35.098850","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-23T20:13:52.980633Z","iopub.execute_input":"2023-08-23T20:13:52.981254Z","iopub.status.idle":"2023-08-23T20:13:59.377639Z","shell.execute_reply.started":"2023-08-23T20:13:52.981216Z","shell.execute_reply":"2023-08-23T20:13:59.376608Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = (train.iloc[:,1:].values).astype('float32')\ny = train.iloc[:,0].values.astype('int32')\nX_test = test.values.astype('float32')","metadata":{"papermill":{"duration":0.109713,"end_time":"2023-08-22T08:46:40.722274","exception":false,"start_time":"2023-08-22T08:46:40.612561","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-23T20:13:59.383552Z","iopub.execute_input":"2023-08-23T20:13:59.386865Z","iopub.status.idle":"2023-08-23T20:13:59.540973Z","shell.execute_reply.started":"2023-08-23T20:13:59.386821Z","shell.execute_reply":"2023-08-23T20:13:59.539959Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X","metadata":{"papermill":{"duration":0.018385,"end_time":"2023-08-22T08:46:40.748117","exception":false,"start_time":"2023-08-22T08:46:40.729732","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-23T20:13:59.546214Z","iopub.execute_input":"2023-08-23T20:13:59.548855Z","iopub.status.idle":"2023-08-23T20:13:59.561885Z","shell.execute_reply.started":"2023-08-23T20:13:59.548817Z","shell.execute_reply":"2023-08-23T20:13:59.560677Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = X.reshape(-1, 28, 28, 1)","metadata":{"papermill":{"duration":0.015846,"end_time":"2023-08-22T08:46:40.771371","exception":false,"start_time":"2023-08-22T08:46:40.755525","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-23T20:13:59.567389Z","iopub.execute_input":"2023-08-23T20:13:59.569985Z","iopub.status.idle":"2023-08-23T20:13:59.576710Z","shell.execute_reply.started":"2023-08-23T20:13:59.569943Z","shell.execute_reply":"2023-08-23T20:13:59.575509Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test = X_test.reshape(-1, 28, 28, 1)","metadata":{"papermill":{"duration":0.014466,"end_time":"2023-08-22T08:46:40.792674","exception":false,"start_time":"2023-08-22T08:46:40.778208","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-23T20:13:59.580788Z","iopub.execute_input":"2023-08-23T20:13:59.582288Z","iopub.status.idle":"2023-08-23T20:13:59.591678Z","shell.execute_reply.started":"2023-08-23T20:13:59.582250Z","shell.execute_reply":"2023-08-23T20:13:59.590747Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Figure size\nplt.figure(figsize=(15,4))\n\n# Subplot \nfor i in range(20):\n    ax=plt.subplot(2, 10, i+1)\n    ax.grid(False)\n    ax.get_xaxis().set_visible(False)\n    ax.get_yaxis().set_visible(False)\n    plt.imshow(X[i], cmap=plt.get_cmap('gray'))\n    plt.title(y[i]);\n    \nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-08-23T20:13:59.593621Z","iopub.execute_input":"2023-08-23T20:13:59.594344Z","iopub.status.idle":"2023-08-23T20:14:00.490405Z","shell.execute_reply.started":"2023-08-23T20:13:59.594310Z","shell.execute_reply":"2023-08-23T20:14:00.489322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 🔥 Build the Model","metadata":{"papermill":{"duration":0.007083,"end_time":"2023-08-22T08:46:41.353412","exception":false,"start_time":"2023-08-22T08:46:41.346329","status":"completed"},"tags":[]}},{"cell_type":"code","source":"X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.10, random_state=42)","metadata":{"papermill":{"duration":0.316503,"end_time":"2023-08-22T08:46:41.677088","exception":false,"start_time":"2023-08-22T08:46:41.360585","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-23T20:14:09.180902Z","iopub.execute_input":"2023-08-23T20:14:09.181497Z","iopub.status.idle":"2023-08-23T20:14:09.483027Z","shell.execute_reply.started":"2023-08-23T20:14:09.181462Z","shell.execute_reply":"2023-08-23T20:14:09.481928Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(\n    rescale=1. / 255,\n    rotation_range=10,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    zoom_range=0.1,\n    horizontal_flip=False,\n    fill_mode='nearest')\n    \nvalidation_datagen = ImageDataGenerator(rescale=1 / 255)","metadata":{"execution":{"iopub.status.busy":"2023-08-23T20:14:09.484640Z","iopub.execute_input":"2023-08-23T20:14:09.485055Z","iopub.status.idle":"2023-08-23T20:14:09.491530Z","shell.execute_reply.started":"2023-08-23T20:14:09.485006Z","shell.execute_reply":"2023-08-23T20:14:09.490275Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen.fit(X_train)\nvalidation_datagen.fit(X_val)","metadata":{"execution":{"iopub.status.busy":"2023-08-23T20:14:09.493285Z","iopub.execute_input":"2023-08-23T20:14:09.493632Z","iopub.status.idle":"2023-08-23T20:14:09.921820Z","shell.execute_reply.started":"2023-08-23T20:14:09.493599Z","shell.execute_reply":"2023-08-23T20:14:09.920726Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = keras.Sequential([\n    layers.Conv2D(filters = 64, kernel_size = (5,5),padding = 'Same', activation ='relu', input_shape = (28,28,1)),\n    layers.Conv2D(filters = 64, kernel_size = (5,5),padding = 'Same', activation ='relu'),\n    layers.MaxPool2D(pool_size=(2,2)),\n    layers.Dropout(0.3),\n\n    # Convolutional layer 3, 4\n    layers.Conv2D(filters = 128, kernel_size = (3,3),padding = 'Same', activation ='relu'),\n    layers.Conv2D(filters = 128, kernel_size = (3,3),padding = 'Same', activation ='relu'),\n    layers.MaxPool2D(pool_size=(2,2), strides=(2,2)),\n    layers.Dropout(0.3),\n\n    \n    # Flatten layer\n    layers.Flatten(),\n    layers.Dense(512, activation = \"relu\"),\n    layers.Dropout(0.5),\n\n    # Output layer (softmax returns a probability distribution)\n    layers.Dense(units=10, activation='linear')\n])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" model.compile(optimizer='adam',\n               loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n               metrics=['sparse_categorical_accuracy'])","metadata":{"papermill":{"duration":0.026534,"end_time":"2023-08-22T08:46:46.360718","exception":false,"start_time":"2023-08-22T08:46:46.334184","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-23T20:15:42.365900Z","iopub.execute_input":"2023-08-23T20:15:42.366323Z","iopub.status.idle":"2023-08-23T20:15:42.381426Z","shell.execute_reply.started":"2023-08-23T20:15:42.366291Z","shell.execute_reply":"2023-08-23T20:15:42.380277Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"early_stopping = keras.callbacks.EarlyStopping(\n    patience=50,\n    min_delta=0.001,\n    restore_best_weights=True,\n)","metadata":{"papermill":{"duration":0.015614,"end_time":"2023-08-22T08:46:46.383483","exception":false,"start_time":"2023-08-22T08:46:46.367869","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-23T20:15:42.948084Z","iopub.execute_input":"2023-08-23T20:15:42.948468Z","iopub.status.idle":"2023-08-23T20:15:42.953866Z","shell.execute_reply.started":"2023-08-23T20:15:42.948420Z","shell.execute_reply":"2023-08-23T20:15:42.952572Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 🚅 Train","metadata":{"papermill":{"duration":0.007146,"end_time":"2023-08-22T08:46:46.397682","exception":false,"start_time":"2023-08-22T08:46:46.390536","status":"completed"},"tags":[]}},{"cell_type":"code","source":"history = model.fit(\n    train_datagen.flow(X_train,y_train, batch_size=BATCH_SIZE),\n    validation_data=validation_datagen.flow(X_val, y_val),\n    epochs=EPOCHS,\n    callbacks=[early_stopping],\n    verbose=1, # hide the output because we have so many epochs\n)","metadata":{"papermill":{"duration":298.161754,"end_time":"2023-08-22T08:51:44.567183","exception":false,"start_time":"2023-08-22T08:46:46.405429","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-23T20:15:52.060860Z","iopub.execute_input":"2023-08-23T20:15:52.061405Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 📈 Evaluation","metadata":{"papermill":{"duration":0.419234,"end_time":"2023-08-22T08:51:45.416628","exception":false,"start_time":"2023-08-22T08:51:44.997394","status":"completed"},"tags":[]}},{"cell_type":"code","source":"history_df = pd.DataFrame(history.history)\nhistory_df.loc[:, ['loss', 'val_loss']].plot();","metadata":{"papermill":{"duration":24.272802,"end_time":"2023-08-22T08:52:10.102680","exception":false,"start_time":"2023-08-22T08:51:45.829878","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-23T20:14:30.856766Z","iopub.status.idle":"2023-08-23T20:14:30.859234Z","shell.execute_reply.started":"2023-08-23T20:14:30.858942Z","shell.execute_reply":"2023-08-23T20:14:30.858969Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 📝 Prediction","metadata":{"papermill":{"duration":0.415924,"end_time":"2023-08-22T08:52:11.178899","exception":false,"start_time":"2023-08-22T08:52:10.762975","status":"completed"},"tags":[]}},{"cell_type":"code","source":"# predict results\nprediction = model.predict(X_test, verbose=0)\nprediction = tf.nn.softmax(prediction)\n\n# select the indix with the maximum probability\nresults = np.argmax(prediction,axis = 1)\n\nresults = pd.Series(results,name=\"Label\")","metadata":{"papermill":{"duration":3.333915,"end_time":"2023-08-22T08:52:14.927933","exception":false,"start_time":"2023-08-22T08:52:11.594018","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-23T20:14:30.863521Z","iopub.status.idle":"2023-08-23T20:14:30.865992Z","shell.execute_reply.started":"2023-08-23T20:14:30.865736Z","shell.execute_reply":"2023-08-23T20:14:30.865761Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Figure size\nplt.figure(figsize=(15,4))\n\n# Subplot \nfor i in range(20):\n    ax=plt.subplot(2, 10, i+1)\n    ax.grid(False)\n    ax.get_xaxis().set_visible(False)\n    ax.get_yaxis().set_visible(False)\n    plt.imshow(X_test[i], cmap=plt.get_cmap('gray'))\n    plt.title(results[i]);\n    \nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-08-23T20:14:30.867415Z","iopub.status.idle":"2023-08-23T20:14:30.872257Z","shell.execute_reply.started":"2023-08-23T20:14:30.872010Z","shell.execute_reply":"2023-08-23T20:14:30.872034Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 📃 Submission file","metadata":{"papermill":{"duration":0.413058,"end_time":"2023-08-22T08:52:15.780522","exception":false,"start_time":"2023-08-22T08:52:15.367464","status":"completed"},"tags":[]}},{"cell_type":"code","source":"submission = pd.concat([pd.Series(range(1,28001),name = \"ImageId\"),results],axis = 1)\n\nsubmission.to_csv(\"submission.csv\",index=False)","metadata":{"papermill":{"duration":0.486162,"end_time":"2023-08-22T08:52:16.724983","exception":false,"start_time":"2023-08-22T08:52:16.238821","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-08-23T20:14:30.873582Z","iopub.status.idle":"2023-08-23T20:14:30.874339Z","shell.execute_reply.started":"2023-08-23T20:14:30.874102Z","shell.execute_reply":"2023-08-23T20:14:30.874125Z"},"trusted":true},"execution_count":null,"outputs":[]}]}