{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Kannada Digit Recognizer"},{"metadata":{},"cell_type":"markdown","source":"# 1) Data Collection"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# these are usuful libs for modeling\nfrom keras import models, layers\nimport numpy as np\nfrom keras.utils import to_categorical\nimport pandas as pd\nfrom keras.layers import Convolution2D, MaxPooling2D, Flatten, Dropout, BatchNormalization, Dense, Lambda\nfrom sklearn.model_selection import train_test_split\nimport warnings\nwarnings.filterwarnings(\"ignore\")","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"# reading csvs files\ntrain = pd.read_csv(\"../input/Kannada-MNIST/train.csv\")\ntest = pd.read_csv(\"../input/Kannada-MNIST/test.csv\")\nsubmisssion = pd.read_csv(\"../input/Kannada-MNIST/sample_submission.csv\")\nsubmisssion.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submisssion.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 2) Prepare Data for Training"},{"metadata":{"trusted":true},"cell_type":"code","source":"# scalling the value in 0-1 , so /255. \nX = train.iloc[:,1:]/255.\ny = train.iloc[:,0]\ntest = test/255.\ntest = test.drop(test.columns[0],axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# reshaping 784 to 28,28,1\nX = X.values.reshape(train.shape[0],28,28,1)\ntest = test.values.reshape(test.shape[0],28,28,1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# one hot of target values using keras's to_categorical class\ny = to_categorical(y)\n\n# splits train/test set \nXtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size =0.3,random_state=29)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"Xtrain.shape, ytrain.shape, Xtest.shape, ytest.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# in model i am using BatchNormalization so for first step, i menualy normalize the batch\nmean_px = Xtrain.mean().astype(np.float32)\nstd_px = Xtrain.std().astype(np.float32)\n\ndef standardize(x): \n    return (x-mean_px)/std_px","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 3) modeling"},{"metadata":{"trusted":true},"cell_type":"code","source":"# this is a model with dropouts layers\ndef cnn():\n    model = models.Sequential()\n    model.add(Lambda(standardize,input_shape=(28,28,1)))\n    model.add(Convolution2D(32,(3,3), activation = 'relu'))\n    model.add(BatchNormalization(axis=1))   \n    model.add(Convolution2D(64,(3,3), activation = 'relu'))\n    model.add(MaxPooling2D())\n    model.add(Convolution2D(128,(3,3), activation = 'relu'))\n    model.add(BatchNormalization(axis=1))\n    model.add(Convolution2D(128,(2,2), activation = 'relu'))\n    model.add(MaxPooling2D())\n    model.add(Flatten())\n    model.add(Dense(256, activation='relu'))\n    model.add(Dropout(0.4))\n    model.add(Dense(256, activation='relu'))\n    model.add(Dropout(0.3))\n    model.add(Dense(10, activation='softmax'))          \n    model.compile(optimizer='adam', loss='categorical_crossentropy',\n                  metrics=['accuracy'])\n    return model          ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"classifier = cnn()\n# traing the model with 20 epochs and 1000 batch size\nclassifier.fit(Xtrain, ytrain, epochs=20,batch_size=1000,validation_data=(Xtest,ytest))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 4) Prediction and Submission\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"#prediction of submission_test set\nprediction = classifier.predict(test) \npredictions = np.argmax(prediction, axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# submission\nsubmissions=pd.DataFrame({\"id\": list(range(1,len(predictions)+1)),\n                         \"label\": predictions})\nsubmissions.to_csv(\"simple_cnn.csv\", index=False, header=True)\nsubmissions.shape","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Thank you , please upvote"}],"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":1}