{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"dockerImageVersionId":30732,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport shutil\nimport random\nimport numpy as np\nimport pandas as pd\nimport matplotlib.image as mpimg\nimport matplotlib.pyplot as plt\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, BatchNormalization, Dropout\nfrom tensorflow.keras.regularizers import L2\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if not os.path.exists(\"/kaggle/working/train\"):\n    !unzip -q /kaggle/input/dogs-vs-cats/train.zip","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_path = '/kaggle/working/train'\nlen(os.listdir(train_path))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.image as mpimg\nimport matplotlib.pyplot as plt\nimport random\n\nplt.figure(figsize=(16,16))\n\nimages = os.listdir(train_path)\nfor i in range(8):\n    img = random.choice([x for x in images])\n    fig = plt.subplot(4,4,i+1)\n    fig.axis('off')\n    img = mpimg.imread(os.path.join(train_path, img)) \n    fig.imshow(img) ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"try:\n    parent_dir = '/kaggle/working/cats-v-dogs'\n    os.mkdir(parent_dir)\n\n    for dir in ['training', 'validation']:\n        path = os.path.join(parent_dir , dir)\n        os.mkdir(path)\n        for dir in ['cats', 'dogs']:\n            n_path = os.path.join(path , dir)\n            os.mkdir(n_path)\nexcept OSError:\n    print('Existed')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"src_dir = train_path\n\ncats_train_dir = '/kaggle/working/cats-v-dogs/training/cats'\ncats_valid_dir = '/kaggle/working/cats-v-dogs/validation/cats'\n\ndogs_train_dir = '/kaggle/working/cats-v-dogs/training/dogs'\ndogs_valid_dir = '/kaggle/working/cats-v-dogs/validation/dogs'\n\n# List of cats names in all training images\ncats =[img for img in os.listdir(src_dir) if img[:3] == 'cat']\n\n# List of dogs names in all training images\ndogs =[img for img in os.listdir(src_dir) if img[:3] == 'dog']\n\n# Take 10% of training images for validation    \nnp.random.seed(100)\ncats_valid_sample = random.sample(cats, int(0.1*len(cats))) \ndogs_valid_sample = random.sample(dogs, int(0.1*len(dogs)))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for img in os.listdir(src_dir):\n    src_img = os.path.join(src_dir, img)\n\n    if img[:3] == 'cat':\n        if img in cats_valid_sample:\n            dest_img = os.path.join(cats_valid_dir, img)\n        else:\n            dest_img = os.path.join(cats_train_dir, img)\n\n    elif img[:3] == 'dog':\n        if img in dogs_valid_sample:\n            dest_img = os.path.join(dogs_valid_dir, img)\n        else:\n            dest_img = os.path.join(dogs_train_dir, img)\n    if not os.path.exists(dest_img):\n        shutil.copyfile(src_img, dest_img)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('No. of ALL cats : ', len(cats))\nprint('No. of cats for training: ', len(os.listdir(cats_train_dir)))\nprint('No. of cats for validation: ', len(os.listdir(cats_valid_dir)))\n\nprint('\\nNo. of ALL dogs : ', len(dogs))\nprint('No. of dogs for training: ', len(os.listdir(dogs_train_dir)))\nprint('No. of dogs for validation: ', len(os.listdir(dogs_valid_dir)))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(16,16))\n\nimages = os.listdir(cats_train_dir)\nfor i in range(8):\n    img = random.choice([x for x in images])\n    fig = plt.subplot(4,4,i+1)\n    fig.axis('off')\n    img = mpimg.imread(os.path.join(cats_train_dir, img)) \n    fig.imshow(img) ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale=1/255)\nvalid_datagen = ImageDataGenerator(rescale=1/255)\n\n\ntrain_dir = '/kaggle/working/cats-v-dogs/training'\ntrain_generator = train_datagen.flow_from_directory(train_dir, target_size=(150, 150), batch_size=32, class_mode='binary')\n\nvalid_dir = '/kaggle/working/cats-v-dogs/validation'\nvalid_generator = valid_datagen.flow_from_directory(valid_dir,target_size=(150, 150), batch_size=32,class_mode='binary')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(valid_generator.class_indices)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# create model\nmodel = Sequential([    Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)),\n                        MaxPooling2D(2, 2),\n                        Conv2D(64, (3,3), activation='relu'),\n                        MaxPooling2D(2,2),\n                        Conv2D(128, (3,3), activation='relu'),\n                        MaxPooling2D(2,2),\n\n                        Flatten(),\n                        Dense(128, activation='relu'),\n                        Dense(1, activation='sigmoid')  ])\n\n# Compile model \nmodel.compile(optimizer='adamax', loss='binary_crossentropy', metrics=['accuracy'])\nmodel.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(train_generator, epochs=5, verbose=1,validation_data=valid_generator)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history_df = pd.DataFrame(history.history)\nhistory_df.loc[:,['loss','val_loss']].plot()\nhistory_df.loc[:,['accuracy','val_accuracy']].plot()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_acc = model.evaluate(train_generator)[1]\nvalid_acc = model.evaluate(valid_generator)[1]\nprint(\"Our Base Model Accuracy on Training Data: \", train_acc)\nprint(\"Our Base Model Accuracy on Validation Data: \", valid_acc)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"aug_train_datagen = ImageDataGenerator(rescale=1./255,\n                                    rotation_range=90,\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')\nvalid_datagen = ImageDataGenerator(rescale=1/255)\n\ntrain_dir = '/kaggle/working/cats-v-dogs/training'\naug_train_generator = train_datagen.flow_from_directory(train_dir, target_size=(150, 150), batch_size=32, class_mode='binary')\n\nvalid_dir = '/kaggle/working/cats-v-dogs/validation'\nvalid_generator = valid_datagen.flow_from_directory(valid_dir,target_size=(150, 150), batch_size=32,class_mode='binary')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"my_callbacks = [ EarlyStopping(monitor='val_loss', patience=5, min_delta=0.001),\n                 ModelCheckpoint('/kaggle/working/weights.best.keras', monitor='val_loss', save_best_only=True)]\n\n# create model\naug_model = Sequential([    Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)),\n                            MaxPooling2D(2, 2),\n                            Conv2D(64, (3,3), activation='relu'),\n                            MaxPooling2D(2,2),\n                            Conv2D(128, (3,3), activation='relu'),\n                            MaxPooling2D(2,2),\n\n                            Flatten(),\n                            Dense(128, activation='relu'),\n                            Dense(1, activation='sigmoid')  ])\n\n# load weights if exists\nif os.path.exists(\"/kaggle/working/weights.best.keras\"):\n    aug_model.load_weights(\"weights.best.keras\")\n\n# Compile model \naug_model.compile(optimizer='adamax', loss='binary_crossentropy', metrics=['accuracy'])\naug_model.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"aug_history = aug_model.fit(aug_train_generator, epochs=5, verbose=1,validation_data=valid_generator, callbacks = my_callbacks)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history_df = pd.DataFrame(aug_history.history)\nhistory_df.loc[:,['loss','val_loss']].plot()\nhistory_df.loc[:,['accuracy','val_accuracy']].plot()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}