{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Dogs vs Cats\n\n## Data preparation"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os\nimport random\nimport shutil\n\nTRAIN_DIR = '../input/dogs-vs-cats-redux-kernels-edition/train'\nTEST_DIR = '../input/dogs-vs-cats-redux-kernels-edition/test'\n\ndef make_dir(path):\n    if not os.path.exists(path):\n        os.mkdir(path)\n\n        \nmake_dir('train')\nmake_dir('train/cat')\nmake_dir('train/dog')\nmake_dir('validation')\nmake_dir('validation/cat')\nmake_dir('validation/dog')\n\ntrain_validation_split = 0.9\n\nfor base, _, filenames in os.walk(TRAIN_DIR):\n    cats = [name for name in filenames if 'cat' in name ]\n    dogs = [name for name in filenames if 'dog' in name ]\n    random.seed(42)\n    random.shuffle(cats)\n    random.shuffle(dogs)\n    \n    cats_number = len(cats)\n    dogs_number = len(dogs)\n    \n    train_cats = cats[:int(cats_number*train_validation_split)]\n    validation_cats = cats[int(cats_number*train_validation_split):]\n    \n    train_dogs = dogs[:int(dogs_number*train_validation_split)]\n    validation_dogs = dogs[int(dogs_number*train_validation_split):]\n    \n    for name in train_cats:\n        shutil.copy(base + '/' + name, './train' + '/cat/' + name)\n        \n    for name in validation_cats:\n        shutil.copy(base + '/' + name, './validation' + '/cat/' + name)\n        \n    for name in train_dogs:\n        shutil.copy(base + '/' + name, './train' + '/dog/' + name)\n        \n    for name in validation_dogs:\n        shutil.copy(base + '/' + name, './validation' + '/dog/' + name)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Train cats:', len(os.listdir('./train/cat')))\nprint('Train dogs:', len(os.listdir('./train/dog')))\nprint('Validation cats:', len(os.listdir('./validation/cat')))\nprint('Validation dogs:', len(os.listdir('./validation/dog')))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Model training"},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow import keras\nprint(tf.__version__)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = keras.models.Sequential([\n    keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)),\n    keras.layers.MaxPooling2D(2, 2),\n    keras.layers.Conv2D(32, (3,3), activation='relu'),\n    keras.layers.MaxPooling2D(2, 2),\n    keras.layers.Conv2D(64, (3,3), activation='relu'),\n    keras.layers.MaxPooling2D(2, 2),\n    keras.layers.Conv2D(64, (3,3), activation='relu'),\n    keras.layers.MaxPooling2D(2, 2),\n    keras.layers.Flatten(),\n    keras.layers.Dense(1024, activation='relu'),\n    keras.layers.Dropout(0.1),\n    keras.layers.Dense(1, activation='sigmoid')\n])\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(loss='binary_crossentropy',\n              optimizers=keras.optimizers.RMSprop(lr=0.001),\n              metrics=['acc']\n             )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\ntrain_datagen = ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=30,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    shear_range=0.1,\n    zoom_range=0.1,\n    horizontal_flip=True,\n    fill_mode='nearest'\n)\ntrain_generator = train_datagen.flow_from_directory(\n    './train',\n    target_size=(150, 150),\n    batch_size=50,\n    class_mode='binary'\n)\nvalidation_datagen = ImageDataGenerator(\n    rescale=1./255\n)\nvalidation_generator = validation_datagen.flow_from_directory(\n    './validation',\n    target_size=(150, 150),\n    batch_size=50,\n    class_mode='binary'\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit_generator(\n    train_generator,\n    epochs=10,\n    validation_data=validation_generator\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def plot_graph(history, metric):\n    plt.plot(history.history[metric])\n    plt.plot(history.history['val_' + metric])\n    plt.xlabel('Epoch')\n    plt.ylabel(metric)\n    plt.legend([metric, 'val_' + metric])\n    plt.show()\n\nplot_graph(history, 'acc')\nplot_graph(history, 'loss')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"shutil.rmtree('./train')\nshutil.rmtree('./validation')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Prediction"},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.preprocessing.image import array_to_img, img_to_array, load_img\n\ndef get_number(s):\n    ar = s.split('.')\n    first = ar[0]\n    return int(first)\n\nfilenames = [ name for name in os.listdir(TEST_DIR + '/test')]\nfilenames.sort(key=get_number)\n\nX_test = [ img_to_array(load_img(TEST_DIR + '/test/' + name, target_size=(150, 150))) for name in filenames]\n\ntest_generator = validation_datagen.flow(np.array(X_test), batch_size=50)\n\npredictions = model.predict_generator(test_generator)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.DataFrame({'id':range(1, len(predictions)+1), 'label': predictions.reshape(len(predictions))})\ndf.to_csv('prediction.csv', index=None)\ndf.head()","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}