{"cells":[{"metadata":{"_uuid":"aa54eb1972b138f8cd604d517541d081200d3dd6"},"cell_type":"markdown","source":"# DIGIT RECOGNIZER\n## Classifier based on CNN"},{"metadata":{"_uuid":"4c4296af0b1cf502d9483e1ddf1da6dd7cef30da"},"cell_type":"markdown","source":"Convolutional neural network was trained on input images 28x28 pixels without any preprocessing. Generation of new images was applied to enlarge training data."},{"metadata":{"_uuid":"234b5461b6172eee61b09374a7f5a4905b3cd6ca"},"cell_type":"markdown","source":"## Prepair data"},{"metadata":{"trusted":true,"_uuid":"35477e5f5d1e66862bca80d8f815ccac33f90703"},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom matplotlib import pyplot as plt\nfrom sklearn import metrics\nfrom sklearn import model_selection as ms\n%pylab inline","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ddef8867d4c0dc5e8e0e4a4d095d6ebb576f7b11"},"cell_type":"code","source":"# Import train data\n\nx = pd.read_csv('../input/train.csv')\ny = x.label\nx.drop('label', axis=1, inplace=True)\nprint(x.shape)\nx.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"5586527c70b1b27ecfa753a4bcd9fd82ddf89bfb"},"cell_type":"code","source":"# Save 20% of data for validation. \n# We can't use simple cross-validation because train set will be used for generating new images\n\nx_train, x_test, y_train, y_test = ms.train_test_split(x.values, y, test_size=0.2)\nx_train = x_train.reshape(-1,28,28,1)\nx_test = x_test.reshape(-1,28,28,1)\n\n# Convert targets to categorical type\nfrom keras import utils\ny_train = utils.to_categorical(y_train, num_classes=10)\ny_test  = utils.to_categorical(y_test , num_classes=10)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8a9048b4e4768d058005568c6e0624b40bc49d41"},"cell_type":"markdown","source":"## Develop and train CNN"},{"metadata":{"trusted":true,"_uuid":"49e3df2345e73ee44f92a4d4cb703d660fb88993"},"cell_type":"code","source":"# Generator of new images by randomly shifting original ones\n\nfrom keras.preprocessing.image import ImageDataGenerator\ndatagen = ImageDataGenerator(\n            width_shift_range=0.1,\n            height_shift_range=0.1)\ndatagen.fit(x_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3e843f310eac340c7d8b1146321ec7b6e980d0c3"},"cell_type":"code","source":"# Create Keras CNN model\n# Commented rows are of original model that require to match time for training on keras\n\nfrom keras.callbacks import EarlyStopping\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D, Dropout, Activation, MaxPool2D, Flatten, Dense\nfrom keras.optimizers import RMSprop\n\nmodel = Sequential()\n\nmodel.add(Conv2D(filters = 8, kernel_size = (5,5), padding = 'Same', activation ='relu', input_shape = (28,28,1)))\n#model.add(Conv2D(filters = 16, kernel_size = (5,5),padding = 'Same', activation ='relu'))\nmodel.add(MaxPool2D(pool_size=(2,2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Conv2D(filters = 16, kernel_size = (3,3),padding = 'Same', activation ='relu'))\n#model.add(Conv2D(filters = 32, kernel_size = (3,3),padding = 'Same', activation ='relu'))\nmodel.add(MaxPool2D(pool_size=(2,2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Flatten())\nmodel.add(Dense(200, activation = \"relu\"))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(10, activation = \"softmax\"))\n\nmodel.compile(optimizer = 'adam' , loss = \"categorical_crossentropy\", metrics=[\"accuracy\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"8806c4ed6501231443b942d164f3254f2f3e7b51"},"cell_type":"code","source":"# Train the model\n\nmodel.fit_generator(datagen.flow(x_train, y_train,\n                        batch_size = 128),\n                        epochs = 3,\n                        samples_per_epoch = x_train.shape[0],\n                        validation_data = (x_test, y_test),\n                        verbose = 1,\n                        callbacks=[EarlyStopping(monitor='val_loss', patience=1)])","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"50bec645b41ee8bd97a20ea028013e741ceae54c"},"cell_type":"markdown","source":"## Submit data"},{"metadata":{"trusted":true,"_uuid":"955f11ad1f9bfafb875b96d623820e4fbae1c45e","scrolled":true},"cell_type":"code","source":"# Import test data\n\nx_submit = pd.read_csv('../input/test.csv')\nx_submit.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"86f7f5f59f24674e2f01ffeaf8582799a68c0100"},"cell_type":"code","source":"# Normalize data and predict test\n\nx_submit = x_submit.values/255\nx_submit = x_submit.reshape(-1,28,28,1)\ny_submit = model.predict_classes(x_submit)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"86820fa6916f67094ec5492689d043796b22be6a"},"cell_type":"code","source":"submit_df = pd.DataFrame({'ImageId':range(1, y_submit.shape[0]+1), 'Label':y_submit})\nsubmit_df.to_csv('submit_data.csv',index=False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}