{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import os\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom tensorflow.keras.applications import VGG16\nfrom tensorflow.keras import models, layers, optimizers\nfrom tensorflow.keras import callbacks","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(os.listdir('../input/dogs-vs-cats/train/train'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"conv_base = VGG16(weights='imagenet', include_top=False, input_shape=(150, 150, 3))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(conv_base.trainable_weights)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"conv_base.trainable = False","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(conv_base.trainable_weights)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"conv_base.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = models.Sequential([conv_base,\n                           layers.Flatten(),\n                           layers.Dense(256, activation='relu'),\n                           layers.Dense(1, activation='sigmoid')])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dir = \"../input/dogs-vs-cats/train/train\"\ntest_dir = \"../input/dogs-vs-cats/test1/test1\"\n\ntrain_size = len([name for name in os.listdir(train_dir)])\ntest_size = len([name for name in os.listdir(test_dir)])\n\n\ntrain_images = os.listdir(train_dir)\ntrain_labels = []\nfor image in train_images:\n    label = image.split('.')[0]\n    train_labels.append(label)\ndf = pd.DataFrame({\n    'id': train_images,\n    'label': train_labels\n})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_set, val_set = train_test_split(df, test_size=0.2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_gen = ImageDataGenerator(rescale=1./255,\n                               horizontal_flip=True,\n                               rotation_range=45,\n                               zoom_range=0.2,\n                               shear_range=0.2,\n                               height_shift_range=0.2,\n                               width_shift_range=0.2,\n                               fill_mode='nearest')\nval_gen = ImageDataGenerator(rescale=1./255)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_data = train_gen.flow_from_dataframe(\n    train_set, \n    train_dir, \n    x_col='id',\n    y_col='label',\n    target_size=(150, 150),\n    class_mode='binary',\n    batch_size=100)\n\nval_data = val_gen.flow_from_dataframe(\n    val_set, \n    train_dir, \n    x_col='id',\n    y_col='label',\n    target_size=(150, 150),\n    class_mode='binary',\n    batch_size=100)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"callbacks_list = [callbacks.EarlyStopping(monitor='val_loss', min_delta=0.001, patience=3, verbose=1),\n                 callbacks.ModelCheckpoint('best_model.h5', monitor='val_loss', verbose=1, save_best_only=True),\n                  callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=2, verbose=1, min_delta=0.001)]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(loss='binary_crossentropy',\n             optimizer=optimizers.RMSprop(lr=2e-5),\n              metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit_generator(train_data,\n                             steps_per_epoch=200,\n                             epochs=15,\n                             validation_data=val_data,\n                             validation_steps=50,\n                             callbacks=callbacks_list)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def plot_history(history):\n    acc = history.history['accuracy']\n    val_acc = history.history['val_accuracy']\n    loss = history.history['loss']\n    val_loss = history.history['val_loss']\n    epochs = range(1, len(acc)+1)\n    \n    plt.plot(epochs, acc, 'b--', label='acc')\n    plt.plot(epochs, val_acc, 'r--', label='val_acc')\n    plt.xlabel('epochs')\n    plt.ylabel('accuracy')\n    plt.legend()\n    plt.grid()\n    \n    plt.figure()\n    plt.plot(epochs, loss, 'b--', label='loss')\n    plt.plot(epochs, val_loss, 'r--', label='val_loss')\n    plt.xlabel('epochs')\n    plt.ylabel('accuracy')\n    plt.legend()\n    plt.grid()\n    \nplot_history(history)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_images = os.listdir(test_dir)\nsubmission = pd.DataFrame({\n    'id': test_images\n})\n\n\ntest_gen = ImageDataGenerator(rescale=1./255)\n\ntest_data = test_gen.flow_from_dataframe(\n    submission, \n    test_dir, \n    x_col='id',\n    y_col=None,\n    class_mode=None,\n    target_size=(150, 150),\n    batch_size=100,\n    shuffle=False\n)\n\npredictions = model.predict_generator(test_data, steps=125)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predictions = [1 if pred > 0.5 else 0 for pred in predictions]\n\nsubmission['label'] = predictions\n\nlabel_maps = dict((i, j) for j, i in train_data.class_indices.items())\nsubmission['label'] = submission['label'].replace(label_maps)\n\n\nsubmission['label'] = submission['label'].replace({ 'dog': 1, 'cat': 0 })\n\nsubmission.to_csv('submission.csv', index=False)\n\nsubmission.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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":1}