{"cells":[{"metadata":{},"cell_type":"markdown","source":"# <span style=\"color:blue\"> Handwritten Digits Recognition using Deep Learning (Suboptimal/Basic Solution) </span>\n\nThis notebook comprises a simple solution to handwritten digits recognition (0-9) using a simple neural network with one hidden layer with 512 neurons, the models gives a test accuracy of 0.97228 and around 0.98 training accuracy. \n\n*This notebook is created as a part of introductory session for members of Developer Student Clubs MAIT, Delhi.*\n"},{"metadata":{},"cell_type":"markdown","source":"### <span style=\"color:blue\"> Brief Introduction to deep learning-\nDeep learning is a branch/division of Machine Learning where the models are a chain of geometric fucntions, applied one after other. Operations are structured into modules called layers. A deep learning module is stack of layers, more specifically a graph of layers.\n\nThese layers are parametarized by weights which are learned during the training. The ***Knowledge*** of a model is stored in its weights which are parameters learned during the training. The process of learing is intented to find good values of these weights. "},{"metadata":{},"cell_type":"markdown","source":"### Importing a few basic libraries for data handling: \n\n**numpy:** This library is added for array operation. It is much faster than arrays/ lists and offer most linear algebra operation \n\npandas: This library is added for data manipulation and analysis, It helps to us to read various file and data processing. In simpler terms it offers excel/spreadsheet like features in Phythonic interface. "},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np \nimport pandas as pd","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Reading the data provided in the competetion. \nPandas offers a read_csv function that allows to read the comma seprated values to a pandas data frame and allows the user to study and analyse the data to find trends and relationship in data. \n\nThe drop function will drop a particular row/column depending on the axis specified in the method argument. "},{"metadata":{"trusted":true},"cell_type":"code","source":"training_data = pd.read_csv(\"../input/digit-recognizer/train.csv\")\ntest_images = pd.read_csv(\"../input/digit-recognizer/test.csv\")\n\ntrain_images = training_data.drop(\"label\", axis=1)\ntrain_labels = training_data[\"label\"]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Neural Network take data as input in form of Numpy Arrays, the data frame thus needs to be converted to numpy arrays so that it can become ready for processing by the neural network. \n\nThe to_numpy() function helps us to convert to numpy array. "},{"metadata":{"trusted":true},"cell_type":"code","source":"train_images.to_numpy()\ntrain_labels.to_numpy()\ntest_images.to_numpy()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Data Preprocessing:**  The data values are divided by 255 for scaling the values in the numpy arrays, this will make the values of array elements in between 0-1 which was previously in between 0-255"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_images = train_images / 255.0\ntest_images = test_images / 255.0","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"The labels are also of same dimensions as the training data, the training labels needs to be converted categorically to a Original_Dimension * Class dimensional array, this will help the model to understand which class does the data belongs to. \n\nIn simpler terms it will categorise the data. "},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.utils import to_categorical\n\ntrain_labels = to_categorical(train_labels)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### <span style=\"color:blue\"> Model Generation using Keras with TensorFlow Backend: </span>\nA black box processing the data and genrating geometrical relationship between the data and label is called a model in deep learning. \n\nTo create models in keras we import **models** class from the keras library. The layers of models are created by various functions **layers** class, the functions describe the type of layer we want to create in the model. "},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras import models\nfrom keras import layers\n\nnetwork = models.Sequential()\nnetwork.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))\nnetwork.add(layers.Dense(10, activation='softmax'))\nnetwork.summary()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Compiling the network:\nThe model is compiled with RMSprop optimiser, which works similar to Gradient Descent, The Formula for RMSprop optimser is:\n\n![image.png](attachment:image.png)\n\nThese optimisers are available inside keras optimisers. ","attachments":{"image.png":{"image/png":"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"}}},{"metadata":{"trusted":true},"cell_type":"code","source":"network.compile(optimizer='rmsprop',\n                loss='categorical_crossentropy',\n                metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Final Step is to fit the model to the training images and the training labels and the model tries that for n numbers of epochs taking batch size number of training_images in one iteration. \n\n***Epochs***: Number of iterations through the complete training data. \n\n***Batch Size***: Number of training samples taken in one iteration of an epoch. "},{"metadata":{"trusted":true},"cell_type":"code","source":"network.fit(train_images, train_labels, epochs = 5, batch_size=128)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### <span style=\"color:RED\">The following cells are used to submit and prepare the submission.csv </span>\nWe need to prepare a csv file with the labels predicted for the test data provided to us in the competition. A sample submission file is always attached to the data set provided by the competition hosts. ","attachments":{}},{"metadata":{"trusted":true},"cell_type":"code","source":"submit = pd.DataFrame(np.argmax(network.predict(test_images), axis=1), \n                      columns=['Label'], \n                      index=pd.read_csv('../input/digit-recognizer/sample_submission.csv')['ImageId'])\n\nsubmit.index.name = 'ImageId'\nsubmit.to_csv('submittion.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submit","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}