{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"},{"sourceId":2431805,"sourceType":"datasetVersion","datasetId":8782},{"sourceId":3399185,"sourceType":"datasetVersion","datasetId":2049052}],"dockerImageVersionId":30204,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport pandas as pd\nimport seaborn as sns\nfrom PIL import Image\nfrom IPython.display import Image, display\nimport os\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import confusion_matrix\nfrom sklearn.metrics import classification_report\nfrom sklearn.datasets import load_files\n\n\n\n# import tensorflow_hub as hub\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.preprocessing.image import load_img, img_to_array\nfrom tensorflow.keras.optimizers import Adam, SGD, RMSprop\nfrom tensorflow.keras.applications import VGG16, ResNet50, InceptionV3, Xception, MobileNet\nfrom tensorflow.keras.applications.resnet50 import preprocess_input as prepro_res50\nfrom tensorflow.keras.applications.vgg19 import preprocess_input as prepro_vgg19\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, Dense, Flatten, GlobalAveragePooling2D, BatchNormalization, Dropout, MaxPool2D, MaxPooling2D\nfrom keras.callbacks  import ModelCheckpoint, ReduceLROnPlateau,  EarlyStopping","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:54:14.520807Z","iopub.execute_input":"2025-02-24T10:54:14.521104Z","iopub.status.idle":"2025-02-24T10:54:20.601423Z","shell.execute_reply.started":"2025-02-24T10:54:14.521041Z","shell.execute_reply":"2025-02-24T10:54:20.600676Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# VGG16\nn_classes = 5\nimgShape = (224, 224, 3)\n# write your code here\nmodel_vgg = Sequential([\n    # Convolutional Layers\n    Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=(224, 224, 3)),\n    MaxPooling2D((2, 2), strides=(2, 2)),\n    \n    Conv2D(128, (3, 3), activation='relu', padding='same'),\n    MaxPooling2D((2, 2), strides=(2, 2)),\n\n    Conv2D(256, (3, 3), activation='relu', padding='same'),\n    Conv2D(256, (3, 3), activation='relu', padding='same'),\n    MaxPooling2D((2, 2), strides=(2, 2)),\n\n    Conv2D(512, (3, 3), activation='relu', padding='same'),\n    Conv2D(512, (3, 3), activation='relu', padding='same'),\n    MaxPooling2D((2, 2), strides=(2, 2)),\n\n    Conv2D(512, (3, 3), activation='relu', padding='same'),\n    Conv2D(512, (3, 3), activation='relu', padding='same'),\n    MaxPooling2D((2, 2), strides=(2, 2)),\n\n    # Fully Connected Layers\n    Flatten(),\n    Dense(512, activation='relu'),\n    Dense(256, activation='relu'),\n    Dense(n_classes, activation='softmax')\n])\n# write your code here\nmodel_vgg.summary()","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:54:20.603113Z","iopub.execute_input":"2025-02-24T10:54:20.603619Z","iopub.status.idle":"2025-02-24T10:54:23.601819Z","shell.execute_reply.started":"2025-02-24T10:54:20.603592Z","shell.execute_reply":"2025-02-24T10:54:23.600862Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# alex Net \ninput_shape=(224, 224, 3)\nn_classes = 5\n# write your code here\nmodel_alex = Sequential([\n    # 1st Convolutional Layer\n    Conv2D(96, (11, 11), strides=(4, 4), activation='relu', input_shape=input_shape),\n    MaxPooling2D((3, 3), strides=(2, 2)),\n\n    # 2nd Convolutional Layer\n    Conv2D(256, (5, 5), padding='same', activation='relu'),\n    MaxPooling2D((3, 3), strides=(2, 2)),\n\n    # 3rd Convolutional Layer\n    Conv2D(384, (3, 3), padding='same', activation='relu'),\n\n    # 4th Convolutional Layer\n    Conv2D(384, (3, 3), padding='same', activation='relu'),\n\n    # 5th Convolutional Layer\n    Conv2D(256, (3, 3), padding='same', activation='relu'),\n    MaxPooling2D((3, 3), strides=(2, 2)),\n\n    # Flatten the output\n    Flatten(),\n\n    # 1st Fully Connected Layer\n    Dense(4096, activation='relu'),\n    Dropout(0.5),\n\n    # 2nd Fully Connected Layer\n    Dense(4096, activation='relu'),\n    Dropout(0.5),\n\n    # Output Layer\n    Dense(n_classes, activation='softmax')\n])\n# write your code here\nmodel_alex.summary()","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:54:23.603257Z","iopub.execute_input":"2025-02-24T10:54:23.603631Z","iopub.status.idle":"2025-02-24T10:54:23.683593Z","shell.execute_reply.started":"2025-02-24T10:54:23.603594Z","shell.execute_reply":"2025-02-24T10:54:23.682614Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# lenet\ninput_shape=(224, 224, 3)\nn_classes = 5\n\n# write your code here\nmodel_lenet = Sequential([\n        Conv2D(6, (5, 5), activation='relu', input_shape=input_shape),\n    MaxPooling2D((2, 2)),\n\n    # 2nd Convolutional Layer\n    Conv2D(16, (5, 5), activation='relu'),\n    MaxPooling2D((2, 2)),\n\n    # Flatten the output\n    Flatten(),\n\n    # 1st Fully Connected Layer\n    Dense(120, activation='relu'),\n\n    # 2nd Fully Connected Layer\n    Dense(84, activation='relu'),\n\n    # Output Layer\n    Dense(n_classes, activation='softmax')\n])\n# write your code here\n\nmodel_lenet.summary()","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:54:23.684763Z","iopub.execute_input":"2025-02-24T10:54:23.685049Z","iopub.status.idle":"2025-02-24T10:54:23.736076Z","shell.execute_reply.started":"2025-02-24T10:54:23.685025Z","shell.execute_reply":"2025-02-24T10:54:23.735159Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"input_shape=(224, 224, 3)\nn_classes = 5\n\nbase_model = ResNet50(weights='imagenet', include_top=False, input_shape=input_shape)\n\n# Freeze the convolutional base\nfor layer in base_model.layers:\n    layer.trainable = False\n\n# Create a new model by adding custom fully connected layers on top of the base model\nmodel_resnet50v2 = Sequential([\n    base_model,\n    GlobalAveragePooling2D(),  # Add pooling layer to flatten the output\n    Dense(256, activation='relu'),  # Add a fully connected layer\n    Dense(n_classes*32, activation='softmax')  # Output layer with n_classes neurons\n])\n\nmodel_resnet50.summary()","metadata":{"execution":{"iopub.status.busy":"2025-02-24T11:52:40.552306Z","iopub.execute_input":"2025-02-24T11:52:40.552971Z","iopub.status.idle":"2025-02-24T11:52:42.841402Z","shell.execute_reply.started":"2025-02-24T11:52:40.552936Z","shell.execute_reply":"2025-02-24T11:52:42.840475Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"input_shape = (224, 224, 3)\nn_classes = 5\nfrom tensorflow.keras.models import Model\n\nbase_model = InceptionV3(include_top=False, weights='imagenet', input_shape=input_shape)\nx = GlobalAveragePooling2D()(base_model.output)\noutput_layer = Dense(n_classes, activation='softmax')(x)\n\nmodel_Inception = Model(inputs=base_model.input, outputs=output_layer)\n\nmodel_Inception.summary()","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:54:25.728665Z","iopub.execute_input":"2025-02-24T10:54:25.729067Z","iopub.status.idle":"2025-02-24T10:54:27.800145Z","shell.execute_reply.started":"2025-02-24T10:54:25.72903Z","shell.execute_reply":"2025-02-24T10:54:27.799162Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.applications import MobileNetV2\nnum_classes = 5\npredictions = Dense(num_classes, activation='softmax')(x)\n\n# Define the complete model\nmodel_MobileNetV2 = Model(inputs=base_model.input, outputs=predictions)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-24T10:54:27.802792Z","iopub.execute_input":"2025-02-24T10:54:27.803081Z","iopub.status.idle":"2025-02-24T10:54:27.826806Z","shell.execute_reply.started":"2025-02-24T10:54:27.803056Z","shell.execute_reply":"2025-02-24T10:54:27.826131Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"path_data = '../input/flowers-recognition/flowers/'\nprint(os.listdir(path_data))","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:54:27.827805Z","iopub.execute_input":"2025-02-24T10:54:27.828079Z","iopub.status.idle":"2025-02-24T10:54:27.83699Z","shell.execute_reply.started":"2025-02-24T10:54:27.828055Z","shell.execute_reply":"2025-02-24T10:54:27.836052Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from os.path import join\n\nimg_folders = [join(path_data, folder) for folder in os.listdir(path_data)]\nlist(img_folders)","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:54:27.838152Z","iopub.execute_input":"2025-02-24T10:54:27.838413Z","iopub.status.idle":"2025-02-24T10:54:27.848911Z","shell.execute_reply.started":"2025-02-24T10:54:27.83839Z","shell.execute_reply":"2025-02-24T10:54:27.847981Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_dir = '../input/flowers-recognition/flowers/'\n\ndata = load_files(data_dir, random_state=28, shuffle=True)\nX = np.array(data['filenames'])    # files location of each flower\ny = np.array(data['target'])       # target label of each flower\nlabels = np.array(data['target_names'])\n\n# remove eventual .pyc or .py files\npyc_file = (np.where(file==X) for file in X if file.endswith(('.pyc','.py')))\nfor pos in pyc_file:\n    X = np.delete(X, pos)\n    y = np.delete(y, pos)\n    \nprint(f'Data files - {X}')\nprint(f'Target labels - {y}')   # numbers are corresponding to class label, \n                               # we have to change them to a vector of 5 elements\nprint(f'Name labels - {labels}')\nprint(f'Number of training files : {X.shape[0]}')","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:54:27.850176Z","iopub.execute_input":"2025-02-24T10:54:27.850519Z","iopub.status.idle":"2025-02-24T10:54:50.604857Z","shell.execute_reply.started":"2025-02-24T10:54:27.850471Z","shell.execute_reply":"2025-02-24T10:54:50.603803Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Flower species number\ndf = pd.DataFrame({'species': y})\nprint(df.shape)\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:54:50.606262Z","iopub.execute_input":"2025-02-24T10:54:50.607236Z","iopub.status.idle":"2025-02-24T10:54:50.623912Z","shell.execute_reply.started":"2025-02-24T10:54:50.607194Z","shell.execute_reply":"2025-02-24T10:54:50.622967Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# associate names to species number\ndf['flower'] = df['species'].astype('category')\ndf['flower'].cat.categories = labels\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:54:50.624975Z","iopub.execute_input":"2025-02-24T10:54:50.625201Z","iopub.status.idle":"2025-02-24T10:54:50.641976Z","shell.execute_reply.started":"2025-02-24T10:54:50.625181Z","shell.execute_reply":"2025-02-24T10:54:50.640984Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fig, ax = plt.subplots()\nax = sns.countplot(x=\"flower\", data=df)\nax.set(ylabel='Count', title='Flower species distribution')\nax.tick_params(axis='x', rotation=15)","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:54:50.643166Z","iopub.execute_input":"2025-02-24T10:54:50.64349Z","iopub.status.idle":"2025-02-24T10:54:50.851192Z","shell.execute_reply.started":"2025-02-24T10:54:50.643458Z","shell.execute_reply":"2025-02-24T10:54:50.850321Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"image_size = 224     # standard value for Transfer learning usecase (MobileNet, ResNet50, VGG16, VGG19)\n\ndef read_and_prep_images(img_paths, img_height=image_size, img_width=image_size):\n    imgs = [load_img(img_path, target_size=(img_height, img_width)) for img_path in img_paths]   # load image\n    img_array = np.array([img_to_array(img) for img in imgs])   # image to array \n    return(img_array)\n\nX = np.array(read_and_prep_images(X))\nprint(X.shape)  # (4323, 224, 224, 3) = (num_images, height_size, width_size, depth=RGB)","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:54:50.852444Z","iopub.execute_input":"2025-02-24T10:54:50.852733Z","iopub.status.idle":"2025-02-24T10:55:08.004911Z","shell.execute_reply.started":"2025-02-24T10:54:50.852708Z","shell.execute_reply":"2025-02-24T10:55:08.003913Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"N = 18  # flowers to display\nfig, axes = plt.subplots(3, 6, figsize=(16,6))\nfor ax, j in zip(axes.flat, np.random.randint(0, len(X), N)):    \n    ax.imshow(X[j].astype(np.uint8))\n    ax.set(title=f'Flower: {labels[y[j]]}', xticks=[], yticks=[])\nfig.tight_layout()","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:55:08.006134Z","iopub.execute_input":"2025-02-24T10:55:08.006398Z","iopub.status.idle":"2025-02-24T10:55:08.936596Z","shell.execute_reply.started":"2025-02-24T10:55:08.006375Z","shell.execute_reply":"2025-02-24T10:55:08.935633Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Label encoding","metadata":{}},{"cell_type":"code","source":"num_classes = len(np.unique(y))\nprint(f'Number of classes: {num_classes} --> {labels}')","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:55:08.937711Z","iopub.execute_input":"2025-02-24T10:55:08.93802Z","iopub.status.idle":"2025-02-24T10:55:08.943934Z","shell.execute_reply.started":"2025-02-24T10:55:08.937994Z","shell.execute_reply":"2025-02-24T10:55:08.942885Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y = to_categorical(y, num_classes)\nprint(y.shape)","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:55:08.945005Z","iopub.execute_input":"2025-02-24T10:55:08.945269Z","iopub.status.idle":"2025-02-24T10:55:08.95645Z","shell.execute_reply.started":"2025-02-24T10:55:08.945246Z","shell.execute_reply":"2025-02-24T10:55:08.955411Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Train , Val , Test ","metadata":{}},{"cell_type":"code","source":"#train, validation and test from the train dataset\ntest_size = 0.25\nXtrain, Xtest, ytrain, ytest = train_test_split(X, y, shuffle=True, \n                                                test_size=test_size, random_state=28)\n\nXval, Xtest, yval, ytest = train_test_split(Xtest, ytest, test_size=0.5,\n                                            shuffle=True, random_state=28)\nprint(f'Train dataset: {Xtrain.shape[0]}')\nprint(f'Validation dataset: {Xval.shape[0]}')\nprint(f'Test dataset: {Xtest.shape[0]}')","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:55:08.957574Z","iopub.execute_input":"2025-02-24T10:55:08.957976Z","iopub.status.idle":"2025-02-24T10:55:09.874102Z","shell.execute_reply.started":"2025-02-24T10:55:08.957908Z","shell.execute_reply":"2025-02-24T10:55:09.872964Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# release memory\ndel X","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:55:09.875399Z","iopub.execute_input":"2025-02-24T10:55:09.875681Z","iopub.status.idle":"2025-02-24T10:55:09.887676Z","shell.execute_reply.started":"2025-02-24T10:55:09.875656Z","shell.execute_reply":"2025-02-24T10:55:09.886658Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"del y","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:55:09.888795Z","iopub.execute_input":"2025-02-24T10:55:09.889064Z","iopub.status.idle":"2025-02-24T10:55:09.90057Z","shell.execute_reply.started":"2025-02-24T10:55:09.889041Z","shell.execute_reply":"2025-02-24T10:55:09.899808Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# DATA Agumentation","metadata":{}},{"cell_type":"code","source":"image_size = 224\nbatch_size = 128 + 64\n\n#train_gen = train_aug.flow(Xtrain, ytrain, batch_size=batch_size)\n# The validation data must not have data augmentation\n#valid_gen = valid_no_aug.flow(Xval, yval, batch_size=batch_size)\n\ntrain_datagen = ImageDataGenerator(\n        rescale=1./255,           # rescale pixel values [0,255] to [0,1]\n        horizontal_flip=True,     # random horizontal flip\n        width_shift_range=0.2,    # random shift images horizontally (fraction of total width)\n        height_shift_range=0.2,   # random shift images vertically (fraction of total height)\n        zoom_range=0.2)           # random zoom image\n        #rotation_range=20,       # random rotation\n        #shear_range=0.2)         # shear transfo\n        #validation_split=0.2)    # splitting train / test datasets\n\ntest_datagen = ImageDataGenerator(\n        rescale=1./255)\n        #validation_split=0.2)\n    \ntrain_gen = train_datagen.flow(\n        Xtrain, ytrain, \n        batch_size=batch_size,\n        shuffle=False)              # already applied\n\nvalid_gen = test_datagen.flow(\n        Xval, yval,\n        batch_size=batch_size,\n        shuffle=False)   ","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:55:09.901829Z","iopub.execute_input":"2025-02-24T10:55:09.902442Z","iopub.status.idle":"2025-02-24T10:55:09.911983Z","shell.execute_reply.started":"2025-02-24T10:55:09.902407Z","shell.execute_reply":"2025-02-24T10:55:09.911239Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# callbacks \nweight_path = '{}_best_weights.hdf5'.format('flower')\ncheckpointer = ModelCheckpoint(weight_path,\n                               monitor='val_accuracy',\n                               verbose=1, \n                               save_best_only=True,\n                               mode='auto',\n                               save_weights_only=True)\n\n\n# set a learning rate annealer\nlearning_rate_reduction = ReduceLROnPlateau(monitor='val_accuracy', \n                                            patience=3, \n                                            verbose=1, \n                                            factor=0.7, \n                                            min_lr=0.00001)\n    \n# early stop if not improvement of accuracy after 5 epochs\nearly = EarlyStopping(patience=6, \n                      verbose=1) \n    \ncallbacks = [checkpointer, learning_rate_reduction] #, early]\n\n# Optimizer\nopt = RMSprop(learning_rate=0.001, rho=0.9, epsilon=1e-08, decay=0.0)\n","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:55:09.916455Z","iopub.execute_input":"2025-02-24T10:55:09.916781Z","iopub.status.idle":"2025-02-24T10:55:09.925728Z","shell.execute_reply.started":"2025-02-24T10:55:09.916738Z","shell.execute_reply":"2025-02-24T10:55:09.924966Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Compilation\nmodel_vgg.compile(optimizer=opt, \n              loss='categorical_crossentropy', \n              metrics=['accuracy'])\n\nmodel_alex.compile(optimizer=opt, \n              loss='categorical_crossentropy', \n              metrics=['accuracy'])\n\nmodel_lenet.compile(optimizer=opt, \n              loss='categorical_crossentropy', \n              metrics=['accuracy'])\n\nmodel_resnet50.compile(optimizer=opt, \n              loss='sparse_categorical_crossentropy', \n              metrics=['accuracy'])\n\nmodel_Inception.compile(optimizer=opt, \n              loss='sparse_categorical_crossentropy', \n              metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2025-02-24T11:52:46.595505Z","iopub.execute_input":"2025-02-24T11:52:46.596461Z","iopub.status.idle":"2025-02-24T11:52:46.630282Z","shell.execute_reply.started":"2025-02-24T11:52:46.596425Z","shell.execute_reply":"2025-02-24T11:52:46.62931Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Training every model ","metadata":{}},{"cell_type":"code","source":"epochs = 15\nmodel_vgg.build()\n# write your code here\nhistory_vgg = model_vgg.fit(\n    train_gen,\n    steps_per_epoch=Xtrain.shape[0] // batch_size,\n    epochs=epochs,  # Adjust the number of epochs as needed\n    validation_data=valid_gen,\n    validation_steps=Xval.shape[0] // batch_size,\n    callbacks=callbacks\n)\n\nloss, accuracy = model_vgg.evaluate(Xtest, ytest, verbose=0)\nprint(f\"Test Loss: {loss:.4f}\")\nprint(f\"Test Accuracy: {accuracy:.4f}\")\n# write your code here","metadata":{"execution":{"iopub.status.busy":"2025-02-24T10:55:09.96661Z","iopub.execute_input":"2025-02-24T10:55:09.966863Z","iopub.status.idle":"2025-02-24T11:04:05.600449Z","shell.execute_reply.started":"2025-02-24T10:55:09.96684Z","shell.execute_reply":"2025-02-24T11:04:05.599312Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model_lenet.build()\n# write your code here\nhistory_lenet = model_lenet.fit(\n    train_gen,\n    steps_per_epoch=Xtrain.shape[0] // batch_size,\n    epochs=epochs,  # Adjust the number of epochs as needed\n    validation_data=valid_gen,\n    validation_steps=Xval.shape[0] // batch_size,\n    callbacks=callbacks\n)\n\nloss, accuracy = model_lenet.evaluate(Xtest, ytest, verbose=0)\nprint(f\"Test Loss: {loss:.4f}\")\nprint(f\"Test Accuracy: {accuracy:.4f}\")\n# write your code here","metadata":{"execution":{"iopub.status.busy":"2025-02-24T11:04:05.601596Z","iopub.execute_input":"2025-02-24T11:04:05.601892Z","iopub.status.idle":"2025-02-24T11:12:24.526996Z","shell.execute_reply.started":"2025-02-24T11:04:05.601865Z","shell.execute_reply":"2025-02-24T11:12:24.525981Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model_alex.build()\n# write your code here\nhistory_alex = model_alex.fit(\n    train_gen,\n    steps_per_epoch=Xtrain.shape[0] // batch_size,\n    epochs=epochs,  # Adjust the number of epochs as needed\n    validation_data=valid_gen,\n    validation_steps=Xval.shape[0] // batch_size,\n    callbacks=callbacks\n)\n\nloss, accuracy = model_alex.evaluate(Xtest, ytest, verbose=0)\nprint(f\"Test Loss: {loss:.4f}\")\nprint(f\"Test Accuracy: {accuracy:.4f}\")\n# write your code here","metadata":{"execution":{"iopub.status.busy":"2025-02-24T11:12:24.528246Z","iopub.execute_input":"2025-02-24T11:12:24.528545Z","iopub.status.idle":"2025-02-24T11:20:41.039679Z","shell.execute_reply.started":"2025-02-24T11:12:24.528513Z","shell.execute_reply":"2025-02-24T11:20:41.038549Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model_resnet50.build((250, 250, 3))\nbatch_size= 4\n# write your code here\nhistory_resnset50 = model_resnet50.fit(\n    train_gen,\n    steps_per_epoch=Xtrain.shape[0] // batch_size,\n    epochs=epochs,  # Adjust the number of epochs as needed\n    validation_data=valid_gen,\n    validation_steps=Xval.shape[0] // batch_size,\n    callbacks=callbacks\n)\n\nloss, accuracy = model_resnet50.evaluate(Xtest, ytest, verbose=0)\nprint(f\"Test Loss: {loss:.4f}\")\nprint(f\"Test Accuracy: {accuracy:.4f}\")\n# write your code here\n","metadata":{"execution":{"iopub.status.busy":"2025-02-24T11:52:49.667419Z","iopub.execute_input":"2025-02-24T11:52:49.667772Z","iopub.status.idle":"2025-02-24T11:52:55.908208Z","shell.execute_reply.started":"2025-02-24T11:52:49.667742Z","shell.execute_reply":"2025-02-24T11:52:55.906313Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model_Inception.build((250,250,3))\n# write your code here\nhistory_inception = model_Inception.fit(\n    train_gen,\n    steps_per_epoch=Xtrain.shape[0] // batch_size,\n    epochs=epochs,  # Adjust the number of epochs as needed\n    validation_data=valid_gen,\n    validation_steps=Xval.shape[0] // batch_size,\n    callbacks=callbacks\n)\n\nloss, accuracy = model_Inception.evaluate(Xtest, ytest, verbose=0)\nprint(f\"Test Loss: {loss:.4f}\")\nprint(f\"Test Accuracy: {accuracy:.4f}\")\n# write your code here","metadata":{"execution":{"iopub.status.busy":"2025-02-24T11:45:40.450249Z","iopub.status.idle":"2025-02-24T11:45:40.450542Z","shell.execute_reply.started":"2025-02-24T11:45:40.450404Z","shell.execute_reply":"2025-02-24T11:45:40.450418Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model_mobilenetv2.build(input_shape=(None, 250, 250, 3))\n# write your code here\nhistory_mobilenetv2 = model_mobilenetv2.fit(\n    train_gen,\n    steps_per_epoch=Xtrain.shape[0] // batch_size,\n    epochs=epochs,  # Adjust the number of epochs as needed\n    validation_data=valid_gen,\n    validation_steps=Xval.shape[0] // batch_size,\n    callbacks=callbacks\n)\n\nloss, accuracy = model_mobilenetv2.evaluate(Xtest, ytest, verbose=0)\nprint(f\"Test Loss: {loss:.4f}\")\nprint(f\"Test Accuracy: {accuracy:.4f}\")\n# write your code here","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-24T11:30:10.409544Z","iopub.status.idle":"2025-02-24T11:30:10.409855Z","shell.execute_reply.started":"2025-02-24T11:30:10.409705Z","shell.execute_reply":"2025-02-24T11:30:10.40972Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}