{"cells":[{"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 sklearn\nfrom sklearn.model_selection import train_test_split\nimport tensorflow as tf\nprint(tf.__version__)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import zipfile\nfrom zipfile import ZipFile\nwith zipfile.ZipFile(\"/kaggle/input/dogs-vs-cats/train.zip\",\"r\") as zip_ref:\n    zip_ref.extractall(\"/kaggle/working/train\")","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"","_uuid":"","trusted":true},"cell_type":"code","source":"from zipfile import ZipFile\nwith zipfile.ZipFile(\"/kaggle/input/dogs-vs-cats/test1.zip\",\"r\") as zip_ref:\n    zip_ref.extractall(\"/kaggle/working/test\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"TRAIN_DIR,TEST_DIR='../working/train/train/','../working/test/test1/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def preprocessing_df(train,test,batch=100,epochs=50):\n    TRAIN_DIR = train\n    TEST_DIR = test\n    TRAIN_SIZE = len([name for name in os.listdir(TRAIN_DIR)])\n    TEST_SIZE = len([name for name in os.listdir(TEST_DIR)])\n    print(\"Number of training images:\", TRAIN_SIZE)\n    print(\"Number of test images:\", TEST_SIZE)\n\n    VALID_FRACTION = 0.2\n    BATCH_SIZE = batch\n    EPOCHS = epochs\n\n    IMAGE_SIZE=256\n\n     # creating df with train labels\n    train_filenames = os.listdir(TRAIN_DIR)\n    train_labels = []\n    for filename in train_filenames:\n        label = filename.split('.')[0]\n        train_labels.append(label)\n    train_df = pd.DataFrame({\n         'id': train_filenames,\n         'label': train_labels\n     })\n\n        # splitting to train & valid\n    train_df, valid_df = train_test_split(train_df, test_size=VALID_FRACTION)\n    \n    train_generator=tf.keras.preprocessing.image.ImageDataGenerator(horizontal_flip=True,\n                                                                rescale=1./255,\n                                                                fill_mode='nearest'\n                                                               )\n    \n    train_ds=train_generator.flow_from_dataframe(train_df,\n                                             TRAIN_DIR,\n                                             x_col='id',\n                                             y_col='label',\n                                             target_size=(IMAGE_SIZE,IMAGE_SIZE),\n                                             class_mode='binary',\n                                             batch_size=BATCH_SIZE\n                                            )\n    \n    valid_gen=tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)\n    \n    \n    valid_ds=valid_gen.flow_from_dataframe(valid_df,\n                                       TRAIN_DIR,\n                                       x_col='id',\n                                       y_col='label',\n                                       target_size=(IMAGE_SIZE,IMAGE_SIZE),\n                                       shuffle=False,\n                                       class_mode='binary',\n                                       batch_size=BATCH_SIZE\n                                      )\n    \n    return train_ds,valid_ds,TRAIN_SIZE,TEST_SIZE,BATCH_SIZE,VALID_FRACTION,IMAGE_SIZE,EPOCHS","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_ds,valid_ds,TRAIN_SIZE,TEST_SIZE,BATCH_SIZE,VALID_FRACTION,IMAGE_SIZE,EPOCHS=preprocessing_df(TRAIN_DIR,TEST_DIR,64)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = tf.keras.models.Sequential([\n    tf.keras.layers.Conv2D(64,(3,3),activation='relu',input_shape=(IMAGE_SIZE,IMAGE_SIZE,3)),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Conv2D(32,(3,3),activation='relu'),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Conv2D(32,(3,3),activation='relu'),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Conv2D(64,(3,3),activation='relu'),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Flatten(),\n    tf.keras.layers.Dropout(0.1),\n    tf.keras.layers.Dense(1024,activation='relu'),\n    tf.keras.layers.Dropout(0.4),\n    tf.keras.layers.Dense(512,activation='relu'),\n    tf.keras.layers.Dense(1, activation='sigmoid')\n])\n\nmodel.compile(optimizer = tf.keras.optimizers.RMSprop(lr=0.0001), \n          loss = 'binary_crossentropy', \n          metrics = ['accuracy'])\nmodel.summary()\n\nes = tf.keras.callbacks.EarlyStopping(monitor='val_loss',\n    mode='min',\n    restore_best_weights=True, \n    verbose=1,\n    patience=4)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"tb=tf.keras.callbacks.TensorBoard(log_dir=\"logs/\",write_images=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit(train_ds,\n    validation_data=valid_ds,\n    steps_per_epoch=round(TRAIN_SIZE*(1.-VALID_FRACTION)/BATCH_SIZE),\n    validation_steps=round(TRAIN_SIZE*VALID_FRACTION/BATCH_SIZE),\n    epochs=50,\n    callbacks=[es,tb],\n    verbose=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#plotting\n\nimport matplotlib.pyplot as plt\n\n#-----------------------------------------------------------\n# Retrieve a list of list results on training and test data\n# sets for each training epoch\n#-----------------------------------------------------------\nacc = history.history['accuracy']\nval_acc = history.history[ 'val_accuracy']\nloss = history.history['loss']\nval_loss = history.history['val_loss']\n\nepochs   = range(len(acc)) # Get number of epochs\n\n#------------------------------------------------\n# Plot training and validation accuracy per epoch\n#------------------------------------------------\nplt.plot(epochs, acc)\nplt.plot(epochs, val_acc)\nplt.title('Training and validation accuracy')\nplt.figure()\n\n#------------------------------------------------\n# Plot training and validation loss per epoch\n#------------------------------------------------\nplt.plot(epochs, loss)\nplt.plot(epochs, val_loss)\nplt.title('Training and validation loss')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\n\n# preparing testing data\ntest_filenames = os.listdir(TEST_DIR)\ntest_df = pd.DataFrame({\n    'id': test_filenames\n})\n\ntest_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale = 1./255)\n\ntest_generator = test_datagen.flow_from_dataframe(\n    test_df, \n    TEST_DIR, \n    x_col='id',\n    y_col=None,\n    class_mode=None,\n    target_size=(IMAGE_SIZE,IMAGE_SIZE),\n    batch_size=BATCH_SIZE,\n    shuffle=False\n)\n\nyhat = model.predict(test_generator, steps=np.ceil(TEST_SIZE/BATCH_SIZE))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# sigmoid returns probability between 0 and 1, need to convert it to an integer class\nyhat = [1 if y > 0.5 else 0 for y in yhat]\n\ntest_df['label'] = yhat\n\n# restoring back to class names (dog|cat)\n#label_map = dict((v,k) for k,v in train_generator.class_indices.items())\n#test_df['label'] = test_df['label'].replace(label_map)\n\n# encoding according to submission format, 1 = dog, 0 = cat\n#test_df['label'] = test_df['label'].replace({ 'dog': 1, 'cat': 0 })\n\ntest_df.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!apt-get install zip","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!zip -r logs.zip ./logs","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":4}