{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import cv2\nimport pandas as pd\nimport numpy as  np\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import confusion_matrix\n\nfrom keras.utils.np_utils import to_categorical\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.models import Sequential\nfrom keras.applications import MobileNetV2\nfrom keras.layers import Dense,Conv2D,Flatten,MaxPool2D,Dropout,BatchNormalization,GlobalAveragePooling2D\nfrom keras.optimizers import RMSprop,Adam\nfrom keras.callbacks import ReduceLROnPlateau\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Load Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"TRAIN_SIZE = 101 #60000\ntrain=pd.read_csv('../input/Kannada-MNIST/train.csv')\ntrain.head","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"label_value_cnts=train.label.value_counts()\nlabel_value_cnts","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def x_train_28_28_1():\n    X_train=train.drop('label',axis=1)\n    X_train=X_train/255 #normalize\n    return X_train.values[:TRAIN_SIZE, :].reshape(-1,28,28,1)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# PreProcessing Image: from (28, 28, 1) to (94, 94, 3)"},{"metadata":{"trusted":true},"cell_type":"code","source":"def convert_shape_channel(X):\n    X = np.float32(X)\n    n = X.shape[0]\n    X_rgb = np.zeros((n, 94, 94, 3))\n    for i in range(n):        \n        resized  = cv2.resize(X[i], dsize=(94, 94), interpolation=cv2.INTER_CUBIC)\n        rgb = cv2.cvtColor(resized,cv2.COLOR_GRAY2RGB) \n        X_rgb[i] = rgb   \n    \n    return X_rgb.reshape((n, 94, 94, 3))\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train = x_train_28_28_1()\nprint(X_train.shape)\nX_train = convert_shape_channel(X_train)\nprint(X_train.shape)","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":"Y_train=train.label[:TRAIN_SIZE]\nY_train=to_categorical(Y_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Y_train.shape","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.2)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Data Augementation"},{"metadata":{"trusted":true},"cell_type":"code","source":"datagen = ImageDataGenerator( \n        rotation_range=10,  \n        zoom_range = 0.1, \n        width_shift_range=0.1,  \n        height_shift_range=0.1)  \n\n\ndatagen.fit(X_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"def mobilenet():\n    base_model = MobileNetV2(\n        weights = 'imagenet',\n        input_shape = (96, 96, 3),\n        include_top = False\n    )\n    base_model.trainable = False\n    return Sequential([\n        base_model,\n        GlobalAveragePooling2D(),\n        Dropout(0.4),\n        Dense(10, activation = 'softmax')\n    ])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def simple_model():\n    model = Sequential()\n    \n\n    model.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', activation ='relu', input_shape = (28,28,1)))\n    model.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', activation ='relu'))\n    model.add(BatchNormalization(momentum=.15))\n    model.add(MaxPool2D(pool_size=(2,2)))\n    model.add(Dropout(0.2))\n\n\n    model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', activation ='relu'))\n    model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', activation ='relu'))\n    model.add(BatchNormalization(momentum=0.15))\n    model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))\n    model.add(Dropout(0.2))\n\n    model.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', activation ='relu', input_shape = (28,28,1)))\n    model.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', activation ='relu'))\n    model.add(BatchNormalization(momentum=.15))\n    model.add(MaxPool2D(pool_size=(2,2)))\n    model.add(Dropout(0.2))\n\n\n    model.add(Flatten())\n    model.add(Dense(128, activation = \"relu\"))\n    model.add(Dropout(0.4))\n    model.add(Dense(64, activation = \"relu\"))\n    model.add(Dropout(0.4))\n    model.add(Dense(10, activation = \"softmax\"))\n    return simple_model()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = mobilenet()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"optimizer=Adam(learning_rate=0.001,beta_1=0.9,beta_2=0.999)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(optimizer=optimizer,loss=['categorical_crossentropy'],metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Learning rate reduction"},{"metadata":{"trusted":true},"cell_type":"code","source":"learning_rate_reduction = ReduceLROnPlateau(monitor='val_accuracy', patience=3, verbose=1, factor=0.5, min_lr=0.00001)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"epochs=5\nbatch_size=64 if TRAIN_SIZE > 100 else 1","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Train"},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit_generator(\n    datagen.flow(X_train,y_train, batch_size=batch_size), \n    epochs = epochs, \n    validation_data = (X_test,y_test),\n    verbose = 2, \n    steps_per_epoch=X_train.shape[0] // batch_size, \n    callbacks=[learning_rate_reduction]\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_pre_test=model.predict(X_test)\ny_pre_test=np.argmax(y_pre_test,axis=1)\ny_test=np.argmax(y_test,axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"conf=confusion_matrix(y_test,y_pre_test)\nconf=pd.DataFrame(conf,index=range(0,10),columns=range(0,10))\nconf","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Test"},{"metadata":{"trusted":true},"cell_type":"code","source":"test=pd.read_csv('../input/Kannada-MNIST/test.csv')\ntest=test.drop('id',axis=1)\ntest=test/255\ntest=test.values.reshape(-1,28,28,1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test = convert_shape_channel(test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_pre=model.predict(test)     \ny_pre=np.argmax(y_pre,axis=1) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission=pd.read_csv('../input/Kannada-MNIST/sample_submission.csv')\nsubmission['label']=y_pre\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}