{"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\nimport matplotlib.pyplot as plt\n\nfrom sklearn.model_selection import train_test_split\nfrom keras.callbacks import EarlyStopping\nfrom sklearn.metrics import accuracy_score\nfrom tensorflow import keras\nfrom keras.utils import np_utils\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense","metadata":{"execution":{"iopub.status.busy":"2023-06-03T14:03:28.527749Z","iopub.execute_input":"2023-06-03T14:03:28.528874Z","iopub.status.idle":"2023-06-03T14:03:28.535747Z","shell.execute_reply.started":"2023-06-03T14:03:28.528821Z","shell.execute_reply":"2023-06-03T14:03:28.534319Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# load train dataset file, and separate the label\ndata = pd.read_csv(\"../input/digit-recognizer/train.csv\")\nX_train = data.drop('label', axis=1)\ny_train = np_utils.to_categorical(data['label'])\n\n# split into train/validation sets\nX_train, X_val, y_train, y_val = train_test_split(\n    X_train, y_train, test_size=0.2, random_state=42)\n\n# rescale train/validation sets\nX_train = X_train.values.reshape(-1, 28, 28, 1) / 255.0\nX_val = X_val.values.reshape(-1, 28, 28, 1) / 255.0\nlen(X_train)","metadata":{"execution":{"iopub.status.busy":"2023-06-03T14:04:20.724790Z","iopub.execute_input":"2023-06-03T14:04:20.725285Z","iopub.status.idle":"2023-06-03T14:04:24.374821Z","shell.execute_reply.started":"2023-06-03T14:04:20.725247Z","shell.execute_reply":"2023-06-03T14:04:24.373637Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# visualize first 5 images\ndef show_images(X, y):\n    f, ax = plt.subplots(1, 5, figsize=(16, 3))\n    y = [np.argmax(y[i]) for i in range(len(y))]\n    for i in range(5):\n        ax[i].imshow(X[i])\n        ax[i].set_xlabel(y[i])\n    plt.show()\n    \nshow_images(X_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2023-06-03T14:04:29.565375Z","iopub.execute_input":"2023-06-03T14:04:29.565755Z","iopub.status.idle":"2023-06-03T14:04:30.463435Z","shell.execute_reply.started":"2023-06-03T14:04:29.565716Z","shell.execute_reply":"2023-06-03T14:04:30.462273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# create CNN classification model\nmodel = Sequential([\n    Conv2D(20, (3,3), activation='relu', input_shape=(28, 28, 1)),   \n    MaxPooling2D(2, 2),\n    Conv2D(20, (3,3), activation='relu'),\n    MaxPooling2D(2, 2),\n    Flatten(),\n    Dense(128, activation='relu'),\n    Dense(10, activation='softmax')])\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2023-06-03T14:04:36.958600Z","iopub.execute_input":"2023-06-03T14:04:36.958998Z","iopub.status.idle":"2023-06-03T14:04:37.056761Z","shell.execute_reply.started":"2023-06-03T14:04:36.958969Z","shell.execute_reply":"2023-06-03T14:04:37.055670Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train the model (should stop after less than 10 epochs)\nmodel.compile(\n    optimizer='adam',\n    loss='categorical_crossentropy',\n    metrics=['accuracy'])\n\ncallback = EarlyStopping(\n    patience=3,\n    restore_best_weights=True)\nhistory = model.fit(X_train, y_train,\n    batch_size=32, epochs=100,\n    validation_data=(X_val, y_val),\n    callbacks=[callback])","metadata":{"execution":{"iopub.status.busy":"2023-06-03T14:04:40.531077Z","iopub.execute_input":"2023-06-03T14:04:40.531470Z","iopub.status.idle":"2023-06-03T14:07:07.362291Z","shell.execute_reply.started":"2023-06-03T14:04:40.531441Z","shell.execute_reply":"2023-06-03T14:07:07.361402Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# visualize model performance\ndef show_validation(h):\n    plt.figure(figsize=(4, 3))\n    epochs = range(len(h.history['accuracy']))\n    plt.plot(epochs, h.history['accuracy'], 'r', label=\"Training Accuracy\")\n    plt.plot(epochs, h.history['val_accuracy'], 'b', label=\"Validation Accuracy\")\n    plt.title('Training and validation accuracy')\n    plt.legend()\n    plt.show()\n    \nshow_validation(history)","metadata":{"execution":{"iopub.status.busy":"2023-06-03T14:07:15.524281Z","iopub.execute_input":"2023-06-03T14:07:15.525640Z","iopub.status.idle":"2023-06-03T14:07:15.846830Z","shell.execute_reply.started":"2023-06-03T14:07:15.525592Z","shell.execute_reply":"2023-06-03T14:07:15.845481Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# make predictions (on the test data)\ndata = pd.read_csv(\"../input/digit-recognizer/test.csv\")\nX_test = data.values.reshape(-1, 28, 28, 1) / 255.0\ny_pred = model.predict(X_test)","metadata":{"execution":{"iopub.status.busy":"2023-06-03T14:07:35.386411Z","iopub.execute_input":"2023-06-03T14:07:35.386798Z","iopub.status.idle":"2023-06-03T14:07:42.130467Z","shell.execute_reply.started":"2023-06-03T14:07:35.386767Z","shell.execute_reply":"2023-06-03T14:07:42.129191Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# visualize first 5 predicted images\nshow_images(X_test, y_pred)","metadata":{"execution":{"iopub.status.busy":"2023-06-03T14:07:45.739465Z","iopub.execute_input":"2023-06-03T14:07:45.739896Z","iopub.status.idle":"2023-06-03T14:07:46.637848Z","shell.execute_reply.started":"2023-06-03T14:07:45.739861Z","shell.execute_reply":"2023-06-03T14:07:46.636959Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# prepare and save submission file\ndf = pd.DataFrame({\n    'ImageId': range(1, len(y_pred)+1),\n    'Label': y_pred.argmax(axis=1)})\ndf.to_csv('submission.csv', index=False)\ndf","metadata":{"execution":{"iopub.status.busy":"2023-06-03T14:07:54.794369Z","iopub.execute_input":"2023-06-03T14:07:54.794768Z","iopub.status.idle":"2023-06-03T14:07:54.883517Z","shell.execute_reply.started":"2023-06-03T14:07:54.794736Z","shell.execute_reply":"2023-06-03T14:07:54.882317Z"},"trusted":true},"execution_count":null,"outputs":[]}]}