{"cells":[{"metadata":{"id":"ZmLGx1S8XVpY","trusted":true},"cell_type":"code","source":"import keras\nfrom keras.datasets import mnist\nfrom sklearn.model_selection import train_test_split\nimport numpy as np\nimport pandas as pd","execution_count":null,"outputs":[]},{"metadata":{"id":"-4SJW-wNXq-c","trusted":true},"cell_type":"code","source":"batch_size = 128\nnum_classes = 10\nepochs = 30","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pd.read_csv(\"../input/digit-recognizer/train.csv\")\ntest = pd.read_csv(\"../input/digit-recognizer/test.csv\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_train = train[\"label\"]\n\nx_train = train.drop(labels=[\"label\"], axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x_train, x_test, y_train, y_test = train_test_split(x_train, y_train , random_state = 42, test_size=0.3)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x_train.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x_test.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_train.shape, y_test.shape","execution_count":null,"outputs":[]},{"metadata":{"id":"yhqG_R3eX_qY","trusted":true},"cell_type":"code","source":"from keras import backend","execution_count":null,"outputs":[]},{"metadata":{"id":"KLPN0WWEXxJo","trusted":true},"cell_type":"code","source":"if backend.image_data_format() == 'channels_first':\n    x_train = np.array(x_train).reshape(x_train.shape[0], 1, 28, 28)\n    x_test = np.array(x_test).reshape(x_test.shape[0], 1, 28, 28)\n    input_shape = (1, 28, 28)\nelse:\n    x_train = np.array(x_train).reshape(x_train.shape[0], 28, 28, 1)\n    x_test = np.array(x_test).reshape(x_test.shape[0], 28, 28, 1)\n    input_shape = (28, 28, 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x_train.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test = np.array(test).reshape(-1, 28, 28, 1)","execution_count":null,"outputs":[]},{"metadata":{"id":"ASA9yOmqX9x2","trusted":true},"cell_type":"code","source":"x_train = x_train.astype('float')\nx_test = x_test.astype('float')\ntest = test.astype('float')\n\nx_train /= 255\nx_test /= 255\ntest/= 255","execution_count":null,"outputs":[]},{"metadata":{"id":"LU6BUlWfYNnh","trusted":true},"cell_type":"code","source":"y_train = keras.utils.to_categorical(y_train, num_classes)\ny_test = keras.utils.to_categorical(y_test, num_classes)","execution_count":null,"outputs":[]},{"metadata":{"id":"l9sBFiCwYR1U","trusted":true},"cell_type":"code","source":"from keras.models import Sequential\nmodel = Sequential()","execution_count":null,"outputs":[]},{"metadata":{"id":"jfAc8QwKYXIj","trusted":true},"cell_type":"code","source":"from keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense","execution_count":null,"outputs":[]},{"metadata":{"id":"OToaj9o_YWAf","trusted":true},"cell_type":"code","source":"model.add(Conv2D(32, kernel_size=(5, 5), activation='relu', input_shape=input_shape))\nmodel.add(Conv2D(32, kernel_size=(5, 5), activation='relu', input_shape=input_shape))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\nmodel.add(Conv2D(64, (3, 3), activation='relu'))\nmodel.add(Conv2D(64, (3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\nmodel.add(Flatten())\n\nmodel.add(Dense(256, activation='relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(num_classes, activation='softmax'))","execution_count":null,"outputs":[]},{"metadata":{"id":"SrOMJESjYix8","trusted":true},"cell_type":"code","source":"model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.RMSprop(lr = 0.001, rho=0.9, epsilon=1e-08, decay = 0.0), metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"id":"yJmwbjL2Ywj3","outputId":"f0a03e42-ec5c-4c03-96e3-5e60d697f0b1","trusted":true},"cell_type":"code","source":"model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test))","execution_count":null,"outputs":[]},{"metadata":{"id":"IhvJ0LGHq8kO","trusted":true},"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator","execution_count":null,"outputs":[]},{"metadata":{"id":"I7jiaYvDq10Z","trusted":true},"cell_type":"code","source":"datagen = ImageDataGenerator(\n        featurewise_center=False,  # set input mean to 0 over the dataset\n        samplewise_center=False,  # set each sample mean to 0\n        featurewise_std_normalization=False,  # divide inputs by std of the dataset\n        samplewise_std_normalization=False,  # divide each input by its std\n        zca_whitening=False,  # apply ZCA whitening\n        rotation_range=10,  # randomly rotate images in the range (degrees, 0 to 180)\n        zoom_range = 0.3, # Randomly zoom image \n        width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)\n        height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)\n        horizontal_flip=False,  # randomly flip images\n        vertical_flip=False)  # randomly flip images\n\n\ndatagen.fit(x_train)","execution_count":null,"outputs":[]},{"metadata":{"id":"ycMCebbHtNrY","trusted":true},"cell_type":"code","source":"from keras.callbacks import ReduceLROnPlateau\nannealer_callback = ReduceLROnPlateau(monitor = 'val_accuracy', patience = 3, verbose = 1, factor = 0.5, min_lr = 0.00001)","execution_count":null,"outputs":[]},{"metadata":{"id":"LcLwsUNwqfyM","outputId":"2b7e7048-19bc-4a0e-8ac6-e4bc6a77ffb1","trusted":true},"cell_type":"code","source":"model.fit_generator(generator=datagen.flow(x_train, y_train, batch_size = batch_size), steps_per_epoch= x_train.shape[0] // batch_size, epochs=epochs, validation_data=(x_test,y_test), verbose = 2,\n                    callbacks = [annealer_callback])","execution_count":null,"outputs":[]},{"metadata":{"id":"rJvhQEjgYzP4","outputId":"6c352767-8f47-4d32-c9a3-2b36d3e12f73","trusted":true},"cell_type":"code","source":"score = model.evaluate(x_test, y_test, verbose=0)\nscore","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"results = model.predict(test)\n\nresults = np.argmax(results,axis = 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission_df = pd.read_csv(\"../input/digit-recognizer/sample_submission.csv\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission_df[\"Label\"] = results","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission_df.to_csv(\"submission.csv\", index = False)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Sources\n1. https://www.kaggle.com/yassineghouzam/introduction-to-cnn-keras-0-997-top-6?rvi=1\n2. https://keras.io/examples/mnist_cnn/"},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"colab":{"name":"Digit recognition with CNN, Data Augmentation and Annealing","provenance":[],"collapsed_sections":[]},"kernelspec":{"display_name":"Python 3","name":"python3"},"accelerator":"GPU"},"nbformat":4,"nbformat_minor":4}