{"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":"markdown","source":"**Checking directory and file structure and setting up working directory (folder)**","metadata":{}},{"cell_type":"code","source":"import os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname,filename))","metadata":{"_kg_hide-output":true,"scrolled":true,"execution":{"iopub.status.busy":"2022-12-05T18:41:50.283496Z","iopub.execute_input":"2022-12-05T18:41:50.284086Z","iopub.status.idle":"2022-12-05T18:41:50.321410Z","shell.execute_reply.started":"2022-12-05T18:41:50.283992Z","shell.execute_reply":"2022-12-05T18:41:50.320297Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.path.abspath('')","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-12-05T18:41:50.323913Z","iopub.execute_input":"2022-12-05T18:41:50.324279Z","iopub.status.idle":"2022-12-05T18:41:50.332561Z","shell.execute_reply.started":"2022-12-05T18:41:50.324243Z","shell.execute_reply":"2022-12-05T18:41:50.331416Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_dir = \"/kaggle/working/base_dir\"\nos.mkdir(base_dir)","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-12-05T18:41:50.334028Z","iopub.execute_input":"2022-12-05T18:41:50.334702Z","iopub.status.idle":"2022-12-05T18:41:50.341034Z","shell.execute_reply.started":"2022-12-05T18:41:50.334667Z","shell.execute_reply":"2022-12-05T18:41:50.339960Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Unzipping files to newly created base directory (folder)**","metadata":{}},{"cell_type":"code","source":"! unzip /kaggle/input/dogs-vs-cats/test1.zip -d \"/kaggle/working/base_dir\"","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-12-05T18:41:50.344980Z","iopub.execute_input":"2022-12-05T18:41:50.345743Z","iopub.status.idle":"2022-12-05T18:41:56.996717Z","shell.execute_reply.started":"2022-12-05T18:41:50.345708Z","shell.execute_reply":"2022-12-05T18:41:56.995498Z"},"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"! unzip /kaggle/input/dogs-vs-cats/train.zip -d \"/kaggle/working/base_dir\"","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-12-05T18:41:57.000605Z","iopub.execute_input":"2022-12-05T18:41:57.000970Z"},"scrolled":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Separating cats and dogs images to their respective training and validation folders**","metadata":{}},{"cell_type":"code","source":"validation_dir = os.path.join(base_dir, 'validation')\n\ntrain_dir = os.path.join(base_dir,'train')\ntest_dir = os.path.join(base_dir,'test1')\n\ntrain_cats_dir = os.path.join(train_dir,'cats')\ntrain_dogs_dir = os.path.join(train_dir,'dogs')\n\ntest_dogs_dir = os.path.join(test_dir,'dogs')\ntest_cats_dir = os.path.join(test_dir,'cats')\n\nvalidation_cats_dir = os.path.join(validation_dir,'cats')\nvalidation_dogs_dir = os.path.join(validation_dir,'dogs')\n\nos.mkdir(train_cats_dir)\nos.mkdir(train_dogs_dir)\nos.mkdir(test_dogs_dir)\nos.mkdir(test_cats_dir)\nos.mkdir(validation_dir)\nos.mkdir(validation_cats_dir)\nos.mkdir(validation_dogs_dir)\n","metadata":{"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Copies the first 9,000 cat images to train_cats_dir**","metadata":{}},{"cell_type":"code","source":"import shutil\n\nfnames = ['cat.{}.jpg'.format(i) for i in range(9000)]\nfor fname in fnames:\n    src = os.path.join(train_dir, fname)\n    dst = os.path.join(train_cats_dir, fname)\n    shutil.copyfile(src, dst)","metadata":{"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":" **Sample Cat**","metadata":{}},{"cell_type":"code","source":"from keras.preprocessing import image\nimport matplotlib.pyplot as plt\nimg = image.load_img(os.path.join(train_cats_dir,'cat.10.jpg' ),target_size=(150,150))\nimgplot = plt.imshow(img)\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Moves the first 9,000 dogs images to train_dogs_dir**","metadata":{}},{"cell_type":"code","source":"fnames = ['dog.{}.jpg'.format(i) for i in range(9000)]\nfor fname in fnames:\n    src = os.path.join(train_dir, fname)\n    dst = os.path.join(train_dogs_dir, fname)\n    shutil.move(src, dst)","metadata":{"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Sample Dog**","metadata":{}},{"cell_type":"code","source":"img = image.load_img(os.path.join(train_dogs_dir,'dog.11.jpg' ),target_size=(150,150))\nimgplot = plt.imshow(img)\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Moves last 3500 dogs images to validation_dogs_dir**","metadata":{}},{"cell_type":"code","source":"fnames = ['dog.{}.jpg'.format(i) for i in range(9000,12500)]\nfor fname in fnames:\n    src = os.path.join(train_dir, fname)\n    dst = os.path.join(validation_dogs_dir, fname)\n    shutil.move(src, dst)","metadata":{"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Moves last 3500 cats images to validation_dogs_dir","metadata":{}},{"cell_type":"code","source":"fnames = ['cat.{}.jpg'.format(i) for i in range(9000,12500)]\nfor fname in fnames:\n    src = os.path.join(train_dir, fname)\n    dst = os.path.join(validation_cats_dir, fname)\n    shutil.move(src, dst)","metadata":{"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"! dir /kaggle/working/base_dir/train/","metadata":{"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Defining model**","metadata":{}},{"cell_type":"code","source":"from keras import layers\nfrom keras import models\n\nmodel = models.Sequential()\nmodel.add(layers.Conv2D(64,(3,3),activation='relu', input_shape=(150,150,3)))\nmodel.add(layers.MaxPooling2D((2,2)))\n\nmodel.add(layers.Conv2D(128,(3,3),activation='relu'))\nmodel.add(layers.MaxPooling2D((2,2)))\n\nmodel.add(layers.Conv2D(256,(3,3),activation='relu'))\nmodel.add(layers.MaxPooling2D((2,2)))\n\nmodel.add(layers.Conv2D(256,(3,3),activation='relu'))\nmodel.add(layers.MaxPooling2D((2,2)))\n\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(512, activation='relu'))\nmodel.add(layers.Dense(1,activation='sigmoid'))","metadata":{"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Configuring the model for training","metadata":{}},{"cell_type":"code","source":"from keras import optimizers\nimport tensorflow as tf\nmodel.compile(loss='binary_crossentropy',optimizer=tf.keras.optimizers.RMSprop(learning_rate=1e-4),metrics=['acc'])","metadata":{"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Using ImageDataGenerator to read images from directories","metadata":{}},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n\ntrain_datagen = ImageDataGenerator(rescale=1./255)\ntest_datagen = ImageDataGenerator(rescale=1./255)\n\ntrain_generator = train_datagen.flow_from_directory(train_dir,target_size=(150,150),batch_size=100,class_mode='binary')\nvalidation_generator = test_datagen.flow_from_directory(validation_dir,target_size=(150,150),batch_size=100,class_mode='binary')\n\n","metadata":{"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for data_batch, labels_batch in train_generator:\n    print('data batch shape:',data_batch.shape)\n    print('labels batch shape:', labels_batch.shape)\n    break;","metadata":{"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Fitting the model using a batch generator","metadata":{}},{"cell_type":"code","source":"history = model.fit_generator(train_generator,steps_per_epoch=180,epochs=30,validation_data=validation_generator,validation_steps=70)","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-12-05T19:31:39.200470Z","iopub.execute_input":"2022-12-05T19:31:39.201013Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Accuracy and Loss of Training and Validation Data","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nhistory_frame = pd.DataFrame(history.history)\nhistory_frame.loc[:,['loss','val_loss']].plot()\nhistory_frame.loc[:,['binary_accuracy','val_binary_accuracy']].plot()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Saving the Model","metadata":{}},{"cell_type":"code","source":"model.save('cats_and_dogs_1.h5')","metadata":{"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"! dir /kaggle/working/","metadata":{"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]}]}