{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import pandas as pd\nimport os\nimport tensorflow as tf\n\nimport matplotlib.pyplot as plt\n%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"physical_devices = tf.config.experimental.list_physical_devices('GPU')\nprint(physical_devices)\nassert len(physical_devices) > 0, \"Not enough GPU hardware devices available\"\nconfig = tf.config.experimental.set_memory_growth(physical_devices[0], True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_dir = \"/kaggle/input/cassava-leaf-disease-classification\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_label_indexes = pd.read_json(data_dir + \"/label_num_to_disease_map.json\", orient=\"index\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"labels = df_label_indexes.values.flatten().tolist()\n\nlabels","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_images = data_dir + \"/train_images\"\ntest_images = data_dir + \"/test_images\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.read_csv(data_dir + \"/train.csv\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df[\"label\"] = df[\"label\"].astype(\"string\")  # for Keras flow_from_dataframe","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\ntraining_datagen = ImageDataGenerator(\n    \n    #preprocessing_function=preprocess_input,\n    rescale = 1/255,\n    rotation_range = 100,\n    width_shift_range = 0.2,\n    height_shift_range = 0.2,\n    shear_range = 0.2,\n    zoom_range = 0.3,\n    brightness_range = [0.7, 1.4],\n    horizontal_flip = True,\n    vertical_flip=True,\n    fill_mode = \"nearest\",\n    validation_split=0.2\n)\n\nvalidation_datagen = ImageDataGenerator(\n    #preprocessing_function=preprocess_input,\n    rescale = 1/255,\n    validation_split=0.2\n)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"BATCH_SIZE = 128\nIMG_WIDTH = 300\nIMG_HEIGHT = 300\nCHANNEL = 3\n\nprint(\"\\nTraining Dataset\")\ntrain_ds = training_datagen.flow_from_dataframe(\n    df,\n    train_images,\n    target_size = (IMG_WIDTH, IMG_HEIGHT),\n    class_mode = \"categorical\",\n    batch_size = BATCH_SIZE,\n    x_col = \"image_id\",\n    y_col = \"label\",\n    shuffle = True,\n    subset = \"training\"\n\n)\nprint(\"\\nValidation Dataset\")\nvalidation_ds = validation_datagen.flow_from_dataframe(\n    df,\n    train_images,\n    target_size = (IMG_WIDTH, IMG_HEIGHT),\n    class_mode = \"categorical\",\n    batch_size = BATCH_SIZE,\n    x_col = \"image_id\",\n    y_col = \"label\",\n    shuffle = False,\n    subset = \"validation\"\n)\nprint(\"\\nClass Indices:\")\nprint(train_ds.class_indices)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.models import Sequential\nfrom tensorflow.keras import layers\n\nmodel = Sequential([\n    layers.Conv2D(64, 3, padding=\"same\", activation=\"relu\", input_shape=(IMG_WIDTH, IMG_HEIGHT, 3)),\n    layers.MaxPooling2D(2),\n    layers.Conv2D(128, 3, padding=\"same\", activation=\"relu\"),\n    layers.MaxPooling2D(2),\n    layers.Conv2D(128, 3, padding=\"same\", activation=\"relu\"),\n    layers.MaxPooling2D(2),\n#    layers.Dropout(0.5),\n    layers.Conv2D(256, 3, padding=\"same\", activation=\"relu\"),\n    layers.MaxPooling2D(2),\n#    layers.Dropout(0.5),\n    layers.Conv2D(256, 3, padding=\"same\", activation=\"relu\"),\n    layers.MaxPooling2D(2),\n    layers.Conv2D(256, 3, padding=\"same\", activation=\"relu\"),\n    layers.MaxPooling2D(2),\n#    layers.Dropout(0.5),\n    layers.Conv2D(512, 3, padding=\"same\", activation=\"relu\"),\n    layers.MaxPooling2D(2),\n    layers.Conv2D(512, 3, padding=\"same\", activation=\"relu\"),\n    layers.MaxPooling2D(2),\n    layers.Dropout(0.5),\n    \n    layers.Flatten(),\n    layers.Dense(512, activation=\"relu\"),\n    layers.Dense(5, activation=\"softmax\"),\n    \n])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Saves checkpoint at the end of each epoch.\ncheckpoint_cb = tf.keras.callbacks.ModelCheckpoint(\"cassava_model.h5\", save_best_only=True)\n\n# For resuming training.\n# model = tf.keras.models.load_model(\"cassava_model.h5\")\n\n# Early Stopping\nearly_stopping_cb = tf.keras.callbacks.EarlyStopping(patience=10, restore_best_weights=True)\n\n# For Tensorboard\n\n# define root log directory\nroot_logdir = os.path.join(os.curdir, \"cassava_logs\")\n\nos.makedirs(root_logdir, exist_ok=True)\n\ndef get_run_logdir():\n    import time\n    run_id = time.strftime(\"run_%Y_%m_%d-%H_%M_%S\")\n    return os.path.join(root_logdir, run_id)\n\nrun_logdir = get_run_logdir()\n\ntensorboard_cb = tf.keras.callbacks.TensorBoard(run_logdir)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(\n    optimizer='adam', \n    loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True), \n    metrics=['accuracy']\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"epochs = 25\n\nhistory = model.fit(\n    train_ds, \n    validation_data=validation_ds, \n    epochs=epochs,\n    callbacks = [checkpoint_cb, early_stopping_cb, tensorboard_cb]\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"acc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\n\nloss = history.history['loss']\nval_loss = history.history['val_loss']\n\nepochs_range = range(epochs)\n\nplt.figure(figsize=(8, 8))\nplt.subplot(1, 2, 1)\nplt.plot(epochs_range, acc, label='Training Accuracy')\nplt.plot(epochs_range, val_acc, label='Validation Accuracy')\nplt.legend(loc='lower right')\nplt.title('Training and Validation Accuracy')\n\nplt.subplot(1, 2, 2)\nplt.plot(epochs_range, loss, label='Training Loss')\nplt.plot(epochs_range, val_loss, label='Validation Loss')\nplt.legend(loc='upper right')\nplt.title('Training and Validation Loss')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.save(\"/kaggle/working/cassava.h5\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n\nss = pd.read_csv(data_dir + '/sample_submission.csv')\n\nss.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\n\npreds = []\n\nloaded_model = tf.keras.models.load_model(\"/kaggle/working/cassava.h5\")\n\nfor image in ss.image_id:\n    img = tf.keras.preprocessing.image.load_img(data_dir + '/test_images/' + image)\n    img = tf.keras.preprocessing.image.img_to_array(img)\n    img = tf.keras.preprocessing.image.smart_resize(img, (IMG_WIDTH, IMG_HEIGHT))\n    img = tf.reshape(img, (-1, IMG_WIDTH, IMG_HEIGHT, 3))\n    prediction = loaded_model.predict(img/255.)\n    print(\"Predictions: \", prediction)\n    print(np.argmax(prediction))\n    preds.append(np.argmax(prediction))\n\n    \nlabels[2]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"my_submission = pd.DataFrame({'image_id': ss.image_id, 'label': preds})\n\nss.image_id, preds","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"my_submission.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}