{"cells":[{"metadata":{"scrolled":false,"trusted":true,"_uuid":"bbe4965f6f7588005eda1c839fa6bf964f987ae3"},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom keras.utils import plot_model\nfrom IPython.display import Image\ntrain = pd.read_csv('../input/train.csv')\ntest = pd.read_csv('../input/test.csv')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"05c951f4a69eaeb8905987fc8d2ba1c227ce62a3"},"cell_type":"markdown","source":"# Data preprocessing"},{"metadata":{"trusted":false,"_uuid":"d5511eb3cf0ca5f8429f89913d5c5e1b809b4834"},"cell_type":"code","source":"X_train = np.array(train.drop('label', axis=1)).reshape(-1,28,28,1)\nX_test = np.array(test).reshape(-1,28,28,1)\ny_train = np.array(pd.get_dummies(train['label']))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"c6a589f54623c840d9d3923e23a0d6c761470447"},"cell_type":"code","source":"X_train=X_train/255\nX_test=X_test/255","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"aee5b6682245e22d7621446ea20ced6ad60664c3"},"cell_type":"markdown","source":"# Model training"},{"metadata":{"scrolled":true,"trusted":false,"_uuid":"8a182c5e16fb62dd478aabcf222efb439695ed97"},"cell_type":"code","source":"from keras.models import Sequential, load_model\nfrom keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense, BatchNormalization\n\nmodel=Sequential()\nmodel.add(Conv2D(16, kernel_size=4, input_shape=[28,28,1], activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(Conv2D(32, kernel_size=4, activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(2))\nmodel.add(Conv2D(64, kernel_size=4, activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(Dropout(0.1))\nmodel.add(Conv2D(128, kernel_size=4, activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(Flatten())\nmodel.add(Dense(3200, activation='tanh'))\nmodel.add(BatchNormalization())\nmodel.add(Dense(10, activation='softmax'))\nmodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"9f6caeaed5e176ebcfedc11b0427577e34d78efe"},"cell_type":"code","source":"history = model.fit(X_train, y_train, epochs=10, validation_split=0.10)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"dab52a68d0b6a2d8985cac3233e65f7b72eba51c"},"cell_type":"markdown","source":"## Saving results on csv file"},{"metadata":{"trusted":false,"_uuid":"7a4994a2b8c43edaf23b609ff17cd87adf516073"},"cell_type":"code","source":"pd.DataFrame({'ImageId': np.arange(1,len(test)+1), 'label': np.argmax(model.predict(X_test), axis=1)}).to_csv('sample_submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e858e3610f97b908c6c0d9d050699a185a15c89a"},"cell_type":"markdown","source":"# Visualizing the results"},{"metadata":{"trusted":false,"_uuid":"bc5f7f6cc96e686d2adb28d35df564e39b3bbfc1"},"cell_type":"code","source":"y_pred = model.predict(X_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"dc02446e0c4f0eb855c6b48224654dc4999835cd"},"cell_type":"code","source":"ypred = np.argmax(y_pred, axis=1)\nytrain = np.argmax(y_train, axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"6fe6a1ffe541d23ae967c55f3385efcbacd23e61"},"cell_type":"code","source":"from sklearn.metrics import confusion_matrix\nimport itertools\ndef plot_confusion_matrix(cm, classes,\n                          normalize=False,\n                          title='Confusion matrix',\n                          cmap=plt.cm.Blues):\n    if normalize:\n        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n    plt.imshow(cm, interpolation='nearest', cmap=cmap)\n    plt.title(title)\n    plt.colorbar()\n    tick_marks = np.arange(len(classes))\n    plt.xticks(tick_marks, classes, rotation=45)\n    plt.yticks(tick_marks, classes)\n\n    fmt = '.2f' if normalize else 'd'\n    thresh = cm.max() / 2.\n    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n        plt.text(j, i, format(cm[i, j], fmt),horizontalalignment=\"center\",color=\"white\" if cm[i, j] > thresh else \"black\")\n\n    plt.ylabel('True label')\n    plt.xlabel('Predicted label')\n    plt.tight_layout()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"375bed127b5f5264532942417ef88fc1352d5768"},"cell_type":"code","source":"cnf_matrix = confusion_matrix(ytrain, ypred)\nnp.set_printoptions(precision=2)\nclass_names = np.arange(0,10)\nplt.figure(figsize=[12,12])\nplot_confusion_matrix(cnf_matrix, classes=class_names,\n                      title='Confusion matrix')\n\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"a80f3db515b60ce4ec7dcaef35c66fd3102c35f8"},"cell_type":"code","source":"plt.figure(figsize=[10,5])\nplt.plot(history.history['acc'])\nplt.plot(history.history['val_acc'])\nplt.title(\"Accuracy per epochs\")\nplt.legend(['train accuracy', 'validation accuracy']);","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"70dbf8c55ad58e46cf354f31442c12f62a41541b"},"cell_type":"code","source":"plt.figure(figsize=[10,5])\nplt.plot(history.history['loss'])\nplt.plot(history.history['val_loss'])\nplt.title(\"Loss per epochs\")\nplt.legend(['train loss', 'validation loss']);","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"b9e262c07cce1d190b1199c63fa37092cb9a8ecf"},"cell_type":"code","source":"plot_model(model, to_file='model.png', show_shapes=True, show_layer_names=True)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"646ad3317170e1efa2a66a32d901e1fe8569e5ff"},"cell_type":"markdown","source":"# Model architecture"},{"metadata":{"scrolled":false,"trusted":false,"_uuid":"fedfd1ed29e848c1cd2b5851055e4346917cfbae"},"cell_type":"code","source":"Image('model.png')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"657404224c1a7013153a6d4012961d72adeeacac"},"cell_type":"code","source":"","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}