{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"\n# # example of creating a CNN with an inception module\n# from keras.models import Model\n# from keras.layers import Input\n# from keras.layers import Conv2D\n# from keras.layers import MaxPooling2D\n# from keras.layers.merge import concatenate\n# from keras.utils.vis_utils import plot_model\n \n# # function for creating a naive inception block\n# def naive_inception_module(layer_in, f1, f2, f3):\n# \t# 1x1 conv\n# \tconv1 = Conv2D(f1, (1,1), padding='same', activation='relu')(layer_in)\n# \t# 3x3 conv\n# \tconv3 = Conv2D(f2, (3,3), padding='same', activation='relu')(layer_in)\n# \t# 5x5 conv\n# \tconv5 = Conv2D(f3, (5,5), padding='same', activation='relu')(layer_in)\n# \t# 3x3 max pooling\n# \tpool = MaxPooling2D((3,3), strides=(1,1), padding='same')(layer_in)\n# \t# concatenate filters, assumes filters/channels last\n# \tlayer_out = concatenate([conv1, conv3, conv5, pool], axis=-1)\n# \treturn layer_out\n \n# # define model input\n# visible = Input(shape=(256, 256, 3))\n# # add inception module\n# layer = naive_inception_module(visible, 64, 128, 32)\n# # create model\n# model = Model(inputs=visible, outputs=layer)\n# # summarize model\n# model.summary()\n# # plot model architecture\n# plot_model(model, show_shapes=True, to_file='naive_inception_module.png')","metadata":{"execution":{"iopub.status.busy":"2022-03-12T13:35:55.635484Z","iopub.execute_input":"2022-03-12T13:35:55.636093Z","iopub.status.idle":"2022-03-12T13:35:55.657637Z","shell.execute_reply.started":"2022-03-12T13:35:55.635996Z","shell.execute_reply":"2022-03-12T13:35:55.656947Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport cv2\nimport random\nimport warnings\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import confusion_matrix, cohen_kappa_score\nfrom keras.models import Model\nfrom keras import optimizers, applications\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.callbacks import EarlyStopping, ReduceLROnPlateau\nfrom keras.layers import Dense, Dropout, GlobalAveragePooling2D, Input\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.preprocessing import image_dataset_from_directory\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import InputLayer, BatchNormalization, Dropout, Flatten, Dense, Activation, MaxPool2D, Conv2D\nfrom tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint\nfrom tensorflow.keras.applications.resnet50 import ResNet50\nfrom tensorflow.keras.utils import to_categorical\nfrom keras import optimizers\nfrom tensorflow.keras.optimizers import Adam\nfrom keras.callbacks import Callback,ModelCheckpoint,ReduceLROnPlateau\nfrom keras.models import Sequential,load_model\nfrom keras.layers import Dense, Dropout\nfrom keras.wrappers.scikit_learn import KerasClassifier\nimport keras.backend as K\n#import tensorflow_addons as tfa\n#from tensorflow.keras.metrics import Metric\n#from tensorflow_addons.utils.types import AcceptableDTypes, FloatTensorLike\nfrom typeguard import typechecked\nfrom typing import Optional\n%matplotlib inline\nsns.set(style=\"whitegrid\")\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2022-03-12T13:35:55.659275Z","iopub.execute_input":"2022-03-12T13:35:55.659593Z","iopub.status.idle":"2022-03-12T13:36:01.628443Z","shell.execute_reply.started":"2022-03-12T13:35:55.659557Z","shell.execute_reply":"2022-03-12T13:36:01.627554Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('../input/aptos2019-blindness-detection/train.csv')\ntest = pd.read_csv('../input/aptos2019-blindness-detection/test.csv')\nN_CLASSES = train['diagnosis'].nunique()\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')","metadata":{"execution":{"iopub.status.busy":"2022-03-12T13:36:01.629935Z","iopub.execute_input":"2022-03-12T13:36:01.630184Z","iopub.status.idle":"2022-03-12T13:36:01.666371Z","shell.execute_reply.started":"2022-03-12T13:36:01.630149Z","shell.execute_reply":"2022-03-12T13:36:01.665714Z"},"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')","metadata":{"execution":{"iopub.status.busy":"2022-03-12T13:36:01.668414Z","iopub.execute_input":"2022-03-12T13:36:01.668736Z","iopub.status.idle":"2022-03-12T13:36:05.450495Z","shell.execute_reply.started":"2022-03-12T13:36:01.668698Z","shell.execute_reply":"2022-03-12T13:36:05.449797Z"},"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":"2022-03-12T13:36:05.452845Z","iopub.execute_input":"2022-03-12T13:36:05.453108Z","iopub.status.idle":"2022-03-12T13:36:05.877397Z","shell.execute_reply.started":"2022-03-12T13:36:05.453073Z","shell.execute_reply":"2022-03-12T13:36:05.876409Z"},"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":"2022-03-12T13:36:05.879011Z","iopub.execute_input":"2022-03-12T13:36:05.879551Z","iopub.status.idle":"2022-03-12T13:36:09.073668Z","shell.execute_reply.started":"2022-03-12T13:36:05.87951Z","shell.execute_reply":"2022-03-12T13:36:09.072883Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.applications.inception_resnet_v2 import InceptionResNetV2\nfrom tensorflow.keras.layers import Input, MaxPooling2D, Dense, Flatten, Dropout\nfrom tensorflow.keras.models import Model\n\n\nbaseModel=InceptionResNetV2(include_top=False, input_tensor=Input(shape=(256, 256, 3)), weights='../input/inceptionresnetv2/inceptionresnetv2weightstfdimnotop.h5')\n\nfor layer in baseModel.layers:\n    layer.trainable=False\n    \ntransfer_model=baseModel.output\ntransfer_model=MaxPooling2D(pool_size=(4, 4))(transfer_model)\ntransfer_model=Flatten()(transfer_model)\ntransfer_model=Dense(64, activation='relu')(transfer_model)\ntransfer_model=Dropout(0.2)(transfer_model)\ntransfer_model=Dense(5, activation='softmax')(transfer_model)\n\nmodel = Model(inputs=baseModel.input, outputs=transfer_model)\nmodel.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#taken from old keras source code\ndef f1_score(y_true, y_pred): \n    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))\n    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))\n    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))\n    precision = true_positives / (predicted_positives + K.epsilon())\n    recall = true_positives / (possible_positives + K.epsilon())\n    f1_val = 2*(precision*recall)/(precision+recall+K.epsilon())\n    return f1_val","metadata":{"execution":{"iopub.status.busy":"2022-03-12T13:36:19.62468Z","iopub.execute_input":"2022-03-12T13:36:19.624966Z","iopub.status.idle":"2022-03-12T13:36:19.632175Z","shell.execute_reply.started":"2022-03-12T13:36:19.624928Z","shell.execute_reply":"2022-03-12T13:36:19.631133Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"METRICS = [\n      tf.keras.metrics.BinaryAccuracy(name='accuracy'),\n      tf.keras.metrics.Precision(name='precision'),\n      tf.keras.metrics.Recall(name='recall'),  \n      tf.keras.metrics.AUC(name='auc'),\n        f1_score,]","metadata":{"execution":{"iopub.status.busy":"2022-03-12T13:36:19.633873Z","iopub.execute_input":"2022-03-12T13:36:19.634164Z","iopub.status.idle":"2022-03-12T13:36:19.660729Z","shell.execute_reply.started":"2022-03-12T13:36:19.634128Z","shell.execute_reply":"2022-03-12T13:36:19.659945Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lrd = ReduceLROnPlateau(monitor = 'val_loss',patience = 2,verbose = 1,factor = 0.8, min_lr = 1e-6)\n\nmcp = ModelCheckpoint('ResNet152V2.h5')\n\nes = EarlyStopping(verbose=1, patience=2)","metadata":{"execution":{"iopub.status.busy":"2022-03-12T13:36:19.664806Z","iopub.execute_input":"2022-03-12T13:36:19.665241Z","iopub.status.idle":"2022-03-12T13:36:19.670927Z","shell.execute_reply.started":"2022-03-12T13:36:19.665208Z","shell.execute_reply":"2022-03-12T13:36:19.66995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer='Adam', loss=\"categorical_crossentropy\", metrics=METRICS)\nSTEP_SIZE_TRAIN = train_generator.n//train_generator.batch_size\nSTEP_SIZE_VALID = valid_generator.n//valid_generator.batch_size","metadata":{"execution":{"iopub.status.busy":"2022-03-12T13:36:19.672518Z","iopub.execute_input":"2022-03-12T13:36:19.673499Z","iopub.status.idle":"2022-03-12T13:36:19.701657Z","shell.execute_reply.started":"2022-03-12T13:36:19.673467Z","shell.execute_reply":"2022-03-12T13:36:19.700912Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit_generator(generator=train_generator,\n                              steps_per_epoch=STEP_SIZE_TRAIN,\n                              validation_data=valid_generator,\n                              validation_steps=STEP_SIZE_VALID,\n                              epochs=10,\n                              callbacks=[lrd,mcp,es])","metadata":{"execution":{"iopub.status.busy":"2022-03-12T13:36:19.703021Z","iopub.execute_input":"2022-03-12T13:36:19.703269Z","iopub.status.idle":"2022-03-12T14:28:56.103777Z","shell.execute_reply.started":"2022-03-12T13:36:19.703236Z","shell.execute_reply":"2022-03-12T14:28:56.101879Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"complete_datagen = ImageDataGenerator(rescale=1./255)\ncomplete_generator = complete_datagen.flow_from_dataframe(  \n        dataframe=train,\n        directory = \"../input/aptos2019-blindness-detection/train_images/\",\n        x_col=\"id_code\",\n        target_size=(224, 224),\n        batch_size=1,\n        shuffle=False,\n        class_mode=None)","metadata":{"execution":{"iopub.status.busy":"2022-03-12T14:28:56.109262Z","iopub.execute_input":"2022-03-12T14:28:56.110475Z","iopub.status.idle":"2022-03-12T14:28:57.350954Z","shell.execute_reply.started":"2022-03-12T14:28:56.11044Z","shell.execute_reply":"2022-03-12T14:28:57.350174Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"STEP_SIZE_COMPLETE = complete_generator.n//complete_generator.batch_size\n","metadata":{"execution":{"iopub.status.busy":"2022-03-12T14:28:57.352081Z","iopub.execute_input":"2022-03-12T14:28:57.35306Z","iopub.status.idle":"2022-03-12T14:28:57.357609Z","shell.execute_reply.started":"2022-03-12T14:28:57.353016Z","shell.execute_reply":"2022-03-12T14:28:57.356799Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_preds = model.predict_generator(complete_generator, steps=STEP_SIZE_COMPLETE)","metadata":{"execution":{"iopub.status.busy":"2022-03-12T14:28:57.359328Z","iopub.execute_input":"2022-03-12T14:28:57.359663Z","iopub.status.idle":"2022-03-12T14:37:06.399466Z","shell.execute_reply.started":"2022-03-12T14:28:57.359629Z","shell.execute_reply":"2022-03-12T14:37:06.398651Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_preds = [np.argmax(pred) for pred in train_preds]","metadata":{"execution":{"iopub.status.busy":"2022-03-12T14:37:06.401336Z","iopub.execute_input":"2022-03-12T14:37:06.401611Z","iopub.status.idle":"2022-03-12T14:37:06.429611Z","shell.execute_reply.started":"2022-03-12T14:37:06.401576Z","shell.execute_reply":"2022-03-12T14:37:06.428942Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# test_generator.reset()\n# STEP_SIZE_TEST = test_generator.n//test_generator.batch_size\n# preds = model.predict_generator(test_generator, steps=STEP_SIZE_TEST)\n# predictions = [np.argmax(pred) for pred in preds]\n# predictions[:10]","metadata":{"execution":{"iopub.status.busy":"2022-03-12T14:37:06.430634Z","iopub.execute_input":"2022-03-12T14:37:06.430882Z","iopub.status.idle":"2022-03-12T14:38:51.310658Z","shell.execute_reply.started":"2022-03-12T14:37:06.430848Z","shell.execute_reply":"2022-03-12T14:38:51.309817Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_generator.reset()\nSTEP_SIZE_TEST = test_generator.n//test_generator.batch_size\npreds = model.predict_generator(test_generator)\npredictions = [np.argmax(pred) for pred in preds]\npredictions[:10]","metadata":{"execution":{"iopub.status.busy":"2022-03-12T15:05:05.919304Z","iopub.execute_input":"2022-03-12T15:05:05.919703Z","iopub.status.idle":"2022-03-12T15:06:24.760753Z","shell.execute_reply.started":"2022-03-12T15:05:05.919667Z","shell.execute_reply":"2022-03-12T15:06:24.759967Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('./output/inception')","metadata":{"execution":{"iopub.status.busy":"2022-03-12T14:38:51.312244Z","iopub.execute_input":"2022-03-12T14:38:51.31264Z","iopub.status.idle":"2022-03-12T14:40:27.121865Z","shell.execute_reply.started":"2022-03-12T14:38:51.312598Z","shell.execute_reply":"2022-03-12T14:40:27.121067Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = ['0 - No DR', '1 - Mild', '2 - Moderate', '3 - Severe', '4 - Proliferative DR']\ncnf_matrix = confusion_matrix(train['diagnosis'].astype('int'), train_preds)\ncnf_matrix_norm = cnf_matrix.astype('float') / cnf_matrix.sum(axis=1)[:, np.newaxis]\ndf_cm = pd.DataFrame(cnf_matrix_norm, index=labels, columns=labels)\nprint(df_cm.describe().T)\nplt.figure(figsize=(15, 8))\nsns.heatmap(df_cm, annot=True, fmt='.2f')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-03-12T15:07:55.261334Z","iopub.execute_input":"2022-03-12T15:07:55.261772Z","iopub.status.idle":"2022-03-12T15:07:55.592442Z","shell.execute_reply.started":"2022-03-12T15:07:55.261737Z","shell.execute_reply":"2022-03-12T15:07:55.591727Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# print(len(predictions), len(filenames), len(preds), test_generator.n)\n# test","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filenames=test_generator.filenames\nresults=pd.DataFrame({\"id_code\":filenames,\n                      \"diagnosis\":predictions})\nresults['id_code'] = results['id_code'].map(lambda x: str(x)[:-4])\nresults.to_csv(\"submission.csv\",index=False)","metadata":{"execution":{"iopub.status.busy":"2022-03-12T15:08:16.381412Z","iopub.execute_input":"2022-03-12T15:08:16.381954Z","iopub.status.idle":"2022-03-12T15:08:16.397997Z","shell.execute_reply.started":"2022-03-12T15:08:16.381914Z","shell.execute_reply":"2022-03-12T15:08:16.397252Z"},"trusted":true},"execution_count":null,"outputs":[]}]}