{"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":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"\n","metadata":{"execution":{"iopub.status.busy":"2024-05-15T10:57:17.760812Z","iopub.execute_input":"2024-05-15T10:57:17.761409Z","iopub.status.idle":"2024-05-15T10:57:29.376970Z","shell.execute_reply.started":"2024-05-15T10:57:17.761375Z","shell.execute_reply":"2024-05-15T10:57:29.375998Z"}}},{"cell_type":"markdown","source":"<div style=\"text-align:center;\">\n    <h2>Cats vs Dogs Classification using different variations of VGG-16 architecture</h2>\n</div>\n","metadata":{}},{"cell_type":"markdown","source":"<div style=\"text-align:center;\">\n    <img src=\"https://www.thetimes.co.uk/imageserver/image/%2Fmethode%2Ftimes%2Fprod%2Fweb%2Fbin%2F31cd9f59-3c4a-4159-a46c-b93e2c502b6b.jpg?crop=2916%2C2825%2C0%2C451\" alt=\"Image Description\" width=\"500\" height=\"200\">\n</div>   \n","metadata":{}},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:black; color:white; height: 3rem; border-radius: 10px;\">\n    <h3 style='padding:10px'>Importing Libraries</h3>\n</div>","metadata":{}},{"cell_type":"code","source":"# Basic\nimport warnings\nwarnings.filterwarnings('ignore')\n\nimport os\nfrom os import makedirs # make directory\nfrom os import listdir # list directories\nfrom shutil import copyfile\nfrom random import seed\nfrom random import random\nimport numpy as np\nimport pandas as pd\n\n# visuals\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom matplotlib.image import imread # Used to read images\nfrom PIL import Image # Image Visulization\n\n# Scikit-learn\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import classification_report,confusion_matrix,ConfusionMatrixDisplay\n\n# Tensorflow\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential \nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.layers import Dense,MaxPooling2D,Dropout,Flatten,BatchNormalization,Conv2D\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau,EarlyStopping","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:23.801639Z","iopub.execute_input":"2024-05-15T14:14:23.802021Z","iopub.status.idle":"2024-05-15T14:14:23.810902Z","shell.execute_reply.started":"2024-05-15T14:14:23.801989Z","shell.execute_reply":"2024-05-15T14:14:23.809782Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Data Extraction","metadata":{}},{"cell_type":"code","source":"train_path = \"../input/dogs-vs-cats/test1.zip\"\ntest_path = \"../input/dogs-vs-cats/train.zip\"\n\nfiles = \"/kaggle/working/\"\n\n# zipfile - python module for extracting files from a zip file\nimport zipfile\n\nwith zipfile.ZipFile(train_path, 'r') as zipp:\n    zipp.extractall(files)\n    \nwith zipfile.ZipFile(test_path, 'r') as zipp:\n    zipp.extractall(files)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:23.965004Z","iopub.execute_input":"2024-05-15T14:14:23.965319Z","iopub.status.idle":"2024-05-15T14:14:36.093234Z","shell.execute_reply.started":"2024-05-15T14:14:23.965293Z","shell.execute_reply":"2024-05-15T14:14:36.092350Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_dir = \"../working/train/\"\n\nfilenames = os.listdir(image_dir)\nlabels = [x.split(\".\")[0] for x in filenames]\n\ndata = pd.DataFrame({\"filename\": filenames, \"label\": labels})\n\ndata.head()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:36.095057Z","iopub.execute_input":"2024-05-15T14:14:36.095391Z","iopub.status.idle":"2024-05-15T14:14:36.140171Z","shell.execute_reply.started":"2024-05-15T14:14:36.095364Z","shell.execute_reply":"2024-05-15T14:14:36.139182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"The shape of the data : \",data.shape)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:36.141241Z","iopub.execute_input":"2024-05-15T14:14:36.141506Z","iopub.status.idle":"2024-05-15T14:14:36.146646Z","shell.execute_reply.started":"2024-05-15T14:14:36.141482Z","shell.execute_reply":"2024-05-15T14:14:36.145500Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:black; color:white; height: 3rem; border-radius: 10px;\">\n    <h3 style='padding:10px'>Visualize some images</h3>\n</div>","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(20,20)) # specifying the overall grid size\nplt.subplots_adjust(hspace=0.4)\n\n\nfor i in range(5):\n    \n    plt.subplot(10, 14,i+1)    # the number of images in the grid is 10*10 (100)\n    filename = 'train/' + 'dog.' + str(i) + '.jpg'\n    image = imread(filename)\n    plt.imshow(image)\n    plt.title('Dog',fontsize=12)\n    plt.axis('off')\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:36.149291Z","iopub.execute_input":"2024-05-15T14:14:36.149688Z","iopub.status.idle":"2024-05-15T14:14:36.835933Z","shell.execute_reply.started":"2024-05-15T14:14:36.149660Z","shell.execute_reply":"2024-05-15T14:14:36.834963Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nplt.figure(figsize=(20,20)) # specifying the overall grid size\nplt.subplots_adjust(hspace=0.4)\n\n\nfor i in range(5):\n    \n    plt.subplot(1,5,i+1)    # the number of images in the grid is 10*10 (100)\n    filename = 'train/' + 'cat.' + str(i) + '.jpg'\n    image = imread(filename)\n    plt.imshow(image)\n    plt.title('Cat',fontsize=12)\n    plt.axis('off')\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:36.837176Z","iopub.execute_input":"2024-05-15T14:14:36.837472Z","iopub.status.idle":"2024-05-15T14:14:37.931117Z","shell.execute_reply.started":"2024-05-15T14:14:36.837446Z","shell.execute_reply":"2024-05-15T14:14:37.930196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:black; color:white; height: 3rem; border-radius: 10px;\">\n    <h3 style='padding:10px'>Splitting into training and vlaidation sets</h3>\n</div>","metadata":{}},{"cell_type":"code","source":"# train test split using dataframe\n\nlabels = data['label']\n\n# 20% split\n# 80%.    20%\nX_train, X_temp = train_test_split(data, test_size=0.2, stratify=labels, random_state = 42)\n\nlabel_test_val = X_temp['label']\n\n# 10%.   10%\nX_test, X_val = train_test_split(X_temp, test_size=0.5, stratify=label_test_val, random_state = 42)\n\nprint('The shape of train data',X_train.shape)\nprint('The shape of test data',X_test.shape)\nprint('The shape of validation data',X_val.shape)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:37.932495Z","iopub.execute_input":"2024-05-15T14:14:37.932858Z","iopub.status.idle":"2024-05-15T14:14:38.005244Z","shell.execute_reply.started":"2024-05-15T14:14:37.932829Z","shell.execute_reply":"2024-05-15T14:14:38.004049Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# create directories\ndataset_home = 'dataset_dogs_vs_cats/'\nsubdirs = ['train/', 'test/']\n\nfor subdir in subdirs:\n    # create label subdirectories\n    labeldirs = ['dogs/', 'cats/']\n    for labldir in labeldirs:\n        newdir = dataset_home + subdir + labldir\n        makedirs(newdir, exist_ok=True) # Create 4 directories\n# seed random number generator\nseed(1)\n# define ratio of pictures to use for validation\nval_ratio = 0.2\n# copy training dataset images into subdirectories\nsrc_directory = 'train/'\nfor file in listdir(src_directory):\n        src = src_directory + '/' + file\n        dst_dir = 'train/'\n        if random() < val_ratio:\n            dst_dir = 'test/'\n        if file.startswith('cat'):\n            dst = dataset_home + dst_dir + 'cats/' + file\n            copyfile(src, dst)\n        elif file.startswith('dog'):\n            dst = dataset_home + dst_dir + 'dogs/' + file\n            copyfile(src, dst)\n\n            \npath1 = \"/kaggle/working/dataset_dogs_vs_cats/train/cats\"\npath2 = \"/kaggle/working/dataset_dogs_vs_cats/train/dogs\"\npath3 = \"/kaggle/working/dataset_dogs_vs_cats/test/cats\"\npath4 = \"/kaggle/working/dataset_dogs_vs_cats/test/dogs\"\n\n\nprint('Then number of cat images in training data is' ,len(os.listdir(path1)))\nprint('Then number of dog images in training data is' ,len(os.listdir(path2)))\nprint('Then number of cat images in validation data is' ,len(os.listdir(path3)))\nprint('Then number of dog images in validation data is' ,len(os.listdir(path4)))","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:38.006904Z","iopub.execute_input":"2024-05-15T14:14:38.007351Z","iopub.status.idle":"2024-05-15T14:14:41.509009Z","shell.execute_reply.started":"2024-05-15T14:14:38.007314Z","shell.execute_reply":"2024-05-15T14:14:41.508040Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# parameters\nimage_size = 128 # Size of the image\nimage_channel = 3 # Colour scale (RGB)\nbat_size = 32 # Number of files/images processed at once","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:41.510104Z","iopub.execute_input":"2024-05-15T14:14:41.510496Z","iopub.status.idle":"2024-05-15T14:14:41.515052Z","shell.execute_reply.started":"2024-05-15T14:14:41.510467Z","shell.execute_reply":"2024-05-15T14:14:41.514187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Creating image data generator\n# Preprocess images ==> Feature Engineering for Images\ntrain_datagen = ImageDataGenerator(rescale=1./255)\n\ntest_datagen = ImageDataGenerator(rescale=1./255)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:41.516140Z","iopub.execute_input":"2024-05-15T14:14:41.516404Z","iopub.status.idle":"2024-05-15T14:14:41.522918Z","shell.execute_reply.started":"2024-05-15T14:14:41.516382Z","shell.execute_reply":"2024-05-15T14:14:41.522033Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:black; color:white; height: 3rem; border-radius: 10px;\">\n    <h3 style='padding:10px'>Using Dataframe</h3>\n</div>","metadata":{}},{"cell_type":"code","source":"X_val.head()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:41.526771Z","iopub.execute_input":"2024-05-15T14:14:41.527061Z","iopub.status.idle":"2024-05-15T14:14:41.536174Z","shell.execute_reply.started":"2024-05-15T14:14:41.527038Z","shell.execute_reply":"2024-05-15T14:14:41.535328Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Applying image data gernerator to train and test data\n\ntrain_generator = train_datagen.flow_from_dataframe(X_train,\n                                                    directory = 'train/',\n                                                    x_col= 'filename',\n                                                    y_col= 'label',\n                                                    batch_size = bat_size,\n                                                    target_size = (image_size,image_size)\n                                                   )\nval_generator = test_datagen.flow_from_dataframe(X_val, \n                                                 directory = 'train/',\n                                                 x_col= 'filename',\n                                                 y_col= 'label',\n                                                 batch_size = bat_size,\n                                                 target_size = (image_size,image_size),\n                                                 shuffle=False\n                                                )\n\ntest_generator = test_datagen.flow_from_dataframe(X_test, \n                                                  directory = 'train/',\n                                                  x_col= 'filename',\n                                                  y_col= 'label',\n                                                  batch_size = bat_size,\n                                                  target_size = (image_size,image_size),\n                                                  shuffle=False\n                                                 )","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:41.537407Z","iopub.execute_input":"2024-05-15T14:14:41.537691Z","iopub.status.idle":"2024-05-15T14:14:41.859348Z","shell.execute_reply.started":"2024-05-15T14:14:41.537666Z","shell.execute_reply":"2024-05-15T14:14:41.858500Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Using Directory","metadata":{}},{"cell_type":"code","source":"train_gen = train_datagen.flow_from_directory('/kaggle/working/dataset_dogs_vs_cats/train/', \n                                              class_mode='binary',\n                                              target_size = (image_size,image_size),\n                                              batch_size = bat_size,\n                                             )\n\nval_gen = test_datagen.flow_from_directory('/kaggle/working/dataset_dogs_vs_cats/test/', \n                                          class_mode='binary',\n                                          batch_size = bat_size,\n                                          target_size = (image_size,image_size),\n                                          shuffle = False\n                                         )","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:41.860491Z","iopub.execute_input":"2024-05-15T14:14:41.860778Z","iopub.status.idle":"2024-05-15T14:14:42.574218Z","shell.execute_reply.started":"2024-05-15T14:14:41.860752Z","shell.execute_reply":"2024-05-15T14:14:42.573421Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:black; color:white; height: 5rem; border-radius: 10px;\">\n    <h2 style='padding:20px'>VGG-16 Model</h2>\n</div>","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense\n\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense\n\ndef VGG16_one(input_shape=(224, 224, 3)):\n    \"\"\"Instantiates the VGG16 architecture for binary classification.\n\n    # Arguments\n        input_shape: optional shape tuple, only to be specified\n            if `include_top` is False (otherwise the input shape\n            has to be `(224, 224, 3)` (with `channels_last` data format)\n            or `(3, 224, 244)` (with `channels_first` data format).\n            It should have exactly 3 inputs channels,\n            and width and height should be no smaller than 48.\n            E.g. `(200, 200, 3)` would be one valid value.\n\n    # Returns\n        A Keras model instance.\n    \"\"\"\n    img_input = Input(shape=input_shape)\n\n    # Block 1\n    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(img_input)\n    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)\n\n    # Block 2\n    x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)\n    x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)\n\n    # Block 3\n    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)\n    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x)\n    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)\n\n    # Block 4\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2')(x)\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)\n\n    # Block 5\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2')(x)\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)\n\n    # Classification block\n    x = Flatten(name='flatten')(x)\n    x = Dense(4096, activation='relu', name='fc1')(x)\n    x = Dense(4096, activation='relu', name='fc2')(x)\n    output = Dense(2, activation='softmax', name='predictions')(x)\n\n    # Create model\n    model = Model(img_input, output, name='vgg16_one')\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:42.575340Z","iopub.execute_input":"2024-05-15T14:14:42.575608Z","iopub.status.idle":"2024-05-15T14:14:42.597193Z","shell.execute_reply.started":"2024-05-15T14:14:42.575584Z","shell.execute_reply":"2024-05-15T14:14:42.596195Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_one = VGG16_one(input_shape=(image_size, image_size, image_channel))\nmodel_one.summary()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:42.598609Z","iopub.execute_input":"2024-05-15T14:14:42.599183Z","iopub.status.idle":"2024-05-15T14:14:42.731252Z","shell.execute_reply.started":"2024-05-15T14:14:42.599148Z","shell.execute_reply":"2024-05-15T14:14:42.730374Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learning_rate_reduction = ReduceLROnPlateau(monitor = 'val_accuracy',\n                                            patience=2,\n                                            factor=0.5,\n                                            min_lr = 0.00001,\n                                            verbose = 1)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:42.732459Z","iopub.execute_input":"2024-05-15T14:14:42.732740Z","iopub.status.idle":"2024-05-15T14:14:42.737286Z","shell.execute_reply.started":"2024-05-15T14:14:42.732715Z","shell.execute_reply":"2024-05-15T14:14:42.736347Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_one.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:42.738565Z","iopub.execute_input":"2024-05-15T14:14:42.738852Z","iopub.status.idle":"2024-05-15T14:14:42.749364Z","shell.execute_reply.started":"2024-05-15T14:14:42.738829Z","shell.execute_reply":"2024-05-15T14:14:42.748462Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_one_logs = model_one.fit(train_generator,\n                    validation_data = val_generator, \n                    callbacks=[learning_rate_reduction],\n                    epochs = 5)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:14:42.750437Z","iopub.execute_input":"2024-05-15T14:14:42.750715Z","iopub.status.idle":"2024-05-15T14:22:25.770715Z","shell.execute_reply.started":"2024-05-15T14:14:42.750673Z","shell.execute_reply":"2024-05-15T14:22:25.769945Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Loss curves</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"def pred_loss(logs):\n    # plots for accuracy and Loss with epochs\n    error = pd.DataFrame(logs.history)\n\n    plt.figure(figsize=(18,5),dpi=200)\n    sns.set_style('darkgrid')\n\n    plt.subplot(121)\n    plt.title('Model Accuracy/Loss',fontsize=15)\n    plt.xlabel('Epochs',fontsize=12)\n    plt.plot(error['loss'])\n    plt.plot(error['accuracy'])\n\n    plt.subplot(122)\n    plt.title('Validation Accuracy/Loss',fontsize=15)\n    plt.xlabel('Epochs',fontsize=12)\n    plt.plot(error['val_loss'])\n    plt.plot(error['val_accuracy'])\n\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:22:25.772312Z","iopub.execute_input":"2024-05-15T14:22:25.772920Z","iopub.status.idle":"2024-05-15T14:22:25.780018Z","shell.execute_reply.started":"2024-05-15T14:22:25.772885Z","shell.execute_reply":"2024-05-15T14:22:25.779000Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_loss(model_one_logs)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:22:25.781207Z","iopub.execute_input":"2024-05-15T14:22:25.781788Z","iopub.status.idle":"2024-05-15T14:22:26.650773Z","shell.execute_reply.started":"2024-05-15T14:22:25.781756Z","shell.execute_reply":"2024-05-15T14:22:26.649789Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Evaluation</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"def evaluate_loss(model):\n    # Evaluate for train generator\n    loss,acc = model.evaluate(train_generator,batch_size = bat_size, verbose = 0)\n\n    print('The accuracy of the model for training data is:',acc*100)\n    print('The Loss of the model for training data is:',loss)\n\n    # Evaluvate for validation generator\n    loss,acc = model.evaluate(val_generator,batch_size = bat_size, verbose = 0)\n\n    print('The accuracy of the model for validation data is:',acc*100)\n    print('The Loss of the model for validation data is:',loss)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:22:26.652299Z","iopub.execute_input":"2024-05-15T14:22:26.652608Z","iopub.status.idle":"2024-05-15T14:22:26.658896Z","shell.execute_reply.started":"2024-05-15T14:22:26.652582Z","shell.execute_reply":"2024-05-15T14:22:26.657964Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"evaluate_loss(model_one)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:22:26.660312Z","iopub.execute_input":"2024-05-15T14:22:26.661034Z","iopub.status.idle":"2024-05-15T14:22:58.911162Z","shell.execute_reply.started":"2024-05-15T14:22:26.661007Z","shell.execute_reply":"2024-05-15T14:22:58.910175Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Confusion matrix</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"def prediction(model):\n    # prediction\n    result = model.predict(test_generator,batch_size = bat_size,verbose = 0)\n\n    y_pred = np.argmax(result, axis = 1)\n\n    y_true = test_generator.labels\n\n    # Evaluate\n    loss,acc = model.evaluate(test_generator, batch_size = bat_size, verbose = 0)\n\n    print('The accuracy of the model for testing data is:',acc*100)\n    print('The Loss of the model for testing data is:',loss)\n    \n    cm = confusion_matrix(y_true,y_pred) \n    plt.figure(figsize=(8, 6))\n    sns.heatmap(cm, annot=True, cmap='Blues', fmt='g')\n    plt.xlabel('Predicted')\n    plt.ylabel('Actual')\n    plt.title('Confusion Matrix')\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:22:58.912770Z","iopub.execute_input":"2024-05-15T14:22:58.913154Z","iopub.status.idle":"2024-05-15T14:22:58.920801Z","shell.execute_reply.started":"2024-05-15T14:22:58.913104Z","shell.execute_reply":"2024-05-15T14:22:58.919841Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prediction(model_one)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:22:58.922203Z","iopub.execute_input":"2024-05-15T14:22:58.922591Z","iopub.status.idle":"2024-05-15T14:23:07.712300Z","shell.execute_reply.started":"2024-05-15T14:22:58.922557Z","shell.execute_reply":"2024-05-15T14:23:07.711383Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:black; color:white; height: 5rem; border-radius: 10px;\">\n    <h2 style='padding:20px'>VGG-16 Model Two</h2>\n</div>","metadata":{}},{"cell_type":"markdown","source":"<center>\n    <h5>Adding batch norm and dropout to all the layers</h5></center>","metadata":{}},{"cell_type":"code","source":"def VGG16_two(input_shape=(224, 224, 3), num_classes=2):\n    model = Sequential()\n\n    # Block 1\n    model.add(Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=input_shape))\n    model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dropout(0.2))\n\n    # Block 2\n    model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))\n    model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dropout(0.2))\n\n    # Block 3\n    model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))\n    model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))\n    model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dropout(0.2))\n\n    # Block 4\n    model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))\n    model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))\n    model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dropout(0.2))\n\n    # Block 5\n    model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))\n    model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))\n    model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Dropout(0.2))\n\n    # Fully Connected layers\n    model.add(Flatten())\n    model.add(Dense(512, activation='relu'))\n    model.add(BatchNormalization())\n    model.add(Dropout(0.2))\n\n    # Output layer\n    model.add(Dense(num_classes, activation='softmax'))\n\n    return model\n","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:23:07.713925Z","iopub.execute_input":"2024-05-15T14:23:07.714385Z","iopub.status.idle":"2024-05-15T14:23:07.727940Z","shell.execute_reply.started":"2024-05-15T14:23:07.714349Z","shell.execute_reply":"2024-05-15T14:23:07.726797Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_two = VGG16_two(input_shape=(image_size, image_size, image_channel))\nmodel_two.summary()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:23:07.729209Z","iopub.execute_input":"2024-05-15T14:23:07.729463Z","iopub.status.idle":"2024-05-15T14:23:08.164045Z","shell.execute_reply.started":"2024-05-15T14:23:07.729441Z","shell.execute_reply":"2024-05-15T14:23:08.163101Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_two.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:23:08.165489Z","iopub.execute_input":"2024-05-15T14:23:08.166183Z","iopub.status.idle":"2024-05-15T14:23:08.174510Z","shell.execute_reply.started":"2024-05-15T14:23:08.166146Z","shell.execute_reply":"2024-05-15T14:23:08.173687Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_two_logs = model_two.fit(train_generator,\n                    validation_data = val_generator, \n                    callbacks=[learning_rate_reduction],\n                    epochs = 5)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:23:08.175620Z","iopub.execute_input":"2024-05-15T14:23:08.176219Z","iopub.status.idle":"2024-05-15T14:27:42.347226Z","shell.execute_reply.started":"2024-05-15T14:23:08.176186Z","shell.execute_reply":"2024-05-15T14:27:42.346407Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Loss curve</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"pred_loss(model_two_logs)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:27:42.353950Z","iopub.execute_input":"2024-05-15T14:27:42.354279Z","iopub.status.idle":"2024-05-15T14:27:43.221194Z","shell.execute_reply.started":"2024-05-15T14:27:42.354244Z","shell.execute_reply":"2024-05-15T14:27:43.220257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Model Evaluation</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"evaluate_loss(model_two)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:27:43.222374Z","iopub.execute_input":"2024-05-15T14:27:43.222662Z","iopub.status.idle":"2024-05-15T14:28:14.287011Z","shell.execute_reply.started":"2024-05-15T14:27:43.222636Z","shell.execute_reply":"2024-05-15T14:28:14.285811Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Confusion matrix</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"prediction(model_two)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:28:14.288697Z","iopub.execute_input":"2024-05-15T14:28:14.289195Z","iopub.status.idle":"2024-05-15T14:28:22.758494Z","shell.execute_reply.started":"2024-05-15T14:28:14.289158Z","shell.execute_reply":"2024-05-15T14:28:22.756891Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:black; color:white; height: 5rem; border-radius: 10px;\">\n    <h2 style='padding:20px'>VGG-16 Model Three</h2>\n</div>\n","metadata":{}},{"cell_type":"markdown","source":"**Adding batch norm and dropout to block two, keeping neurons same**","metadata":{}},{"cell_type":"code","source":"def VGG16_three(input_shape=(224, 224, 3)):\n    \"\"\"Instantiates the VGG16 architecture for binary classification.\n\n    # Arguments\n        input_shape: optional shape tuple, only to be specified\n            if `include_top` is False (otherwise the input shape\n            has to be `(224, 224, 3)` (with `channels_last` data format)\n            or `(3, 224, 244)` (with `channels_first` data format).\n            It should have exactly 3 inputs channels,\n            and width and height should be no smaller than 48.\n            E.g. `(200, 200, 3)` would be one valid value.\n\n    # Returns\n        A Keras model instance.\n    \"\"\"\n    img_input = Input(shape=input_shape)\n\n    # Block 1\n    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(img_input)\n    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)\n\n    # Block 2\n    x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)\n    x = BatchNormalization()(x)\n    x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2')(x)\n    x = BatchNormalization()(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)\n    x = Dropout(0.2)(x)\n\n    # Block 3\n    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)\n    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x)\n    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)\n\n    # Block 4\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2')(x)\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)\n\n    # Block 5\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2')(x)\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)\n\n    # Classification block\n    x = Flatten(name='flatten')(x)\n    x = Dense(4096, activation='relu', name='fc1')(x)\n    x = Dense(4096, activation='relu', name='fc2')(x)\n    output = Dense(2, activation='softmax', name='predictions')(x)\n\n    # Create model\n    model = Model(img_input, output, name='vgg16_three')\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:28:22.760029Z","iopub.execute_input":"2024-05-15T14:28:22.760683Z","iopub.status.idle":"2024-05-15T14:28:22.779279Z","shell.execute_reply.started":"2024-05-15T14:28:22.760643Z","shell.execute_reply":"2024-05-15T14:28:22.778276Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_three = VGG16_three(input_shape=(image_size, image_size, image_channel))\nmodel_three.summary()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:28:22.780548Z","iopub.execute_input":"2024-05-15T14:28:22.781113Z","iopub.status.idle":"2024-05-15T14:28:22.929708Z","shell.execute_reply.started":"2024-05-15T14:28:22.781079Z","shell.execute_reply":"2024-05-15T14:28:22.928894Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_three.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])\nmodel_three_logs = model_three.fit(train_generator,\n                    validation_data = val_generator, \n                    callbacks=[learning_rate_reduction],\n                    epochs = 5)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:28:22.930677Z","iopub.execute_input":"2024-05-15T14:28:22.930941Z","iopub.status.idle":"2024-05-15T14:36:21.399729Z","shell.execute_reply.started":"2024-05-15T14:28:22.930918Z","shell.execute_reply":"2024-05-15T14:36:21.398697Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Loss curve</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"pred_loss(model_three_logs)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:36:21.401287Z","iopub.execute_input":"2024-05-15T14:36:21.401658Z","iopub.status.idle":"2024-05-15T14:36:22.225403Z","shell.execute_reply.started":"2024-05-15T14:36:21.401625Z","shell.execute_reply":"2024-05-15T14:36:22.224484Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Model Evaluation</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"evaluate_loss(model_three)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:36:22.226569Z","iopub.execute_input":"2024-05-15T14:36:22.226852Z","iopub.status.idle":"2024-05-15T14:36:54.072414Z","shell.execute_reply.started":"2024-05-15T14:36:22.226826Z","shell.execute_reply":"2024-05-15T14:36:54.071349Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Confusion Matrix</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"# pred_loss(model_three_logs)\n# evaluate_loss(model_two)\nprediction(model_three)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:36:54.073872Z","iopub.execute_input":"2024-05-15T14:36:54.074262Z","iopub.status.idle":"2024-05-15T14:37:02.764541Z","shell.execute_reply.started":"2024-05-15T14:36:54.074227Z","shell.execute_reply":"2024-05-15T14:37:02.763614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:black; color:white; height: 5rem; border-radius: 10px;\">\n    <h2 style='padding:20px'>VGG-16 Model Four</h2>\n</div>\n","metadata":{}},{"cell_type":"markdown","source":"<center><h5>Keeping only One Conv2D block in each layer</h5></center>","metadata":{}},{"cell_type":"code","source":"def VGG16_four(input_shape=(224, 224, 3)):\n    \"\"\"Instantiates the VGG16 architecture for binary classification.\n\n    # Arguments\n        input_shape: optional shape tuple, only to be specified\n            if `include_top` is False (otherwise the input shape\n            has to be `(224, 224, 3)` (with `channels_last` data format)\n            or `(3, 224, 244)` (with `channels_first` data format).\n            It should have exactly 3 inputs channels,\n            and width and height should be no smaller than 48.\n            E.g. `(200, 200, 3)` would be one valid value.\n\n    # Returns\n        A Keras model instance.\n    \"\"\"\n    img_input = Input(shape=input_shape)\n\n    # Block 1\n    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(img_input)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)\n\n    # Block 2\n    x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)\n\n    # Block 3\n    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)\n\n    # Block 4\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)\n\n    # Block 5\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)\n\n    # Classification block\n    x = Flatten(name='flatten')(x)\n    x = Dense(4096, activation='relu', name='fc2')(x)\n    output = Dense(2, activation='softmax', name='predictions')(x)\n\n    # Create model\n    model = Model(img_input, output, name='vgg16_four')\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:37:02.765677Z","iopub.execute_input":"2024-05-15T14:37:02.765931Z","iopub.status.idle":"2024-05-15T14:37:02.777431Z","shell.execute_reply.started":"2024-05-15T14:37:02.765909Z","shell.execute_reply":"2024-05-15T14:37:02.776452Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_four = VGG16_four(input_shape=(image_size, image_size, image_channel))\nmodel_four.summary()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:37:02.778560Z","iopub.execute_input":"2024-05-15T14:37:02.778819Z","iopub.status.idle":"2024-05-15T14:37:02.863067Z","shell.execute_reply.started":"2024-05-15T14:37:02.778796Z","shell.execute_reply":"2024-05-15T14:37:02.861962Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_four.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])\nmodel_four_logs = model_four.fit(train_generator,\n                    validation_data = val_generator, \n                    callbacks=[learning_rate_reduction],\n                    epochs = 5)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:37:02.864477Z","iopub.execute_input":"2024-05-15T14:37:02.864833Z","iopub.status.idle":"2024-05-15T14:39:53.810722Z","shell.execute_reply.started":"2024-05-15T14:37:02.864800Z","shell.execute_reply":"2024-05-15T14:39:53.809677Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Loss curve</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"pred_loss(model_four_logs)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:39:53.813648Z","iopub.execute_input":"2024-05-15T14:39:53.814284Z","iopub.status.idle":"2024-05-15T14:39:54.697286Z","shell.execute_reply.started":"2024-05-15T14:39:53.814255Z","shell.execute_reply":"2024-05-15T14:39:54.696315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Evaluate loss</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"evaluate_loss(model_four)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:39:54.698661Z","iopub.execute_input":"2024-05-15T14:39:54.699274Z","iopub.status.idle":"2024-05-15T14:40:25.239339Z","shell.execute_reply.started":"2024-05-15T14:39:54.699240Z","shell.execute_reply":"2024-05-15T14:40:25.238327Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Confusion matrix</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"prediction(model_four)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:40:25.240577Z","iopub.execute_input":"2024-05-15T14:40:25.240867Z","iopub.status.idle":"2024-05-15T14:40:33.319915Z","shell.execute_reply.started":"2024-05-15T14:40:25.240842Z","shell.execute_reply":"2024-05-15T14:40:33.319052Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:black; color:white; height: 5rem; border-radius: 10px;\">\n    <h2 style='padding:20px'>VGG-16 Model Five</h2>\n</div>\n","metadata":{}},{"cell_type":"markdown","source":"\n<center><h5>Same as model 4 but last fully connected layer input neurons to 1024</h5></center>","metadata":{}},{"cell_type":"code","source":"def VGG16_five(input_shape=(224, 224, 3)):\n    \"\"\"Instantiates the VGG16 architecture for binary classification.\n\n    # Arguments\n        input_shape: optional shape tuple, only to be specified\n            if `include_top` is False (otherwise the input shape\n            has to be `(224, 224, 3)` (with `channels_last` data format)\n            or `(3, 224, 244)` (with `channels_first` data format).\n            It should have exactly 3 inputs channels,\n            and width and height should be no smaller than 48.\n            E.g. `(200, 200, 3)` would be one valid value.\n\n    # Returns\n        A Keras model instance.\n    \"\"\"\n    img_input = Input(shape=input_shape)\n\n    # Block 1\n    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(img_input)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)\n\n    # Block 2\n    x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)\n\n    # Block 3\n    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)\n\n    # Block 4\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)\n\n    # Block 5\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)\n\n    # Classification block\n    x = Flatten(name='flatten')(x)\n    x = Dense(1024, activation='relu', name='fc2')(x)\n    output = Dense(2, activation='softmax', name='predictions')(x)\n\n    # Create model\n    model = Model(img_input, output, name='vgg16_five')\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:40:33.321398Z","iopub.execute_input":"2024-05-15T14:40:33.321801Z","iopub.status.idle":"2024-05-15T14:40:33.333521Z","shell.execute_reply.started":"2024-05-15T14:40:33.321763Z","shell.execute_reply":"2024-05-15T14:40:33.332675Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_five = VGG16_five(input_shape=(image_size, image_size, image_channel))\nmodel_five.summary()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:40:33.334730Z","iopub.execute_input":"2024-05-15T14:40:33.335008Z","iopub.status.idle":"2024-05-15T14:40:33.415085Z","shell.execute_reply.started":"2024-05-15T14:40:33.334985Z","shell.execute_reply":"2024-05-15T14:40:33.414274Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_five.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])\nmodel_five_logs = model_five.fit(train_generator,\n                    validation_data = val_generator, \n                    callbacks=[learning_rate_reduction],\n                    epochs = 5)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:40:33.416367Z","iopub.execute_input":"2024-05-15T14:40:33.416694Z","iopub.status.idle":"2024-05-15T14:43:21.200115Z","shell.execute_reply.started":"2024-05-15T14:40:33.416664Z","shell.execute_reply":"2024-05-15T14:43:21.199329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Loss curve</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"pred_loss(model_five_logs)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:43:21.201730Z","iopub.execute_input":"2024-05-15T14:43:21.202033Z","iopub.status.idle":"2024-05-15T14:43:22.004121Z","shell.execute_reply.started":"2024-05-15T14:43:21.202006Z","shell.execute_reply":"2024-05-15T14:43:22.003137Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Evaluate model</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"evaluate_loss(model_five)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:56:51.103195Z","iopub.status.idle":"2024-05-15T14:56:51.103523Z","shell.execute_reply.started":"2024-05-15T14:56:51.103366Z","shell.execute_reply":"2024-05-15T14:56:51.103379Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Confusion matrix</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"prediction(model_five)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:43:52.627402Z","iopub.execute_input":"2024-05-15T14:43:52.627818Z","iopub.status.idle":"2024-05-15T14:44:00.794707Z","shell.execute_reply.started":"2024-05-15T14:43:52.627785Z","shell.execute_reply":"2024-05-15T14:44:00.793778Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:black; color:white; height: 5rem; border-radius: 10px;\">\n    <h2 style='padding:20px'>VGG-16 Model Six</h2>\n</div>\n","metadata":{}},{"cell_type":"markdown","source":"<center><h5>Same as model 5 but adding Batchnormalization after each Conv2D layer</h5></center>","metadata":{}},{"cell_type":"code","source":"def VGG16_six(input_shape=(224, 224, 3)):\n    \"\"\"Instantiates the VGG16 architecture for binary classification.\n\n    # Arguments\n        input_shape: optional shape tuple, only to be specified\n            if `include_top` is False (otherwise the input shape\n            has to be `(224, 224, 3)` (with `channels_last` data format)\n            or `(3, 224, 244)` (with `channels_first` data format).\n            It should have exactly 3 inputs channels,\n            and width and height should be no smaller than 48.\n            E.g. `(200, 200, 3)` would be one valid value.\n\n    # Returns\n        A Keras model instance.\n    \"\"\"\n    img_input = Input(shape=input_shape)\n\n    # Block 1\n    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(img_input)\n    x = BatchNormalization()(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)\n\n    # Block 2\n    x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)\n    x = BatchNormalization()(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)\n\n    # Block 3\n    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)\n    x = BatchNormalization()(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)\n\n    # Block 4\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)\n    x = BatchNormalization()(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)\n\n    # Block 5\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)\n    x = BatchNormalization()(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)\n\n    # Classification block\n    x = Flatten(name='flatten')(x)\n    x = Dense(1024, activation='relu', name='fc2')(x)\n    output = Dense(2, activation='softmax', name='predictions')(x)\n\n    # Create model\n    model = Model(img_input, output, name='vgg16_six')\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:44:00.796102Z","iopub.execute_input":"2024-05-15T14:44:00.796471Z","iopub.status.idle":"2024-05-15T14:44:00.809281Z","shell.execute_reply.started":"2024-05-15T14:44:00.796438Z","shell.execute_reply":"2024-05-15T14:44:00.808273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_six = VGG16_six(input_shape=(image_size, image_size, image_channel))\nmodel_six.summary()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:44:00.810572Z","iopub.execute_input":"2024-05-15T14:44:00.810893Z","iopub.status.idle":"2024-05-15T14:44:00.937026Z","shell.execute_reply.started":"2024-05-15T14:44:00.810868Z","shell.execute_reply":"2024-05-15T14:44:00.936160Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_six.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])\nmodel_six_logs = model_six.fit(train_generator,\n                    validation_data = val_generator, \n                    callbacks=[learning_rate_reduction],\n                    epochs = 5)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:44:00.938140Z","iopub.execute_input":"2024-05-15T14:44:00.938469Z","iopub.status.idle":"2024-05-15T14:47:00.425999Z","shell.execute_reply.started":"2024-05-15T14:44:00.938435Z","shell.execute_reply":"2024-05-15T14:47:00.425167Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Loss curve</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"pred_loss(model_six_logs)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:47:00.427495Z","iopub.execute_input":"2024-05-15T14:47:00.428205Z","iopub.status.idle":"2024-05-15T14:47:01.299097Z","shell.execute_reply.started":"2024-05-15T14:47:00.428167Z","shell.execute_reply":"2024-05-15T14:47:01.298190Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Evaluate loss</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"evaluate_loss(model_six)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:47:01.300354Z","iopub.execute_input":"2024-05-15T14:47:01.300697Z","iopub.status.idle":"2024-05-15T14:47:32.230057Z","shell.execute_reply.started":"2024-05-15T14:47:01.300665Z","shell.execute_reply":"2024-05-15T14:47:32.229069Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Confusion matrix</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"prediction(model_six)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:47:32.231354Z","iopub.execute_input":"2024-05-15T14:47:32.231618Z","iopub.status.idle":"2024-05-15T14:47:40.431252Z","shell.execute_reply.started":"2024-05-15T14:47:32.231595Z","shell.execute_reply":"2024-05-15T14:47:40.430378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:black; color:white; height: 5rem; border-radius: 10px;\">\n    <h2 style='padding:20px'>VGG-16 Model Seven</h2>\n</div>\n","metadata":{}},{"cell_type":"markdown","source":"\n<center><h5>Same as model 6 but addig more 1 more Conv2d block in layer 1, layer 2, layer 3, layer 4, layer 5 and in the FC layer changing the neurons size to 2048 </center></h5>","metadata":{}},{"cell_type":"code","source":"def VGG16_seven(input_shape=(224, 224, 3)):\n    \"\"\"Instantiates the VGG16 architecture for binary classification.\n\n    # Arguments\n        input_shape: optional shape tuple, only to be specified\n            if `include_top` is False (otherwise the input shape\n            has to be `(224, 224, 3)` (with `channels_last` data format)\n            or `(3, 224, 244)` (with `channels_first` data format).\n            It should have exactly 3 inputs channels,\n            and width and height should be no smaller than 48.\n            E.g. `(200, 200, 3)` would be one valid value.\n\n    # Returns\n        A Keras model instance.\n    \"\"\"\n    img_input = Input(shape=input_shape)\n\n    # Block 1\n    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(img_input)\n    x = BatchNormalization()(x)\n    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x)\n    x = BatchNormalization()(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)\n\n    # Block 2\n    x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)\n    x = BatchNormalization()(x)\n    x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2')(x)\n    x = BatchNormalization()(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)\n\n    # Block 3\n    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)\n    x = BatchNormalization()(x)\n    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x)\n    x = BatchNormalization()(x)\n    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3')(x)\n    x = BatchNormalization()(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)\n\n    # Block 4\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)\n    x = BatchNormalization()(x)\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2')(x)\n    x = BatchNormalization()(x)\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3')(x)\n    x = BatchNormalization()(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)\n\n    # Block 5\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)\n    x = BatchNormalization()(x)\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2')(x)\n    x = BatchNormalization()(x)\n    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3')(x)\n    x = BatchNormalization()(x)\n    x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)\n\n    # Classification block\n    x = Flatten(name='flatten')(x)\n    x = Dense(1024, activation='relu', name='fc2')(x)\n    output = Dense(2, activation='softmax', name='predictions')(x)\n\n    # Create model\n    model = Model(img_input, output, name='vgg16_seven')\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:47:40.433031Z","iopub.execute_input":"2024-05-15T14:47:40.433397Z","iopub.status.idle":"2024-05-15T14:47:40.450284Z","shell.execute_reply.started":"2024-05-15T14:47:40.433365Z","shell.execute_reply":"2024-05-15T14:47:40.449383Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_seven = VGG16_seven(input_shape=(image_size, image_size, image_channel))\nmodel_seven.summary()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:47:40.451477Z","iopub.execute_input":"2024-05-15T14:47:40.451744Z","iopub.status.idle":"2024-05-15T14:47:40.697087Z","shell.execute_reply.started":"2024-05-15T14:47:40.451714Z","shell.execute_reply":"2024-05-15T14:47:40.696176Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_seven.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])\nmodel_seven_logs = model_seven.fit(train_generator,\n                    validation_data = val_generator, \n                    callbacks=[learning_rate_reduction],\n                    epochs = 5)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:47:40.698249Z","iopub.execute_input":"2024-05-15T14:47:40.698521Z","iopub.status.idle":"2024-05-15T14:56:07.025071Z","shell.execute_reply.started":"2024-05-15T14:47:40.698498Z","shell.execute_reply":"2024-05-15T14:56:07.024048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Loss curve</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"pred_loss(model_seven_logs)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:56:07.026798Z","iopub.execute_input":"2024-05-15T14:56:07.027190Z","iopub.status.idle":"2024-05-15T14:56:07.818731Z","shell.execute_reply.started":"2024-05-15T14:56:07.027156Z","shell.execute_reply":"2024-05-15T14:56:07.817591Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Evaluate loss</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"evaluate_loss(model_seven)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:56:07.820231Z","iopub.execute_input":"2024-05-15T14:56:07.820667Z","iopub.status.idle":"2024-05-15T14:56:39.679808Z","shell.execute_reply.started":"2024-05-15T14:56:07.820632Z","shell.execute_reply":"2024-05-15T14:56:39.678772Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"text-align:center; background-color:#e3e1e1; color:#4d4d4f; height: 3rem; border-radius: 10px;\">\n    <h4 style='padding:10px'>Confusion matrix</h4>\n</div>","metadata":{}},{"cell_type":"code","source":"prediction(model_seven)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:56:39.681484Z","iopub.execute_input":"2024-05-15T14:56:39.682107Z","iopub.status.idle":"2024-05-15T14:56:48.922936Z","shell.execute_reply.started":"2024-05-15T14:56:39.682069Z","shell.execute_reply":"2024-05-15T14:56:48.922095Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n<div style=\"text-align:center; background-color:black; color:white; height: 3rem; border-radius: 10px;\">\n    <h3 style='padding:10px'>Comparing the performance of different models</h3>\n</div>","metadata":{}},{"cell_type":"code","source":"# Suppose you have model histories stored in a list\nmodel_histories = [model_one_logs, model_two_logs, model_three_logs,model_four_logs,model_five_logs,model_six_logs,model_seven_logs]  # Add your model histories here\n\n# Extract accuracies from each model's history\naccuracies = []\nfor history in model_histories:\n    accuracies.append(history.history['accuracy'])  # Adjust key based on your history structure\n\n# Create a DataFrame\ndf = pd.DataFrame(accuracies).T\ndf.columns = ['Model 1', 'Model 2', 'Model 3','Model 4','Model 5','Model 6','Model 7' ]  # Adjust model names accordingly\n\n# Plot accuracies\nplt.figure(figsize=(10, 6))\nsns.lineplot(data=df, markers=True)\nplt.title('Training Accuracies of Different Models')\nplt.xlabel('Epochs')\nplt.ylabel('Accuracy')\nplt.legend(title='Models')\nplt.grid(True)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:56:48.925469Z","iopub.execute_input":"2024-05-15T14:56:48.925831Z","iopub.status.idle":"2024-05-15T14:56:49.471315Z","shell.execute_reply.started":"2024-05-15T14:56:48.925797Z","shell.execute_reply":"2024-05-15T14:56:49.470258Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Suppose you have model histories stored in a list\nmodel_histories = [model_one_logs, model_two_logs, model_three_logs,model_four_logs,model_five_logs,model_six_logs,model_seven_logs]  # Add your model histories here\n\n# Extract accuracies from each model's history\naccuracies = []\nfor history in model_histories:\n    accuracies.append(history.history['loss'])  # Adjust key based on your history structure\n\n# Create a DataFrame\ndf = pd.DataFrame(accuracies).T\ndf.columns = ['Model 1', 'Model 2', 'Model 3','Model 4','Model 5','Model 6','Model 7' ]  # Adjust model names accordingly\n\n# Plot accuracies\nplt.figure(figsize=(10, 6))\nsns.lineplot(data=df, markers=True)\nplt.title('Training Loss of Different Models')\nplt.xlabel('Epochs')\nplt.ylabel('Accuracy')\nplt.legend(title='Models')\nplt.grid(True)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:56:49.472517Z","iopub.execute_input":"2024-05-15T14:56:49.472804Z","iopub.status.idle":"2024-05-15T14:56:50.027433Z","shell.execute_reply.started":"2024-05-15T14:56:49.472779Z","shell.execute_reply":"2024-05-15T14:56:50.026486Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"accuracies = []\nfor history in model_histories:\n    accuracies.append(history.history['val_accuracy'])  # Adjust key based on your history structure\n\n# Create a DataFrame\ndf = pd.DataFrame(accuracies).T\ndf.columns = ['Model 1', 'Model 2', 'Model 3','Model 4','Model 5','Model 6','Model 7' ]  # Adjust model names accordingly\n\n# Plot accuracies\nplt.figure(figsize=(10, 6))\nsns.lineplot(data=df, markers=True)\nplt.title('Val accuracy of Different Models')\nplt.xlabel('Epochs')\nplt.ylabel('Accuracy')\nplt.legend(title='Models')\nplt.grid(True)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:56:50.028610Z","iopub.execute_input":"2024-05-15T14:56:50.028896Z","iopub.status.idle":"2024-05-15T14:56:50.584050Z","shell.execute_reply.started":"2024-05-15T14:56:50.028871Z","shell.execute_reply":"2024-05-15T14:56:50.583033Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"accuracies = []\nfor history in model_histories:\n    accuracies.append(history.history['val_loss'])  # Adjust key based on your history structure\n\n# Create a DataFrame\ndf = pd.DataFrame(accuracies).T\ndf.columns = ['Model 1', 'Model 2', 'Model 3','Model 4','Model 5','Model 6','Model 7' ]  # Adjust model names accordingly\n\n# Plot accuracies\nplt.figure(figsize=(10, 6))\nsns.lineplot(data=df, markers=True)\nplt.title('Val Loss of Different Models')\nplt.xlabel('Epochs')\nplt.ylabel('Accuracy')\nplt.legend(title='Models')\nplt.grid(True)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:56:50.585118Z","iopub.execute_input":"2024-05-15T14:56:50.585413Z","iopub.status.idle":"2024-05-15T14:56:51.082179Z","shell.execute_reply.started":"2024-05-15T14:56:50.585387Z","shell.execute_reply":"2024-05-15T14:56:51.081235Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n<div style=\"text-align:center; background-color:black; color:white; height: 3rem; border-radius: 10px;\">\n    <h3 style='padding:10px'>Different Accuracy metrics</h3>\n</div>","metadata":{}},{"cell_type":"code","source":"def evaluate_model_metrics(model):\n    result = model.predict(test_generator,batch_size = bat_size,verbose = 0)\n    y_pred = np.argmax(result, axis = 1)\n    y_true = test_generator.labels\n    report = classification_report(y_true, y_pred, target_names=test_generator.class_indices)\n    print(report)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T15:11:06.250002Z","iopub.execute_input":"2024-05-15T15:11:06.250399Z","iopub.status.idle":"2024-05-15T15:11:06.256321Z","shell.execute_reply.started":"2024-05-15T15:11:06.250367Z","shell.execute_reply":"2024-05-15T15:11:06.255178Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"models = [model_one,model_two,model_three,model_four,model_five,model_six,model_seven]","metadata":{"execution":{"iopub.status.busy":"2024-05-15T15:11:07.371071Z","iopub.execute_input":"2024-05-15T15:11:07.371922Z","iopub.status.idle":"2024-05-15T15:11:07.376148Z","shell.execute_reply.started":"2024-05-15T15:11:07.371882Z","shell.execute_reply":"2024-05-15T15:11:07.375114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(len(models)):\n    print(f'Model : {i+1}')\n    print(evaluate_model_metrics(models[i]))\n    print('- '*42)\n    print()","metadata":{"execution":{"iopub.status.busy":"2024-05-15T15:12:54.506100Z","iopub.execute_input":"2024-05-15T15:12:54.506444Z","iopub.status.idle":"2024-05-15T15:13:20.719133Z","shell.execute_reply.started":"2024-05-15T15:12:54.506416Z","shell.execute_reply":"2024-05-15T15:13:20.717947Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}