{"cells":[{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":false},"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom subprocess import check_output\nimport keras\nfrom setuptools.command.setopt import option_base\nfrom tensorflow.python.keras.models import Sequential\nfrom tensorflow.python.keras.layers import InputLayer\nfrom tensorflow.python.keras.layers import MaxPooling2D, MaxPool2D\nfrom tensorflow.python.keras.layers import Conv2D, Dense, Flatten,BatchNormalization,Dropout\nfrom tensorflow.python.keras.optimizers import Adam\nfrom keras.optimizers import RMSprop\nfrom sklearn.model_selection import train_test_split\nfrom keras.utils import to_categorical\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.callbacks import ReduceLROnPlateau\n\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D\nfrom keras.layers.normalization import BatchNormalization\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.callbacks import ReduceLROnPlateau\nfrom sklearn.model_selection import train_test_split\n\nimport matplotlib.pyplot as plt\n\n\ntrain = pd.read_csv(\"../input/digit-recognizer/train.csv\")\ntest_orj  = pd.read_csv(\"../input/digit-recognizer/test.csv\")\n\nprint(\"Training set has {0[0]} rows and {0[1]} columns\".format(train.shape))\nprint(\"Test set has {0[0]} rows and {0[1]} columns\".format(test_orj.shape))","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":false},"cell_type":"code","source":"# put labels into y_train variable\nY_train = train[\"label\"]\n# Drop 'label' column\nX_train = train.drop(labels = [\"label\"],axis = 1) ","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"35e207a11a147650860ec4889b1515799a529885","trusted":false},"cell_type":"code","source":"import seaborn as sns\nimport matplotlib.pyplot as plt\n# visualize number of digits classes\nplt.figure(figsize=(15,7))\nsns.countplot(Y_train)\nplt.title(\"Number of digit classes\")\nY_train.value_counts()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"5b4dd7b0a5005464e77b980c4e6e2a63df55f150","trusted":false},"cell_type":"code","source":"# plot some samples\nprint(type(X_train))\nimg = X_train.iloc[1].as_matrix()\nimg = img.reshape((28,28))\nplt.imshow(img,cmap='gray')\nplt.title(train.iloc[0,0])\nplt.axis(\"off\")\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"2f0cdbd5e088c07d477b766f91ebcb69125ee147","trusted":false},"cell_type":"code","source":"# Normalize the data\nX_train = X_train / 255.0\ntest = test_orj.copy() / 255.0\n\n# Reshape\nX_train = X_train.values.reshape(-1,28,28,1)\ntest = test.values.reshape(-1,28,28,1)\n\n# Label Encoding \nfrom keras.utils.np_utils import to_categorical # convert to one-hot-encoding\nY_train = to_categorical(Y_train, num_classes = 10)\n\n# Split the train and the validation set for the fitting\nfrom sklearn.model_selection import train_test_split\nX_train, X_val, Y_train, Y_val = train_test_split(X_train, Y_train, test_size = 0.1, random_state=2)\nprint(\"x_train shape\",X_train.shape)\nprint(\"x_val shape\",X_val.shape)\nprint(\"y_train shape\",Y_train.shape)\nprint(\"y_test shape\",Y_val.shape)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"4453d627f2b6fed7afddfbb2eb8e1bed2711d464","trusted":false},"cell_type":"code","source":"Y_train[0]","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"0f2ca4953cb0065569ed3923cc6f903d38fce271","trusted":false},"cell_type":"code","source":"from keras import backend as K\ndef recall(y_true, y_pred):\n    \"\"\"Recall metric.\n\n    Only computes a batch-wise average of recall.\n\n    Computes the recall, a metric for multi-label classification of\n    how many relevant items are selected.\n    \"\"\"\n    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))\n    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))\n    recall = true_positives / (possible_positives + K.epsilon())\n    return recall\n\n\n# Select optimizer\nsgd = keras.optimizers.SGD(lr=1e-4, momentum=0.9)\nrms_prop = keras.optimizers.RMSprop(lr=1e-4)\nadam = keras.optimizers.adam(lr=1e-4, beta_1=0.9, beta_2=0.999, epsilon=1e-08) \nadamax = keras.optimizers.Adamax(lr=1e-4, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0)\nadadelta = keras.optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=1e-08, decay=0.0)\n\nlearning_rate_reduction = ReduceLROnPlateau(monitor='val_acc', \n                                            patience=3, \n                                            verbose=1, \n                                            factor=0.5, \n                                            min_lr=0.0001)\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f9561e3b0b02fd0abb68a1d4fe5f4d33e0e6d1e8","trusted":false},"cell_type":"code","source":"batch_size = 86\nnum_classes = 10\nepochs = 100\ninput_shape = (28, 28, 1)\n\nmodel = Sequential()\n\nmodel.add(Conv2D(32, kernel_size=(3, 3),padding='same',activation='relu',input_shape=input_shape))\nmodel.add(Conv2D(32,kernel_size=(3, 3), activation='relu'))\nmodel.add(MaxPool2D((2, 2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Conv2D(64,kernel_size=(3, 3),padding='same', activation='relu'))\nmodel.add(Conv2D(64,kernel_size=(3, 3),activation='relu'))\nmodel.add(MaxPool2D((2, 2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Flatten())\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(10, activation = \"softmax\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"ed0626815a145d30148252b50d0080b4f517fea6"},"cell_type":"code","source":"model.compile(loss=keras.losses.categorical_crossentropy,\n              optimizer=adam,\n              metrics=['accuracy', recall])","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"2df66047b68371d20c8efa9852791fad1981c2ed"},"cell_type":"code","source":"datagenn = ImageDataGenerator(\n        featurewise_center=False,  # set input mean to 0 over the dataset\n        samplewise_center=False,  # set each sample mean to 0\n        featurewise_std_normalization=False,  # divide inputs by std of the dataset\n        samplewise_std_normalization=False,  # divide each input by its std\n        zca_whitening=False,  # apply ZCA whitening\n        rotation_range=10,  # randomly rotate images in the range (degrees, 0 to 180)\n        zoom_range = 0.1, # Randomly zoom image \n        width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)\n        height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)\n        horizontal_flip=False,  # randomly flip images\n        vertical_flip=False)  # randomly flip images\n\n\ndatagenn.fit(X_train)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"9497324027111394e3d1c48550ff140a5c964319","trusted":false},"cell_type":"code","source":"\nhistory = model.fit_generator(datagenn.flow(X_train,Y_train, batch_size=batch_size),\n                              epochs = epochs, validation_data = (X_val,Y_val),\n                              verbose = 2, steps_per_epoch=X_train.shape[0] // batch_size\n                              , callbacks=[learning_rate_reduction],)\nresult = model.evaluate(x=X_train, y=Y_train)\nprint('Accuracy:', result[1])","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"3726e09f97f6cee21063897ab2033ab0077c202d","trusted":false},"cell_type":"code","source":"plt.plot(history.history['loss'])\nplt.title(\"Model Loss\")\nplt.xlabel('Epochs')\nplt.ylabel('Loss')\nplt.legend(['Train', 'Test'])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d1f996725cb2ee0513fce930917275a468a58b2a","trusted":false},"cell_type":"code","source":"plt.plot(history.history['acc'])\nplt.title('Model Accuracy')\nplt.xlabel('Epochs')\nplt.ylabel('Accuracy')\nplt.legend(['Train','Test'])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"6cf1f1c8264b5d615ec1501ad7c96f1a53cab06d","trusted":false},"cell_type":"code","source":"# confusion matrix\nimport seaborn as sns\nfrom sklearn.metrics import confusion_matrix\n# Predict the values from the validation dataset\nY_pred = model.predict(X_val)\n# Convert predictions classes to one hot vectors \nY_pred_classes = np.argmax(Y_pred,axis = 1) \n# Convert validation observations to one hot vectors\nY_true = np.argmax(Y_val,axis = 1) \n# compute the confusion matrix\nconfusion_mtx = confusion_matrix(Y_true, Y_pred_classes) \n# plot the confusion matrix\nf,ax = plt.subplots(figsize=(8, 8))\nsns.heatmap(confusion_mtx, annot=True, linewidths=0.01,cmap=\"Greens\",linecolor=\"gray\", fmt= '.1f',ax=ax)\nplt.xlabel(\"Predicted Label\")\nplt.ylabel(\"True Label\")\nplt.title(\"Confusion Matrix\")\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f8b5b42f52afc340748bce360cb45090b0d9853a","trusted":false},"cell_type":"code","source":"pred_digits_test=np.argmax(model.predict(test),axis=1)\nimage_id_test=[]\nfor i in range (len(pred_digits_test)):\n    image_id_test.append(i+1)\nd={'ImageId':image_id_test,'Label':pred_digits_test}\nanswer=pd.DataFrame(d)\nanswer.to_csv('result_0601_1401.csv',index=False)\n\nplt.figure(figsize=(10,5))\nsns.countplot(pred_digits_test)\nplt.title(\"(Test data) Number of Digits classes\")","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}