{"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 numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nimport os \nimport zipfile\nfrom tqdm import tqdm\nfrom glob import glob\nfrom shutil import copy, move","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-08-28T10:34:39.743727Z","iopub.execute_input":"2021-08-28T10:34:39.744103Z","iopub.status.idle":"2021-08-28T10:34:43.766203Z","shell.execute_reply.started":"2021-08-28T10:34:39.744023Z","shell.execute_reply":"2021-08-28T10:34:43.765337Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Data Preparation","metadata":{}},{"cell_type":"code","source":"zipfile_dir = '../input/dogs-vs-cats/train.zip'\ntrain_dir = zipfile.ZipFile(zipfile_dir, 'r')\ntrain_dir.extractall()\n\nzipfile_dir = '../input/dogs-vs-cats/test1.zip'\ntest_dir = zipfile.ZipFile(zipfile_dir, 'r')\ntest_dir.extractall()","metadata":{"execution":{"iopub.status.busy":"2021-08-28T10:34:43.769752Z","iopub.execute_input":"2021-08-28T10:34:43.770014Z","iopub.status.idle":"2021-08-28T10:35:01.967620Z","shell.execute_reply.started":"2021-08-28T10:34:43.769981Z","shell.execute_reply":"2021-08-28T10:35:01.966774Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TRAIN_DIR = './train'\nTEST_DIR = './test1'\n\ntrain_set = os.listdir(TRAIN_DIR)\ntest_set = os.listdir(TEST_DIR)\n\nprint('#train images: %s'%len(train_set))\nprint('#test images: %s'%len(test_set))\nprint(train_set[:5])\nprint(test_set[:5])","metadata":{"execution":{"iopub.status.busy":"2021-08-28T10:35:01.969366Z","iopub.execute_input":"2021-08-28T10:35:01.969737Z","iopub.status.idle":"2021-08-28T10:35:01.996982Z","shell.execute_reply.started":"2021-08-28T10:35:01.969700Z","shell.execute_reply":"2021-08-28T10:35:01.996046Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dog_train_dir = './training/dog'\ndog_val_dir = './validation/dog'\ncat_train_dir = './training/cat'\ncat_val_dir = './validation/cat'\n\nfile_dirs = [dog_train_dir, dog_val_dir, cat_train_dir, cat_val_dir]\n\nfor dir in file_dirs:\n    os.makedirs(dir,exist_ok = True)","metadata":{"execution":{"iopub.status.busy":"2021-08-28T10:35:01.998528Z","iopub.execute_input":"2021-08-28T10:35:01.998898Z","iopub.status.idle":"2021-08-28T10:35:02.005212Z","shell.execute_reply.started":"2021-08-28T10:35:01.998860Z","shell.execute_reply":"2021-08-28T10:35:02.004436Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_dogs = glob('./train/dog*jpg')\nall_cats = glob('./train/cat*jpg')\n\nprint(len(all_dogs))\nprint(len(all_cats))","metadata":{"execution":{"iopub.status.busy":"2021-08-28T10:35:02.006610Z","iopub.execute_input":"2021-08-28T10:35:02.006963Z","iopub.status.idle":"2021-08-28T10:35:02.127679Z","shell.execute_reply.started":"2021-08-28T10:35:02.006929Z","shell.execute_reply":"2021-08-28T10:35:02.126744Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ndogs_train, dogs_test = train_test_split(all_dogs, test_size=0.1, shuffle=True,random_state = 100)\ncats_train, cats_test = train_test_split(all_cats, test_size=0.1, shuffle=True,random_state = 100)","metadata":{"execution":{"iopub.status.busy":"2021-08-28T10:35:02.128941Z","iopub.execute_input":"2021-08-28T10:35:02.129282Z","iopub.status.idle":"2021-08-28T10:35:03.178247Z","shell.execute_reply.started":"2021-08-28T10:35:02.129247Z","shell.execute_reply":"2021-08-28T10:35:03.177415Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for name in tqdm(dogs_train):\n  copy(name , os.path.join(dog_train_dir , name.split('/')[-1]))\nfor name in tqdm(cats_train):\n  copy(name , os.path.join(cat_train_dir , name.split('/')[-1]))\n  \nfor name in tqdm(dogs_test):\n  copy(name , os.path.join(dog_val_dir , name.split('/')[-1]))\nfor name in tqdm(cats_test):\n  copy(name , os.path.join(cat_val_dir , name.split('/')[-1]))","metadata":{"execution":{"iopub.status.busy":"2021-08-28T10:35:03.181419Z","iopub.execute_input":"2021-08-28T10:35:03.181713Z","iopub.status.idle":"2021-08-28T10:35:05.820323Z","shell.execute_reply.started":"2021-08-28T10:35:03.181686Z","shell.execute_reply":"2021-08-28T10:35:05.819279Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(os.listdir(dog_train_dir)))\nprint(len(os.listdir(cat_train_dir)))\nprint(len(os.listdir(dog_val_dir)))\nprint(len(os.listdir(cat_val_dir)))","metadata":{"execution":{"iopub.status.busy":"2021-08-28T10:35:05.822970Z","iopub.execute_input":"2021-08-28T10:35:05.823358Z","iopub.status.idle":"2021-08-28T10:35:05.844112Z","shell.execute_reply.started":"2021-08-28T10:35:05.823317Z","shell.execute_reply":"2021-08-28T10:35:05.843048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Data Preprocessing","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\nTRAINING_DIR = './training'\ntrain_datagen = ImageDataGenerator(rescale=1 / 255)\ntrain_generator = train_datagen.flow_from_directory(\n    TRAINING_DIR,\n    batch_size=64,\n    class_mode='binary',\n    target_size=(150, 150)\n)\n\nVALIDATION_DIR = './validation'\nvalidation_datagen = ImageDataGenerator(rescale=1/255)\nvalidation_generator = validation_datagen.flow_from_directory(\n    VALIDATION_DIR,\n    batch_size = 64,\n    class_mode = 'binary',\n    target_size = (150, 150)\n)","metadata":{"execution":{"iopub.status.busy":"2021-08-28T10:35:05.845720Z","iopub.execute_input":"2021-08-28T10:35:05.846209Z","iopub.status.idle":"2021-08-28T10:35:07.430201Z","shell.execute_reply.started":"2021-08-28T10:35:05.846173Z","shell.execute_reply":"2021-08-28T10:35:07.429292Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Model Creation","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, Dense, MaxPool2D, Flatten, Dropout\n\nmodel = Sequential()\nmodel.add(Conv2D(64, (3,3), strides=(1,1), padding='same', activation='relu',kernel_initializer='he_normal',input_shape=(150, 150, 3)))\nmodel.add(Conv2D(64, (3,3), strides=(1,1), padding='same', activation='relu',kernel_initializer='he_normal'))\nmodel.add(MaxPool2D((2,2)))\nmodel.add(Dropout(0.4))\n\nmodel.add(Conv2D(128, (3,3), strides=(1,1), padding='same', activation='relu',kernel_initializer='he_normal'))\nmodel.add(Conv2D(128, (3,3), strides=(1,1), padding='same', activation='relu',kernel_initializer='he_normal'))\nmodel.add(Conv2D(128, (3,3), strides=(1,1), padding='same', activation='relu',kernel_initializer='he_normal'))\nmodel.add(MaxPool2D((2,2)))\nmodel.add(Dropout(0.4))\n\nmodel.add(Conv2D(256, (3,3), strides=(1,1), padding='same', activation='relu',kernel_initializer='he_normal'))\nmodel.add(Dropout(0.4))\nmodel.add(Conv2D(256, (3,3), strides=(1,1), padding='same', activation='relu',kernel_initializer='he_normal'))\nmodel.add(Dropout(0.4))\nmodel.add(Conv2D(256, (3,3), strides=(1,1), padding='same', activation='relu',kernel_initializer='he_normal'))\nmodel.add(MaxPool2D((2,2)))\nmodel.add(Dropout(0.4))\n\nmodel.add(Conv2D(512, (3,3), strides=(1,1), padding='same', activation='relu',kernel_initializer='he_normal'))\nmodel.add(Dropout(0.4))\nmodel.add(Conv2D(512, (3,3), strides=(1,1), padding='same', activation='relu',kernel_initializer='he_normal'))\nmodel.add(Dropout(0.4))\nmodel.add(Conv2D(512, (3,3), strides=(1,1), padding='same', activation='relu',kernel_initializer='he_normal'))\nmodel.add(MaxPool2D((2,2)))\nmodel.add(Dropout(0.4))\n\nmodel.add(Flatten())\nmodel.add(Dense(units=1024, activation='relu'))\nmodel.add(Dropout(0.4))\nmodel.add(Dense(units=1024, activation='relu'))\nmodel.add(Dropout(0.4))\nmodel.add(Dense(units=1024, activation='relu'))\nmodel.add(Dropout(0.4))\nmodel.add(Dense(units=1, activation='sigmoid'))","metadata":{"execution":{"iopub.status.busy":"2021-08-28T12:11:01.879230Z","iopub.execute_input":"2021-08-28T12:11:01.879662Z","iopub.status.idle":"2021-08-28T12:11:02.058683Z","shell.execute_reply.started":"2021-08-28T12:11:01.879618Z","shell.execute_reply":"2021-08-28T12:11:02.057836Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2021-08-28T12:11:02.060195Z","iopub.execute_input":"2021-08-28T12:11:02.060590Z","iopub.status.idle":"2021-08-28T12:11:02.080703Z","shell.execute_reply.started":"2021-08-28T12:11:02.060506Z","shell.execute_reply":"2021-08-28T12:11:02.079962Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"check_point_path = './best.h5'\nmodel_checkpoint = tf.keras.callbacks.ModelCheckpoint(\n    filepath = check_point_path,\n    monitor = 'val_accuracy',\n    save_weights_only=False,\n    save_best_only=True,\n    verbose=1\n)","metadata":{"execution":{"iopub.status.busy":"2021-08-28T12:11:02.181704Z","iopub.execute_input":"2021-08-28T12:11:02.181962Z","iopub.status.idle":"2021-08-28T12:11:02.188518Z","shell.execute_reply.started":"2021-08-28T12:11:02.181927Z","shell.execute_reply":"2021-08-28T12:11:02.187754Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer = tf.keras.optimizers.Adam(0.0005,decay=1e-5),\n             loss = 'binary_crossentropy',\n             metrics = ['acc'])","metadata":{"execution":{"iopub.status.busy":"2021-08-28T12:11:02.523621Z","iopub.execute_input":"2021-08-28T12:11:02.523877Z","iopub.status.idle":"2021-08-28T12:11:02.534699Z","shell.execute_reply.started":"2021-08-28T12:11:02.523853Z","shell.execute_reply":"2021-08-28T12:11:02.533896Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Num Params : ',model.count_params())\nmodel_history = model.fit(\n    train_generator,\n    epochs=50,\n    verbose=1,\n    callbacks = [model_checkpoint],\n    validation_data=validation_generator\n)","metadata":{"execution":{"iopub.status.busy":"2021-08-28T12:11:03.186002Z","iopub.execute_input":"2021-08-28T12:11:03.186316Z","iopub.status.idle":"2021-08-28T13:28:55.176273Z","shell.execute_reply.started":"2021-08-28T12:11:03.186288Z","shell.execute_reply":"2021-08-28T13:28:55.175463Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Model Evaluation","metadata":{}},{"cell_type":"markdown","source":"Plotting Loss and Accuracy","metadata":{}},{"cell_type":"code","source":"%matplotlib inline\n\nimport matplotlib.image  as mpimg\nimport matplotlib.pyplot as plt\n\n#-----------------------------------------------------------\n# Retrieve a list of list results on training and test data\n# sets for each training epoch\n#-----------------------------------------------------------\nacc=model_history.history['acc']\nval_acc=model_history.history['val_acc']\nloss=model_history.history['loss']\nval_loss=model_history.history['val_loss']\n\nepochs=range(len(acc)) # Get number of epochs\n\n#------------------------------------------------\n# Plot training and validation accuracy per epoch\n#------------------------------------------------\nplt.plot(epochs, acc, 'r')\nplt.plot(epochs, val_acc, 'b')\nplt.title('Training and validation accuracy')\nplt.xlabel('epochs')\nplt.ylabel('accuracy')\nplt.legend([\"Training Accuracy\",\"Validation Accuracy\"])\nplt.show()\n\n#------------------------------------------------\n# Plot training and validation loss per epoch\n#------------------------------------------------\nplt.plot(epochs, loss, 'r')\nplt.plot(epochs, val_loss, 'b')\nplt.title('Training and validation loss')\nplt.title('Training and validation loss')\nplt.xlabel('epochs')\nplt.ylabel('loss')\nplt.legend([\"Training Loss\",\"Validation Loss\"])\nplt.show()\n\n# Desired output. Charts with training and validation metrics. ","metadata":{"execution":{"iopub.status.busy":"2021-08-28T13:36:09.952107Z","iopub.execute_input":"2021-08-28T13:36:09.952426Z","iopub.status.idle":"2021-08-28T13:36:10.239833Z","shell.execute_reply.started":"2021-08-28T13:36:09.952396Z","shell.execute_reply":"2021-08-28T13:36:10.238859Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_file = os.listdir(\"./test1\")\ntest_df = pd.DataFrame({\n    'filename': test_file\n})\ntest_df","metadata":{"execution":{"iopub.status.busy":"2021-08-28T13:36:22.630991Z","iopub.execute_input":"2021-08-28T13:36:22.631373Z","iopub.status.idle":"2021-08-28T13:36:22.653048Z","shell.execute_reply.started":"2021-08-28T13:36:22.631337Z","shell.execute_reply":"2021-08-28T13:36:22.652082Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TESTING_DIR = './test1'\ntest_generator = train_datagen.flow_from_dataframe(\n    test_df,\n    directory = TESTING_DIR,\n    x_col='filename',\n    y_col=None,\n    batch_size=64,\n    target_size=(150, 150),\n    shuffle = False,\n    class_mode = None\n)","metadata":{"execution":{"iopub.status.busy":"2021-08-28T13:36:26.110228Z","iopub.execute_input":"2021-08-28T13:36:26.110563Z","iopub.status.idle":"2021-08-28T13:36:26.217314Z","shell.execute_reply.started":"2021-08-28T13:36:26.110516Z","shell.execute_reply":"2021-08-28T13:36:26.216259Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_generator.reset()\ny_pred = model.predict(test_generator)","metadata":{"execution":{"iopub.status.busy":"2021-08-28T13:36:28.910193Z","iopub.execute_input":"2021-08-28T13:36:28.910566Z","iopub.status.idle":"2021-08-28T13:37:01.793202Z","shell.execute_reply.started":"2021-08-28T13:36:28.910515Z","shell.execute_reply":"2021-08-28T13:37:01.792321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"To see the class mapping of dogs and cats, we have to see class_indices from training dataset","metadata":{}},{"cell_type":"code","source":"train_generator.class_indices","metadata":{"execution":{"iopub.status.busy":"2021-08-28T13:38:47.975088Z","iopub.execute_input":"2021-08-28T13:38:47.975410Z","iopub.status.idle":"2021-08-28T13:38:47.981695Z","shell.execute_reply.started":"2021-08-28T13:38:47.975380Z","shell.execute_reply":"2021-08-28T13:38:47.980658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Let's make labels","metadata":{}},{"cell_type":"code","source":"y_pred_classification = np.where(y_pred > 0.5, 1, 0)\ny_pred_classification","metadata":{"execution":{"iopub.status.busy":"2021-08-28T13:48:46.014019Z","iopub.execute_input":"2021-08-28T13:48:46.014351Z","iopub.status.idle":"2021-08-28T13:48:46.021038Z","shell.execute_reply.started":"2021-08-28T13:48:46.014321Z","shell.execute_reply":"2021-08-28T13:48:46.020166Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Seeing some results","metadata":{}},{"cell_type":"code","source":"test_generator.reset()\ntest_images = test_generator[0][:9]\n\nfig, ax = plt.subplots(3,3)\nfig.set_size_inches(10,10)\nfor i, img in enumerate(test_images):\n    ax[i//3][i%3].imshow(img)\n    if y_pred_classification[i]==1:\n        label = 'Dog'\n    else:\n        label = 'Cat'\n    ax[i//3][i%3].set_title(label)","metadata":{"execution":{"iopub.status.busy":"2021-08-28T13:51:17.363337Z","iopub.execute_input":"2021-08-28T13:51:17.363670Z","iopub.status.idle":"2021-08-28T13:51:18.892331Z","shell.execute_reply.started":"2021-08-28T13:51:17.363638Z","shell.execute_reply":"2021-08-28T13:51:18.891414Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Visualizing first 9 filters","metadata":{}},{"cell_type":"code","source":"model.layers","metadata":{"execution":{"iopub.status.busy":"2021-08-28T13:54:47.602737Z","iopub.execute_input":"2021-08-28T13:54:47.603058Z","iopub.status.idle":"2021-08-28T13:54:47.610293Z","shell.execute_reply.started":"2021-08-28T13:54:47.603032Z","shell.execute_reply":"2021-08-28T13:54:47.609227Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"first_conv = model.layers[0]\noutput_layer1 = first_conv(test_images)[4]\n\nprint(output_layer1.shape)\nfig, ax = plt.subplots(3,3)\nfig.set_size_inches(10,10)\nfor i in range(9):\n  ax[i//3][i%3].imshow(output_layer1[:,:,i])","metadata":{"execution":{"iopub.status.busy":"2021-08-28T13:55:16.984985Z","iopub.execute_input":"2021-08-28T13:55:16.985303Z","iopub.status.idle":"2021-08-28T13:55:17.920131Z","shell.execute_reply.started":"2021-08-28T13:55:16.985273Z","shell.execute_reply":"2021-08-28T13:55:17.919162Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Submition","metadata":{}},{"cell_type":"code","source":"submission = pd.read_csv('../input/dogs-vs-cats/sampleSubmission.csv')\nsubmission['label'] = y_pred_classification\nsubmission","metadata":{"execution":{"iopub.status.busy":"2021-08-28T14:10:02.970833Z","iopub.execute_input":"2021-08-28T14:10:02.971163Z","iopub.status.idle":"2021-08-28T14:10:02.998337Z","shell.execute_reply.started":"2021-08-28T14:10:02.971133Z","shell.execute_reply":"2021-08-28T14:10:02.997539Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv',index='False')","metadata":{"execution":{"iopub.status.busy":"2021-08-28T14:10:09.862232Z","iopub.execute_input":"2021-08-28T14:10:09.862583Z","iopub.status.idle":"2021-08-28T14:10:09.897462Z","shell.execute_reply.started":"2021-08-28T14:10:09.862533Z","shell.execute_reply":"2021-08-28T14:10:09.896705Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}