{"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":"none","dataSources":[{"sourceId":14774,"databundleVersionId":875431,"sourceType":"competition"}],"dockerImageVersionId":30627,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import cv2\nimport numpy as np\nimport pandas as pd\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.models import Sequential, Model\nfrom tensorflow.keras.layers import InputLayer, BatchNormalization,Activation, MaxPooling2D, Conv2D\nfrom tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense, Dropout, GlobalAveragePooling2D\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.optimizers import Adam, SGD, RMSprop\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau, TensorBoard\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:48:56.022367Z","iopub.execute_input":"2024-01-07T12:48:56.022773Z","iopub.status.idle":"2024-01-07T12:48:56.029865Z","shell.execute_reply.started":"2024-01-07T12:48:56.022740Z","shell.execute_reply":"2024-01-07T12:48:56.028895Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Importing the data\n\ntrain = pd.read_csv('../input/aptos2019-blindness-detection/train.csv')\ntest = pd.read_csv('../input/aptos2019-blindness-detection/test.csv'\n                  )\nsubmission= pd.read_csv('../input/aptos2019-blindness-detection/sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:48:56.032151Z","iopub.execute_input":"2024-01-07T12:48:56.032889Z","iopub.status.idle":"2024-01-07T12:48:56.075057Z","shell.execute_reply.started":"2024-01-07T12:48:56.032833Z","shell.execute_reply":"2024-01-07T12:48:56.073684Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Number of train samples: ', train.shape[0])\nprint('Number of test samples: ', test.shape[0])","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:48:56.076358Z","iopub.execute_input":"2024-01-07T12:48:56.076640Z","iopub.status.idle":"2024-01-07T12:48:56.082476Z","shell.execute_reply.started":"2024-01-07T12:48:56.076615Z","shell.execute_reply":"2024-01-07T12:48:56.081251Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display(train.head())","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:48:56.083541Z","iopub.execute_input":"2024-01-07T12:48:56.083930Z","iopub.status.idle":"2024-01-07T12:48:56.101924Z","shell.execute_reply.started":"2024-01-07T12:48:56.083903Z","shell.execute_reply":"2024-01-07T12:48:56.100492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas_profiling as pp\npp.ProfileReport(train)","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:48:56.104982Z","iopub.execute_input":"2024-01-07T12:48:56.107467Z","iopub.status.idle":"2024-01-07T12:48:57.363310Z","shell.execute_reply.started":"2024-01-07T12:48:56.107409Z","shell.execute_reply":"2024-01-07T12:48:57.361810Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns\nf, ax = plt.subplots(figsize=(14, 5))\nax = sns.countplot(x=\"diagnosis\", data=train, palette=\"Set2\")\nsns.despine()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:48:57.364582Z","iopub.execute_input":"2024-01-07T12:48:57.364888Z","iopub.status.idle":"2024-01-07T12:48:57.578947Z","shell.execute_reply.started":"2024-01-07T12:48:57.364861Z","shell.execute_reply":"2024-01-07T12:48:57.577832Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.set_style(\"white\")\ncount = 1\nplt.figure(figsize=[15, 15])\nfor img_name in train['id_code'][:15]:\n    img = cv2.imread(\"../input/aptos2019-blindness-detection/train_images/%s.png\" % img_name)[...,[2, 1, 0]]\n    plt.subplot(5, 5, count)\n    plt.imshow(img)\n    plt.title(\"Image %s\" % count)\n    count += 1\n    \nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:48:57.580837Z","iopub.execute_input":"2024-01-07T12:48:57.581321Z","iopub.status.idle":"2024-01-07T12:49:08.337081Z","shell.execute_reply.started":"2024-01-07T12:48:57.581288Z","shell.execute_reply":"2024-01-07T12:49:08.335529Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"N_CLASSES = train['diagnosis'].nunique()\nN_CLASSES","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:49:08.338636Z","iopub.execute_input":"2024-01-07T12:49:08.340266Z","iopub.status.idle":"2024-01-07T12:49:08.348073Z","shell.execute_reply.started":"2024-01-07T12:49:08.340208Z","shell.execute_reply":"2024-01-07T12:49:08.346336Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Preprocecss data\ntrain[\"id_code\"] = train[\"id_code\"].apply(lambda x: x + \".png\")\ntest[\"id_code\"] = test[\"id_code\"].apply(lambda x: x + \".png\")\ntrain['diagnosis'] = train['diagnosis'].astype('str')\ntrain.head()","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:49:08.349801Z","iopub.execute_input":"2024-01-07T12:49:08.350221Z","iopub.status.idle":"2024-01-07T12:49:08.374471Z","shell.execute_reply.started":"2024-01-07T12:49:08.350186Z","shell.execute_reply":"2024-01-07T12:49:08.373093Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen=ImageDataGenerator(rescale=1./255, \n                                 validation_split=0.2,\n                                 horizontal_flip=True)\n\ntrain_generator=train_datagen.flow_from_dataframe(\n    dataframe=train,\n    directory=\"../input/aptos2019-blindness-detection/train_images/\",\n    x_col=\"id_code\",\n    y_col=\"diagnosis\",\n    batch_size=16,\n    class_mode=\"categorical\",\n    target_size=(224, 224),\n    subset='training')\n\n","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:49:08.376150Z","iopub.execute_input":"2024-01-07T12:49:08.376462Z","iopub.status.idle":"2024-01-07T12:49:11.532793Z","shell.execute_reply.started":"2024-01-07T12:49:08.376436Z","shell.execute_reply":"2024-01-07T12:49:11.531332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"valid_generator=train_datagen.flow_from_dataframe(\n    dataframe=train,\n    directory=\"../input/aptos2019-blindness-detection/train_images/\",\n    x_col=\"id_code\",\n    y_col=\"diagnosis\",\n    batch_size=16,\n    class_mode=\"categorical\",    \n    target_size=(224, 224),\n    subset='validation')","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:49:11.534470Z","iopub.execute_input":"2024-01-07T12:49:11.534877Z","iopub.status.idle":"2024-01-07T12:49:11.576256Z","shell.execute_reply.started":"2024-01-07T12:49:11.534841Z","shell.execute_reply":"2024-01-07T12:49:11.575265Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale=1./255)\n\ntest_generator = test_datagen.flow_from_dataframe(  \n        dataframe=test,\n        directory = \"../input/aptos2019-blindness-detection/test_images/\",\n        x_col=\"id_code\",\n        target_size=(224, 224),\n        batch_size=16,\n        shuffle=False,\n        class_mode=None)","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:49:11.580373Z","iopub.execute_input":"2024-01-07T12:49:11.581603Z","iopub.status.idle":"2024-01-07T12:49:14.628920Z","shell.execute_reply.started":"2024-01-07T12:49:11.581563Z","shell.execute_reply":"2024-01-07T12:49:14.628159Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:49:14.631030Z","iopub.execute_input":"2024-01-07T12:49:14.631868Z","iopub.status.idle":"2024-01-07T12:49:14.637870Z","shell.execute_reply.started":"2024-01-07T12:49:14.631825Z","shell.execute_reply":"2024-01-07T12:49:14.636342Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_model = tf.keras.applications.ResNet152V2(input_shape=(224,224,3),include_top=False,weights=\"imagenet\")","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:49:14.639666Z","iopub.execute_input":"2024-01-07T12:49:14.641157Z","iopub.status.idle":"2024-01-07T12:49:23.504800Z","shell.execute_reply.started":"2024-01-07T12:49:14.640995Z","shell.execute_reply":"2024-01-07T12:49:23.503331Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Fine-tuning top layers\nfor layer in base_model.layers[:-10]:\n    layer.trainable = False","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:49:23.506565Z","iopub.execute_input":"2024-01-07T12:49:23.506949Z","iopub.status.idle":"2024-01-07T12:49:23.531384Z","shell.execute_reply.started":"2024-01-07T12:49:23.506920Z","shell.execute_reply":"2024-01-07T12:49:23.529927Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Building Model\n\nmodel=Sequential()\nmodel.add(base_model)\nmodel.add(Dropout(0.5))\nmodel.add(Flatten())\nmodel.add(BatchNormalization())\nmodel.add(Dense(256,kernel_initializer='he_uniform'))\nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(128,kernel_initializer='he_uniform'))\nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(32,kernel_initializer='he_uniform'))\nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(Dense(5,activation='softmax'))","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:49:23.532971Z","iopub.execute_input":"2024-01-07T12:49:23.533617Z","iopub.status.idle":"2024-01-07T12:49:25.221689Z","shell.execute_reply.started":"2024-01-07T12:49:23.533578Z","shell.execute_reply":"2024-01-07T12:49:25.220910Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:49:25.223000Z","iopub.execute_input":"2024-01-07T12:49:25.224279Z","iopub.status.idle":"2024-01-07T12:49:25.324789Z","shell.execute_reply.started":"2024-01-07T12:49:25.224246Z","shell.execute_reply":"2024-01-07T12:49:25.322954Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.utils import plot_model\nplot_model(model, to_file='convnet.png', show_shapes=True,show_layer_names=True)","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:49:25.326154Z","iopub.execute_input":"2024-01-07T12:49:25.326457Z","iopub.status.idle":"2024-01-07T12:49:25.596237Z","shell.execute_reply.started":"2024-01-07T12:49:25.326433Z","shell.execute_reply":"2024-01-07T12:49:25.594902Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer='Adam', loss=\"categorical_crossentropy\", metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:49:25.597931Z","iopub.execute_input":"2024-01-07T12:49:25.598450Z","iopub.status.idle":"2024-01-07T12:49:25.623587Z","shell.execute_reply.started":"2024-01-07T12:49:25.598419Z","shell.execute_reply":"2024-01-07T12:49:25.622496Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(\n    train_generator,\n    validation_data=valid_generator,\n    epochs=50\n)","metadata":{"execution":{"iopub.status.busy":"2024-01-07T12:49:25.625001Z","iopub.execute_input":"2024-01-07T12:49:25.626147Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"loss, accuracy = model.evaluate(train_generator)\nprint(\"Train loss:\", loss, \"Train accuracy:\", accuracy)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_loss, test_accuracy = model.evaluate(test_generator)\nprint(\"Test loss:\", test_loss, \"Test accuracy:\", test_accuracy)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_loss, val_accuracy = model.evaluate(valid_generator)\nprint(\"Validation loss:\", val_loss, \"Val accuracy:\", val_accuracy)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(history.history['loss'], label = 'training loss')\nplt.plot(history.history['accuracy'], label = 'training accuracy')\nplt.grid(True)\nplt.legend()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(history.history['val_loss'], label = 'validation loss')\nplt.plot(history.history['val_accuracy'], label = 'validation accuracy')\nplt.grid(True)\nplt.legend()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}