{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import pandas as pd\n\nfrom keras.utils import to_categorical\n\nnum_classes = 10\n\ntrain_fname = '/kaggle/input/digit-recognizer/train.csv'\ntrain_db = pd.read_csv(train_fname)\n\nlabel = train_db['label'].to_numpy()\nlabel = to_categorical(label, num_classes=num_classes)\n\ndata = train_db.drop('label', axis=1).to_numpy()\ndata = data.reshape((data .shape[0], 28, 28, 1))\ndata = data.astype('float32') / 255\n\nx_train = data [:32000]\ny_train = label[:32000]\n\nx_valid = data [32000:]\ny_valid = label[32000:]\n\ndel train_db","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n\ntrain_datagen = ImageDataGenerator(rotation_range=10,\n                                   width_shift_range=0.1,\n                                   height_shift_range=0.1,\n                                   shear_range=0.1,\n                                   zoom_range=0.1)\nbatch_size = 16\n\ntrain_generator = train_datagen.flow(x_train, y_train, batch_size=batch_size)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.layers import Dense, Flatten, SeparableConv2D, Conv2D, MaxPooling2D\nfrom keras.layers import SpatialDropout2D, Dropout, BatchNormalization\nfrom keras.regularizers import l2\n\nmodel = Sequential([\n    Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),\n    Conv2D(32, (3, 3), activation='relu'),\n    SeparableConv2D(32, (5, 5), activation='relu', padding='same'),\n    BatchNormalization(),\n    MaxPooling2D((2,2)),\n    SpatialDropout2D(0.35),\n    Conv2D(64, (3, 3), activation='relu'),\n    Conv2D(64, (3, 3), activation='relu'),\n    SeparableConv2D(64, (5, 5), activation='relu', padding='same'),\n    BatchNormalization(),\n    MaxPooling2D((2,2)),\n    SpatialDropout2D(0.35),\n    Flatten(),\n    Dense(256, activation='relu', kernel_regularizer=l2(1e-3)),\n    Dense( 10, activation='softmax')\n])\nmodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.callbacks import ReduceLROnPlateau\n\nlearning_rate_reduction = ReduceLROnPlateau(monitor='val_acc', \n                                            patience=3, \n                                            verbose=1, \n                                            factor=0.5, \n                                            min_lr=0.00001)\nepochs = 30\n\nperformance = model.fit(train_generator,\n                        steps_per_epoch=x_train.shape[0] // batch_size,\n                        epochs=epochs,\n                        validation_data=(x_valid, y_valid),\n                        callbacks=[learning_rate_reduction])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.subplots(figsize=(10, 12))\n\nloss = performance.history[\"loss\"]\nval_loss = performance.history[\"val_loss\"]\n\nplt.subplot(211)\nplt.title(\"Loss\")\nplt.plot(range(1, epochs + 1), loss, \"bo-\", label=\"Training Loss\")\nplt.plot(range(1, epochs + 1), val_loss, \"ro-\", label=\"Validation Loss\")\nplt.xticks(range(1, epochs + 1))\nplt.grid(True)\nplt.legend()\n\nacc = performance.history[\"acc\"]\nval_acc = performance.history[\"val_acc\"]\n\nplt.subplot(212)\nplt.title(\"Accuracy\")\nplt.plot(range(1, epochs + 1), acc, \"bo-\", label=\"Training Acc\")\nplt.plot(range(1, epochs + 1), val_acc, \"ro-\", label=\"Validation Acc\")\nplt.xticks(range(1, epochs + 1))\nplt.grid(True)\nplt.legend()\n\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import seaborn as sns\nimport numpy as np\n\nfrom sklearn.metrics import confusion_matrix\n\npred = model.predict(x_valid)\npred_classes = np.argmax(pred, axis=1)\npred_true = np.argmax(y_valid, axis=1)\n\nconfusion_mtx = confusion_matrix(pred_true, pred_classes)\nsns.set(style=\"white\", context=\"notebook\", palette=\"deep\")\nsns.heatmap(confusion_mtx, annot=True, fmt='d', cmap=plt.cm.Blues)\n\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_fname = '/kaggle/input/digit-recognizer/test.csv'\n\ntest_db = pd.read_csv(test_fname)\n\nx_test = test_db.to_numpy()\nx_test = x_test.reshape((x_test.shape[0], 28, 28, 1))\nx_test = x_test.astype('float32') / 255\n\npredictions = np.argmax(model.predict(x_test), axis=1)\n\nimageIds = pd.Series(range(1,28001), name='ImageId')\nresults  = pd.Series(predictions   , name='Label'  )\n\nsubmission = pd.concat([imageIds, results], axis=1)\nsubmission.to_csv(\"submission.csv\", index=False, header=True)\n","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}