{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import tensorflow\nfrom tensorflow.keras import layers,models,optimizers\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint\nfrom tensorflow.keras.applications.vgg16 import VGG16, preprocess_input\nfrom tensorflow.keras.applications.resnet50 import ResNet50\nfrom tensorflow.keras.applications import EfficientNetB7\nfrom tensorflow.keras import datasets, layers, models, losses, Model\nfrom tensorflow.keras.preprocessing import image  \nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.optimizers import Adam\n\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt  \nimport matplotlib.image as mpimg","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_frame = pd.read_csv('../input/plant-pathology-2021-fgvc8/train.csv')\ndata_frame.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"new_list = []\nlabels = data_frame.labels.unique().tolist()\nfor lab in labels:\n    new_list.append(lab.split(' '))\nflat_list = [item for sub_list in new_list for item in sub_list]\nprint(set(flat_list))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_frame.labels.value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for name in data_frame.labels.unique():\n    img = mpimg.imread('/kaggle/input/plant-pathology-2021-fgvc8/train_images/'+data_frame.loc[data_frame.labels==name,'image'].values[0])\n    imgplot = plt.imshow(img)\n    plt.title(name +\"-\"+ str(img.shape)+\"-\"+str(img.dtype))\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dir = '../input/plant-pathology-2021-fgvc8/train_images'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"count_dict = data_frame.labels.value_counts()\nclasses = list(count_dict.index)\nIMAGE_SIZE = (128, 128)\nNUM_CLASSES = len(classes)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale=1./225,\n                                  rotation_range=20,\n                                  width_shift_range=0.2,\n                                  height_shift_range=0.2,\n                                  shear_range=0.2,\n                                  zoom_range=0.2,\n                                  horizontal_flip=True,\n                                  validation_split=0.2)\n\ntest_datagen = ImageDataGenerator(rescale=1./255)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_generator = train_datagen.flow_from_dataframe(dataframe = data_frame,\n                                                    directory = train_dir,\n                                                    subset = 'training',\n                                                    x_col = \"image\",\n                                                    y_col = \"labels\",\n                                                    shuffle = True,\n                                                    target_size = IMAGE_SIZE,\n                                                    batch_size = 32,\n                                                    class_mode = 'categorical')\n\n\nval_generator = train_datagen.flow_from_dataframe(dataframe = data_frame,\n                                                    directory = train_dir,\n                                                    subset = 'training',\n                                                    x_col = \"image\",\n                                                    y_col = \"labels\",\n                                                    shuffle = True,\n                                                    target_size = IMAGE_SIZE,\n                                                    batch_size = 32,\n                                                    class_mode = 'categorical')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras import backend as K\n\ndef f1(y_true, y_pred):\n    def recall(y_true, y_pred):\n        \"\"\"Recall metric.\n\n        Only computes a batch-wise average of recall.\n\n        Computes the recall, a metric for multi-label classification of\n        how many relevant items are selected.\n        \"\"\"\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        recall = true_positives / (possible_positives + K.epsilon())\n        return recall","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.models import Sequential\nfrom tensorflow.keras.applications import EfficientNetB7\nimport tensorflow_addons as tfa\ninput_shape = [128, 128, 3]\n# instantiating the model in the strategy scope creates the model on the TPU\ndef build_model():\n    base_model = EfficientNetB7(include_top=False, input_shape=input_shape ,weights=\"imagenet\", drop_connect_rate=0.4)\n    # Freeze the pretrained weights\n    for layer in base_model.layers:\n            if not isinstance(layer, layers.BatchNormalization):\n                layer.trainable = True\n    model = Sequential()\n    model.add(layers.BatchNormalization(input_shape=input_shape))\n    model.add(base_model)\n    # Rebuild top\n    model.add(layers.GlobalAveragePooling2D(name=\"avg_pool\"))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Dropout(0.2, name=\"top_dropout1\"))\n    model.add(layers.Dense(512,activation='relu'))\n    model.add(layers.Dense(128,activation='relu'))\n    model.add(layers.Dense(32,activation='relu'))\n    model.add(layers.Dense(NUM_CLASSES, activation=\"sigmoid\", name=\"pred\"))\n    opt = Adam(lr=0.001)\n    metrics = [tfa.metrics.F1Score(num_classes = NUM_CLASSES, average = \"macro\", name = \"f1_score\")]\n    model.compile(optimizer='Adam', loss='binary_crossentropy', metrics=metrics)\n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = build_model()\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"callback_list = [\n    EarlyStopping(monitor='val_f1_score', mode = 'max', patience=10, verbose = 1),\n    ReduceLROnPlateau(monitor='val_f1_score', factor=0.1, patience=3, verbose = 0),\n    ]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"epochs = 10\n\nhist = model.fit_generator(train_generator, epochs=epochs, steps_per_epoch=100,\n                           validation_data=val_generator, validation_steps=100, \n                           callbacks=callback_list, verbose=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot(hist.history[\"loss\"])\nplt.plot(hist.history[\"val_loss\"])\nplt.title(\"model accuracy\")\nplt.ylabel(\"accuracy\")\nplt.xlabel(\"epoch\")\nplt.legend([\"train\", \"validation\"], loc=\"upper left\") \nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot(hist.history['Training Categorical Accuracy'])\nplt.plot(hist.history['Validation Categorical Accuracy'])\nplt.show()   ","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}