{"cells":[{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":true},"cell_type":"code","source":"import os, cv2, re, random\nimport numpy as np\nimport pandas as pd\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.preprocessing.image import img_to_array, load_img\nfrom keras import layers, models, optimizers\nfrom keras import backend as K\nfrom sklearn.model_selection import train_test_split\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import confusion_matrix\nimport itertools\n\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport seaborn as sns\n%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"img_width = 150\nimg_height = 150\nTRAIN_DIR = '../input/train/'\nTEST_DIR = '../input/test/'\ntrain_images_dogs_cats = [TRAIN_DIR+i for i in os.listdir(TRAIN_DIR)] # use this for full dataset\ntest_images_dogs_cats = [TEST_DIR+i for i in os.listdir(TEST_DIR)]","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"74a98b4c78b232e9eaf62de074152b6f67db0130","trusted":true},"cell_type":"code","source":"print(len(train_images_dogs_cats))\nprint(len(test_images_dogs_cats))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"c8a802fb0dc3b3a66cbd636fbe95a7514da6dac8","trusted":true,"collapsed":true},"cell_type":"code","source":"def atoi(text):\n    return int(text) if text.isdigit() else text\n\ndef natural_keys(text):\n    return [ atoi(c) for c in re.split('(\\d+)', text) ]","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"82a0a581655f3f2763a6986d89f085b17b6c9b37","trusted":true,"collapsed":true},"cell_type":"code","source":"train_images_dogs_cats.sort(key=natural_keys)\ntrain_images_dogs_cats_trim = train_images_dogs_cats[0:1300]\ntrain_images_dogs_cats_trim += train_images_dogs_cats[12500:13800] \n\ntest_images_dogs_cats.sort(key=natural_keys)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f3791cacea989b14e2e713d0cbb0541cbfab827e","trusted":true},"cell_type":"code","source":"print(len(train_images_dogs_cats_trim))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"273492ba2b9af81131b99a2c1cd95dbc6b915743","trusted":true,"collapsed":true},"cell_type":"code","source":"def prepare_data(list_of_images):\n    \"\"\"\n    Returns two arrays: \n        x is an array of resized images\n        y is an array of labels\n    \"\"\"\n    x = [] # images as arrays\n    y = [] # labels\n    \n    for image in list_of_images:\n        x.append(cv2.resize(cv2.imread(image), (img_width,img_height), interpolation=cv2.INTER_CUBIC))\n    \n    for i in list_of_images:\n        if 'dog' in i:\n            y.append(1)\n        elif 'cat' in i:\n            y.append(0)\n        #else:\n            #print('neither cat nor dog name present in images')\n            \n    return x, y","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"2bd8644ea0aeebd6538223e6997216a4aab4c88d","trusted":true,"collapsed":true},"cell_type":"code","source":"X, Y = prepare_data(train_images_dogs_cats_trim)\n\n# First split the data in two sets, 80% for training, 20% for Val/Test)\nX_train, X_val, Y_train, Y_val = train_test_split(X,Y, test_size=0.2, random_state=1)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"ef4dd6a840ac1a4e4efa1af1db37d6a2173cf30b","trusted":true,"collapsed":true},"cell_type":"code","source":"nb_train_samples = len(X_train)\nnb_validation_samples = len(X_val)\nbatch_size = 16","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"bf9cefe3a7bf9b67d66817540db919c01c7a2b95","trusted":true,"collapsed":true},"cell_type":"code","source":"model = models.Sequential()\n\nmodel.add(layers.Conv2D(32, (3, 3), input_shape=(img_width, img_height, 3)))\nmodel.add(layers.Activation('relu'))\nmodel.add(layers.MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(layers.Conv2D(32, (3, 3)))\nmodel.add(layers.Activation('relu'))\nmodel.add(layers.MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(layers.Conv2D(64, (3, 3)))\nmodel.add(layers.Activation('relu'))\nmodel.add(layers.MaxPooling2D(pool_size=(2, 2)))\n\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(64))\nmodel.add(layers.Activation('relu'))\nmodel.add(layers.Dropout(0.5))\nmodel.add(layers.Dense(1))\nmodel.add(layers.Activation('sigmoid'))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"60ba7d8e07bd8faea77452feb189213e613024af","trusted":true},"cell_type":"code","source":"model.compile(loss='binary_crossentropy',\n              optimizer='rmsprop',\n              metrics=['accuracy'])\n\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"ff3b4d6ee38d96d56f7cdf0ca5b9c9d37779d750","trusted":true,"collapsed":true},"cell_type":"code","source":"train_datagen = ImageDataGenerator(\n    rescale=1. / 255,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True)\n\nval_datagen = ImageDataGenerator(\n    rescale=1. / 255,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"397cdc8b544600e432fede4c5a4278ca8e39e7a5","trusted":true,"collapsed":true},"cell_type":"code","source":"train_generator = train_datagen.flow(np.array(X_train), Y_train, batch_size=batch_size)\nvalidation_generator = val_datagen.flow(np.array(X_val), Y_val, batch_size=batch_size)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"308bc614e352af0c9ffc04a50df3e17ae6f0ae85","trusted":true},"cell_type":"code","source":"visualize_acc_loss = model.fit_generator(\n    train_generator, \n    steps_per_epoch=nb_train_samples // batch_size,\n    epochs=40,\n    validation_data=validation_generator,\n    validation_steps=nb_validation_samples // batch_size\n)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e12aff044a046f10d168d899bbf37d3a11b1511d"},"cell_type":"markdown","source":"### Plot the Loss and Accuracy of Model"},{"metadata":{"_uuid":"9d4c1158494bc1c2568a57dfd96d609ccfc65918","trusted":true},"cell_type":"code","source":"# Plot the loss and accuracy curves for training and validation \nfig, ax = plt.subplots(2,1)\nax[0].plot(visualize_acc_loss.history['loss'], color='b', label=\"Training loss\")\nax[0].plot(visualize_acc_loss.history['val_loss'], color='r', label=\"validation loss\",axes =ax[0])\nlegend = ax[0].legend(loc='best', shadow=True)\n\nax[1].plot(visualize_acc_loss.history['acc'], color='b', label=\"Training accuracy\")\nax[1].plot(visualize_acc_loss.history['val_acc'], color='r',label=\"Validation accuracy\")\nlegend = ax[1].legend(loc='best', shadow=True)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"71c9707f2c1885109ee087b98cf3c9826c2995ea","trusted":true,"collapsed":true},"cell_type":"code","source":"X_test, Y_test = prepare_data(test_images_dogs_cats) #Y_test in this case will be []","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"6f8e7194984e8e808b3cc98b2f25ea9945ba3795","trusted":true,"collapsed":true},"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale=1. / 255)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8ca0b6078d994fc5688598eb63c781bd8214d3ee"},"cell_type":"markdown","source":"## Validation of the Model"},{"metadata":{"_uuid":"03096d5f61edef4ea46b7f3f880e111d699dcfee","trusted":true,"collapsed":true},"cell_type":"code","source":"def plot_confusion_matrix(cm, classes,\n                          normalize=False,\n                          title='Confusion matrix',\n                          cmap=plt.cm.Blues):\n    \"\"\"\n    This function prints and plots the confusion matrix.\n    Normalization can be applied by setting `normalize=True`.\n    \"\"\"\n    plt.imshow(cm, interpolation='nearest', cmap=cmap)\n    plt.title(title)\n    plt.colorbar()\n    tick_marks = np.arange(len(classes))\n    plt.xticks(tick_marks, classes, rotation=45)\n    plt.yticks(tick_marks, classes)\n    \n    if normalize:\n        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n\n    thresh = cm.max() / 2.\n    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n        plt.text(j, i, cm[i, j],\n                 horizontalalignment=\"center\",\n                 color=\"white\" if cm[i, j] > thresh else \"black\")\n\n    plt.tight_layout()\n    plt.ylabel('True label')\n    plt.xlabel('Predicted label')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"839edb256448bd2772b95629405752b3c35b7dc3","trusted":true},"cell_type":"code","source":"# Predict the values from the validation dataset\nY_pred = model.predict(np.array(X_val))\n\nY_pred_labels = [] # labels    \n    \nfor i in range(0,len(Y_pred)):\n    if Y_pred[i, 0] >= 0.5: \n        Y_pred_labels.append(1)\n    else:\n        Y_pred_labels.append(0)\n\n# Convert predictions classes to one hot vectors \nY_pred_classes = np.argmax(Y_pred) \n\n# compute the confusion matrix\nconfusion_mtx = confusion_matrix(Y_val, Y_pred_labels) \n\n# plot the confusion matrix\nplot_confusion_matrix(confusion_mtx, classes = range(1))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2728ef6c6378fdc3ce9d186a8a886f6c8fe7cc67"},"cell_type":"code","source":"Y_pred = model.predict(np.array(X_val))\n\n#####predict cat | predict dog\nfor i in range(0,5):\n    if Y_pred[i, 0] >= 0.5: \n        print('I am {:.2%} sure this is a Dog'.format(Y_pred[i][0]))\n    else: \n        print('I am {:.2%} sure this is a Cat'.format(1-Y_pred[i][0]))\n        \n    plt.imshow(X_val[i])    \n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e426c9ed2d05ed216000a4c6d629cc9c1d41d421","trusted":true},"cell_type":"code","source":"test_generator = val_datagen.flow(np.array(X_test), batch_size=batch_size)\nprediction_probabilities = model.predict_generator(test_generator, verbose=1)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"0762e067c496228782cba31301ebaa4a7b2f1758","trusted":true,"collapsed":true},"cell_type":"code","source":"counter = range(1, len(test_images_dogs_cats) + 1)\nsolution = pd.DataFrame({\"id\": counter, \"label\":list(prediction_probabilities)})\ncols = ['label']\n\nfor col in cols:\n    solution[col] = solution[col].map(lambda x: str(x).lstrip('[').rstrip(']')).astype(float)\n\nsolution.to_csv(\"dogsVScats.csv\", index = False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"98defe1565ae34f3082e1508bf2ac9886da7ecea"},"cell_type":"code","source":"# Validating the score on validation data \nscore = model.evaluate_generator(validation_generator)\nprint('Test score:', score[0])\nprint('Test accuracy:', score[1])","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}