{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import cv2\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpplt\nimport tensorflow\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense\nfrom tensorflow.keras.layers import Dropout, MaxPooling2D, Activation\nfrom tensorflow.keras.layers import Conv2D, Flatten\nfrom tensorflow.keras.preprocessing import image\nimport tensorflow.keras.backend as i_d_f\nimport os\nimport pandas as pd\nfrom tensorflow.keras.preprocessing import image\nfrom keras import layers\nimport keras\nfrom sklearn.model_selection import train_test_split\nimport random","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\ntrain = pd.read_csv('../input/digit-recognizer/train.csv')\ntest = pd.read_csv('../input/digit-recognizer/test.csv')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_file = pd.read_csv('../input/digit-recognizer/sample_submission.csv')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.tail()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.describe()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train = train.drop(['label'], axis=1)\ny_train = train.label","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_train","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_test = test.copy()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train = x_train/255.0\nx_test = x_test/255.0","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train = x_train.values.reshape(-1, 28, 28, 1)\nx_test = x_test.values.reshape(-1, 28, 28, 1)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"no_images=len(x_train)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(figsize=(8, 6))\nplt.imshow(x_train[random.randint(0,no_images), :, :, 0]) \nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(x_train[0, :, :, 0]) \nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def sides(image):\n    fig, im = plt.subplots(nrows=1, ncols=3, figsize=(30, 20))\n    im[0].imshow(image)\n    im[0].set_title('Original Image', fontsize=24)\n    im[1].imshow(cv2.flip(image, 0))\n    im[1].set_title('Vertical Flip', fontsize=24)\n    im[2].imshow(cv2.flip(image, 1))\n    im[2].set_title('Horizontal Flip', fontsize=24)\n    plt.show()\nsides(x_train[0, :, :, 0])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow import keras","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(x_train[8,:].reshape(28,28),cmap=\"gray\")\nplt.show()\nplt.imshow(x_train[9,:].reshape(28,28),cmap=\"gray\")\nplt.show()\nplt.imshow(x_train[0,:].reshape(28,28),cmap=\"gray\")\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"validation_size = 0.2\nx_train, x_val, y_train, y_val = train_test_split(x_train, y_train, test_size = validation_size)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_train = keras.utils.to_categorical(y_train, num_classes = 10)\ny_val = keras.utils.to_categorical(y_val, num_classes = 10)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = tensorflow.keras.models.Sequential()\nmodel.add(layers.Conv2D(32, (3, 3), (1, 1), padding='valid', input_shape=(28, 28, 1), name='conv2d_1_1'))\nmodel.add(layers.Conv2D(32, (3, 3), (1, 1), padding='same', name='conv2d_1_2'))\nmodel.add(layers.BatchNormalization(name='bn_1'))\nmodel.add(layers.Activation('relu', name='relu_1'))\nmodel.add(layers.MaxPooling2D((2, 2), (2, 2), padding='valid', name='mp2d_1'))\nmodel.add(layers.Dropout(0.2, name='drop_1'))\nmodel.add(layers.Conv2D(64, (3, 3), (1, 1), padding='valid', name='conv2d_2_1'))\nmodel.add(layers.Conv2D(64, (3, 3), (1, 1), padding='same', name='conv2d_2_2'))\nmodel.add(layers.BatchNormalization(name='bn_2'))\nmodel.add(layers.Activation('relu', name='relu_2'))\nmodel.add(layers.MaxPooling2D((2, 2), (2, 2), padding='valid', name='mp2d_2'))\nmodel.add(layers.Dropout(0.2, name='drop_2'))\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(100, activation='relu'))\nmodel.add(layers.Dense(10, activation='softmax'))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer = \"Adam\", loss = \"CategoricalCrossentropy\", metrics = \"accuracy\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"training = model.fit(x_train, y_train, validation_data = (x_val, y_val), steps_per_epoch=500, epochs=100, validation_steps=200)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nacc = training.history['accuracy']\nval_acc = training.history['accuracy']\nloss = training.history['loss']\nval_loss = training.history['val_loss']\nepochs = range(1, len(acc) + 1)\nplt.figure(figsize=(12,8))\nplt.plot(epochs, acc, 'bo', label='Training acc')\nplt.plot(epochs, val_acc, 'b', label='Validation acc')\nplt.title('Training and validation accuracy')\nplt.legend()\nplt.figure()\nplt.figure(figsize=(12,8))\nplt.plot(epochs, loss, 'bo', label='Training loss')\nplt.plot(epochs, val_loss, 'b', label='Validation loss')\nplt.title('Training and validation loss')\nplt.legend()\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix, classification_report","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = model.predict(x_test).argmax(axis=1)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(18, 24))\n\nfor i in range(100):\n    plt.subplot(10, 10, i+1)\n    plt.imshow(x_test[i], cmap='gray')\n    plt.title(f\"Pred: {predictions[i]}\")\n    plt.axis('off')\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"file_name = \"submission.csv\"\ny_pred = pd.Series(predictions, name='Label')\nsub = pd.concat([pd.Series(range(1, 28001), name=\"ImageId\"), y_pred], axis=1)\nsub.to_csv(file_name, index=False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub.tail()","metadata":{},"execution_count":null,"outputs":[]}]}