{"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":"import datetime\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport pathlib\nimport tensorflow as tf\n\n\nfrom tensorflow import keras\nfrom tensorflow.keras import datasets, layers, Sequential, optimizers\nfrom tensorflow.keras.preprocessing import image_dataset_from_directory\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Dropout, Flatten, experimental, BatchNormalization","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:50:06.666711Z","iopub.execute_input":"2022-12-22T14:50:06.667095Z","iopub.status.idle":"2022-12-22T14:50:06.673684Z","shell.execute_reply.started":"2022-12-22T14:50:06.667063Z","shell.execute_reply":"2022-12-22T14:50:06.672623Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sess = tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(log_device_placement=True))","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:56:43.402472Z","iopub.execute_input":"2022-12-22T14:56:43.402834Z","iopub.status.idle":"2022-12-22T14:56:43.413876Z","shell.execute_reply.started":"2022-12-22T14:56:43.402804Z","shell.execute_reply":"2022-12-22T14:56:43.412582Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow.keras.backend as K\nK.tensorflow_backend._get_available_gpus()","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:56:45.406775Z","iopub.execute_input":"2022-12-22T14:56:45.407155Z","iopub.status.idle":"2022-12-22T14:56:45.431223Z","shell.execute_reply.started":"2022-12-22T14:56:45.407113Z","shell.execute_reply":"2022-12-22T14:56:45.430100Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tf.compat.v1.keras.backend._get_available_gpus()","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:57:35.482682Z","iopub.execute_input":"2022-12-22T14:57:35.483063Z","iopub.status.idle":"2022-12-22T14:57:35.510517Z","shell.execute_reply.started":"2022-12-22T14:57:35.483030Z","shell.execute_reply":"2022-12-22T14:57:35.508667Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"config = tf.ConfigProto( device_count = {'GPU': 1 , 'CPU': 56} ) \nsess = tf.Session(config=config) \nkeras.backend.set_session(sess)","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:55:10.591671Z","iopub.execute_input":"2022-12-22T14:55:10.592034Z","iopub.status.idle":"2022-12-22T14:55:10.617473Z","shell.execute_reply.started":"2022-12-22T14:55:10.591988Z","shell.execute_reply":"2022-12-22T14:55:10.616257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!unzip ../input/diabetic-retinopathy-detection/trainLabels.csv.zip","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:08:02.243975Z","iopub.execute_input":"2022-12-22T14:08:02.244690Z","iopub.status.idle":"2022-12-22T14:08:03.256733Z","shell.execute_reply.started":"2022-12-22T14:08:02.244648Z","shell.execute_reply":"2022-12-22T14:08:03.255542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!apt install p7zip-full -y\n!7z x ../input/diabetic-retinopathy-detection/train.zip.001 \"-i!train/11*.jpeg\" -y # restrict extracted file to about 100 for the disk restriction\n!mkdir data\n!mv train data/train_11","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:08:03.258083Z","iopub.execute_input":"2022-12-22T14:08:03.259520Z","iopub.status.idle":"2022-12-22T14:08:26.586197Z","shell.execute_reply.started":"2022-12-22T14:08:03.259466Z","shell.execute_reply":"2022-12-22T14:08:26.584653Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image\n\nimg = Image.open(\"./data/train_11/1116_right.jpeg\")\n\nimport matplotlib.pyplot as plt\n\nplt.imshow(img)","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:09:10.550359Z","iopub.execute_input":"2022-12-22T14:09:10.550785Z","iopub.status.idle":"2022-12-22T14:09:12.735946Z","shell.execute_reply.started":"2022-12-22T14:09:10.550750Z","shell.execute_reply":"2022-12-22T14:09:12.735065Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport pandas as pd\nbase_image_dir = os.path.join('.', 'data/train_11')\ndf = pd.read_csv(os.path.join('./trainLabels.csv'))\ndf['path'] = df['image'].map(lambda x: os.path.join(base_image_dir,'{}.jpeg'.format(x)))\ndf['exists'] = df['path'].map(os.path.exists) #Most of the files do not exist because this is a sample of the original dataset\ndf = df[df['exists']]\ndf = df.drop(columns=['image','exists'])\ndf = df.sample(frac=1).reset_index(drop=True)#shuffle dataframe\ndf['level'] = df['level'].astype(str)\ndf.head(10)","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:09:19.854719Z","iopub.execute_input":"2022-12-22T14:09:19.855296Z","iopub.status.idle":"2022-12-22T14:09:20.146462Z","shell.execute_reply.started":"2022-12-22T14:09:19.855253Z","shell.execute_reply":"2022-12-22T14:09:20.145216Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df[\"level\"].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:09:22.000261Z","iopub.execute_input":"2022-12-22T14:09:22.000702Z","iopub.status.idle":"2022-12-22T14:09:22.015364Z","shell.execute_reply.started":"2022-12-22T14:09:22.000662Z","shell.execute_reply":"2022-12-22T14:09:22.014469Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def balance_data(class_size,df):\n    train_df = df.groupby(['level']).apply(lambda x: x.sample(class_size, replace = True)).reset_index(drop = True)\n    train_df = train_df.sample(frac=1).reset_index(drop=True)\n    print('New Data Size:', train_df.shape[0], 'Old Size:', df.shape[0])\n    train_df['level'].hist(figsize = (10, 5))\n    return train_df","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:09:23.546444Z","iopub.execute_input":"2022-12-22T14:09:23.546886Z","iopub.status.idle":"2022-12-22T14:09:23.554970Z","shell.execute_reply.started":"2022-12-22T14:09:23.546845Z","shell.execute_reply":"2022-12-22T14:09:23.553949Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\ntrain_df, val_df = train_test_split(df,test_size=0.2) # Here we will perform an 80%/20% split of the dataset, with stratification to keep similar distribution in validation set\ntrain_df['level'].hist(figsize = (10, 5))\nlen(val_df)","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:09:25.155646Z","iopub.execute_input":"2022-12-22T14:09:25.156018Z","iopub.status.idle":"2022-12-22T14:09:25.845936Z","shell.execute_reply.started":"2022-12-22T14:09:25.155973Z","shell.execute_reply":"2022-12-22T14:09:25.845032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = balance_data(train_df.pivot_table(index='level', aggfunc=len).max().max(),train_df) # I will oversample such that all classes have the same number of images as the maximum\ntrain_df['level'].hist(figsize = (10, 5))","metadata":{"execution":{"iopub.status.busy":"2022-12-20T09:41:15.613507Z","iopub.execute_input":"2022-12-20T09:41:15.614013Z","iopub.status.idle":"2022-12-20T09:41:15.916764Z","shell.execute_reply.started":"2022-12-20T09:41:15.613971Z","shell.execute_reply":"2022-12-20T09:41:15.915773Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\ntrain_datagen = ImageDataGenerator(\n    rescale=1.0/255,\n    horizontal_flip = True,\n    zoom_range=0.2\n)\n\ntest_datagen = ImageDataGenerator(\n    rescale=1.0/255,\n    validation_split = 0.2\n)","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:09:32.906617Z","iopub.execute_input":"2022-12-22T14:09:32.906994Z","iopub.status.idle":"2022-12-22T14:09:32.913470Z","shell.execute_reply.started":"2022-12-22T14:09:32.906963Z","shell.execute_reply":"2022-12-22T14:09:32.911937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"type(train_datagen)","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:32:32.497345Z","iopub.execute_input":"2022-12-22T14:32:32.497702Z","iopub.status.idle":"2022-12-22T14:32:32.504059Z","shell.execute_reply.started":"2022-12-22T14:32:32.497671Z","shell.execute_reply":"2022-12-22T14:32:32.503064Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train = train_datagen.flow_from_dataframe(\n        train_df,\n        directory=\".\",\n        x_col=\"path\",\n        y_col=\"level\",\n        target_size=(256, 256),\n        batch_size=32,\n        class_mode='categorical')\nx_test = test_datagen.flow_from_dataframe(\n        val_df,\n        x_col=\"path\",\n        y_col=\"level\",\n        directory=\".\",\n        target_size=(256, 256),\n        batch_size=32,\n        class_mode='categorical')","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:10:19.077320Z","iopub.execute_input":"2022-12-22T14:10:19.077716Z","iopub.status.idle":"2022-12-22T14:10:19.102307Z","shell.execute_reply.started":"2022-12-22T14:10:19.077684Z","shell.execute_reply":"2022-12-22T14:10:19.101192Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#CNN\nmodel = Sequential()\n\n#1st Module\nmodel.add(Conv2D(32, (3, 3),  padding='same', activation='relu', input_shape=(256, 256, 3)))\nmodel.add(Conv2D(32, (3, 3), padding='same', activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n# model.add(Dropout(0.25))\n# model.add(BatchNormalization())\n\n#2nd Module\nmodel.add(Conv2D(64, (3, 3),  padding='same', activation='relu'))\nmodel.add(Conv2D(64, (3, 3),  padding='same', activation='relu'))\nmodel.add(Conv2D(64, (3, 3),  padding='same', activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n# model.add(Dropout(0.2))\n# model.add(BatchNormalization())\n\n#3rd Module\nmodel.add(Conv2D(128, (3, 3), (1,1), padding='same', activation='relu'))\nmodel.add(Conv2D(128, (3, 3), (1,1), padding='same', activation='relu'))\nmodel.add(Conv2D(128, (3, 3), (1,1), padding='same', activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n# model.add(Dropout(0.25))\n\n#4th Module\nmodel.add(Conv2D(256, (3, 3), (1,1), padding='same', activation='relu'))\nmodel.add(Conv2D(256, (3, 3), (1,1), padding='same', activation='relu'))\nmodel.add(Conv2D(256, (3, 3), (1,1), padding='same', activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n# model.add(Dropout(0.2))\n\n#4th Module\nmodel.add(Conv2D(512, (3, 3), (1,1), padding='same', activation='relu'))\nmodel.add(Conv2D(512, (3, 3), (1,1), padding='same', activation='relu'))\nmodel.add(Conv2D(512, (3, 3), (1,1), padding='same', activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n\n#Flatten the layers\nmodel.add(Flatten())\n\n#Fully connected layers\nmodel.add(Dense(1024, activation='relu'))\n# model.add(Dropout(0.25))\nmodel.add(Dense(5, activation='softmax'))\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:49:30.711234Z","iopub.execute_input":"2022-12-22T14:49:30.711639Z","iopub.status.idle":"2022-12-22T14:49:30.930189Z","shell.execute_reply.started":"2022-12-22T14:49:30.711603Z","shell.execute_reply":"2022-12-22T14:49:30.929130Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(keras.optimizers.Adam(learning_rate=0.005), loss='categorical_crossentropy', metrics=['Accuracy'])","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:50:38.029476Z","iopub.execute_input":"2022-12-22T14:50:38.029828Z","iopub.status.idle":"2022-12-22T14:50:38.040962Z","shell.execute_reply.started":"2022-12-22T14:50:38.029798Z","shell.execute_reply":"2022-12-22T14:50:38.039875Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(x_train, epochs=5, batch_size=32, validation_data=x_test)","metadata":{"execution":{"iopub.status.busy":"2022-12-22T14:50:39.577091Z","iopub.execute_input":"2022-12-22T14:50:39.577466Z","iopub.status.idle":"2022-12-22T14:54:51.573269Z","shell.execute_reply.started":"2022-12-22T14:50:39.577432Z","shell.execute_reply":"2022-12-22T14:54:51.570563Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" # define the grid search parameters\nbatch_size = [16, 32, 64, 128, 256]\nepochs = [10, 50, 100]\nparam_grid = dict(batch_size=batch_size, epochs=epochs)\ngrid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1, cv=3)\ngrid_result = grid.fit(X, Y)\n# summarize results\nprint(\"Best: %f using %s\" % (grid_result.bestscore, grid_result.bestparams))\nmeans = grid_result.cvresults['mean_test_score']\nstds = grid_result.cvresults['std_test_score']\nparams = grid_result.cvresults['params']\nfor mean, stdev, param in zip(means, stds, params):\n    print(\"%f (%f) with: %r\" % (mean, stdev, param))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Transfer Learn Resnet","metadata":{}},{"cell_type":"code","source":"resnet = tf.keras.applications.ResNet50(weights='imagenet', \n                                        include_top = False,\n                                        input_shape=(224, 224, 3))\n\nlayer = tf.keras.layers.GlobalMaxPooling2D()(resnet.output)\nlayer = Flatten()(layer)\n\n#Fully connected layers\nlayer=Dense(1024, activation='relu')(layer)\n# model.add(Dropout(0.25))\noutput = tf.keras.layers.Dense(5, activation = 'softmax')(layer)\n\nmodel1 = tf.keras.Model(inputs=resnet.input, outputs=output)","metadata":{"execution":{"iopub.status.busy":"2022-12-22T15:12:32.414487Z","iopub.execute_input":"2022-12-22T15:12:32.415410Z","iopub.status.idle":"2022-12-22T15:12:34.300094Z","shell.execute_reply.started":"2022-12-22T15:12:32.415366Z","shell.execute_reply":"2022-12-22T15:12:34.299084Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model1.summary()","metadata":{"execution":{"iopub.status.busy":"2022-12-22T15:12:34.421796Z","iopub.execute_input":"2022-12-22T15:12:34.424597Z","iopub.status.idle":"2022-12-22T15:12:34.471139Z","shell.execute_reply.started":"2022-12-22T15:12:34.424556Z","shell.execute_reply":"2022-12-22T15:12:34.470097Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model1.compile(keras.optimizers.Adam(learning_rate=0.005), loss='categorical_crossentropy', metrics=['Accuracy'])","metadata":{"execution":{"iopub.status.busy":"2022-12-22T15:13:09.192716Z","iopub.execute_input":"2022-12-22T15:13:09.193093Z","iopub.status.idle":"2022-12-22T15:13:09.207393Z","shell.execute_reply.started":"2022-12-22T15:13:09.193061Z","shell.execute_reply":"2022-12-22T15:13:09.206487Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model1.fit(x_train, epochs=5, batch_size=32, validation_data=x_test)","metadata":{"execution":{"iopub.status.busy":"2022-12-22T15:13:11.590236Z","iopub.execute_input":"2022-12-22T15:13:11.590594Z","iopub.status.idle":"2022-12-22T15:23:45.382558Z","shell.execute_reply.started":"2022-12-22T15:13:11.590564Z","shell.execute_reply":"2022-12-22T15:23:45.381368Z"},"trusted":true},"execution_count":null,"outputs":[]}]}