{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Intro \nWelcome To The [Kannada-MINST](https://www.kaggle.com/c/Kannada-MNIST) Competition\n![](https://storage.googleapis.com/kaggle-media/competitions/Kannada-MNIST/kannada.png)\nThis notebook is a starter code for all beginners and easy to understand. To predict the test data a simple CNN is used.\n\nSome helpful informations for the image classification of a MINST dataset you will find her:\n\nhttps://towardsdatascience.com/image-classification-in-10-minutes-with-mnist-dataset-54c35b77a38d\n\n\n\n<span style=\"color: royalblue;\">Please vote the notebook up if it helps you. Thank you. </span>"},{"metadata":{},"cell_type":"markdown","source":"# Load Libraries"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport scipy.special\nimport matplotlib.pyplot as plt\nimport os\nprint(os.listdir(\"../input/Kannada-MNIST\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.utils import to_categorical\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D\nfrom keras.optimizers import RMSprop,Adam\nfrom keras.preprocessing.image import ImageDataGenerator","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Load Data\nWe use the Dig-MNIST file for valtidation data."},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"path_in = '../input/Kannada-MNIST/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_data = pd.read_csv(path_in+'train.csv')\nval_data = pd.read_csv(path_in+'Dig-MNIST.csv')\ntest_data = pd.read_csv(path_in+'test.csv')\nsamp_subm = pd.read_csv(path_in+'sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# A Look on the labels\nThe lables are equally distributed, so we need no class weights for the CNN."},{"metadata":{"trusted":true},"cell_type":"code","source":"dict_data = dict(zip(range(0, 10), (((train_data['label'].value_counts()).sort_index())).tolist()))\nnames = list(dict_data.keys())\nvalues = list(dict_data.values())\nplt.bar(names, values)\nplt.grid()\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dict_data = dict(zip(range(0, 10), (((val_data['label'].value_counts()).sort_index())).tolist()))\nnames = list(dict_data.keys())\nvalues = list(dict_data.values())\nplt.bar(names, values)\nplt.grid()\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Overview"},{"metadata":{"trusted":true},"cell_type":"code","source":"print('# train samples:', len(train_data.index))\nprint('# val samples:', len(val_data.index))\nprint('# test samples:', len(test_data.index))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Define train, val and test set"},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train = train_data.copy()\ny_train = train_data['label']\ndel X_train['label']\nX_val = val_data.copy()\ny_val = val_data['label']\ndel X_val['label']\nX_test = test_data.copy()\ndel X_test['id']\ny_train = to_categorical(y_train, num_classes = 10)\ny_val = to_categorical(y_val, num_classes = 10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train = X_train.values.reshape(-1,28,28,1)\nX_val = X_val.values.reshape(-1,28,28,1)\nX_test = X_test.values.reshape(-1,28,28,1)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Scale data"},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train = X_train.astype('float32')/255\nX_val = X_val.astype('float32')/255\nX_test = X_test.astype('float32')/255","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Split train data to get val data"},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size = 0.1, random_state=2020)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Some Examples"},{"metadata":{"trusted":true},"cell_type":"code","source":"fig, axs = plt.subplots(2, 5, figsize=(15, 6))\nfig.subplots_adjust(hspace = .5, wspace=.5)\naxs = axs.ravel()\nfor i in range(10):\n    idx = train_data[train_data['label']==i].index[0]\n    axs[i].imshow(X_train[idx][:,:,0], cmap='gray')\n    axs[i].set_title(y_train[idx].argmax())\n    axs[i].set_xticklabels([])\n    axs[i].set_yticklabels([])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Define Model\nWe use a simple CNN model."},{"metadata":{"trusted":true},"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(filters=64, kernel_size=3, padding='same', activation='relu', input_shape=(28,28,1)))\nmodel.add(Conv2D(filters=128, kernel_size=3, padding='same', activation='relu'))\nmodel.add(MaxPool2D(pool_size=2))\n\nmodel.add(Conv2D(filters=128, kernel_size=3, padding='same', activation='relu'))\nmodel.add(Conv2D(filters=256, kernel_size=3, padding='same', activation='relu'))\nmodel.add(MaxPool2D(pool_size=2, padding='same'))\n\nmodel.add(Conv2D(filters=256, kernel_size=3, padding='same', activation='relu'))\nmodel.add(Conv2D(filters=512, kernel_size=3, padding='same', activation='relu'))\nmodel.add(MaxPool2D(pool_size=2, padding='same'))\n\nmodel.add(Dropout(0.5))\n\nmodel.add(Flatten())\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dense(10, activation='softmax'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"optimizer = RMSprop(lr=0.001)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nmodel.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['acc'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"epochs = 50\nbatch_size = 512","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Define the ImageDataGenerator"},{"metadata":{"trusted":true},"cell_type":"code","source":"datagen = ImageDataGenerator(\n        featurewise_center=False,\n        samplewise_center=False,\n        featurewise_std_normalization=False,\n        samplewise_std_normalization=False,\n        zca_whitening=False,\n        rotation_range=10,\n        zoom_range = 0.10,\n        width_shift_range=0.15,\n        height_shift_range=0.15,\n        horizontal_flip=False,\n        vertical_flip=False)\ndatagen.fit(X_train)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Train data"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Fit the model\nhistory = model.fit(datagen.flow(X_train, y_train, batch_size=batch_size),\n                    epochs=epochs,\n                    validation_data=(X_val,y_val),\n                    steps_per_epoch=X_train.shape[0] // batch_size)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Predict Test data"},{"metadata":{"trusted":true},"cell_type":"code","source":"y_test = model.predict(X_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_test_classes = np.argmax(y_test, axis = 1)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Write Output For Submission"},{"metadata":{"trusted":true},"cell_type":"code","source":"output = pd.DataFrame({'id': samp_subm['id'],\n                       'label': y_test_classes})\noutput.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Analyse the results"},{"metadata":{"trusted":true},"cell_type":"code","source":"loss = history.history['loss']\nloss_val = history.history['val_loss']\nepochs = range(1, len(loss)+1)\nplt.plot(epochs, loss, 'bo', label='loss_train')\nplt.plot(epochs, loss_val, 'b', label='loss_val')\nplt.title('value of the loss function')\nplt.xlabel('epochs')\nplt.ylabel('value of the loss function')\nplt.legend()\nplt.grid()\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"acc = history.history['acc']\nacc_val = history.history['val_acc']\nepochs = range(1, len(loss)+1)\nplt.plot(epochs, acc, 'bo', label='accuracy_train')\nplt.plot(epochs, acc_val, 'b', label='accuracy_val')\nplt.title('accuracy')\nplt.xlabel('epochs')\nplt.ylabel('value of accuracy')\nplt.legend()\nplt.grid()\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"del model","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}