{"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":"markdown","source":"**Our Casava project research work**","metadata":{"_uuid":"cd77d31a-5559-47d4-918f-9fd5df38abfc","_cell_guid":"19d4af1b-626e-44d3-ab88-b59580cd769e","trusted":true}},{"cell_type":"markdown","source":"Get the necessary imports.","metadata":{"_uuid":"a6279183-aeb8-4786-9e20-f3880f8b7e02","_cell_guid":"259dfd49-6da3-4496-95e4-201b0dbf5b10","trusted":true}},{"cell_type":"code","source":"import os, shutil\nfrom keras import layers, models, optimizers\nimport pandas as pd\nimport numpy as np\nimport tensorflow as tf\nfrom keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array, smart_resize\nfrom keras.callbacks import EarlyStopping, LearningRateScheduler, ReduceLROnPlateau, ModelCheckpoint\nfrom keras.applications import VGG16\nimport matplotlib.pyplot as plt\nimport seaborn as sns","metadata":{"_uuid":"f45314ca-14a5-4c11-9002-088889055e35","_cell_guid":"bc2a0ca5-7960-4e0c-8039-fc19fef3940c","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"work_dir = '../input/cassava-leaf-disease-classification/'\nos.listdir(work_dir) \ntrain_path = '/kaggle/input/cassava-leaf-disease-classification/train_images'","metadata":{"_uuid":"cb1c3cef-7ac4-4303-9a34-7f58fd488f92","_cell_guid":"f669c69e-9d2d-4900-bcca-4e35bb4374f3","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Num GPUs Available: \", len(tf.config.experimental.list_physical_devices('GPU')))\nwith tf.device('/GPU:0'):\n    print('Yes, there is GPU')\n    \ntf.debugging.set_log_device_placement(True)","metadata":{"_uuid":"d4c957ed-2d89-46eb-835f-6fa376014000","_cell_guid":"a6d41a35-c986-4b47-99af-23903572a386","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import random\nimport warnings\ndef seed_everything(seed=0):\n    random.seed(seed)\n    np.random.seed(seed)\n    tf.random.set_seed(seed)\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    os.environ['TF_DETERMINISTIC_OPS'] = '1'\n\nseed = 21\nseed_everything(seed)\nwarnings.filterwarnings('ignore')","metadata":{"_uuid":"12f08d07-c404-4399-a9d2-0a9126e25e74","_cell_guid":"22b6e245-0652-44a7-8e4e-8e9116915d01","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = pd.read_csv(work_dir + 'train.csv')\nprint(data['label'].value_counts())","metadata":{"_uuid":"5da2093b-736c-4a73-b3e6-d338dff1a56e","_cell_guid":"553178e1-19df-49c1-a66c-ef629c08a537","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import json\n# Importing the json file with labels\nwith open(work_dir + 'label_num_to_disease_map.json') as f:\n    real_labels = json.load(f)\n    real_labels = {int(k):v for k,v in real_labels.items()}\n    \n# Defining the working dataset\ndata['class_name'] = data['label'].map(real_labels)\n\nreal_labels","metadata":{"_uuid":"11599d61-e767-41d3-a253-c72b6f4c99ba","_cell_guid":"de7ef889-63b0-4625-8d71-c541e14ed08f","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n# generate train and test sets\ntrain, test = train_test_split(data, test_size = 0.05, random_state = 42, stratify = data['class_name'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.utils import  plot_model\nmodelvgg = VGG16()\nplot_model(modelvgg)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IMG_SIZE = 456\nsize = (IMG_SIZE,IMG_SIZE)\nn_CLASS = 5\nBATCH_SIZE = 15","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datagen_train = ImageDataGenerator(\n    preprocessing_function = tf.keras.applications.vgg16.preprocess_input,\n    rotation_range = 40,\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    vertical_flip = True,\n    fill_mode = 'nearest',\n)\n\ndatagen_test = ImageDataGenerator(\n    preprocessing_function = tf.keras.applications.vgg16.preprocess_input,\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_set = datagen_train.flow_from_dataframe(\n    train,\n    directory=train_path,\n    seed=42,\n    x_col='image_id',\n    y_col='class_name',\n    target_size = size,\n    class_mode='categorical',\n    interpolation='nearest',\n    shuffle = True,\n    batch_size = BATCH_SIZE,\n)\n\ntest_set = datagen_test.flow_from_dataframe(\n    test,\n    directory=train_path,\n    seed=42,\n    x_col='image_id',\n    y_col='class_name',\n    target_size = size,\n    class_mode='categorical',\n    interpolation='nearest',\n    shuffle=True,\n    batch_size=BATCH_SIZE,    \n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import keras\nfrom keras.models import Sequential\nfrom keras.layers import GlobalAveragePooling2D, Flatten, Dense, Dropout, BatchNormalization\nfrom keras.optimizers import RMSprop, Adam\nfrom keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau\nmodel = Sequential()\nvgg=VGG16(input_shape = (IMG_SIZE, IMG_SIZE, 3), weights = 'imagenet', include_top = False)\nfor layer in vgg.layers:\n    layer.trainable = False\nmodel.add(vgg)\nmodel.add(GlobalAveragePooling2D())\nmodel.add(Flatten())\nmodel.add(Dense(n_CLASS, activation = 'softmax'))\nmodel.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def model_fit():\n    loss = tf.keras.losses.CategoricalCrossentropy(\n        from_logits = False,\n        label_smoothing=0.0001,\n        name='categorical_crossentropy'\n    )\n\n    model.compile(\n        optimizer = Adam(learning_rate = 1e-3),\n        loss = loss, #'categorical_crossentropy'\n        metrics = ['categorical_accuracy']\n    )\n    \n    # Stop training when the val_loss has stopped decreasing for 3 epochs.\n    # https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/EarlyStopping\n    es = EarlyStopping(\n        monitor='val_loss', \n        mode='min', \n        patience=3,\n        restore_best_weights=True, \n        verbose=1,\n    )\n    \n    # Save the model with the minimum validation loss\n    # https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/ModelCheckpoint\n    checkpoint_cb = ModelCheckpoint(\n        \"Cassava_best_model.h5\",\n        save_best_only=True,\n        monitor='val_loss',\n        mode='min',\n    )\n    \n    # Reduce learning rate once learning stagnates\n    # https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/ReduceLROnPlateau\n    reduce_lr = ReduceLROnPlateau(\n        monitor='val_loss',\n        factor=0.2,\n        patience=2,\n        min_lr=1e-6,\n        mode='min',\n        verbose=1,\n    )\n    \n    # Fit the model\n    history = model.fit(\n        train_set,\n        validation_data=test_set,\n        epochs=25,\n        batch_size=BATCH_SIZE,\n        callbacks=[es, checkpoint_cb, reduce_lr],\n    )\n    \n    # Save the model\n    model.save('Cassava_model_vggtry1'+'.h5')  \n    return history","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sess = tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(log_device_placement=True))\n\nfrom tensorflow.compat.v1.keras import backend as K\nK.set_session(sess)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"try:\n    final_model = keras.models.load_model('Cassava_model_vggtry1.h5')\nexcept Exception as e:\n    with tf.device('/GPU:0'):\n        results = model_fit()\n    print('Train Categorical Accuracy: ', max(results.history['categorical_accuracy']))\n    print('Test Categorical Accuracy: ', max(results.history['val_categorical_accuracy']))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def trai_test_plot(acc, test_acc, loss, test_loss):\n\n    fig, (ax1, ax2) = plt.subplots(1,2, figsize= (15,10))\n    fig.suptitle(\"Model's metrics comparisson\", fontsize=20)\n\n    ax1.plot(range(1, len(acc) + 1), acc)\n    ax1.plot(range(1, len(test_acc) + 1), test_acc)\n    ax1.set_title('History of Accuracy', fontsize=15)\n    ax1.set_xlabel('Epochs', fontsize=15)\n    ax1.set_ylabel('Accuracy', fontsize=15)\n    ax1.legend(['training', 'validation'])\n\n\n    ax2.plot(range(1, len(loss) + 1), loss)\n    ax2.plot(range(1, len(test_loss) + 1), test_loss)\n    ax2.set_title('History of Loss', fontsize=15)\n    ax2.set_xlabel('Epochs', fontsize=15)\n    ax2.set_ylabel('Loss', fontsize=15)\n    ax2.legend(['training', 'validation'])\n    plt.show()\n\n\ntrai_test_plot(\n    results.history['categorical_accuracy'],\n    results.history['val_categorical_accuracy'],\n    results.history['loss'],\n    results.history['val_loss']\n)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_model = keras.models.load_model('Cassava_model_vggtry1.h5')","metadata":{},"execution_count":null,"outputs":[]}]}