{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport zipfile\nimport random\nimport shutil\nimport numpy as np \nimport pandas as pd \nimport tensorflow as tf\n\nimport matplotlib.pyplot as plt\nfrom matplotlib import animation\nfrom IPython.display import HTML\n!pip install celluloid \nfrom celluloid import Camera\n\n\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom shutil import copyfile\n\n\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n        if 'zip' in os.path.join(dirname, filename):\n            zip_ref  = zipfile.ZipFile(os.path.join(dirname, filename), 'r')\n            zip_ref.extractall('/kaggle/working')\n        zip_ref.close()\n\n        \nsource_path_train = '/kaggle/working/train'\nsource_path_test = '/kaggle/working/test1'\n\n# creating dogs and cats directories\nos.makedirs('/kaggle/working/images/dogs')\nos.makedirs('/kaggle/working/images/cats')\n\nos.makedirs('/kaggle/working/cats-v-dogs')\n\nimages_dogs = '/kaggle/working/images/dogs'\nimages_cats = '/kaggle/working/images/cats'\n\nroot_dir = '/kaggle/working/cats-v-dogs'\n\ndata_train_list = os.listdir(source_path_train)\ncat_jpg_train = [jpg for jpg in data_train_list if 'cat' in jpg]\ndog_jpg_train = [jpg for jpg in data_train_list if 'dog' in jpg]\n# ls -R | grep \":$\" | sed -e 's/:$//' -e 's/[^-][^\\/]*\\//--/g' -e 's/^/   /' -e 's/-/|/'","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-02-19T07:27:26.581868Z","iopub.execute_input":"2022-02-19T07:27:26.582233Z","iopub.status.idle":"2022-02-19T07:27:57.6699Z","shell.execute_reply.started":"2022-02-19T07:27:26.582148Z","shell.execute_reply":"2022-02-19T07:27:57.669119Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def move_jpg(photo_names: list, source_path: str, dest_path: str, split_data=0):\n    \n    # moving photos to subdirectories cats and dogs\n    for photo in photo_names:\n        shutil.move(os.path.join(source_path, photo), os.path.join(dest_path, photo))\n\n# moving photos of cats to new directory 'trainig/cats'\nmove_jpg(cat_jpg_train, source_path_train, images_cats )\n\n# moving photos of dogs to new subdirectory 'training/dogs'\nmove_jpg(dog_jpg_train, source_path_train, images_dogs )","metadata":{"execution":{"iopub.status.busy":"2022-02-19T07:27:57.671687Z","iopub.execute_input":"2022-02-19T07:27:57.672127Z","iopub.status.idle":"2022-02-19T07:27:58.773404Z","shell.execute_reply.started":"2022-02-19T07:27:57.672087Z","shell.execute_reply":"2022-02-19T07:27:58.772643Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(f'Number of images in train directory: {len(os.listdir(source_path_train))}')\nprint(f'Number of images in test directory: {len(os.listdir(source_path_test))}')\nprint(f'Number of images in dogs directory: {len(os.listdir(images_dogs))}')\nprint(f'Number of images in cats directory: {len(os.listdir(images_cats))}')","metadata":{"execution":{"iopub.status.busy":"2022-02-19T07:27:58.77558Z","iopub.execute_input":"2022-02-19T07:27:58.77608Z","iopub.status.idle":"2022-02-19T07:27:58.804606Z","shell.execute_reply.started":"2022-02-19T07:27:58.776042Z","shell.execute_reply":"2022-02-19T07:27:58.803643Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if os.path.exists(root_dir):\n    shutil.rmtree(root_dir)\n\n\ndef create_train_test_dirs(root_path):\n    training_cats_dir = 'training/cats'\n    training_dogs_dir = 'training/dogs'\n\n    testing_cats_dir = 'testing/cats'\n    testing_dogs_dir = 'testing/dogs'\n\n    directories = [training_cats_dir, \n                 training_dogs_dir, \n                 testing_cats_dir, \n                 testing_dogs_dir]\n\n    for dir in directories:\n        os.makedirs(os.path.join(root_path, dir))\n\ntry:\n    create_train_test_dirs(root_path=root_dir)\nexcept FileExistsError:\n    print(\"You should not be seeing this since the upper directory is removed beforehand\")","metadata":{"execution":{"iopub.status.busy":"2022-02-19T07:27:58.807012Z","iopub.execute_input":"2022-02-19T07:27:58.807303Z","iopub.status.idle":"2022-02-19T07:27:59.328504Z","shell.execute_reply.started":"2022-02-19T07:27:58.807266Z","shell.execute_reply":"2022-02-19T07:27:59.327631Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for rootdir, dirs, files in os.walk(root_dir):\n    for subdir in dirs:\n        print(os.path.join(rootdir, subdir))","metadata":{"execution":{"iopub.status.busy":"2022-02-19T07:27:59.329924Z","iopub.execute_input":"2022-02-19T07:27:59.330481Z","iopub.status.idle":"2022-02-19T07:27:59.341696Z","shell.execute_reply.started":"2022-02-19T07:27:59.330436Z","shell.execute_reply":"2022-02-19T07:27:59.340852Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def split_data(SOURCE, TRAINING, TESTING, SPLIT_SIZE):\n    source_data_list = os.listdir(SOURCE)\n\n    # testing for photos with size 0\n    for photo in source_data_list:\n        if os.path.getsize(os.path.join(SOURCE, photo)) == 0:\n            source_data_list.remove(photo)\n      \n    # shuffled list of photos\n    source_data_list = random.sample(source_data_list, len(source_data_list))\n\n    # training \n    trainig_photos = source_data_list[ :int(len(source_data_list) * SPLIT_SIZE)]\n\n    # test \n    testing_photos = source_data_list[int(len(source_data_list) * SPLIT_SIZE): ]\n\n    # copying trainig data \n    for train_photo in trainig_photos:\n        shutil.move( os.path.join(SOURCE, train_photo), os.path.join(TRAINING, train_photo) )\n\n    # copying test data\n    for test_photo in testing_photos:\n        shutil.move( os.path.join(SOURCE, test_photo), os.path.join(TESTING, test_photo) )","metadata":{"execution":{"iopub.status.busy":"2022-02-19T07:27:59.343278Z","iopub.execute_input":"2022-02-19T07:27:59.343804Z","iopub.status.idle":"2022-02-19T07:27:59.354538Z","shell.execute_reply.started":"2022-02-19T07:27:59.343765Z","shell.execute_reply":"2022-02-19T07:27:59.353642Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define paths\nCAT_SOURCE_DIR = '/kaggle/working/images/dogs'\nDOG_SOURCE_DIR = '/kaggle/working/images/cats'\n\nTRAINING_DIR = \"/kaggle/working/cats-v-dogs/training/\"\nTESTING_DIR = \"/kaggle/working/cats-v-dogs/testing/\"\n\nTRAINING_CATS_DIR = os.path.join(TRAINING_DIR, \"cats/\")\nTESTING_CATS_DIR = os.path.join(TESTING_DIR, \"cats/\")\n\nTRAINING_DOGS_DIR = os.path.join(TRAINING_DIR, \"dogs/\")\nTESTING_DOGS_DIR = os.path.join(TESTING_DIR, \"dogs/\")\n\nif len(os.listdir(TRAINING_CATS_DIR)) > 0:\n    for file in os.scandir(TRAINING_CATS_DIR):\n        os.remove(file.path)\nif len(os.listdir(TRAINING_DOGS_DIR)) > 0:\n    for file in os.scandir(TRAINING_DOGS_DIR):\n        os.remove(file.path)\nif len(os.listdir(TESTING_CATS_DIR)) > 0:\n    for file in os.scandir(TESTING_CATS_DIR):\n        os.remove(file.path)\nif len(os.listdir(TESTING_DOGS_DIR)) > 0:\n    for file in os.scandir(TESTING_DOGS_DIR):\n        os.remove(file.path)\n\n\nsplit_size = .9\n\nsplit_data(CAT_SOURCE_DIR, TRAINING_CATS_DIR, TESTING_CATS_DIR, split_size)\nsplit_data(DOG_SOURCE_DIR, TRAINING_DOGS_DIR, TESTING_DOGS_DIR, split_size)\n\nprint(f\"\\n\\nThere are {len(os.listdir(TRAINING_CATS_DIR))} images of cats for training\")\nprint(f\"There are {len(os.listdir(TRAINING_DOGS_DIR))} images of dogs for training\")\nprint(f\"There are {len(os.listdir(TESTING_CATS_DIR))} images of cats for testing\")\nprint(f\"There are {len(os.listdir(TESTING_DOGS_DIR))} images of dogs for testing\")","metadata":{"execution":{"iopub.status.busy":"2022-02-19T07:27:59.355847Z","iopub.execute_input":"2022-02-19T07:27:59.356053Z","iopub.status.idle":"2022-02-19T07:28:00.247107Z","shell.execute_reply.started":"2022-02-19T07:27:59.356028Z","shell.execute_reply":"2022-02-19T07:28:00.246347Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# callback class\nclass myCallbacks(tf.keras.callbacks.Callback):\n    def on_epoch_end(self, epoch, logs={}):\n        if(logs.get('accuracy') >= 0.99):\n            print('\\nReached desired training accuracy of 99%. Training stopped!')\n            self.model.stop_training = True","metadata":{"execution":{"iopub.status.busy":"2022-02-19T07:28:00.248797Z","iopub.execute_input":"2022-02-19T07:28:00.24907Z","iopub.status.idle":"2022-02-19T07:28:00.254687Z","shell.execute_reply.started":"2022-02-19T07:28:00.249032Z","shell.execute_reply":"2022-02-19T07:28:00.253612Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.optimizers import RMSprop\nfrom tensorflow.keras.optimizers import Adam\n\ndef create_model():\n    \n    model = tf.keras.models.Sequential([\n                                      \n              tf.keras.layers.Conv2D(16, kernel_size=(3, 3), activation='relu', input_shape=(150,150,3)), \n              tf.keras.layers.MaxPool2D(2,2),\n\n              tf.keras.layers.Conv2D(32, kernel_size=(3,3), activation='relu'),\n              tf.keras.layers.MaxPool2D(2,2),\n\n              tf.keras.layers.Conv2D(64, kernel_size=(3,3), activation='relu'),\n              tf.keras.layers.MaxPool2D(2,2),\n\n              tf.keras.layers.Conv2D(128, kernel_size=(3,3), activation='relu'),\n              tf.keras.layers.MaxPool2D(2,2),\n\n              tf.keras.layers.Flatten(),\n              tf.keras.layers.Dense(512, activation='relu'),\n              tf.keras.layers.Dense(1, activation='sigmoid')  \n        ])\n    \n    model.compile(optimizer=Adam(learning_rate=0.001), \n                  loss='binary_crossentropy',\n                  metrics=['accuracy']) \n\n    return model\n","metadata":{"execution":{"iopub.status.busy":"2022-02-19T13:05:24.080324Z","iopub.execute_input":"2022-02-19T13:05:24.08059Z","iopub.status.idle":"2022-02-19T13:05:24.091339Z","shell.execute_reply.started":"2022-02-19T13:05:24.080544Z","shell.execute_reply":"2022-02-19T13:05:24.090634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train_val_generators_aug(TRAINING_DIR, VALIDATION_DIR):\n    \n    train_datagen_aug = ImageDataGenerator( rescale = 1.0 / 255.,\n                                        rotation_range=45,\n                                        width_shift_range=0.25,\n                                        height_shift_range=0.25,\n                                        shear_range=0.25,\n                                        zoom_range=0.25,\n                                        horizontal_flip=True,\n                                        fill_mode='nearest')\n\n\n    train_generator_aug = train_datagen_aug.flow_from_directory(directory=TRAINING_DIR,\n                                                        batch_size=20,\n                                                        class_mode='binary',\n                                                        target_size=(150, 150))\n\n\n    validation_datagen_aug = ImageDataGenerator( rescale = 1.0 / 255.)\n\n\n    validation_generator_aug = validation_datagen_aug.flow_from_directory(directory=VALIDATION_DIR,\n                                                                  batch_size=20,\n                                                                  class_mode='binary',\n                                                                  target_size=(150, 150))\n\n    return train_generator_aug, validation_generator_aug","metadata":{"execution":{"iopub.status.busy":"2022-02-19T13:05:28.524399Z","iopub.execute_input":"2022-02-19T13:05:28.524662Z","iopub.status.idle":"2022-02-19T13:05:28.533855Z","shell.execute_reply.started":"2022-02-19T13:05:28.524631Z","shell.execute_reply":"2022-02-19T13:05:28.533169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator_aug, validation_generator_aug = train_val_generators_aug(TRAINING_DIR, TESTING_DIR)\nmodel_augumented = create_model()\ncallbacks = myCallbacks()\nhistory = model_augumented.fit(train_generator_aug,\n                    epochs=150,\n                    batch_size=16, # this time batch size was added ver.3 previous stopped on 93% and 89%\n                    verbose=1,\n                    validation_data=validation_generator_aug,\n                    callbacks=[callbacks])","metadata":{"execution":{"iopub.status.busy":"2022-02-19T13:05:32.181768Z","iopub.execute_input":"2022-02-19T13:05:32.182289Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"acc_aug=history.history['accuracy']\nval_acc_aug=history.history['val_accuracy']\nloss_aug=history.history['loss']\nval_loss_aug=history.history['val_loss']\n\nepochs_aug=range(len(acc_aug)) # Get number of epochs\n\nplt.plot(epochs_aug, acc_aug, 'r', \"Training Accuracy\")\nplt.plot(epochs_aug, val_acc_aug, 'b', \"Validation Accuracy\")\nplt.title('Training and validation accuracy')\nplt.show()\nprint(\"\")\n\nplt.plot(epochs_aug, loss_aug, 'r', \"Training Loss\")\nplt.plot(epochs_aug, val_loss_aug, 'b', \"Validation Loss\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-02-19T13:03:39.465105Z","iopub.status.idle":"2022-02-19T13:03:39.465967Z","shell.execute_reply.started":"2022-02-19T13:03:39.465518Z","shell.execute_reply":"2022-02-19T13:03:39.465544Z"},"trusted":true},"execution_count":null,"outputs":[]}]}