{"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 os\nimport shutil\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport cv2 as cv\n\nimport tensorflow as tf\nfrom matplotlib import pyplot as plt\nfrom sklearn.preprocessing import MultiLabelBinarizer\nfrom sklearn.metrics import multilabel_confusion_matrix\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.models import Sequential, Model\nfrom tensorflow.keras.layers import Input, Dense, Flatten, Conv2D, MaxPooling2D, Dropout, BatchNormalization, concatenate\nfrom tensorflow.keras.activations import relu, sigmoid\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.losses import binary_crossentropy\nfrom tensorflow.keras.metrics import Precision, Recall, AUC\nfrom tensorflow.keras.utils import plot_model, save_img\nfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau\nfrom tensorflow.keras.preprocessing.image import load_img, img_to_array, array_to_img","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-01-10T13:13:16.11971Z","iopub.execute_input":"2022-01-10T13:13:16.120107Z","iopub.status.idle":"2022-01-10T13:13:23.212173Z","shell.execute_reply.started":"2022-01-10T13:13:16.119995Z","shell.execute_reply":"2022-01-10T13:13:23.211154Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_dir = '../input'","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:13:23.214515Z","iopub.execute_input":"2022-01-10T13:13:23.214791Z","iopub.status.idle":"2022-01-10T13:13:23.222861Z","shell.execute_reply.started":"2022-01-10T13:13:23.214761Z","shell.execute_reply":"2022-01-10T13:13:23.221844Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cassava_dir = os.path.join(base_dir, 'cassava-leaf-disease-classification')\nplant_village_dir = os.path.join(base_dir, 'plantvillage-dataset')\nrice_dir = os.path.join(base_dir, 'rice-leaf-images/rice_images')","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:13:23.224465Z","iopub.execute_input":"2022-01-10T13:13:23.224996Z","iopub.status.idle":"2022-01-10T13:13:23.242023Z","shell.execute_reply.started":"2022-01-10T13:13:23.224951Z","shell.execute_reply":"2022-01-10T13:13:23.240865Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fnames = []\n\nfor dir in os.listdir(os.path.join(plant_village_dir, 'color')):\n    columns = dir.split('___')\n    columns.append(dir)\n    fnames.append(columns)","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:13:23.244Z","iopub.execute_input":"2022-01-10T13:13:23.244408Z","iopub.status.idle":"2022-01-10T13:13:23.259275Z","shell.execute_reply.started":"2022-01-10T13:13:23.244364Z","shell.execute_reply":"2022-01-10T13:13:23.258136Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fnames = pd.DataFrame(fnames, columns=['Tree type', 'Disease', 'Folder'])\nfnames","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:13:23.262356Z","iopub.execute_input":"2022-01-10T13:13:23.262701Z","iopub.status.idle":"2022-01-10T13:13:23.291588Z","shell.execute_reply.started":"2022-01-10T13:13:23.262644Z","shell.execute_reply":"2022-01-10T13:13:23.290779Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fnames.drop([4,17,33],axis=0,inplace=True)","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:13:23.292849Z","iopub.execute_input":"2022-01-10T13:13:23.294315Z","iopub.status.idle":"2022-01-10T13:13:23.301943Z","shell.execute_reply.started":"2022-01-10T13:13:23.294246Z","shell.execute_reply":"2022-01-10T13:13:23.300621Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fnames['Disease'] = fnames['Disease'].str.replace('_', ' ')\nfnames['Disease'] = fnames['Disease'].str.lstrip()\nfnames['Tree type'] = fnames['Tree type'].str.replace('_', ' ')\nfnames['Tree type'] = fnames['Tree type'].str.lstrip()\nfnames","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:13:23.304135Z","iopub.execute_input":"2022-01-10T13:13:23.304507Z","iopub.status.idle":"2022-01-10T13:13:23.328808Z","shell.execute_reply.started":"2022-01-10T13:13:23.304466Z","shell.execute_reply":"2022-01-10T13:13:23.327299Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.mkdir('image data')","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:13:23.330943Z","iopub.execute_input":"2022-01-10T13:13:23.331327Z","iopub.status.idle":"2022-01-10T13:13:23.339158Z","shell.execute_reply.started":"2022-01-10T13:13:23.331283Z","shell.execute_reply":"2022-01-10T13:13:23.33789Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.mkdir(os.path.join('image data', 'train'))\nos.mkdir(os.path.join('image data', 'validation'))\nos.mkdir(os.path.join('image data', 'test'))","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:13:23.341316Z","iopub.execute_input":"2022-01-10T13:13:23.34187Z","iopub.status.idle":"2022-01-10T13:13:23.349805Z","shell.execute_reply.started":"2022-01-10T13:13:23.341823Z","shell.execute_reply":"2022-01-10T13:13:23.348531Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_path = os.path.join('image data/train')\nval_path = os.path.join('image data/validation')\ntest_path = os.path.join('image data/test')","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:13:23.351921Z","iopub.execute_input":"2022-01-10T13:13:23.352354Z","iopub.status.idle":"2022-01-10T13:13:23.361374Z","shell.execute_reply.started":"2022-01-10T13:13:23.352266Z","shell.execute_reply":"2022-01-10T13:13:23.359417Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for tree in fnames['Tree type'].unique().tolist():\n    # create directory for tree\n    path_1 = os.path.join(train_path, tree)\n    path_2 = os.path.join(test_path, tree)\n    path_3 = os.path.join(val_path, tree)\n\n    os.mkdir(path_1)\n    os.mkdir(path_2)\n    os.mkdir(path_3)\n\n    for disease, folder in fnames[fnames['Tree type'] == tree][['Disease', 'Folder']].values.tolist():\n        # create directory to each disease\n        sub_path_1 = os.path.join(path_1, disease.strip())\n        sub_path_2 = os.path.join(path_2, disease.strip())\n        sub_path_3 = os.path.join(path_3, disease.strip())\n\n        os.mkdir(sub_path_1)\n        os.mkdir(sub_path_2)\n        os.mkdir(sub_path_3)\n\n        # read data from source folder\n        src = os.path.join(plant_village_dir, 'color', folder)\n        image_count = len(os.listdir(src))\n        test_img_count = image_count // 10\n        val_img_count = (image_count - test_img_count) // 5\n        train_img_count = image_count - (test_img_count + val_img_count)\n        counts = [train_img_count, test_img_count, val_img_count]\n        splits = [sub_path_1, sub_path_2, sub_path_3]\n\n        for i in range(3):\n            images = os.listdir(src)\n            for j in images[:counts[i]]:\n                shutil.copyfile(src=os.path.join(src, j),\n                                dst=os.path.join(splits[i], j))","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:13:23.364378Z","iopub.execute_input":"2022-01-10T13:13:23.36499Z","iopub.status.idle":"2022-01-10T13:16:00.82189Z","shell.execute_reply.started":"2022-01-10T13:13:23.364946Z","shell.execute_reply":"2022-01-10T13:16:00.820867Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.mkdir(os.path.join(train_path, 'Rice'))\nos.mkdir(os.path.join(test_path, 'Rice'))\nos.mkdir(os.path.join(val_path, 'Rice'))","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:16:00.823881Z","iopub.execute_input":"2022-01-10T13:16:00.824476Z","iopub.status.idle":"2022-01-10T13:16:00.831348Z","shell.execute_reply.started":"2022-01-10T13:16:00.824434Z","shell.execute_reply":"2022-01-10T13:16:00.830145Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"source_dirs = os.listdir(rice_dir)\n\nfor source in source_dirs:\n    src = os.path.join(rice_dir, source)\n    image_count = len(os.listdir(src))\n    test_img_count = image_count // 10\n    val_img_count = (image_count - test_img_count) // 5\n    train_img_count = image_count - (test_img_count + val_img_count)\n    path_1 = os.path.join('image data/train/Rice', source.replace('_', '').lower())\n    path_2 = os.path.join('image data/test/Rice', source.replace('_', '').lower())\n    path_3 = os.path.join('image data/validation/Rice', source.replace('_', '').lower())\n\n    os.mkdir(path_1)\n    os.mkdir(path_2)\n    os.mkdir(path_3)\n    paths = [path_1, path_2, path_3]\n    split_counts = [train_img_count, test_img_count, val_img_count]\n\n    for i in range(3):\n        images = os.listdir(src)\n        for j in images[:split_counts[i]]:\n            shutil.copyfile(src=os.path.join(src, j),\n                        dst=os.path.join(paths[i], j))","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:16:00.832995Z","iopub.execute_input":"2022-01-10T13:16:00.833333Z","iopub.status.idle":"2022-01-10T13:16:10.940226Z","shell.execute_reply.started":"2022-01-10T13:16:00.833289Z","shell.execute_reply":"2022-01-10T13:16:10.939159Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# disease_map = {0: \"Bacterial Blight (CBB)\",\n#                1: \"Brown Streak Disease (CBSD)\",\n#                2: \"Green Mottle (CGM)\",\n#                3: \"Mosaic Disease (CMD)\",\n#                4: \"Healthy\"}","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:16:10.94523Z","iopub.execute_input":"2022-01-10T13:16:10.945931Z","iopub.status.idle":"2022-01-10T13:16:10.949822Z","shell.execute_reply.started":"2022-01-10T13:16:10.945898Z","shell.execute_reply":"2022-01-10T13:16:10.94886Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# pd.read_csv('../input/cassava-leaf-disease-classification/train.csv')['label'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:16:10.951767Z","iopub.execute_input":"2022-01-10T13:16:10.952784Z","iopub.status.idle":"2022-01-10T13:16:10.963055Z","shell.execute_reply.started":"2022-01-10T13:16:10.952503Z","shell.execute_reply":"2022-01-10T13:16:10.961994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# os.mkdir(os.path.join(train_path, 'Cassava'))\n# os.mkdir(os.path.join(test_path, 'Cassava'))\n# os.mkdir(os.path.join(val_path, 'Cassava'))","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:16:10.965702Z","iopub.execute_input":"2022-01-10T13:16:10.965983Z","iopub.status.idle":"2022-01-10T13:16:10.974862Z","shell.execute_reply.started":"2022-01-10T13:16:10.96595Z","shell.execute_reply":"2022-01-10T13:16:10.973868Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for disease in disease_map.values():\n#     os.mkdir(os.path.join('image data/train/Cassava', disease))\n#     os.mkdir(os.path.join('image data/test/Cassava', disease))\n#     os.mkdir(os.path.join('image data/validation/Cassava', disease))","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:16:10.976329Z","iopub.execute_input":"2022-01-10T13:16:10.976944Z","iopub.status.idle":"2022-01-10T13:16:10.986552Z","shell.execute_reply.started":"2022-01-10T13:16:10.976883Z","shell.execute_reply":"2022-01-10T13:16:10.985353Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df = pd.read_csv('../input/cassava-leaf-disease-classification/train.csv')\n\n# for img in df[df['label'] == 0].reset_index().loc[:378, 'image_id']:\n#     src = os.path.join(cassava_dir, 'train_images', img)\n#     dst = os.path.join('image data/train/Cassava', disease_map[0], img)\n\n#     if os.path.isfile(src):\n#         img_ = img_to_array(load_img(src))\n#         cropped = tf.image.central_crop(img_, central_fraction=0.65)\n#         save_img(dst, cv.resize(src=img_to_array(cropped), dsize=(256, 256)))\n\n# for img in df[df['label'] == 0].reset_index().loc[378:486, 'image_id']:\n#     src = os.path.join(cassava_dir, 'train_images', img)\n#     dst = os.path.join('image data/test/Cassava', disease_map[0], img)\n\n#     if os.path.isfile(src):\n#         img_ = img_to_array(load_img(src))\n#         cropped = tf.image.central_crop(img_, central_fraction=0.65)\n#         save_img(dst, cv.resize(src=img_to_array(cropped), dsize=(256, 256)))\n\n# for img in df[df['label'] == 0].reset_index().loc[486:540, 'image_id']:\n#     src = os.path.join(cassava_dir, 'train_images', img)\n#     dst = os.path.join('image data/validation/Cassava', disease_map[0], img)\n\n#     if os.path.isfile(src):\n#         img_ = img_to_array(load_img(src))\n#         cropped = tf.image.central_crop(img_, central_fraction=0.65)\n#         save_img(dst, cv.resize(src=img_to_array(cropped), dsize=(256, 256)))","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:16:10.98852Z","iopub.execute_input":"2022-01-10T13:16:10.990186Z","iopub.status.idle":"2022-01-10T13:16:10.998824Z","shell.execute_reply.started":"2022-01-10T13:16:10.990101Z","shell.execute_reply":"2022-01-10T13:16:10.997754Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for i in range(1, 4):\n#     for img in df[df['label'] == i].reset_index().loc[:448, 'image_id']:\n#         src = os.path.join(cassava_dir, 'train_images', img)\n#         dst = os.path.join('image data/train/Cassava', disease_map[i], img)\n\n#         if os.path.isfile(src):\n#             img_ = img_to_array(load_img(src))\n#             cropped = tf.image.central_crop(img_, central_fraction=0.65)\n#             save_img(dst, cv.resize(src=img_to_array(cropped), dsize=(256, 256)))\n\n#     for img in df[df['label'] == i].reset_index().loc[448:572, 'image_id']:\n#         src = os.path.join(cassava_dir, 'train_images', img)\n#         dst = os.path.join('image data/test/Cassava', disease_map[i], img)\n\n#         if os.path.isfile(src):\n#             img_ = img_to_array(load_img(src))\n#             cropped = tf.image.central_crop(img_, central_fraction=0.65)\n#             save_img(dst, cv.resize(src=img_to_array(cropped), dsize=(256, 256)))\n\n#     for img in df[df['label'] == i].reset_index().loc[572:634, 'image_id']:\n#         src = os.path.join(cassava_dir, 'train_images', img)\n#         dst = os.path.join('image data/validation/Cassava', disease_map[i], img)\n\n#         if os.path.isfile(src):\n#             img_ = img_to_array(load_img(src))\n#             cropped = tf.image.central_crop(img_, central_fraction=0.65)\n#             save_img(dst, cv.resize(src=img_to_array(cropped), dsize=(256, 256)))","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:16:11.002497Z","iopub.execute_input":"2022-01-10T13:16:11.002766Z","iopub.status.idle":"2022-01-10T13:16:11.014429Z","shell.execute_reply.started":"2022-01-10T13:16:11.002714Z","shell.execute_reply":"2022-01-10T13:16:11.013305Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for img in df[df['label'] == 4].reset_index().loc[:708, 'image_id']:\n#     src = os.path.join(cassava_dir, 'train_images', img)\n#     dst = os.path.join('image data/train/Cassava', disease_map[4], img)\n\n#     if os.path.isfile(src):\n#         img_ = img_to_array(load_img(src))\n#         cropped = tf.image.central_crop(img_, central_fraction=0.65)\n#         save_img(dst, cv.resize(src=img_to_array(cropped), dsize=(256, 256)))\n\n# for img in df[df['label'] == 4].reset_index().loc[708:910, 'image_id']:\n#     src = os.path.join(cassava_dir, 'train_images', img)\n#     dst = os.path.join('image data/test/Cassava', disease_map[4], img)\n\n#     if os.path.isfile(src):\n#         img_ = img_to_array(load_img(src))\n#         cropped = tf.image.central_crop(img_, central_fraction=0.65)\n#         save_img(dst, cv.resize(src=img_to_array(cropped), dsize=(256, 256)))\n\n# for img in df[df['label'] == 4].reset_index().loc[910:1011, 'image_id']:\n#     src = os.path.join(cassava_dir, 'train_images', img)\n#     dst = os.path.join('image data/validation/Cassava', disease_map[4], img)\n\n#     if os.path.isfile(src):\n#         img_ = img_to_array(load_img(src))\n#         cropped = tf.image.central_crop(img_, central_fraction=0.65)\n#         save_img(dst, cv.resize(src=img_to_array(cropped), dsize=(256, 256)))","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:16:11.016415Z","iopub.execute_input":"2022-01-10T13:16:11.016907Z","iopub.status.idle":"2022-01-10T13:16:11.029565Z","shell.execute_reply.started":"2022-01-10T13:16:11.016861Z","shell.execute_reply":"2022-01-10T13:16:11.028356Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## modeling","metadata":{}},{"cell_type":"code","source":"X = []\ny = []\nval_x = []\nval_y = []\ntest_x = []\ntest_y = []\ntree_types = os.listdir('image data/train')\n\nfor tree in tree_types:\n    tree_path = os.path.join('image data/train', tree)\n    tree_disease_types = os.listdir(tree_path)\n\n    for disease in tree_disease_types:\n        img_name = os.listdir(os.path.join(tree_path, disease))\n\n        for img in img_name:\n            image_path = os.path.join(tree_path, disease, img)\n            image = img_to_array(load_img(image_path, target_size=(56,56)))\n            X.append(image)\n            y.append([tree, disease])\n            \nfor tree in tree_types:\n    tree_path = os.path.join('image data/validation', tree)\n    tree_disease_types = os.listdir(tree_path)\n\n    for disease in tree_disease_types:\n        img_name = os.listdir(os.path.join(tree_path, disease))\n\n        for img in img_name:\n            image_path = os.path.join(tree_path, disease, img)\n            image = img_to_array(load_img(image_path, target_size=(56,56)))\n            val_x.append(image)\n            val_y.append([tree, disease])\n            \nfor tree in tree_types:\n    tree_path = os.path.join('image data/test', tree)\n    tree_disease_types = os.listdir(tree_path)\n\n    for disease in tree_disease_types:\n        img_name = os.listdir(os.path.join(tree_path, disease))\n\n        for img in img_name:\n            image_path = os.path.join(tree_path, disease, img)\n            image = img_to_array(load_img(image_path, target_size=(56,56)))\n            test_x.append(image)\n            test_y.append([tree, disease])","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:16:11.031541Z","iopub.execute_input":"2022-01-10T13:16:11.031923Z","iopub.status.idle":"2022-01-10T13:17:22.973256Z","shell.execute_reply.started":"2022-01-10T13:16:11.031876Z","shell.execute_reply":"2022-01-10T13:17:22.972062Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mlb = MultiLabelBinarizer()\n\nX = np.array(X)\nval_x = np.array(val_x)\ny = mlb.fit_transform(y)\nval_y = mlb.transform(val_y)\ntest_y = mlb.transform(test_y)\ntest_x = np.array(test_x)/255\nval_x = val_x/255\nX.shape, y.shape","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:17:22.97508Z","iopub.execute_input":"2022-01-10T13:17:22.975508Z","iopub.status.idle":"2022-01-10T13:17:23.948075Z","shell.execute_reply.started":"2022-01-10T13:17:22.975419Z","shell.execute_reply":"2022-01-10T13:17:23.947005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"generator = ImageDataGenerator(rescale=1. / 255,\n                               rotation_range=15,\n                               width_shift_range=0.1,\n                               height_shift_range=0.1,\n                               horizontal_flip=True,\n                               vertical_flip=True\n                                    )\ngenerator.fit(X)","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:17:23.949791Z","iopub.execute_input":"2022-01-10T13:17:23.950129Z","iopub.status.idle":"2022-01-10T13:17:24.712659Z","shell.execute_reply.started":"2022-01-10T13:17:23.950064Z","shell.execute_reply":"2022-01-10T13:17:24.711637Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"check_pointer = ModelCheckpoint(filepath='exp_conv_20.hdf5',\n                                save_best_only=True)\n\nearly_stop = EarlyStopping(monitor='val_loss',\n                           patience=40,\n                           min_delta=0,\n                           restore_best_weights=True)\n\nreduce_lr = ReduceLROnPlateau(monitor='val_loss',\n                              factor=0.1,\n                              patience=20,\n                             cooldown=15)","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:17:24.714385Z","iopub.execute_input":"2022-01-10T13:17:24.714684Z","iopub.status.idle":"2022-01-10T13:17:24.720743Z","shell.execute_reply.started":"2022-01-10T13:17:24.714641Z","shell.execute_reply":"2022-01-10T13:17:24.71961Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def inception_module(x, filter_1x1, filter_3x3_reduce, filter_3x3, filter_5x5_reduce, filter_5x5, filters_pool_proj,\n                     name=None):\n    # reduction layer\n    conv_3x3_reducer = Conv2D(filters=filter_3x3_reduce, kernel_size=(1, 1), activation=relu, padding='same')(x)\n    conv_5x5_reducer = Conv2D(filters=filter_5x5_reduce, kernel_size=(1, 1), activation=relu, padding='same')(x)\n    pool_3x3 = MaxPooling2D(pool_size=(3, 3), strides=(1, 1), padding='same')(x)\n\n    # extraction layer\n    conv_3x3 = Conv2D(filters=filter_3x3, kernel_size=(3, 3), activation=relu, padding='same')(conv_3x3_reducer)\n    conv_5x5 = Conv2D(filters=filter_5x5, kernel_size=(5, 5), activation=relu, padding='same')(conv_5x5_reducer)\n    conv_1x1_proj = Conv2D(filters=filters_pool_proj, kernel_size=(1, 1), activation=relu, padding='same')(pool_3x3)\n\n    # projection layer\n    proj = Conv2D(filters=filter_1x1, kernel_size=(1, 1), activation=relu, padding='same')(x)\n\n    # output\n    x = concatenate([proj, conv_1x1_proj, conv_3x3, conv_5x5], axis=3, name=name)\n\n    return x","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"exp_input = Input(shape=(56,56,3))\n\n# conv_7x7\nx = Conv2D(filters=64, kernel_size=(7,7), padding='same', activation=relu)(exp_input)\nx = BatchNormalization()(x)\nx = MaxPooling2D(pool_size=(3,3), strides=(1,1))(x)\n\n# conv_5x5\nx = Conv2D(filters=192, kernel_size=(5,5), padding='same', activation=relu)(x)\nx = BatchNormalization()(x)\nx = MaxPooling2D(pool_size=(3,3), strides=(1,1))(x)\n\n# inception block 1\nx = inception_module(x,\n                     filter_1x1=64,\n                     filter_5x5_reduce=96,\n                     filter_3x3=128,\n                     filter_3x3_reduce=16,\n                     filter_5x5=32,\n                     filters_pool_proj=32,\n                     name='inception_1a')\nx = inception_module(x,\n                     filter_1x1=96,\n                     filter_5x5_reduce=128,\n                     filter_3x3=160,\n                     filter_3x3_reduce=32,\n                     filter_5x5=48,\n                     filters_pool_proj=64,\n                     name='inception_1b')\n\n# pooling\nx = BatchNormalization()(x)\nx = MaxPooling2D(pool_size=(2,2), padding='same')(x)\n\n# inception block 2\nx = inception_module(x,\n                     filter_1x1=128,\n                     filter_5x5_reduce=96,\n                     filter_3x3=128,\n                     filter_3x3_reduce=48,\n                     filter_5x5=32,\n                     filters_pool_proj=32,\n                     name='inception_2a')\nx = inception_module(x,\n                     filter_1x1=160,\n                     filter_5x5_reduce=112,\n                     filter_3x3=160,\n                     filter_3x3_reduce=32,\n                     filter_5x5=64,\n                     filters_pool_proj=64,\n                     name='inception_2b')\nx = inception_module(x,\n                     filter_1x1=192,\n                     filter_5x5_reduce=128,\n                     filter_3x3=128,\n                     filter_3x3_reduce=48,\n                     filter_5x5=64,\n                     filters_pool_proj=64,\n                     name='inception_2c')\nx = inception_module(x,\n                     filter_1x1=256,\n                     filter_5x5_reduce=160,\n                     filter_3x3=160,\n                     filter_3x3_reduce=32,\n                     filter_5x5=96,\n                     filters_pool_proj=96,\n                     name='inception_2d')\n\n# pooling\nx = BatchNormalization()(x)\nx = MaxPooling2D(pool_size=(2,2), padding='same')(x)\n\n# conv 3x3\nx = Conv2D(filters=256, kernel_size=(3,3), activation=relu, padding='same')(x)\nx = Conv2D(filters=256, kernel_size=(3,3), activation=relu, padding='same')(x)\nx = BatchNormalization()(x)\nx = MaxPooling2D(pool_size=(2,2), padding='same')(x)\n\nx = Conv2D(filters=256, kernel_size=(3,3), activation=relu, padding='same')(x)\nx = Conv2D(filters=256, kernel_size=(3,3), activation=relu, padding='same')(x)\nx = BatchNormalization()(x)\nx = MaxPooling2D(pool_size=(2,2), padding='same')(x)\n\nx = Conv2D(filters=256, kernel_size=(3,3), activation=relu, padding='same')(x)\nx = Conv2D(filters=256, kernel_size=(3,3), activation=relu, padding='same')(x)\nx = BatchNormalization()(x)\nx = MaxPooling2D(pool_size=(2,2), padding='same')(x)\n\n# flatten\nx = Flatten()(x)\n\n# output layer\nx = Dense(units=1024, activation=relu)(x)\nx = Dropout(0.5)(x)\nx = Dense(units=1024, activation=relu)(x)\nx = Dropout(0.5)(x)\nexp_output = Dense(units=36, activation=sigmoid)(x)\n\nexp_conv = Model(exp_input, exp_output)\nexp_conv.summary()","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:17:24.722783Z","iopub.execute_input":"2022-01-10T13:17:24.723462Z","iopub.status.idle":"2022-01-10T13:17:27.665935Z","shell.execute_reply.started":"2022-01-10T13:17:24.723416Z","shell.execute_reply":"2022-01-10T13:17:27.66474Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_model(exp_conv,\n           to_file='baseline_conv_15_exp(VGGNet with INCEPTION).png',\n           show_shapes=True,\n           show_dtype=True,\n           show_layer_names=True)","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:17:27.667423Z","iopub.execute_input":"2022-01-10T13:17:27.667975Z","iopub.status.idle":"2022-01-10T13:17:29.278191Z","shell.execute_reply.started":"2022-01-10T13:17:27.667931Z","shell.execute_reply":"2022-01-10T13:17:29.276988Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"exp_conv.compile(optimizer=Adam(),\n                   loss=binary_crossentropy,\n                   metrics=[Recall(), Precision(), 'accuracy'])\n\nhistory = exp_conv.fit(generator.flow(X,y, batch_size=128), \n                        epochs=500, \n                        validation_data=(val_x,val_y),\n                        callbacks=[early_stop, check_pointer, reduce_lr])","metadata":{"execution":{"iopub.status.busy":"2022-01-10T13:17:29.279883Z","iopub.execute_input":"2022-01-10T13:17:29.28038Z","iopub.status.idle":"2022-01-10T15:04:48.651151Z","shell.execute_reply.started":"2022-01-10T13:17:29.280333Z","shell.execute_reply":"2022-01-10T15:04:48.650174Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"exp_conv.evaluate(test_x,test_y)","metadata":{"execution":{"iopub.status.busy":"2022-01-10T15:04:48.654643Z","iopub.execute_input":"2022-01-10T15:04:48.654959Z","iopub.status.idle":"2022-01-10T15:04:51.479558Z","shell.execute_reply.started":"2022-01-10T15:04:48.654914Z","shell.execute_reply":"2022-01-10T15:04:51.478604Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"figure, axes = plt.subplots(nrows=1, ncols=3, figsize=[18, 6], dpi=300)\naxes = axes.ravel()\nepochs = list(range(len(history.history['loss'])))\n\nsns.lineplot(x=epochs, y=history.history['loss'], ax=axes[0],label='loss')\nsns.lineplot(x=epochs, y=history.history['val_loss'], ax=axes[0],label='val loss')\nsns.lineplot(x=epochs, y=history.history['precision'], ax=axes[1],label='precision')\nsns.lineplot(x=epochs, y=history.history['val_precision'], ax=axes[1],label='val precision')\nsns.lineplot(x=epochs, y=history.history['recall'], color='#025918', ax=axes[1],label='recall')\nsns.lineplot(x=epochs, y=history.history['val_recall'], color='#D9B504',ax=axes[1],label='val recall')\nsns.lineplot(x=epochs, y=history.history['accuracy'], ax=axes[2],label='accuracy')\nsns.lineplot(x=epochs, y=history.history['val_accuracy'], ax=axes[2],label='val accuracy')\naxes[0].set_xlabel('epoch')\naxes[0].set_ylabel('loss')\naxes[1].set_xlabel('epoch')\naxes[1].set_ylabel('precision and recall')\naxes[2].set_xlabel('epoch')\naxes[2].set_ylabel('accuracy')\nplt.savefig('VGGNet_base_conv_train_history_with_cassava.png')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-10T15:04:51.481417Z","iopub.execute_input":"2022-01-10T15:04:51.481788Z","iopub.status.idle":"2022-01-10T15:04:54.405309Z","shell.execute_reply.started":"2022-01-10T15:04:51.481741Z","shell.execute_reply":"2022-01-10T15:04:54.404368Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"figure, axes = plt.subplots(nrows=1, ncols=2, figsize=[12, 6], dpi=300)\naxes = axes.ravel()\n\nsns.lineplot(x=epochs, y=history.history['lr'], ax=axes[0],label='learning rate')\nsns.lineplot(x=history.history['lr'], y=history.history['val_accuracy'], ax=axes[1],label='accuracy & lr')\naxes[0].set_xlabel('epoch')\naxes[0].set_ylabel('learning rate')\naxes[1].set_xlabel('learning rate')\naxes[1].set_ylabel('accuracy')\n\nplt.savefig('VGGNet_base_conv_lr_history_4.png')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-10T15:04:54.406734Z","iopub.execute_input":"2022-01-10T15:04:54.407741Z","iopub.status.idle":"2022-01-10T15:04:55.899739Z","shell.execute_reply.started":"2022-01-10T15:04:54.407696Z","shell.execute_reply":"2022-01-10T15:04:55.898835Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot confusion matrix\nfig, axes = plt.subplots(nrows=14, ncols=3, figsize=[24, 72], dpi=300)\naxes = axes.ravel()\n\npreds = np.where(exp_conv.predict(test_x) < 0.65, 0, 1)\nconfusion = multilabel_confusion_matrix(test_y, preds)\n\nfor i, (label, matrix) in enumerate(zip(mlb.classes_, confusion)):\n    labels = [f'not_{label}', label]\n    sns.heatmap(matrix, annot=True, square=True, fmt='d', cbar=False, cmap='Blues',\n                xticklabels=labels, yticklabels=labels, linecolor='black', linewidth=1,\n                ax=axes[i])\n    axes[i].set_title(labels[0])\n\nplt.savefig('VGGNet_base_conv_4_cm.png')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-10T15:04:55.901209Z","iopub.execute_input":"2022-01-10T15:04:55.902243Z","iopub.status.idle":"2022-01-10T15:06:01.141526Z","shell.execute_reply.started":"2022-01-10T15:04:55.902196Z","shell.execute_reply":"2022-01-10T15:06:01.140326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"exp_conv.save('VGGNet_based_with_all_data_be_top.hdf5')","metadata":{"execution":{"iopub.status.busy":"2022-01-10T15:06:01.143237Z","iopub.execute_input":"2022-01-10T15:06:01.143804Z","iopub.status.idle":"2022-01-10T15:06:01.917634Z","shell.execute_reply.started":"2022-01-10T15:06:01.143754Z","shell.execute_reply":"2022-01-10T15:06:01.916619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, axes = plt.subplots(nrows=5, ncols=2,figsize = (8, 24))\npreds = exp_conv.predict(test_x[200:210])\naxes = axes.ravel()\n\nfor i in range(len(preds)):\n    p = zip(list(mlb.classes_), list(preds[i]))\n    p = sorted(list(p), key = lambda z: z[1], reverse = True)[:2]\n    axes[i].imshow(test_x[200+i])\n    axes[i].set_title(f'{p[0][0]}: {round(p[0][1] * 100, 2)}% \\n {p[1][0]}: {round(p[1][1] * 100, 2)}%')\n    ","metadata":{"execution":{"iopub.status.busy":"2022-01-10T15:06:01.920021Z","iopub.execute_input":"2022-01-10T15:06:01.920644Z","iopub.status.idle":"2022-01-10T15:06:03.860217Z","shell.execute_reply.started":"2022-01-10T15:06:01.920596Z","shell.execute_reply":"2022-01-10T15:06:03.859324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pd.to_pickle(pd.DataFrame(history.history), 'VGGNet_base_conv_lr_history.pkl')","metadata":{"execution":{"iopub.status.busy":"2022-01-10T15:11:20.045281Z","iopub.execute_input":"2022-01-10T15:11:20.045583Z","iopub.status.idle":"2022-01-10T15:11:20.053758Z","shell.execute_reply.started":"2022-01-10T15:11:20.045551Z","shell.execute_reply":"2022-01-10T15:11:20.052588Z"},"trusted":true},"execution_count":null,"outputs":[]}]}