{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"\nimport matplotlib.pyplot as plt\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport seaborn as sns\nimport random\n\ndf = pd.read_csv('../input/digit-recognizer/train.csv')\n\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"#Explore the data and split\nprint(df.columns)\nprint(df.head)\nprint(df.dtypes)\n# We can see that our data's first column is the label and pixels the rest.\n#There are 784 pixels(28*28) and all of them contains only int64 values.\nX = df.iloc[:,1:]\ny = df.iloc[:,0]\n\nfrom sklearn.model_selection import train_test_split\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#We need to see whether our data contains null values.\nprint(pd.isnull(X_train[:]).any().describe())\nprint(pd.isnull(X_test[:]).any().describe())\n#We don't have any null values.","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#We need to reshape our data to 3D\nX_train = X_train.values.reshape(-1,28,28,1)\nX_test = X_test.values.reshape(-1,28,28,1)\nprint(X_train.shape) #We have 37800 images for training which are 28*28 pixels","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Let's make some visualisation to understand the data better.\nplt.bar(y_train.value_counts().index,y_train.value_counts()) #we can see that our data disturbuted well.\nplt.title('Disturbution of our labels')\nplt.show()\nplt.subplot(3,3,1)\nplt.imshow(X_train[random.randint(0, 37800)].reshape(28,28))\nplt.title('Random Image ')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# We got to Normalize our data. Since we have grayscale data our pixel values between 0-255 so, dividing 255 would be enough to normalize\nX_train = X_train/255\nX_test= X_test/255","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#We need to convert our labels into categorical data:\nfrom keras.utils import np_utils\ny_train = np_utils.to_categorical(y_train)\ny_test = np_utils.to_categorical(y_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# We need to do Data Augmentation in order to avoid overfitting. It means we will  increase diversity by playing our images(shifting,zoom,rotate,etc.)\nfrom keras.preprocessing.image import ImageDataGenerator\ndatagen = 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.1, \n        width_shift_range=0.1,  \n        height_shift_range=0.1,  \n        horizontal_flip=False,  \n        vertical_flip=False)  \n\n\ndatagen.fit(X_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# We succesfully pre processed our data. Now we can build our CNN model.\n#Our model will be like  [Conv2D->relu -> MaxPool2D -> Dropout] -> Flatten -> Dense -> Dropout -> Out\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D\n#Initialising the CNN\nmodel = Sequential()\nmodel.add(layers.Conv2D(filters=256,kernel_size=3,activation='relu',input_shape=[28,28,1]))  # 1 is our canal number it is just 1 because we use grayscale data\nmodel.add(layers.Conv2D(filters=256,kernel_size=3,activation='relu'))\n\n#I preffered relu activation because image data sets are not linear mostly.\n#32 feature detector will be enough for this model. And size of the each will be 3(3,3)\n#Pooling\nmodel.add(layers.MaxPool2D(pool_size=2,strides=2)) #I preffered Max Pooling for this model\nmodel.add(Dropout(0.2))\n\n#Second Layer\nmodel.add(layers.Conv2D(filters=256,kernel_size=3,activation='relu'))\nmodel.add(layers.Conv2D(filters=256,kernel_size=3,activation='relu'))\nmodel.add(layers.MaxPool2D(pool_size=2,strides=2))\nmodel.add(Dropout(0.2))\n\n\n\n#Flattening and bulding ANN\n\nmodel.add(Flatten())\nmodel.add(Dense(256, activation = \"relu\"))\nmodel.add(Dense(256, activation = \"relu\"))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(10, activation = \"softmax\")) #Our output layer occurs 10 neurons since we have 10 categorical variables. And we use softmax activation\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Now we need to choose loss function, optimizer and compile the model\nfrom keras.optimizers import RMSprop # I preferred RMSprop because of it's speed but you can use Stochastic Gradient Descent instead.\nmodel.compile(optimizer=RMSprop(lr=0.0005, rho=0.9, epsilon=1e-08, decay=0.0),loss='categorical_crossentropy',metrics=['accuracy'])\n#","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Now we fit our model\nmodel.fit_generator(datagen.flow(X_train,y_train, batch_size=86),epochs = 100, validation_data = (X_test,y_test),verbose = 1,steps_per_epoch=len(X_train) // 50,callbacks=None)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Making Predictions on Test data\npredicted = model.predict(X_test)\ny_head = predicted.argmax(axis=1).reshape(-1,1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Evaluation(accuracy and confusion matrix)\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.metrics import confusion_matrix\nprint(accuracy_score(y_test.argmax(axis=1), y_head))\ncm = confusion_matrix(y_test.argmax(axis=1),y_head)\nsns.heatmap(cm, annot=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Submission Preaparation\nsample_set = pd.read_csv('../input/digit-recognizer/sample_submission.csv')\ntest_set = pd.read_csv('../input/digit-recognizer/test.csv')\ntest = test_set.values.reshape(-1,28,28,1)\n# Making Predictions on Test Data\ny_head_test = model.predict(test)\nresult_test = y_head_test.argmax(axis=1)\n#Visualising predictions\nfor i in range(1,5):\n    index = np.random.randint(1,28001)\n    plt.subplot(3,3,i)\n    plt.imshow(test[index].reshape(28,28))\n    plt.title(\"Predicted Label : {} \".format(result_test[index]))\nplt.subplots_adjust(hspace = 1.2, wspace = 1.2)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"result_test = pd.Series(result_test,name=\"Label\")\nsubmission = pd.concat([pd.Series(range(1,28001),name = \"ImageId\"),result_test],axis = 1)\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}