{"nbformat_minor": 1, "nbformat": 4, "cells": [{"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"_cell_guid": "1ef67da3-dd50-4944-8d80-57c0bfdd927f", "_uuid": "0e688499cc7c0a78f72f5cccd7ed5ba5f7038384"}, "source": ["import numpy as np\n", "import pandas as pd\n", "from sklearn.model_selection import train_test_split\n", "from keras import backend as K\n", "from keras.layers import Conv2D, MaxPool2D\n", "from keras.models import Sequential\n", "from keras.preprocessing.image import ImageDataGenerator\n", "from keras.layers import Dropout, Dense, Flatten, BatchNormalization\n", "from keras.losses import categorical_crossentropy\n", "from keras.optimizers import Adadelta\n", "from keras.utils import to_categorical\n", "np.random.seed(0)"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "5b3bd971-246e-4382-a277-78a00dd44cce", "_uuid": "f39c3203509a3089d778d17697ee686ce37b16ed"}, "source": ["train_data_path = '../input/train.csv'\n", "test_data_path = '../input/test.csv'"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "be936a4a-2248-4b8a-be93-6535f49f4425", "_uuid": "d1a7b10998d272fdd4b39e6b67b65af12fe1d37d"}, "source": ["train = pd.read_csv(train_data_path)\n", "test = pd.read_csv(test_data_path)"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "cb82ae4d-b9f9-46d0-996d-c8350baa7ced", "_uuid": "144ee9e6a595388c6889ba227662d06fcbfe1320"}, "source": ["data = train.drop('label', axis=1)\n", "label = train[['label']]"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"_cell_guid": "f1129d35-cd6c-4d1d-a928-ffb3dd130383", "_uuid": "310bb733c3bc7e97831dd985a43e8f2a53f5dc16"}, "source": ["data.shape, label.shape"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "ee3c392d-9599-45a9-95a4-a0369eb642d3", "_uuid": "a9d09974f06612dd0a9d469ee6f8ee877662204c"}, "source": ["X_train, X_test, y_train, y_test = train_test_split(data, label, shuffle=True, test_size=0.1)"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"_cell_guid": "fe3c0fc6-00c1-4f25-9737-38bdb36d7bb2", "_uuid": "be00eadea26d4297b5c680c2f639e9ce16e5d4d8"}, "source": ["X_train.shape, y_train.shape"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"_cell_guid": "5fbd3c6f-5b11-4fd2-bdfa-69caffc1d3dc", "_uuid": "4cb522e2fe823e088bf436393c04f1c96db6e54b"}, "source": ["X_test.shape, y_test.shape"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "264585e0-c341-4c0d-9ae3-fd8ff5477115", "_uuid": "11118272f10dd20d5fc6fe83ae8a427d477288b1"}, "source": ["X_train = X_train.as_matrix()\n", "X_test = X_test.as_matrix()\n", "y_train = y_train.as_matrix()\n", "y_test = y_test.as_matrix()"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"_cell_guid": "d3d7c072-69b4-42f9-b153-25b25bc53066", "_uuid": "c82eadcecac2539044d452b2c2186b6a9eaea172"}, "source": ["X_train.shape, y_train.shape"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"_cell_guid": "99fbf837-c049-47d5-9cfe-747e2e722ba9", "_uuid": "14cb498b9e46736960b053c028c2486090c3637c"}, "source": ["X_test.shape, y_test.shape"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "9450852e-0590-48e0-9b9d-1b681b19c580", "_uuid": "0deaff40e7b0ab4c9a75d64e1e9148438182b7f2"}, "source": ["if K.image_data_format() == 'channels_first':\n", "    X_train = X_train.reshape(X_train.shape[0], 1, 28, 28)\n", "    X_test = X_test.reshape(X_test.shape[0], 1, 28, 28)\n", "else:\n", "    X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)\n", "    X_test = X_test.reshape(X_test.shape[0], 28, 28, 1)"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "4f8036fc-0d59-4e10-b0b7-aac2d5313fdb", "_uuid": "79c6ac6ae9861d5870bac282bb18e25bfb71a6b3"}, "source": ["y_train = to_categorical(y_train, 10)\n", "y_test = to_categorical(y_test, 10)"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "24fd1f54-bf8f-464f-a8c6-de20a625394f", "_uuid": "ea6c1b238b2dfcd46befbf433d149a94e6e08a55"}, "source": ["X_train = X_train.astype('float32')\n", "X_test = X_test.astype('float32')\n", "y_train = y_train.astype('float32')\n", "y_test = y_test.astype('float32')"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"_cell_guid": "a67f4b8f-9d74-4422-8855-5d15574ee23f", "_uuid": "e7a1e468f027500b26e2f747a56429dad7e52753"}, "source": ["X_train.shape, X_test.shape, y_train.shape, y_test.shape"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "cddf98b2-bdaa-4b7f-8f89-94a946494092", "_uuid": "1bce91126aef2f3e55a4aa150f0f8fdf386de31c"}, "source": ["model = Sequential()"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "f051c1f8-8d5b-4373-ac0b-a45b364e075f", "_uuid": "b695537d89342a2303e6adfdc264f990b477e7ea"}, "source": ["model.add(Conv2D(filters=32, \n", "                 kernel_size=(5, 5), \n", "                 activation='relu', \n", "                 input_shape=X_train[0].shape))\n", "model.add(BatchNormalization(axis=-1))\n", "model.add(Conv2D(filters=32, \n", "                 kernel_size=(3, 3), \n", "                 activation='relu'))\n", "model.add(MaxPool2D(pool_size=(2,2)))"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "0d1eb83a-46db-4000-afc3-8f8b0e2b290e", "_uuid": "ea7b035fffca6863fe7ac19be51bb1a340d2cf8d"}, "source": ["model.add(BatchNormalization(axis=-1))\n", "model.add(Conv2D(filters=64,\n", "                 kernel_size=(3, 3), \n", "                 activation='relu'))\n", "model.add(BatchNormalization(axis=-1))\n", "model.add(Conv2D(filters=64,\n", "                 kernel_size=(3, 3), \n", "                 activation='relu'))\n", "model.add(MaxPool2D(pool_size=(2,2)))"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "a38ffadf-7c37-4b48-a408-c374583a576f", "_uuid": "a744802c0a623abbe4789af4a741bb553b9093a4"}, "source": ["model.add(Flatten())\n", "model.add(BatchNormalization())\n", "model.add(Dense(512, activation='relu'))\n", "model.add(BatchNormalization())\n", "model.add(Dropout(0.2))\n", "model.add(Dense(10, activation='softmax'))"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "7d84de0e-6304-41dd-9d78-e4eb8d86ae5c", "_uuid": "bdd845d91339b0a6028d739a4f05b7f19580159d"}, "source": ["model.compile(loss=categorical_crossentropy, \n", "              optimizer=Adadelta(), \n", "              metrics=['accuracy'])"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "4f278e74-bf93-4761-98d0-c73ac7a87581", "_uuid": "1629d938539efac6c2195e0d1987d9738c14473b"}, "source": ["gen = ImageDataGenerator(rotation_range=8, width_shift_range=0.08, shear_range=0.3,\n", "                         height_shift_range=0.08, zoom_range=0.08)\n", "\n", "test_gen = ImageDataGenerator()"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "7676147f-49f2-4593-8854-d2278f1844be", "_uuid": "4421c139572f331ee431238d87c3657ca099320b"}, "source": ["train_generator = gen.flow(X_train, y_train, batch_size=64)\n", "test_generator = test_gen.flow(X_test, y_test, batch_size=64)"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"_cell_guid": "cdd343ae-a8b9-413a-94e7-d5878d417db3", "_uuid": "c4fe735cf7a14b46553ca59e1e294d705b46511c"}, "source": ["model.fit_generator(train_generator, steps_per_epoch=X_train.shape[0]//64, epochs=10, \n", "                    validation_data=test_generator, validation_steps=X_test.shape[0]//64)"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"_cell_guid": "4b8b0bbe-1fe4-4067-81cf-b6ed56b4bb2b", "_uuid": "372f493fcdfda0a1a10de4e4f5f3cfcd2066d130"}, "source": ["loss, accuracy = model.evaluate(X_test, y_test, verbose=True)"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"_cell_guid": "412ab748-db76-4dcb-91e5-eee8af66cac2", "_uuid": "73bf943fa3cf77b5c0220c4d5ebc861728892b6b"}, "source": ["loss, accuracy"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "c56dc21d-a76a-4373-b253-19a9eb4ee81a", "_uuid": "ccd9ff228358264ad30d925b18d219ac734cf429"}, "source": ["test = test.as_matrix()"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "92b3ea20-6f8a-4f31-b68c-33e76309c9e4", "_uuid": "d4bb53182a4abc11bc1befa63ca30e479797863d"}, "source": ["if K.image_data_format() == 'channels_first':\n", "    test = test.reshape(test.shape[0], 1, 28, 28)\n", "else:\n", "    test = test.reshape(test.shape[0], 28, 28, 1)"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"_cell_guid": "430f4489-fe0f-4478-bfd0-ccc473c9ad34", "_uuid": "638a58e80747a98cd2a9a71e9280b721e8a3381c"}, "source": ["ans = model.predict_classes(test, batch_size=32, verbose=True)"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"_cell_guid": "9443cd2f-d2a6-4a31-a8f8-121d64f84e9e", "_uuid": "f81facccc3923a958e2cb1b56689402beafd7aef"}, "source": ["ans"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "2123b4a1-5dca-4107-b8b8-5ca4ce1d0acd", "_uuid": "bcb7816754127a1e6290551c7cda5c82f72588b9"}, "source": ["res = pd.DataFrame(columns=['ImageId', 'Label'])"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "cb2f8cdf-23dc-435f-bdea-d29e561195f1", "_uuid": "30e41c081318d884ec2d93b882ae101cc282448e"}, "source": ["res['ImageId'] = pd.Series(1 + np.arange(ans.shape[0]))"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "cea3715d-75e0-49b8-b9f9-2aff5e365bd6", "_uuid": "72a2d41607726981b2416e90c7a7faf57dbf0846"}, "source": ["res['Label'] = pd.Series(ans)"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"_cell_guid": "5b177f13-65f3-4df9-877d-d2bf1395cd4f", "_uuid": "62d2f1d02c6180fb55f9180cdefe9052ec75bac1"}, "source": ["res.head()"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "ce15aed0-1413-4c0d-9692-e409de4df12f", "_uuid": "8eb0f3cb9754c9bd14208b0fb57d5ed76a04a6b5"}, "source": ["res.to_csv('submission_cnn_mnist.csv', index=False)"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true, "_cell_guid": "c3a1acbf-7e30-456d-8dc0-a4562b285857", "_uuid": "06bbb8a93902e5df71f53f4795194bc9e86ec7dc"}, "source": ["X_total_train = np.vstack((X_train, X_test))\n", "y_total_train = np.vstack((y_train, y_test))"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {}, "source": ["X_total_train.shape, y_total_train.shape"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {}, "source": ["total_loss, total_accuracy = model.evaluate(X_total_train, y_total_train, verbose=True)"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {}, "source": ["total_loss, total_accuracy"]}, {"execution_count": null, "outputs": [], "cell_type": "code", "metadata": {"collapsed": true}, "source": []}], "metadata": {"language_info": {"mimetype": "text/x-python", "version": "3.6.1", "name": "python", "pygments_lexer": "ipython3", "file_extension": ".py", "nbconvert_exporter": "python", "codemirror_mode": {"version": 3, "name": "ipython"}}, "kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}}}