{"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 tensorflow as tf\nfrom sklearn.preprocessing import MultiLabelBinarizer\nfrom collections import defaultdict\nfrom tensorflow import keras\nfrom keras.models import Sequential, Model\nfrom keras.layers import Dense, Flatten, Dropout, MaxPooling2D, Conv2D, BatchNormalization, GlobalAveragePooling2D\nfrom tensorflow.keras.applications import DenseNet121, EfficientNetB0, Xception\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#loading training data\ntrain_df = pd.read_csv('../input/plant-pathology-2021-fgvc8/train.csv')\ntrain_path = \"../input/plant-pathology-2021-fgvc8/train_images\"\ntrain_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mlb = MultiLabelBinarizer().fit(train_df.labels.apply(lambda x : x.split()))\nlabels = pd.DataFrame(mlb.transform(train_df.labels.apply(lambda x : x.split())), columns = mlb.classes_)\n\nlabels = pd.concat([train_df['image'], labels], axis=1)\nlabels.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_datagen = ImageDataGenerator(\n    rescale=1/255.0,\n    rotation_range=5,\n    zoom_range=0.1,\n    shear_range=0.05,\n    horizontal_flip=True,\n    validation_split=0.2\n    \n)\nIMAGE = (256, 256)\nBATCH_SIZE = 32","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator = image_datagen.flow_from_dataframe(\n    labels,\n    directory='../input/resized-plant2021/img_sz_256',\n    x_col=\"image\",\n    y_col=labels.columns.tolist()[1:],\n    target_size=IMAGE,\n    color_mode=\"rgb\",\n    batch_size=BATCH_SIZE,\n    subset=\"training\",\n    shuffle=True,\n    seed=42,\n    class_mode=\"raw\"\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"validation_generator = image_datagen.flow_from_dataframe(\n    labels,\n    directory='../input/resized-plant2021/img_sz_256',\n    x_col=\"image\",\n    y_col=labels.columns.tolist()[1:],\n    target_size=IMAGE,\n    color_mode=\"rgb\",\n    batch_size=BATCH_SIZE,\n    subset=\"validation\",\n    shuffle=True,\n    seed=42,\n    class_mode=\"raw\"\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"WEIGHTS_PATH = '../input/keras-pretrained-models/EfficientNetB0_NoTop_ImageNet.h5'\nbase_model = EfficientNetB0(weights=WEIGHTS_PATH,include_top=False, input_shape=(256,256,3))\n\nx=base_model.output\n\nx=GlobalAveragePooling2D()(x)\n\npreds=Dense(6,activation='sigmoid')(x)\n\nmodel=Model(inputs=base_model.input, outputs=preds)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(\n    loss=\"binary_crossentropy\",\n    optimizer=\"adam\",\n    metrics=[\"accuracy\"])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"early_stopping = EarlyStopping(\n    monitor='val_loss', \n    patience=5, \n    verbose=1, \n    restore_best_weights=True)\n\nreducelr = ReduceLROnPlateau(\n        monitor= 'val_loss',\n        mode='min',\n        factor=0.01,\n        patience=2,\n        verbose=0\n    )\n\ncallbacks = [reducelr, early_stopping]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(train_generator,\n                validation_data=validation_generator,\n                steps_per_epoch = train_generator.n // BATCH_SIZE,\n                validation_steps = validation_generator.n // BATCH_SIZE,\n                epochs=30,\n                callbacks=callbacks)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('effnetb0-256.h5')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}