{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import os\nimport zipfile\nimport random\nimport tensorflow as tf\nimport tensorflow_datasets as tfds\nfrom tensorflow.keras.optimizers import RMSprop\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom shutil import copyfile","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!wget --no-check-certificate \\\n    \"https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_3367a.zip\" \\\n    -O \"/tmp/cats-and-dogs.zip\"\n\nlocal_zip = '/tmp/cats-and-dogs.zip'\nzip_ref = zipfile.ZipFile(local_zip, 'r')\nzip_ref.extractall('/tmp')\nzip_ref.close()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"try:\n    \n    os.mkdir('/tmp/cats-v-dogs')\n    os.mkdir('/tmp/cats-v-dogs/training')\n    os.mkdir('/tmp/cats-v-dogs/testing')\n    os.mkdir('/tmp/cats-v-dogs/training/cats')\n    os.mkdir('/tmp/cats-v-dogs/training/dogs')\n    os.mkdir('/tmp/cats-v-dogs/testing/cats')\n    os.mkdir('/tmp/cats-v-dogs/testing/dogs')\nexcept OSError:\n    pass","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def split_data(SOURCE, TRAINING, TESTING, SPLIT_SIZE):\n\n    dataset = []\n    \n    for unitData in os.listdir(SOURCE):\n        data = SOURCE + unitData\n        if (os.path.getsize(data) > 0):\n            dataset.append(unitData)\n        else:\n            print('Skipped ' + unitData)\n            print('Invalid file size! i.e Zero length.')\n    \n    train_data_length = int(len(dataset) * SPLIT_SIZE)\n    test_data_length = int(len(dataset) - train_data_length)\n    shuffled_set = random.sample(dataset, len(dataset))\n    train_set = shuffled_set[0:train_data_length]\n    test_set = shuffled_set[-test_data_length:]\n    \n    for unitData in train_set:\n        temp_train_data = SOURCE + unitData\n        final_train_data = TRAINING + unitData\n        copyfile(temp_train_data, final_train_data)\n    \n    for unitData in test_set:\n        temp_test_data = SOURCE + unitData\n        final_test_data = TESTING + unitData\n        copyfile(temp_train_data, final_test_data)\n\n\n\nCAT_SOURCE_DIR = \"/tmp/PetImages/Cat/\"\nTRAINING_CATS_DIR = \"/tmp/cats-v-dogs/training/cats/\"\nTESTING_CATS_DIR = \"/tmp/cats-v-dogs/testing/cats/\"\nDOG_SOURCE_DIR = \"/tmp/PetImages/Dog/\"\nTRAINING_DOGS_DIR = \"/tmp/cats-v-dogs/training/dogs/\"\nTESTING_DOGS_DIR = \"/tmp/cats-v-dogs/testing/dogs/\"\n\nsplit_size = .9\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)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class myCallback(tf.keras.callbacks.Callback):\n    def on_epoch_end(self,epoch,logs={}):\n        if (logs.get('accuracy')>0.99):\n            print(\"Reaches 99% accuracy. Cancelling training\")\n            self.model.stop_training = True\n\ncallbacks = myCallback()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = tf.keras.models.Sequential([\n    tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)),\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.Conv2D(128, (3,3), activation='relu'),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Flatten(),\n    tf.keras.layers.Dense(512, activation='relu'),\n    tf.keras.layers.Dense(1, activation='sigmoid')\n\n])\n\nmodel.compile(optimizer=RMSprop(lr= 1e-4), loss='binary_crossentropy', metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"TRAINING_DIR = '/tmp/cats-v-dogs/training'\ntrain_datagen = ImageDataGenerator( rescale = 1/255,\n                                  rotation_range = 40,\n                                   width_shift_range= 0.2,\n                                   height_shift_range= 0.2,\n                                   shear_range = 0.2,\n                                   zoom_range = 0.2,\n                                   horizontal_flip = True,\n                                   fill_mode = 'nearest'\n                                  \n                                  )\n\n\ntrain_generator = train_datagen.flow_from_directory(\nTRAINING_DIR , batch_size = 20 , class_mode = 'binary' , target_size = (150,150))\n\nVALIDATION_DIR = '/tmp/cats-v-dogs/testing'\nvalidation_datagen = ImageDataGenerator( rescale = 1/255)\n\n\nvalidation_generator = validation_datagen.flow_from_directory(\nVALIDATION_DIR , batch_size= 20 , class_mode = 'binary' , target_size=(150,150))\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit(train_generator, steps_per_epoch=100 ,epochs=100, verbose=2, validation_data=validation_generator,\n                    validation_steps = 50 , callbacks=[callbacks])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%matplotlib inline\nimport matplotlib.image  as mpimg\nimport matplotlib.pyplot as plt\n\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)) \n\n\nplt.plot(epochs, acc, 'r', \"Training Accuracy\")\nplt.plot(epochs, val_acc, 'b', \"Validation Accuracy\")\nplt.title('Training and validation accuracy')\nplt.figure()\n\nplt.plot(epochs, loss, 'r', \"Training Loss\")\nplt.plot(epochs, val_loss, 'b', \"Validation Loss\")\n\n\nplt.title('Training and validation loss')\n\n","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}