{"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":"markdown","source":"# Intent:\n\nThis is a simple notebook to demonstrate use of CNNs.","metadata":{}},{"cell_type":"markdown","source":"# Import libraries","metadata":{}},{"cell_type":"code","source":"# Disable warning\nimport warnings\nwarnings.filterwarnings('ignore')\n\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport os\nprint(os.listdir(\"../input\"))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"FAST_RUN=False\nbatch_size=32\nepochs=100\nif FAST_RUN:\n    epochs=1","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Import data\nData input train and test data","metadata":{"_uuid":"3fb90e41b8197494173b95db76df1c7361032c62"}},{"cell_type":"code","source":"train_data = pd.read_csv(\"../input/train.csv\")\ntest_data = pd.read_csv(\"../input/test.csv\")","metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data exploration","metadata":{"_uuid":"a03b4fafc97fb65412b792c3a29bff6598ca4108"}},{"cell_type":"markdown","source":"**Columns**","metadata":{"_uuid":"39cb9739f13dc28f395e1522a65b5958daf9226b"}},{"cell_type":"code","source":"print(train_data.columns)","metadata":{"_uuid":"8cf0ddb91ea1800044aef4755f26401711d0fc5f","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"We can see that data have label and other pixels columns. Which label present the digit and pixel present pixel of image","metadata":{"_uuid":"6c2b1e92eae66f5a7a17e05cc140b4e96671f297"}},{"cell_type":"markdown","source":"**Show Image**\nThis is how 784 pixels of each row form to be images","metadata":{"_uuid":"5617766598d43af63d8b808e7df90d3bd285b559","trusted":true}},{"cell_type":"code","source":"def show_image(train_image, label, index):\n    image_shaped = train_image.values.reshape(28,28)\n    plt.subplot(3, 6, index+1)\n    plt.imshow(image_shaped, cmap=plt.cm.gray)\n    plt.title(label)\n\n\nplt.figure(figsize=(18, 8))\nsample_image = train_data.sample(18).reset_index(drop=True)\nfor index, row in sample_image.iterrows():\n    label = row['label']\n    image_pixels = row.drop('label')\n    show_image(image_pixels, label, index)\nplt.tight_layout()","metadata":{"_uuid":"7bb023b61768378f76e5519d6b637b064d18d272","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Preparation\nWe split data for test and train","metadata":{"_uuid":"9972ed36f54c148f144a3b9cff877e2ef85c96fd"}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom keras.utils import to_categorical\n\nx = train_data.drop(columns=['label']).values.reshape(train_data.shape[0],28,28,1)\ny = to_categorical(train_data['label'])\nx_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.1)","metadata":{"_uuid":"8a41153b5cd7f8cb666ef6a6d706da7e394cc5ba","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n\ntrain_datagen = ImageDataGenerator(\n    rotation_range=10,\n    rescale=1./255,\n    shear_range=0.1,\n    zoom_range=0.1,\n    width_shift_range=0.1,\n    height_shift_range=0.1\n)\ntrain_datagen.fit(x_train)\ntrain_generator = train_datagen.flow(\n    x_train,\n    y_train,\n    batch_size=batch_size\n)\n\nvalidation_datagen = ImageDataGenerator(rescale=1./255)\ntrain_datagen.fit(x_test)\nvalidation_generator = validation_datagen.flow(\n    x_test,\n    y_test\n    \n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Build CNN Model","metadata":{"_uuid":"00679e884878da26771d92c34f2773f4f17abcc8"}},{"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.layers import Dense, Conv2D, Flatten, MaxPooling2D\n\nmodel = Sequential()\nmodel.add(Conv2D(64, kernel_size=3, activation='relu', input_shape=(28,28,1)))\nmodel.add(Conv2D(32, kernel_size=3, activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Flatten())\nmodel.add(Dense(10, activation='softmax'))","metadata":{"_uuid":"c19b7a6003a4c599ead616015ed7441b9d02b773","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Compile Model","metadata":{}},{"cell_type":"code","source":"model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Callbacks","metadata":{}},{"cell_type":"code","source":"from keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau\n\ncallbacks = [\n    EarlyStopping(patience=10, verbose=1),\n    ReduceLROnPlateau(factor=0.1, patience=3, min_lr=0.00001, verbose=1),\n    ModelCheckpoint('model.h5', verbose=1, save_best_only=True, save_weights_only=True)\n]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Fit model","metadata":{}},{"cell_type":"code","source":"model.fit_generator(\n    train_generator, \n    steps_per_epoch=len(x_train) // batch_size, \n    validation_data=validation_generator,\n    validation_steps=len(x_test) // batch_size,\n    epochs=epochs,\n    callbacks=callbacks\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Evaluate Model","metadata":{}},{"cell_type":"code","source":"x_test_recaled = (x_test.astype(\"float32\") / 255)\nscores = model.evaluate(x_test_recaled, y_test, verbose=0)\nprint(\"%s: %.2f%%\" % (model.metrics_names[1], scores[1]*100))\nprint(\"%s: %.2f%%\" % (model.metrics_names[0], scores[0]*100))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prediction","metadata":{"_uuid":"8c44330520ad37b8940fda3054b1bb0539378312"}},{"cell_type":"code","source":"test_digit_data = test_data.values.reshape(test_data.shape[0],28,28,1).astype(\"float32\") / 255\npredictions = model.predict(test_digit_data)\nresults = np.argmax(predictions, axis = 1) ","metadata":{"_uuid":"3154531f9be3cdd74d8ec02509616c491dc27bbc","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Set how is our prediction","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(18, 8))\nsample_test = test_data.head(18)\nfor index, image_pixels in sample_test.iterrows():\n    label = results[index]\n    show_image(image_pixels, label, index)\nplt.tight_layout()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Create submission file","metadata":{}},{"cell_type":"code","source":"submissions = pd.read_csv(\"../input/sample_submission.csv\")\nsubmissions['Label'] = results\nsubmissions.to_csv('submission.csv', index = False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Next step check [Dog And Cat Image Classification](https://www.kaggle.com/uysimty/keras-cnn-dog-or-cat-classification)","metadata":{}}]}