{"cells":[{"metadata":{},"cell_type":"markdown","source":"**UNZIPPING THE DATA**"},{"metadata":{"_kg_hide-output":true,"_kg_hide-input":false,"trusted":true},"cell_type":"code","source":"! unzip \"../input/dogs-vs-cats-redux-kernels-edition/train.zip\"\n! unzip \"../input/dogs-vs-cats-redux-kernels-edition/test.zip\"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**IMPORTING LIBRARIES**"},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**DEFINING CONSTANTS**"},{"metadata":{"trusted":true},"cell_type":"code","source":"IMAGE_HEIGHT = 128\nIMAGE_WIDTH = 128\nIMAGE_SIZE = (IMAGE_HEIGHT, IMAGE_WIDTH)\nIMAGE_CHANNELS = 3\nBATCH_SIZE = 256","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**LOADING DATA**"},{"metadata":{"trusted":true},"cell_type":"code","source":"filenames = os.listdir(\"train\")\ncategories = []\nfor filename in filenames:\n    category = filename.split('.')[0]\n    if category == \"dog\":\n        categories.append(1)\n    else:\n        categories.append(0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"all_data = pd.DataFrame({\n    \"filename\": filenames,\n    \"category\": categories,\n}, dtype = \"str\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**SAMPLE IMAGE**"},{"metadata":{"trusted":true},"cell_type":"code","source":"index = 357\nsample_img_filename, sample_img_label = all_data.iloc[index, :]\nsample_img_label = int(sample_img_label)\nsample_img = plt.imread(\"train/\" + sample_img_filename)\nplt.imshow(sample_img)\nprint(\"Label: {}({})\".format([\"Cat\", \"Dog\"][sample_img_label], sample_img_label))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**TRAIN-VALIDATION SPLIT**"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_data, validation_data = train_test_split(all_data, test_size = 0.05, shuffle = True, random_state = 2)\n\ntrain_data = train_data.reset_index(drop = True)\nvalidation_data = validation_data.reset_index(drop = True)\n\ntrain_data.shape, validation_data.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"num_train = train_data.shape[0]\nnum_val = validation_data.shape[0]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**IMPORTING LIBRARIES FOR DEFINING THE MODEL**"},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.applications import VGG19\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Input, Dense, Dropout, Flatten, BatchNormalization, Activation","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**DEFINING IMAGE GENERATORS**"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_datagen = ImageDataGenerator(\n    rescale = 1./255,\n    rotation_range = 15,\n    shear_range = 0.1,\n    zoom_range = 0.2,\n    horizontal_flip = True,\n    width_shift_range = 0.1,\n    height_shift_range = 0.1\n)\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    train_data,\n    directory = \"train/\",\n    x_col = \"filename\",\n    y_col = \"category\",\n    class_mode = \"binary\",\n    target_size = IMAGE_SIZE,\n    batch_size = BATCH_SIZE,\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"validation_datagen = ImageDataGenerator(rescale = 1./255)\n\nvalidation_generator = validation_datagen.flow_from_dataframe(\n    validation_data,\n    directory = \"train/\",\n    x_col = \"filename\",\n    y_col = \"category\",\n    class_mode = \"binary\",\n    target_size = IMAGE_SIZE,\n    batch_size = BATCH_SIZE,\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**EXAMPLE GENERATOR**"},{"metadata":{"trusted":true},"cell_type":"code","source":"example_generator = train_datagen.flow_from_dataframe(\n    train_data.sample(n = 1),\n    directory = \"train/\",\n    x_col = \"filename\",\n    y_col = \"category\",\n    target_size = IMAGE_SIZE,\n    batch_size = 15,\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize = (12, 12))\nfor i in range(15):\n    example_data = next(example_generator)\n    plt.subplot(5, 3, i + 1)\n    image = np.squeeze(example_data[0])\n    plt.imshow(image)\n    \nlabel = int(example_data[1])\nprint(\"Label: {}({})\".format([\"Cat\", \"Dog\"][label], label))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**DEFINING PRETRAINED VGG19 MODEL**"},{"metadata":{"trusted":true},"cell_type":"code","source":"pretrained_base = VGG19(\n    include_top = False, \n    weights = \"imagenet\",\n    input_shape = (IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_CHANNELS),\n    pooling = None,\n)\n\nfor layer in pretrained_base.layers[:5]:\n    layer.trainable = True\nfor layer in pretrained_base.layers[5:]:\n    layer.trainable = False\npretrained_base.summary()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**DEFINING HEAD LAYERS**"},{"metadata":{"trusted":true},"cell_type":"code","source":"model = Sequential([\n    pretrained_base,\n    Flatten(),\n    Dropout(0.2),\n    Dense(512),\n    BatchNormalization(),\n    Activation(\"relu\"),\n    Dropout(0.2),\n    Dense(128),\n    BatchNormalization(),\n    Activation(\"relu\"),\n    Dropout(0.2),\n    Dense(32),\n    BatchNormalization(),\n    Activation(\"relu\"),\n    Dense(1, activation = \"sigmoid\"),\n])\n\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(optimizer = \"adam\", loss = \"binary_crossentropy\", metrics = [\"accuracy\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit(\n    x = train_generator, \n    steps_per_epoch = num_train // BATCH_SIZE,\n    epochs = 20,\n    validation_data = validation_generator,\n    validation_steps = num_val // BATCH_SIZE,\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**PREDICTING ON TEST DATASET**"},{"metadata":{"trusted":true},"cell_type":"code","source":"filenames = os.listdir(\"test\")\ntest_data = pd.DataFrame({\n    \"filename\": filenames\n}, dtype = \"str\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale = 1./255)\n\ntest_generator = test_datagen.flow_from_dataframe(\n    test_data,\n    directory = \"test\",\n    x_col = \"filename\",\n    y_col = None,\n    target_size = IMAGE_SIZE,\n    class_mode = None,\n    shuffle = False,\n    batch_size = 1,\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predictions = model.predict(x = test_generator, batch_size = 1, steps = test_data.shape[0], verbose = 1)\npredictions.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predictions = np.squeeze(predictions)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**SUBMISSION**"},{"metadata":{"trusted":true},"cell_type":"code","source":"ids = np.arange(1, test_data.shape[0] + 1, 1)\nids.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.DataFrame({\n    \"id\": ids,\n    \"label\": predictions,\n})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission.to_csv(\"submission.csv\", index = False)","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}