{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd \nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\n\n#Deep learning\n#Import Package\nimport keras\nfrom keras.models import Sequential\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.models import Sequential,Input,Model\nfrom keras.layers import Dense,Flatten,Dropout,MaxPooling2D,Conv2D,GlobalAveragePooling2D\nfrom keras.callbacks import ModelCheckpoint,EarlyStopping,TensorBoard,CSVLogger,ReduceLROnPlateau\nfrom keras.models import model_from_json\n\nimport time\n\nfrom sklearn.metrics import confusion_matrix\nfrom sklearn.metrics import classification_report\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Callbacks Function\ndef Fun_Callbacks(model_name):\n    path_callback = '/content/'+ str(model_name)\n\n    try:\n      path_callback = '/content/'+ str(model_name)      \n      os.mkdir(path_callback) \n    except:\n      print('Folder Existed Before, Continuing to Train \\n')\n\n    best_model_weights = path_callback+'/base_best.hdf5'\n    checkpoint = ModelCheckpoint(\n        best_model_weights,\n        monitor='val_accuracy',\n        verbose=1,\n        save_best_only=True,\n        mode='max',        \n        period=1    \n    )\n\n    earlystop = EarlyStopping(\n        monitor='val_loss',\n        min_delta=0.001,\n        patience=10,\n        verbose=1,\n        mode='auto'\n    )\n\n    tensorboard = TensorBoard(\n        log_dir = path_callback+'/logs',\n        histogram_freq=0,\n        batch_size=16,\n        write_graph=True,\n        write_grads=True,\n        write_images=False,\n    )\n\n    csvlogger = CSVLogger(\n        filename= path_callback+'/training_csv.log',\n        separator = \",\",\n        append = False\n    )\n\n    reduce = ReduceLROnPlateau(\n        monitor='val_loss',\n        factor=0.5,\n        patience=40,\n        verbose=1, \n        mode='auto',\n        cooldown=1 \n    )\n\n    callbacks = [checkpoint,tensorboard,csvlogger,reduce]\n    return callbacks\n\n#Save Model\ndef SaveModel(model,model_name):\n  path_callback = '/content/'+ str(model_name)\n  model_json = model.to_json()\n  with open(path_callback+\"/model.json\", \"w\") as json_file:\n      json_file.write(model_json)\n\n  model.save_weights(path_callback+\"/\"+model_name+\".h5\")\n  print(\"Model save to directory: \", model_name, 'folder')\n\n#Convert Time\ndef Convert(s): \n    s = s % (24 * 3600) \n    h = s // 3600\n    s %= 3600\n    m = s // 60\n    s %= 60\n      \n    return \"%d:%d:%d\" % (h, m, s) \n\n#History Visualization\ndef PlotHistory(hist):\n  plt.figure(figsize=(20,10))\n  plt.subplot(1, 2, 1)\n  plt.title('Loss History When Its Training')\n  plt.xlabel('Epoch', fontsize=16)\n  plt.ylabel('Loss', fontsize=16)\n  plt.plot(hist.history['loss'], label='Training Loss')\n  plt.plot(hist.history['val_loss'], label='Validation Loss')\n  plt.legend(loc='upper right')\n\n  plt.subplot(1, 2, 2)\n  plt.title('Accuracy History When Its Training')\n  plt.xlabel('Epoch', fontsize=16)\n  plt.ylabel('Accuracy', fontsize=16)\n  plt.plot(hist.history['accuracy'], label='Training Accuracy')\n  plt.plot(hist.history['val_accuracy'], label='Validation Accuracy')\n  plt.legend(loc='lower right')\n  plt.show()\n\n#Running Model Function\ndef Run(model, epoch_val, model_name, image_train, image_val):\n  start = time.time()\n  print(\"-------------------------\")\n  print(\"Training Start, Good Luck\")\n  print(\"-------------------------\")\n\n  history = model.fit_generator(\n      generator = image_train, steps_per_epoch=1, epochs=epoch_val, verbose=1,\n      validation_data=image_val, validation_steps=1,\n      callbacks=Fun_Callbacks(model_name)\n  )\n\n  end = time.time()\n\n  print(\"---------------\")\n  print('Time Ended, Your Model Training Has Taken Time: ',Convert(end - start),', Have a Nice Day')\n  print(\"---------------\")\n\n  return history\n\ndef LoadCP(model,model_name):\n  model.load_weights('/content/'+ str(model_name)+\"/base_best.hdf5\")\n  print('Model Loaded From Checkpoint')\n  return model\n\ndef plot_cm(y_true, y_pred, test_label, figsize=(5,5)):\n    cm = confusion_matrix(y_true, y_pred)\n    cm_sum = np.sum(cm, axis=1, keepdims=True)\n    cm_perc = cm / cm_sum.astype(float) * 100\n    annot = np.empty_like(cm).astype(str)\n    nrows, ncols = cm.shape\n    for i in range(nrows):\n        for j in range(ncols):\n            c = cm[i, j]\n            p = cm_perc[i, j]\n            if i == j:\n                s = cm_sum[i]\n                annot[i, j] = '%.1f%%\\n%d/%d' % (p, c, s)\n            elif c == 0:\n                annot[i, j] = ''\n            else:\n                annot[i, j] = '%.1f%%\\n%d' % (p, c)\n    cm = pd.DataFrame(cm, index=np.unique(y_pred), columns= np.unique(y_true))\n    cm.index = np.unique(test_label)\n    cm.columns = np.unique(test_label)\n    cm.index.name = 'ACTUAL'\n    cm.columns.name = 'PREDICTED'\n    fig, ax = plt.subplots(figsize=figsize)\n    sns.heatmap(cm, cmap= \"YlGnBu\", annot=annot, fmt='', ax=ax)\n\ndef Test(model,image_val):\n  Test_Step_Size=image_val.n//image_val.batch_size\n  y_pred = model.predict_generator(image_val,steps=Test_Step_Size+1,verbose=1)\n  y_pred = np.argmax(y_pred, axis=1)\n  return y_pred\n\ndef ShowCFMatrix(y_pred,image_val):\n  y_true = image_val.classes\n  target_names = list(image_val.class_indices.keys())\n  plot_cm(image_val.classes, y_pred, target_names)\n\n  print('Classification Report')\n  print(classification_report(image_val.classes, y_pred, target_names=target_names))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Read train data\ndf = pd.read_csv('../input/plant-pathology-2021-fgvc8/train.csv')\ndf.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Split data\nfrom sklearn.model_selection import train_test_split\ntrain, test = train_test_split(df, test_size=0.3)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Image Augmentation\ntrain_path = '../input/plant-pathology-2021-fgvc8/train_images'\ntest_path = '../input/plant-pathology-2021-fgvc8/test_images'\n\nimage_aug = keras.preprocessing.image.ImageDataGenerator(\n    rescale = 1/255,\n    \n    horizontal_flip=True, \n    vertical_flip=False,\n  )\n\n#Image Train Generator\nimage_train = image_aug.flow_from_dataframe(train, directory = train_path,\n                                              x_col = \"image\", y_col = \"labels\", shuffle = True)\n\n#Image Validation and Test Generator\nimage_val = image_aug.flow_from_dataframe(test, directory = train_path,\n                                        x_col = \"image\", y_col = \"labels\", shuffle = True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Image shape\nimage_size_target = (299,299)\ndim = (3,)\nimage_shape = image_size_target + dim\n\n#Model Transfer Learning From Keras Application\nfrom keras.layers import *\nfrom keras.optimizers import *\nfrom keras.applications import *\n\n#Load Xception Base Model\nbase_model = Xception(weights='imagenet',include_top=False,input_shape=image_shape)\nx = base_model.output\nx = GlobalAveragePooling2D()(x)\npredictions = Dense(12, activation='softmax')(x)\n\nKerasModel = Model(base_model.input, predictions)\n#print(KerasModel.summary())\n\n#Compiling The Model\nKerasModel.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy'])\n\n#Run Keras Application\nmilestone = Run(KerasModel, 300, 'Keras Model',image_train,image_val)\nPlotHistory(milestone)\nSaveModel(KerasModel,'Keras Model')\n\nprint(\"-----------------------------------------------------------\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Evaluation Data Validation\nfrom sklearn.metrics import confusion_matrix\ny_pred = Test(KerasModel,image_val)\nconfusion_matrix(image_val.classes, y_pred)","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}