{"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":"### Imports","metadata":{}},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nimport matplotlib.pyplot as plt\nos.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # Supress tensorflow log outputs","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-12-31T19:42:34.791603Z","iopub.execute_input":"2021-12-31T19:42:34.792464Z","iopub.status.idle":"2021-12-31T19:42:34.880932Z","shell.execute_reply.started":"2021-12-31T19:42:34.792412Z","shell.execute_reply":"2021-12-31T19:42:34.880201Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Load in Data","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv(\"/kaggle/input/digit-recognizer/train.csv\")\ntest = pd.read_csv(\"/kaggle/input/digit-recognizer/test.csv\")","metadata":{"execution":{"iopub.status.busy":"2021-12-31T19:42:42.580049Z","iopub.execute_input":"2021-12-31T19:42:42.580659Z","iopub.status.idle":"2021-12-31T19:42:47.301918Z","shell.execute_reply.started":"2021-12-31T19:42:42.580616Z","shell.execute_reply":"2021-12-31T19:42:47.301118Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Extract x_train and y_train","metadata":{}},{"cell_type":"code","source":"x_train = train.drop(\"label\", axis=1).to_numpy().astype(\"float32\").reshape(-1, 28, 28, 1) / 255.0\nx_test = test.to_numpy().astype(\"float32\").reshape(-1, 28, 28, 1) / 255.0\ny_train = train[\"label\"]","metadata":{"execution":{"iopub.status.busy":"2021-12-31T19:42:47.303535Z","iopub.execute_input":"2021-12-31T19:42:47.303956Z","iopub.status.idle":"2021-12-31T19:42:47.551289Z","shell.execute_reply.started":"2021-12-31T19:42:47.303917Z","shell.execute_reply":"2021-12-31T19:42:47.550538Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Simple CNN Model with Regularization","metadata":{}},{"cell_type":"code","source":"model = keras.Sequential([\n    layers.Input((28, 28, 1)),\n    \n    # image augmentation\n    layers.RandomContrast(0.2, seed=1),\n    layers.RandomZoom(0.2, 0.2, seed=1),\n    \n    layers.Conv2D(32, 3, activation=\"relu\"),\n    layers.MaxPooling2D(),\n    layers.BatchNormalization(),\n    layers.Dropout(0.2),\n    \n    layers.Conv2D(64, 3, activation=\"relu\"),\n    layers.MaxPooling2D(),\n    layers.BatchNormalization(),\n    layers.Dropout(0.3),\n    \n    layers.Conv2D(128, 3, activation=\"relu\"),\n    layers.MaxPooling2D(),\n    layers.BatchNormalization(),\n    layers.Dropout(0.2),\n    \n    layers.Flatten(),\n    layers.Dense(64),\n    layers.BatchNormalization(),\n    layers.Dropout(0.1),\n    layers.Dense(10, activation=\"softmax\")\n])","metadata":{"execution":{"iopub.status.busy":"2021-12-31T19:42:47.552419Z","iopub.execute_input":"2021-12-31T19:42:47.552712Z","iopub.status.idle":"2021-12-31T19:42:49.912873Z","shell.execute_reply.started":"2021-12-31T19:42:47.552662Z","shell.execute_reply":"2021-12-31T19:42:49.912103Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(\n    optimizer = keras.optimizers.Adam(),\n    loss = keras.losses.SparseCategoricalCrossentropy(),\n    metrics=[\"accuracy\"]\n)","metadata":{"execution":{"iopub.status.busy":"2021-12-31T19:42:49.915051Z","iopub.execute_input":"2021-12-31T19:42:49.915540Z","iopub.status.idle":"2021-12-31T19:42:49.927756Z","shell.execute_reply.started":"2021-12-31T19:42:49.915500Z","shell.execute_reply":"2021-12-31T19:42:49.927085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Callbacks to minimize loss","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.callbacks import EarlyStopping\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau\nfrom tensorflow.keras.callbacks import ModelCheckpoint\n\ncallbacks = [\n    EarlyStopping(patience=25, monitor='val_loss'),\n\n\tReduceLROnPlateau(monitor='val_loss', min_lr=1e-9, patience=5, mode='min',verbose=1, factor=0.1),\n\n\tModelCheckpoint(monitor='val_loss', filepath='./best_model.h5', save_best_only=True)\n]","metadata":{"execution":{"iopub.status.busy":"2021-12-31T19:42:50.019618Z","iopub.execute_input":"2021-12-31T19:42:50.020061Z","iopub.status.idle":"2021-12-31T19:42:50.025782Z","shell.execute_reply.started":"2021-12-31T19:42:50.020030Z","shell.execute_reply":"2021-12-31T19:42:50.024856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(x_train, y_train, epochs=150, batch_size=64, validation_split=0.2, verbose=2, callbacks=callbacks)","metadata":{"execution":{"iopub.status.busy":"2021-12-31T19:42:58.392830Z","iopub.execute_input":"2021-12-31T19:42:58.393078Z","iopub.status.idle":"2021-12-31T19:45:18.057744Z","shell.execute_reply.started":"2021-12-31T19:42:58.393050Z","shell.execute_reply":"2021-12-31T19:45:18.057059Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = keras.models.load_model(\"best_model.h5\") # load in best model","metadata":{"execution":{"iopub.status.busy":"2021-12-31T19:45:26.744720Z","iopub.execute_input":"2021-12-31T19:45:26.745442Z","iopub.status.idle":"2021-12-31T19:46:21.767949Z","shell.execute_reply.started":"2021-12-31T19:45:26.745403Z","shell.execute_reply":"2021-12-31T19:46:21.767208Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Submission","metadata":{}},{"cell_type":"code","source":"submission = pd.read_csv(\"/kaggle/input/digit-recognizer/sample_submission.csv\")\nsubmission[\"Label\"] = np.argmax(model.predict(x_test), axis=-1)\nsubmission.to_csv(\"submission.csv\", index=False)","metadata":{"execution":{"iopub.status.busy":"2021-12-31T19:46:28.674910Z","iopub.execute_input":"2021-12-31T19:46:28.675194Z","iopub.status.idle":"2021-12-31T19:46:30.261134Z","shell.execute_reply.started":"2021-12-31T19:46:28.675160Z","shell.execute_reply":"2021-12-31T19:46:30.260395Z"},"trusted":true},"execution_count":null,"outputs":[]}]}