{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.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":14774,"databundleVersionId":875431,"sourceType":"competition"}],"dockerImageVersionId":30579,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nprint(os.listdir(\"../input\"))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-11-26T05:07:21.598894Z","iopub.execute_input":"2023-11-26T05:07:21.599209Z","iopub.status.idle":"2023-11-26T05:07:21.948078Z","shell.execute_reply.started":"2023-11-26T05:07:21.599181Z","shell.execute_reply":"2023-11-26T05:07:21.947161Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow import keras\nfrom keras.callbacks import Callback,EarlyStopping,ReduceLROnPlateau\nfrom keras.layers import Dense,Flatten,GlobalAveragePooling2D,Dropout,Conv2D,Input,Reshape,Multiply,BatchNormalization,Activation\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.metrics import cohen_kappa_score\nimport random\nfrom PIL import Image\nimport matplotlib.pyplot as plt\nimport cv2\nkaggle_dir='../input/aptos2019-blindness-detection/'\ntrain_path=os.path.join(kaggle_dir,\"train_images/\")\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras import Model","metadata":{"execution":{"iopub.status.busy":"2023-11-26T05:07:23.685282Z","iopub.execute_input":"2023-11-26T05:07:23.685739Z","iopub.status.idle":"2023-11-26T05:07:35.718737Z","shell.execute_reply.started":"2023-11-26T05:07:23.685709Z","shell.execute_reply":"2023-11-26T05:07:35.717961Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seed=1534\nrandom.seed(seed)\nnp.random.seed(seed)\ntf.random.set_seed(seed)\nos.environ[\"PYTHONHASHSEED\"]=str(seed)\n","metadata":{"execution":{"iopub.status.busy":"2023-11-26T05:07:35.720249Z","iopub.execute_input":"2023-11-26T05:07:35.720780Z","iopub.status.idle":"2023-11-26T05:07:35.726001Z","shell.execute_reply.started":"2023-11-26T05:07:35.720753Z","shell.execute_reply":"2023-11-26T05:07:35.724970Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df=pd.read_csv(\"../input/aptos2019-blindness-detection/train.csv\")\ntrain_df[\"id_code\"]=train_df[\"id_code\"].astype(str)+\".png\"\nprint(train_df.head(),\"\\n\")\nprint(f\"training_images_labels:\",len(train_df))\ntrain_df[\"diagnosis\"]=train_df[\"diagnosis\"].astype(\"str\")\n","metadata":{"execution":{"iopub.status.busy":"2023-11-26T05:07:35.727222Z","iopub.execute_input":"2023-11-26T05:07:35.727553Z","iopub.status.idle":"2023-11-26T05:07:35.769963Z","shell.execute_reply.started":"2023-11-26T05:07:35.727520Z","shell.execute_reply":"2023-11-26T05:07:35.769113Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df=pd.read_csv(\"../input/aptos2019-blindness-detection/test.csv\")\ntest_df[\"id_code\"]=test_df[\"id_code\"]+\".png\"\nprint(test_df.head(),\"\\n\")\nprint(f\"test_images_labels:\",len(test_df))","metadata":{"execution":{"iopub.status.busy":"2023-11-26T05:07:35.771396Z","iopub.execute_input":"2023-11-26T05:07:35.771676Z","iopub.status.idle":"2023-11-26T05:07:35.785002Z","shell.execute_reply.started":"2023-11-26T05:07:35.771651Z","shell.execute_reply":"2023-11-26T05:07:35.783840Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images_display=10\nimage_dir=\"../input/aptos2019-blindness-detection/train_images/\"\nfor i in range(images_display):\n    image_path=image_dir+train_df[\"id_code\"].iloc[i]\n    image=Image.open(image_path)\n    \n    plt.imshow(image)\n    plt.title(f\"label:{train_df['diagnosis'].iloc[i]}\")\n    plt.show()\n              ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df=pd.DataFrame(train_df,columns=[\"id_code\",\"diagnosis\"])\n","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\nimage_size=224\nseed=42\nimg_dir=\"../input/aptos2019-blindness-detection/train_images\"\ndef preprocessing(train_df):\n    global img_dir\n    fig = plt.figure(figsize=(25, 16))\n    \n    for i, (idx, row) in enumerate(train_df.iterrows()):\n        if i >= 25:\n            break\n        ax = fig.add_subplot(5, 5, i + 1, xticks=[], yticks=[])\n        \n        path = f\"{img_dir}/{row['id_code']}\"\n        image = cv2.imread(path)\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        \n        height,width=image.shape[:2]\n        \n        left=int(0.1 * width)\n        top=int(0.1 * height)\n        right=int(1.0 * width)\n        bottom=int(1.0 * height)\n        \n        image=image[top:bottom,left:right]\n        \n        \n        image = cv2.resize(image, (image_size, image_size))\n        image = cv2.addWeighted(image, 4, cv2.GaussianBlur(image, (0, 0), image_size/10), -4, 128)\n\n        plt.imshow(image, cmap='gray')\n        ax.set_title(f'Label: {row[\"diagnosis\"]}, ID: {row[\"id_code\"]}')\n\n    plt.show()\n\n\npreprocessing(train_df)\n\"\"\"","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_train=train_df[\"diagnosis\"].values","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def preprocess(row_or_array):\n    if isinstance(row_or_array,pd.Series):\n        path=f\"{train_path}/{row_or_array['id_code']}\"\n        image=cv2.imread(path)\n        image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)\n        \n        height,width=image.shape[:2]\n        \n        left=int(0.1 * width)\n        top=int(0.1 * height)\n        right=int(1.0 * width)\n        bottom=int(1.0 * height)\n        \n        image=image[top:bottom,left:right]\n        \n        image=cv2.resize(image,(224,224))\n        image=cv2.addWeighted(image,4,cv2.GaussianBlur(image,(0,0),224/10),-4,128)\n        plt.imshow(image)\n        plt.title(f'Label: {row_or_array[\"diagnosis\"]}, ID: {row_or_array[\"id_code\"]}')\n        plt.show()\n        return image\n    \n    elif isinstance(row_or_array,np.ndarray):\n        return row_or_array\n    \n    ","metadata":{"execution":{"iopub.status.busy":"2023-11-26T05:18:00.042935Z","iopub.execute_input":"2023-11-26T05:18:00.043293Z","iopub.status.idle":"2023-11-26T05:18:00.051643Z","shell.execute_reply.started":"2023-11-26T05:18:00.043265Z","shell.execute_reply":"2023-11-26T05:18:00.050517Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size=32\ntrain_datagen=ImageDataGenerator(rotation_range=40,\n                                horizontal_flip=True,\n                                vertical_flip=True,\n                                validation_split=0.2,\n                                preprocessing_function=preprocess,\n                                rescale=1./255,\n                                zoom_range=0.2,\n                                fill_mode=\"nearest\",\n                                height_shift_range=0.2,\n                                width_shift_range=0.2,\n                                shear_range=0.2,\n                                \n                                )","metadata":{"execution":{"iopub.status.busy":"2023-11-26T05:18:02.786175Z","iopub.execute_input":"2023-11-26T05:18:02.786659Z","iopub.status.idle":"2023-11-26T05:18:02.792114Z","shell.execute_reply.started":"2023-11-26T05:18:02.786626Z","shell.execute_reply":"2023-11-26T05:18:02.791106Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_gen=train_datagen.flow_from_dataframe(dataframe=train_df,\n                                           x_col=\"id_code\",\n                                           y_col=\"diagnosis\",\n                                           directory=train_path,\n                                           target_size=(224,224),\n                                           batch_size=batch_size,\n                                           class_mode=\"categorical\",\n                                           subset=\"training\",shuffle=True)\ntest_gen=train_datagen.flow_from_dataframe(train_df,\n                                          x_col=\"id_code\",\n                                          y_col=\"diagnosis\",\n                                          directory=train_path,\n                                          target_size=(224,224),\n                                          class_mode=\"categorical\",\n                                          subset=\"validation\",shuffle=False)\nval_gen=train_datagen.flow_from_dataframe(train_df,\n                                        x_col=\"id_code\",\n                                        y_col=\"diagnosis\",\n                                        directory=train_path,\n                                        class_mode=\"categorical\",\n                                        subset=\"validation\",shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2023-11-26T05:20:40.129223Z","iopub.execute_input":"2023-11-26T05:20:40.129591Z","iopub.status.idle":"2023-11-26T05:21:07.696434Z","shell.execute_reply.started":"2023-11-26T05:20:40.129559Z","shell.execute_reply":"2023-11-26T05:21:07.695498Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot=train_df.head(batch_size).apply(preprocess,axis=1)","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mobile=tf.keras.applications.mobilenet.MobileNet(weights=\"imagenet\",input_shape=(224,224,3),include_top=False)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-11-26T05:21:07.698179Z","iopub.execute_input":"2023-11-26T05:21:07.698874Z","iopub.status.idle":"2023-11-26T05:21:13.851606Z","shell.execute_reply.started":"2023-11-26T05:21:07.698838Z","shell.execute_reply":"2023-11-26T05:21:13.850613Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mobile.summary()","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x=mobile.layers[-1].output\nx=tf.keras.layers.GlobalAveragePooling2D()(x)\noutput=Dense(5,activation=\"softmax\")(x)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-11-26T05:21:13.852725Z","iopub.execute_input":"2023-11-26T05:21:13.853041Z","iopub.status.idle":"2023-11-26T05:21:13.879393Z","shell.execute_reply.started":"2023-11-26T05:21:13.853015Z","shell.execute_reply":"2023-11-26T05:21:13.878412Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mobilenet=Model(inputs=mobile.input,outputs=output)\n","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-11-26T05:21:13.882075Z","iopub.execute_input":"2023-11-26T05:21:13.882722Z","iopub.status.idle":"2023-11-26T05:21:13.896733Z","shell.execute_reply.started":"2023-11-26T05:21:13.882686Z","shell.execute_reply":"2023-11-26T05:21:13.895839Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"es=EarlyStopping(monitor=\"val_loss\",mode=\"auto\",verbose=1,patience=12)\nrlr=ReduceLROnPlateau(monitos=\"val_loss\",factor=0.5,patience=5,verbose=1,mode=\"auto\",epsilon=0.02)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-11-26T05:21:13.897773Z","iopub.execute_input":"2023-11-26T05:21:13.898134Z","iopub.status.idle":"2023-11-26T05:21:13.902656Z","shell.execute_reply.started":"2023-11-26T05:21:13.898101Z","shell.execute_reply":"2023-11-26T05:21:13.901840Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mobilenet.compile(loss=\"categorical_crossentropy\",optimizer=tf.keras.optimizers.RMSprop(lr=0.001),metrics=[\"accuracy\"])\ntotal_samples=train_gen.n\nepochs=5\n","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-11-26T05:21:13.903678Z","iopub.execute_input":"2023-11-26T05:21:13.903961Z","iopub.status.idle":"2023-11-26T05:21:13.925637Z","shell.execute_reply.started":"2023-11-26T05:21:13.903928Z","shell.execute_reply":"2023-11-26T05:21:13.924907Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history=mobilenet.fit(\n    train_gen,\n    steps_per_epoch=train_gen.samples//batch_size,\n    epochs=epochs,\n    validation_data=test_gen,\n    validation_steps=test_gen.samples//batch_size,\n    callbacks=[es,rlr]\n    ) ","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-11-26T05:21:14.760644Z","iopub.execute_input":"2023-11-26T05:21:14.761445Z","iopub.status.idle":"2023-11-26T05:56:37.458088Z","shell.execute_reply.started":"2023-11-26T05:21:14.761403Z","shell.execute_reply":"2023-11-26T05:56:37.457182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mobilenet.save_weights(\"#newly (customized&trained) mobilenet_v3@weights.h5\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"strategy=tf.distribute.MirroredStrategy()","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mobilenet=tf.keras.Model(inputs=mobilenet.input,outputs=mobilenet.layers[-2].output)\n    ","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(mobilenet.summary())","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" model=tf.keras.Sequential([\n     mobilenet,\n     tf.keras.layers.Dense(128,activation=\"relu\"),\n     tf.keras.layers.AlphaDropout(0.5),\n     tf.keras.layers.BatchNormalization(),\n     tf.keras.layers.Flatten(),\n     tf.keras.layers.Dense(5,activation=\"softmax\")\n    \n])\nmodel.build((64,224,224,3))\nmodel.summary()\n    ","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(loss=\"categorical_crossentropy\",optimizer=tf.keras.optimizers.Adam(lr=0.001),metrics=[\"categorical_accuracy\"])","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"es=EarlyStopping(monitor=\"val_loss\",mode=\"auto\",verbose=1,patience=12)\nrlr=ReduceLROnPlateau(monitos=\"val_loss\",factor=0.5,patience=5,verbose=1,mode=\"auto\",epsilon=0.0001)","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Batch_size=64\nepoch=20\nstrategy = tf.distribute.MirroredStrategy()\nprint('Number of devices: {}'.format(strategy.num_replicas_in_sync))\nBUFFER_SIZE = 10000\n\nBATCH_SIZE_PER_REPLICA = 64\nBATCH_SIZE = BATCH_SIZE_PER_REPLICA * strategy.num_replicas_in_sync","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history_1=model.fit(\n    train_gen,\n    steps_per_epoch=train_gen.samples//Batch_size,\n    epochs=epoch,\n    validation_data=test_gen,\n    validation_steps=test_gen.samples//Batch_size,\n    callbacks=[es,rlr]\n    )","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mobilenet_acc=history.history[\"accuracy\"]\nmodel_acc=history_1.history[\"categorical_accuracy\"]\n\nmobilenet_params=mobilenet.count_params() / 1e6\nmodel_params=model.count_params() / 1e6\n\nfig, ax1 = plt.subplots(figsize=(10, 6))\n\ncolor = 'tab:red'\nax1.set_xlabel('Epochs')\nax1.set_ylabel('Accuracy - MobileNet', color=color)\nax1.plot(mobilenet_acc, color=color, label='Accuracy - MobileNet', linestyle='-', marker='o')\nax1.tick_params(axis='y', labelcolor=color)\n\nax2 = ax1.twinx()  \ncolor = 'tab:blue'\nax2.set_ylabel('Accuracy - Custom Model', color=color)  \nax2.plot(model_acc, color=color, label='Accuracy - Custom Model', linestyle='-', marker='s')\nax2.tick_params(axis='y', labelcolor=color)\n\n\nax1.set_xticks(np.arange(0, len(mobilenet_acc), 1))\n\n\nax1.legend(loc='upper left', bbox_to_anchor=(0.01, 0.99))\n\nfig.tight_layout()  \nplt.title('Training Accuracy and Model Parameters Comparison')\nplt.show()\n\n\nmodels = ['MobileNet', 'Custom Model']\nparams = [mobilenet_params, model_params]\n\nfig, ax = plt.subplots(figsize=(8, 5))\nax.bar(models, params, color=['red', 'blue'], alpha=0.7)\nax.set_ylabel('Number of Parameters (Millions)')\nax.set_title('Model Parameter Comparison')\nplt.show()","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"layer_names = [layer.name for layer in mobilenet.layers if isinstance(layer, Conv2D)]\nfor layer_name in layer_names:\n    intermediate_model = tf.keras.Model(inputs=mobilenet.input, outputs=mobilenet.get_layer(layer_name).output)\n    intermediate_output = intermediate_model.predict(train_gen[0][0])\n    \n    # Plot the feature maps\n    plt.figure(figsize=(10, 10))\n    num_plots = min(intermediate_output.shape[3], 64)\n    rows = int(np.sqrt(num_plots))\n    cols = int(np.ceil(num_plots / rows))\n\n    for i in range(num_plots):\n        plt.subplot(rows, cols, i+1)\n        plt.imshow(intermediate_output[0, :, :, i], cmap='gray')\n        plt.axis('off')\n\n    plt.suptitle(f'Feature Maps - {layer_name}')\n    plt.show()\n","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mobile=tf.keras.applications.mobilenet.MobileNet(weights=\"imagenet\",input_shape=(224,224,3),include_top=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class SEBlock(tf.keras.layers.Layer):\n    def __init__(self, ratio=19):\n        super(SEBlock, self).__init__()\n        self.ratio = ratio\n        #self.global_pooling = tf.keras.layers.GlobalAveragePooling2D(data_format='channels_last')\n\n    def build(self, input_shape):\n        num_channels = input_shape[-1]\n        self.global_pooling=tf.keras.layers.GlobalAveragePooling2D(data_format=\"channels_last\")\n        \n        self.fc1 = tf.keras.layers.Dense(num_channels // self.ratio, activation='relu')\n        self.fc2=tf.keras.layers.Dense(num_channels //  self.ratio,activation='relu')\n        self.fc2 = tf.keras.layers.Dense(num_channels, activation='softmax')\n\n    def call(self, inputs):\n        x = self.global_pooling(inputs)\n        x=Reshape((1,1,x.shape[-1]))(x)\n        x = self.fc1(x)\n        x = self.fc2(x)\n        #x = tf.expand_dims(tf.expand_dims(x, axis=1), axis=1)\n        return Multiply()([inputs,Reshape((1,1,x.shape[-1]))(x)])\n    def get_config(self):\n        config=super(SEBlock,self).get_config()\n        config[\"ratio\"]=self.ratio\n        return config\n    \n    \n    ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.initializers import he_normal","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x=mobile.output\nx=SEBlock(ratio=19)(x)\nx=Conv2D(128,(3,3),activation=\"relu\",padding=\"same\")(x)\nx=BatchNormalization()(x)\nx=Activation('relu')(x)\nx=SEBlock()(x)\n#x=Conv2D(128,(3,3),activation=\"relu\",padding=\"same\")(x)\n#x=SEBlock()(x)\nx=BatchNormalization()(x)\nx=GlobalAveragePooling2D(data_format=\"channels_last\")(x)\nx=Dense(128,activation=\"relu\",kernel_initializer=he_normal())(x)\nx=BatchNormalization()(x)\nx=Dense(1024,activation=\"relu\")(x)\nx=BatchNormalization()(x)\noutput=Dense(5,activation=\"softmax\")(x)\nmodel=tf.keras.models.Model(inputs=mobile.input,outputs=output)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for layer in mobile.layers[:23]:\n    layer.trainable=False","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import LearningRateScheduler\ndef lr_schedule(epoch, lr):\n    initial_lr = 0.001\n    if epoch < 10:\n        return initial_lr\n    else:\n        return lr * tf.math.exp(0.1 * (10 - epoch))\nmodel.compile(\n    loss=\"categorical_crossentropy\",\n    optimizer=Adam(learning_rate=0.001),\n    metrics=[\"accuracy\"]\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"es=EarlyStopping(monitor=\"val_accuracy\",verbose=1,patience=5,restore_best_weights=True)\nrlr=ReduceLROnPlateau(monitos=\"val_loss\",factor=0.5,patience=10,verbose=1,mode=\"auto\",epsilon=0.02)\nbatch_size=64","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(\n    train_gen,\n    steps_per_epoch=train_gen.samples // batch_size,\n    epochs=50,\n    validation_data=val_gen,\n    validation_steps=test_gen.samples // batch_size,\n    callbacks=[LearningRateScheduler(lr_schedule)]\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_loss, val_accuracy = model.evaluate(val_gen, steps=test_gen.samples // batch_size)\n\nprint(f'Test Loss: {val_loss:.4f}')\nprint(f'Test Accuracy: {val_accuracy * 100:.2f}%')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"initial_learning_rate = 0.001\nlr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(\n    initial_learning_rate, decay_steps=10000, decay_rate=0.9, staircase=True\n)\n\noptimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)\nmodel.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])\n","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(\n    train_gen,\n    steps_per_epoch=train_gen.samples // batch_size,\n    epochs=50,\n    validation_data=test_gen,\n    validation_steps=test_gen.samples // batch_size,\n    callbacks=[LearningRateScheduler(lr_schedule)]\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"es=EarlyStopping(monitor=\"val_loss\",mode=\"auto\",verbose=1,patience=12)\nrlr=ReduceLROnPlateau(monitos=\"val_loss\",factor=0.5,patience=5,verbose=1,mode=\"auto\",epsilon=0.02)\ndef scheduler(epoch, lr):\n    if epoch < 20:\n        return lr\n    else:\n        return lr * tf.math.exp(-0.2)\n\nlrs=tf.keras.callbacks.LearningRateScheduler(scheduler)\n","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Batch_size=64","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\nSE_history=model_with_multiple_seblocks.fit(\n    train_gen,\n    steps_per_epoch=train_gen.samples//Batch_size,\n    epochs=epoch,\n    validation_data=test_gen,\n    validation_steps=test_gen.samples//Batch_size,\n    callbacks=[es,rlr,lrs]\n    )\n\"\"\"","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-11-26T05:14:20.492819Z","iopub.execute_input":"2023-11-26T05:14:20.493209Z","iopub.status.idle":"2023-11-26T05:14:20.500890Z","shell.execute_reply.started":"2023-11-26T05:14:20.493180Z","shell.execute_reply":"2023-11-26T05:14:20.499858Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"layer_names = [layer.name for layer in model.layers if isinstance(layer, Conv2D)]\nfor layer_name in layer_names:\n    intermediate_model = tf.keras.Model(inputs=model.input, outputs=model.get_layer(layer_name).output)\n    intermediate_output = intermediate_model.predict(train_gen[0][0])\n    \n    # Plot the feature maps\n    plt.figure(figsize=(10, 10))\n    num_plots = min(intermediate_output.shape[3], 64)\n    rows = int(np.sqrt(num_plots))\n    cols = int(np.ceil(num_plots / rows))\n\n    for i in range(num_plots):\n        plt.subplot(rows, cols, i+1)\n        plt.imshow(intermediate_output[0, :, :, i], cmap='gray')\n        plt.axis('off')\n\n    plt.suptitle(f'Feature Maps - {layer_name}')\n    plt.show()\n","metadata":{"execution":{"iopub.status.idle":"2023-11-25T10:05:38.111730Z","shell.execute_reply.started":"2023-11-25T10:04:13.460702Z","shell.execute_reply":"2023-11-25T10:05:38.110760Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_path=\"/kaggle/input/aptos2019-blindness-detection/test_images\"\ntest_files=os.listdir(test_path)\ntest_data=pd.DataFrame({\"id_code\":[os.path.join(test_path,file)for file in test_files]})","metadata":{"execution":{"iopub.status.busy":"2023-11-26T05:16:58.906833Z","iopub.execute_input":"2023-11-26T05:16:58.907657Z","iopub.status.idle":"2023-11-26T05:16:58.918518Z","shell.execute_reply.started":"2023-11-26T05:16:58.907619Z","shell.execute_reply":"2023-11-26T05:16:58.917616Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_gen=train_datagen.flow_from_dataframe(test_data,\n                                          x_col=\"id_code\",\n                                          directory=test_path,\n                                          target_size=(224,224),\n                                          batch_size=32,\n                                          class_mode=None,\n                                          shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2023-11-26T05:56:37.459903Z","iopub.execute_input":"2023-11-26T05:56:37.460196Z","iopub.status.idle":"2023-11-26T05:56:41.127048Z","shell.execute_reply.started":"2023-11-26T05:56:37.460172Z","shell.execute_reply":"2023-11-26T05:56:41.126224Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions=mobilenet.predict(test_gen,steps=len(test_path),verbose=1)\npredicted_labels=np.argmax(predictions,axis=1)","metadata":{"execution":{"iopub.status.busy":"2023-11-26T05:57:23.482693Z","iopub.execute_input":"2023-11-26T05:57:23.483612Z","iopub.status.idle":"2023-11-26T05:59:12.951374Z","shell.execute_reply.started":"2023-11-26T05:57:23.483578Z","shell.execute_reply":"2023-11-26T05:59:12.950289Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\ntrue_labels=np.array([0,1,2,3,4,0])\n\nfig,axes=plt.subplots(2,3,figsize=(12,7))\n\nfor i,ax in enumerate(axes.flat):\n    img=plt.imread(test_data[\"id_code\"][i])\n    ax.imshow(img)\n    ax.axis(\"off\")\n    \n    true_label = true_labels[i]\n    predicted_label=predicted_labels[i]\n    ax.set_title(f\"True: {true_label}, Predicted: {predicted_label}\")\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-26T06:07:40.829308Z","iopub.execute_input":"2023-11-26T06:07:40.829674Z","iopub.status.idle":"2023-11-26T06:07:41.991709Z","shell.execute_reply.started":"2023-11-26T06:07:40.829648Z","shell.execute_reply":"2023-11-26T06:07:41.990809Z"},"trusted":true},"execution_count":null,"outputs":[]}]}