{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.preprocessing import OneHotEncoder\nfrom sklearn.model_selection import train_test_split\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport tensorflow.keras as keras\nimport tensorflow.keras.layers as layers\nimport tensorflow.keras.layers.experimental.preprocessing as preprocessing","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_data = pd.read_csv('../input/digit-recognizer/train.csv')\ntest_data = pd.read_csv('../input/digit-recognizer/test.csv')\n\nprint(f'Training Data size is : {train_data.shape}')\nprint(f'Test Data size is : {test_data.shape}')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X = train_data.drop(['label'], axis=1)\ny = train_data['label']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X = X / 255.0\ntest_data = test_data / 255.0\nX.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X = X.values.reshape(-1, 28, 28, 1)\ntest_data = test_data.values.reshape(-1, 28, 28, 1)\nprint('X.shape =', X.shape)\nprint('test_data.shape =', test_data.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"encoder = OneHotEncoder()\ny = np.array(y)\ny = y.reshape(len(y), 1)\nencoder.fit(y)\ny = encoder.transform(y).toarray()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Data Augmentation\n\ndatagen = ImageDataGenerator(\n        rotation_range=10,  \n        zoom_range = 0.10,  \n        width_shift_range=0.1, \n        height_shift_range=0.1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_part, X_cross_val, y_part, y_cross_val = train_test_split(\n                                                            X,\n                                                            y,\n                                                            test_size=0.15,\n                                                            random_state=44, \n                                                            shuffle=True\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(\n                                                X_part,\n                                                y_part,\n                                                test_size=0.25,\n                                                random_state=44,\n                                                shuffle=True\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = keras.Sequential([\n    layers.InputLayer(input_shape=[28, 28, 1]),\n    preprocessing.RandomTranslation(height_factor=0.1, width_factor=0.1),\n    \n    layers.Conv2D(filters=32, kernel_size=3, activation=\"relu\"),\n    layers.BatchNormalization(),\n    layers.Conv2D(filters=32, kernel_size=3, activation=\"relu\"),\n    layers.BatchNormalization(),\n    layers.Conv2D(filters=32, kernel_size=5, strides=2, padding='same', activation='relu'),\n    layers.BatchNormalization(),\n    layers.Dropout(rate=0.3),\n\n    layers.Conv2D(filters=64, kernel_size=3, activation=\"relu\"),\n    layers.BatchNormalization(),\n    layers.Conv2D(filters=64, kernel_size=3, activation=\"relu\"),\n    layers.BatchNormalization(),\n    layers.Conv2D(filters=64, kernel_size=5, strides=2, padding='same', activation='relu'),\n    layers.BatchNormalization(),\n    layers.Dropout(rate=0.3),\n\n    layers.Conv2D(128, kernel_size = 4, activation='relu'),\n    layers.BatchNormalization(),\n    layers.Flatten(),\n    layers.Dense(128, activation='relu'),\n    layers.Dropout(rate=0.25),\n    layers.Dense(10, activation='softmax')\n])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(\n    optimizer=\"Adam\",\n    loss=\"categorical_crossentropy\",\n    metrics=[\"accuracy\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Decrease learning rate for each epoch\nannealer = keras.callbacks.LearningRateScheduler(lambda x: 1e-3 * 0.95 ** x)\n\n# train\n\nepochs = 45\nX_train2, X_val2, y_train2, y_val2 = train_test_split(X_train, y_train, test_size = 0.1)\nhistory = model.fit_generator(datagen.flow(X_train2,y_train2, batch_size=64),\n                              epochs = epochs, \n                              steps_per_epoch = X_train2.shape[0]//64, \n                              validation_data = (X_val2,y_val2), \n                              callbacks=[annealer], verbose=2)\nprint(\"Epochs={0:d}, Train accuracy={1:.5f}, Validation accuracy={2:.5f}\".format(epochs,max(history.history['acc']),max(history.history['val_acc'])))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# model.fit(X_train, y_train, validation_data=(\n#     X_cross_val, y_cross_val), epochs=45, batch_size=64, verbose=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_loss, model_accuracy = model.evaluate(X_test, y_test)\n\nprint('Test Loss =', model_loss)\nprint('Test Accuracy =', model_accuracy)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"result = model.predict(test_data)\nresult = pd.Series(np.argmax(result, axis=1), name=\"Label\")\n\nMNIST_Submission = pd.concat(\n    [pd.Series(range(1, 28001), name=\"ImageId\"), result], axis=1)\nMNIST_Submission.to_csv(\"MNIST_submission.csv\", index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(15,6))\nfor i in range(40):  \n    plt.subplot(4, 10, i+1)\n    plt.imshow(X_test[i].reshape((28,28)),cmap=plt.cm.binary)\n    plt.title(\"predict=%d\" % result[i],y=0.9)\n    plt.axis('off')\nplt.subplots_adjust(wspace=0.3, hspace=-0.1)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}