{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"markdown","source":"# Let's bring in the imports and the data"},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nplt.style.use('ggplot')\nimport seaborn as sns\nsns.set_style('dark')\nimport sklearn\nimport tensorflow as tf\nfrom tensorflow import keras","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\n\ntrain = pd.read_csv('../input/Kannada-MNIST/train.csv')\ntest = pd.read_csv('../input/Kannada-MNIST/test.csv')\ndig_mnist = pd.read_csv('../input/Kannada-MNIST/Dig-MNIST.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(train.shape)\nprint(dig_mnist.shape)\nprint(test.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.columns","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Data Preparation and Preprocessing"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_labels = train['label'].values\ntrain_data = train.drop('label',axis=1).values\n\nval_labels = dig_mnist['label'].values\nval_data = dig_mnist.drop('label',axis=1).values\n\ntest_data = test.drop('id', axis=1).values\n\nprint(train_labels)\nprint(train_data)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_data = (train_data - np.mean(train_data)) / 255.\nval_data = (val_data - np.mean(val_data)) / 255.\ntest_data = (test_data - np.mean(test_data)) / 255.\n\ntrain_data","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n\ndatagen = ImageDataGenerator(\n      rotation_range=40,\n      width_shift_range=0.2,\n      height_shift_range=0.2,\n      shear_range=0.2,\n      zoom_range=0.2,\n      horizontal_flip=True,\n      fill_mode='nearest')\n\n# Let's reshape our 2d arrays because input to datagen.fit() should have rank 4.\n\ntrain_data = train_data.reshape(-1,28,28,1)\nval_data = val_data.reshape(-1,28,28,1)\ntest_data = test_data.reshape(-1,28,28,1)\n\ndatagen.fit(train_data)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Building and compiling the model"},{"metadata":{"trusted":true},"cell_type":"code","source":"model = keras.models.Sequential([\n    keras.layers.Conv2D(64, (3,3), padding='same', input_shape=(28, 28, 1)),\n    keras.layers.BatchNormalization(momentum=0.9, epsilon=1e-5, gamma_initializer=\"uniform\"),\n    keras.layers.LeakyReLU(alpha=0.1),\n    \n    keras.layers.Conv2D(64, (3,3), padding='same'),\n    keras.layers.BatchNormalization(momentum=0.9, epsilon=1e-5, gamma_initializer=\"uniform\"),\n    keras.layers.LeakyReLU(alpha=0.1),\n    \n    keras.layers.Conv2D(64, (3,3), padding='same'),\n    keras.layers.BatchNormalization(momentum=0.9, epsilon=1e-5, gamma_initializer=\"uniform\"),\n    keras.layers.LeakyReLU(alpha=0.1),\n    \n    keras.layers.MaxPooling2D(2, 2),\n    keras.layers.Dropout(0.2),\n    \n    keras.layers.Conv2D(128, (3,3), padding='same', input_shape=(28, 28, 1)),\n    keras.layers.BatchNormalization(momentum=0.9, epsilon=1e-5, gamma_initializer=\"uniform\"),\n    keras.layers.LeakyReLU(alpha=0.1),\n    \n    keras.layers.Conv2D(128, (3,3), padding='same', input_shape=(28, 28, 1)),\n    keras.layers.BatchNormalization(momentum=0.9, epsilon=1e-5, gamma_initializer=\"uniform\"),\n    keras.layers.LeakyReLU(alpha=0.1),\n    \n    keras.layers.Conv2D(128, (3,3), padding='same', input_shape=(28, 28, 1)),\n    keras.layers.BatchNormalization(momentum=0.9, epsilon=1e-5, gamma_initializer=\"uniform\"),\n    keras.layers.LeakyReLU(alpha=0.1),\n    \n    keras.layers.MaxPooling2D(2, 2),\n    keras.layers.Dropout(0.2),\n    \n    \n    keras.layers.Conv2D(256, (3,3), padding='same', input_shape=(28, 28, 1)),\n    keras.layers.BatchNormalization(momentum=0.9, epsilon=1e-5, gamma_initializer=\"uniform\"),\n    keras.layers.LeakyReLU(alpha=0.1),\n    \n    keras.layers.Conv2D(256, (3,3), padding='same', input_shape=(28, 28, 1)),\n    keras.layers.BatchNormalization(momentum=0.9, epsilon=1e-5, gamma_initializer=\"uniform\"),\n    keras.layers.LeakyReLU(alpha=0.1),\n    \n    keras.layers.MaxPooling2D(2, 2),\n    keras.layers.Dropout(0.2),\n    \n    keras.layers.Flatten(),\n    \n    keras.layers.Dense(256),\n    keras.layers.LeakyReLU(alpha=0.1),\n    keras.layers.BatchNormalization(),\n    \n    keras.layers.Dense(256),\n    keras.layers.LeakyReLU(alpha=0.1),\n    keras.layers.BatchNormalization(),\n    \n    keras.layers.Dense(10, activation='softmax')\n    \n])\n\n\noptimizer = keras.optimizers.RMSprop(learning_rate=0.002,rho=0.9)\nmodel.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Training our model"},{"metadata":{"trusted":true},"cell_type":"code","source":"learning_rate_reduction = keras.callbacks.ReduceLROnPlateau( \n    monitor='loss',    \n    factor=0.2,       \n    patience=2,        \n    verbose=1,         \n    mode=\"min\",       \n    min_delta=0.0001,  \n    cooldown=0, \n    min_lr=0.00001)\n\nes = keras.callbacks.EarlyStopping(monitor='val_loss', mode='min', verbose=2, patience=3, restore_best_weights=True)\n\nhistory = model.fit(datagen.flow(train_data, train_labels, batch_size=1024),\n                              steps_per_epoch = len(train_data) // 1024,\n                              epochs = 100,\n                              validation_data = (np.array(val_data),np.array(val_labels)),\n                              validation_steps = 50,\n                              callbacks = [learning_rate_reduction, es])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Evaluating our model"},{"metadata":{"trusted":true},"cell_type":"code","source":"print(history.history.keys())\nepochs = len(history.history['loss'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y1 = history.history['loss']\ny2 = history.history['val_loss']\nx = np.arange(1, epochs+1)\n\nplt.plot(x, y1, y2)\nplt.legend(['loss', 'val_loss'])\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.tight_layout()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y1 = history.history['accuracy']\ny2 = history.history['val_accuracy']\nx = np.arange(1, epochs+1)\n\nplt.plot(x, y1, y2)\nplt.legend(['accuracy', 'val_accuracy'])\nplt.xlabel('Epochs')\nplt.ylabel('Acc')\nplt.tight_layout()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"score = model.evaluate( np.array(val_data), np.array(val_labels),batch_size = 1024)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Making predictions"},{"metadata":{"trusted":true},"cell_type":"code","source":"predictions = model.predict(test_data)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"pred = np.argmax(predictions, axis=1)\npred","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# test_id = test_data['Id']\ntest_id = np.arange(pred.shape[0])\ntest_id","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.DataFrame({'id': test_id, 'label': pred})\nsubmission.to_csv('submission.csv', index = False)","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}