{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom matplotlib import pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"origin_train = pd.read_csv('../input/Kannada-MNIST/train.csv')\nvalidate = pd.read_csv('../input/Kannada-MNIST/Dig-MNIST.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pd.concat([origin_train, validate])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(origin_train.shape)\nprint(validate.shape)\nprint(train.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"a = np.matrix(train.iloc[0:1, 1:]).reshape(28, 28)\nplt.imshow(a)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"i, j = 4, 10\nfig, ax = plt.subplots(i, j)\nfig.set_figheight(6)\nfig.set_figwidth(6)\n\nimage_total_count = i * j\n\nfor index, row in train.iterrows():\n    if index < image_total_count:\n        ax[index//j, index%j].set_title(row[0])\n        ax[index//j, index%j].imshow(np.matrix(row[1:785]).reshape(28,28))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train = train.iloc[:, 1:]\ny_train = train.iloc[:, 0]\nprint(X_train.shape, y_train.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.layers import Dense,Dropout,Conv2D,MaxPool2D,Flatten\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import *\nfrom keras.utils import np_utils, to_categorical\nfrom keras.callbacks import ReduceLROnPlateau\nfrom keras.models import Sequential  \nfrom keras import backend as K\n\n# test data split\nX_train, X_test, y_train, y_test = train_test_split(X_train.values, y_train.values, test_size=0.2, random_state=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def func_prep(data_prep):\n    data_prep_data=[]\n    for i in range(data_prep.shape[0]):\n        num=np.array(data_prep[i:i+1])\n        num=num.ravel()\n        num=num.reshape((28,28))\n        data_prep_data.append(num)\n        \n    return np.array(data_prep_data)\n\nX_train=func_prep(X_train)\nX_test=np.array(X_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# images\nimport matplotlib.pyplot as plt\nfig = plt.figure()\nax1 = fig.add_subplot(2,2,1)\nax1.imshow(X_train[3],cmap='gray')\nax2 = fig.add_subplot(2,2,2)\nax2.imshow(X_train[8],cmap='gray')\nax3 = fig.add_subplot(2,2,3)\nax3.imshow(X_train[2],cmap='gray')\nax4 = fig.add_subplot(2,2,4)\nax4.imshow(X_train[20],cmap='gray')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# input image dimensions\nimg_rows, img_cols = 28, 28\nX_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)\nX_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)\ninput_shape = (img_rows, img_cols, 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# type casting to float\nX_train = X_train.astype('float32')\nX_test = X_test.astype('float32')\n\n# normaliztion\nX_train /= 255\nX_test /= 255\n\n# printing size\nprint('X_train shape:', X_train.shape)\nprint(X_train.shape[0], 'train samples')\nprint(X_test.shape[0], 'test samples')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# scalar to one-hot-encoding\nnum_classes = 10\ny_train = to_categorical(y_train, num_classes)\ny_test = to_categorical(y_test, num_classes)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', \n             activation ='relu', input_shape = (img_rows,img_cols,1)))\nmodel.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', \n             activation ='relu'))\nmodel.add(MaxPool2D(pool_size=(2,2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', \n             activation ='relu'))\nmodel.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', \n             activation ='relu'))\nmodel.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Flatten())\nmodel.add(Dense(256, activation = \"relu\"))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(10, activation = \"softmax\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.optimizers import RMSprop\nfrom keras.preprocessing.image import ImageDataGenerator\n\noptimizer = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)\nmodel.compile(optimizer = optimizer , loss = \"categorical_crossentropy\", metrics=[\"accuracy\"])\nlearning_rate_reduction = ReduceLROnPlateau(monitor='val_loss',patience=3,factor=0.2,min_lr=0.00001)\n\n# fit model\n# hist = model.fit(X_train,y_train,batch_size=128,epochs=30,validation_split=0.3,\n#                  callbacks=[learning_rate_reduction], shuffle=True)\n\n# Data Agumentation\ndatagen = ImageDataGenerator(rotation_range=10,zoom_range = 0.1, width_shift_range=0.1, height_shift_range=0.1) \n\n# Model Training with data agumentation\nhist = model.fit(x=datagen.flow(X_train,y_train, batch_size=128),\n                              epochs = 20, \n                              verbose = 2, steps_per_epoch=X_train.shape[0] // 128\n                              ,callbacks=[learning_rate_reduction])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# evalute model\nscore = model.evaluate(X_test, y_test, verbose=0)\nprint('Test loss:', score[0])\nprint('Test accuracy:', score[1])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test = pd.read_csv('../input/Kannada-MNIST/test.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_test = test.values[:, 1:]\nX_test = func_prep(X_test)\nX_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)\nX_test = X_test.astype('float32')\nX_test /= 255\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(X_test[0].shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import time\n\nt = time.process_time()\n\npreds = np.argmax(model.predict(X_test), axis=-1)\n\nelapsed_time = time.process_time() - t\n\nprint('elapsed_time: ', elapsed_time)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(preds.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Tried verifying a few images manually. They all matched. I'll see what's the final score after submission.\n\nidx = 3\nprint(preds[idx])\n\nplt.imshow(X_test[idx].reshape(28, 28))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.DataFrame({'id': [ i for i in range(len(preds))], 'label': preds})\n# print(df)\n\ndf.to_csv('submission.csv', index=False)","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}