{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import os\nimport zipfile\nimport pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nfrom keras.preprocessing.image import ImageDataGenerator\nimport tensorflow.keras.applications as zoo\nimport tensorflow.keras.layers as L\nfrom tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!unzip -q ../input/dogs-vs-cats/train.zip -d . \n!unzip -q ../input/dogs-vs-cats/test1.zip -d . ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"filenames = os.listdir(\"./train\")\ncategories = []\nfor filename in filenames:\n    categories.append(filename.split('.')[0])\n\ndf = pd.DataFrame({\n    'filename': filenames,\n    'category': categories\n})\ntest_df =pd.DataFrame({\n    'filename': os.listdir('./test1')\n})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# I will be using unlabeled images for testing purposes\ntrain_df, val_df = train_test_split(df, test_size=0.2, random_state=42)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig, ax = plt.subplots(1, 2, figsize=(12, 5))\nax[0].bar(['cat', 'dog'], train_df.category.value_counts(), color=['b', 'r'])\nax[1].bar(['cat', 'dog'], val_df.category.value_counts(), color=['b', 'r'])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"IMAGE_SIZE = (256, 256)\nBATCH_SIZE = 32\nEARLY_STOP_PATIENCE = 7","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_generator = ImageDataGenerator(\n    rescale=1./255\n)\n\ntrain = data_generator.flow_from_dataframe(\n    train_df, \n    \"./train\", \n    x_col='filename',\n    y_col='category',\n    target_size=IMAGE_SIZE,\n    batch_size=BATCH_SIZE\n)\n\nval = data_generator.flow_from_dataframe(\n    val_df, \n    \"./train\", \n    x_col='filename',\n    y_col='category',\n    target_size=IMAGE_SIZE,\n    batch_size=BATCH_SIZE\n)\n\ntest = data_generator.flow_from_dataframe(\n    test_df, \n    \"./test1\", \n    x_col='filename',\n    target_size=IMAGE_SIZE,\n    batch_size=BATCH_SIZE,\n    class_mode=None,\n    shuffle=False\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"base = zoo.VGG16(include_top=False, input_shape=IMAGE_SIZE +(3,))\nbase.trainable = False\nbase.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = tf.keras.Sequential()\nmodel.add(base)\nmodel.add(L.GlobalAveragePooling2D())\nmodel.add(L.Flatten())\nmodel.add(L.BatchNormalization())\nmodel.add(L.ReLU())\nmodel.add(L.Dense(256))\nmodel.add(L.Dropout(0.3))\nmodel.add(L.BatchNormalization())\nmodel.add(L.ReLU())\nmodel.add(L.Dropout(0.3))\nmodel.add(L.Dense(2))\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"loss = tf.keras.losses.CategoricalCrossentropy(from_logits=True)\nopt = tf.keras.optimizers.Adam()\nmodel.compile(loss=loss, optimizer=opt, metrics=['acc'])\nearly_stop = EarlyStopping(\n    monitor='val_acc',\n    patience=EARLY_STOP_PATIENCE, \n    restore_best_weights=True\n)\ncheckpoint = ModelCheckpoint(\n    filepath='./best.hdf5',\n    monitor='acc',\n    save_best_only=True,\n    mode='auto'\n)\ncheckpoint_val = ModelCheckpoint(\n    filepath = './best_val.hdf5',\n    save_best_only = True,\n    mode = 'auto'\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history1 = model.fit(\n    train, \n    validation_data=val,\n    batch_size=BATCH_SIZE,\n    epochs=10,\n    callbacks=[early_stop, checkpoint, checkpoint_val]\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"base.trainable = False\n# model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history2 = model.fit(\n    train, \n    validation_data=val,\n    batch_size=BATCH_SIZE,\n    epochs=25,\n    callbacks=[early_stop, checkpoint, checkpoint_val]\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.load_weights('./best_val.hdf5')\npred = np.argmax(model.predict(test), axis=-1)\npred","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"pred = pd.DataFrame({\n    'id': np.arange(12500) + 1,\n    'label': pred\n})\npred","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"pred.to_csv('./predictions.csv')","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}