{"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\nimport os\n\nfrom tensorflow.keras import layers\nfrom tensorflow.keras import Model\n!wget --no-check-certificate \\\n    https://storage.googleapis.com/mledu-datasets/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5 \\\n    -O /tmp/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5\n  \nfrom tensorflow.keras.applications.inception_v3 import InceptionV3\n\nlocal_weights_file = '/tmp/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5'\n\npre_trained_model = InceptionV3(input_shape = (150, 150, 3), \n                                include_top = False, \n                                weights = None)\n\npre_trained_model.load_weights(local_weights_file)\n\nfor layer in pre_trained_model.layers:\n  layer.trainable = False\n  \n# pre_trained_model.summary()\n\nlast_layer = pre_trained_model.get_layer('mixed7')\nprint('last layer output shape: ', last_layer.output_shape)\nlast_output = last_layer.output","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()\ntry:\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\n\ndef 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.999):\n      print(\"Reaches 99.9% accuracy. Cancelling training\")\n      self.model.stop_training = True\n\ncallbacks = myCallback()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.optimizers import RMSprop\n\nx = layers.Flatten()(last_output)\nx = layers.Dense(1024, activation = 'relu')(x)\nx = layers.Dropout(0.2)(x)\nx = layers.Dense( 1 , activation = 'sigmoid')(x)\n\nmodel = Model( pre_trained_model.input , x)\n\n\nmodel.compile(optimizer=RMSprop(lr=0.0001), 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))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit(train_generator ,\n                    steps_per_epoch=100, \n                    epochs=20, \n                    verbose=2,validation_steps=50,\n                    validation_data=validation_generator , 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')","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}