{"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":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nfrom sklearn.model_selection import train_test_split\n\ntrain = pd.read_csv('../input/digit-recognizer/train.csv')\ntest = pd.read_csv('../input/digit-recognizer/test.csv')\n\nX_train = (train.drop('label', axis=1) / 255).values.reshape(-1, 28, 28, 1)\nX_test = (test / 255).values.reshape(-1, 28, 28, 1)\ny_train = np.array(pd.get_dummies(train['label']))\n\ndatagen = tf.keras.preprocessing.image.ImageDataGenerator(\n    rotation_range=10,\n    zoom_range=0.1,\n    width_shift_range=0.1,\n    height_shift_range=0.1\n)\n\ninputs = tf.keras.Input(shape=(28, 28, 1))\n\nx = tf.keras.layers.Conv2D(filters=32, kernel_size=3, activation='relu')(inputs)\nx = tf.keras.layers.BatchNormalization()(x)\nx = tf.keras.layers.Conv2D(filters=32, kernel_size=3, activation='relu')(x)\nx = tf.keras.layers.BatchNormalization()(x)\nx = tf.keras.layers.Conv2D(filters=32, kernel_size=5, strides=2, padding='same', activation='relu')(x)\nx = tf.keras.layers.BatchNormalization()(x)\nx = tf.keras.layers.Dropout(0.4)(x)\n\nx = tf.keras.layers.Conv2D(filters=64, kernel_size=3, activation='relu')(x)\nx = tf.keras.layers.BatchNormalization()(x)\nx = tf.keras.layers.Conv2D(filters=64, kernel_size=3, activation='relu')(x)\nx = tf.keras.layers.BatchNormalization()(x)\nx = tf.keras.layers.Conv2D(filters=64, kernel_size=5, strides=2, padding='same', activation='relu')(x)\nx = tf.keras.layers.BatchNormalization()(x)\nx = tf.keras.layers.Dropout(0.4)(x)\n\nx = tf.keras.layers.Conv2D(filters=128, kernel_size=4, activation='relu')(x)\nx = tf.keras.layers.BatchNormalization()(x)\nx = tf.keras.layers.Flatten()(x)\nx = tf.keras.layers.Dropout(0.4)(x)\noutputs = tf.keras.layers.Dense(10, activation='softmax')(x)\n\nmodel = tf.keras.Model(inputs=inputs, outputs=outputs)\n\n\nX_train, X_val, y_train, y_val = train_test_split(\n    X_train, y_train, train_size=0.9, shuffle=True, random_state=0\n)\n\nmodel.compile(\n    optimizer='adam',\n    loss='categorical_crossentropy',\n    metrics=['accuracy']   \n)\n\nhistory = model.fit_generator(\n    datagen.flow(X_train, y_train, batch_size=64),\n    validation_data=(X_val, y_val),\n    epochs=20,\n    callbacks=[\n        tf.keras.callbacks.LearningRateScheduler(\n            lambda x: 1e-3 * 0.95 ** x, verbose=0\n        )\n    ]\n)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = model.predict(X_test).argmax(axis=1)\nsample_submission = pd.read_csv('../input/digit-recognizer/sample_submission.csv')\nsample_submission['Label'] = predictions\nsample_submission.to_csv('submission.csv', index=False)","metadata":{},"execution_count":null,"outputs":[]}]}