{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nimport keras\nimport os\nfrom keras.preprocessing import image\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D, MaxPool2D, Flatten, Dense, Dropout, BatchNormalization, Input, GlobalAveragePooling2D\nfrom keras.utils.vis_utils import plot_model\nfrom keras.callbacks import ModelCheckpoint,EarlyStopping,ReduceLROnPlateau\nfrom tensorflow.keras.layers.experimental import preprocessing\nfrom tensorflow.keras.applications import InceptionResNetV2","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np \nimport pandas as pd\nimport json\nWORK_DIR = '../input/cassava-leaf-disease-classification'\nos.listdir(WORK_DIR)\n\nlist_dir = os.listdir(os.path.join(WORK_DIR, \"train_images\"))\nprint(len(list_dir))\nwith open(os.path.join(WORK_DIR, \"label_num_to_disease_map.json\")) as file:\n    print(json.dumps(json.loads(file.read()), indent=2))\n    \ntrain_labels = pd.read_csv(os.path.join(WORK_DIR, \"train.csv\"))\ntrain_labels.head()\n\ntrain = pd.read_csv(os.path.join(WORK_DIR, \"train.csv\"))\ntrain['label'] = train['label'].astype('string')\ntrain.head()\n\ndiseases = pd.read_json(\"/kaggle/input/cassava-leaf-disease-classification/label_num_to_disease_map.json\", typ='series')\ndiseases\ntrain['label'].value_counts(normalize=True)\nIMG_SIZE = 320","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"IMG_SIZE = 300\n\ndatagen = image.ImageDataGenerator(rotation_range=360,\n                                width_shift_range=0.1,\n                                height_shift_range=0.1,\n                                brightness_range=[0.2,1.5],\n                                shear_range=25,\n                                zoom_range=0.3,\n                                channel_shift_range=0.1,\n                                horizontal_flip=True,\n                                vertical_flip=True,\n                                rescale=1/255,\n                                validation_split=0.15)\n\nval_datagen = image.ImageDataGenerator(rescale=1/255,\n                                       validation_split = 0.2)\ntrain_generator = datagen.flow_from_dataframe(\n    dataframe=train,\n    directory=\"/kaggle/input/cassava-leaf-disease-classification/train_images\",\n    x_col='image_id',\n    y_col='label',\n    target_size=(IMG_SIZE, IMG_SIZE),\n    batch_size=32,\n    subset='training',\n    shuffle = True,\n    class_mode='categorical'\n)\n\nval_generator = val_datagen.flow_from_dataframe(\n    dataframe=train,\n    directory=\"/kaggle/input/cassava-leaf-disease-classification/train_images\",\n    x_col='image_id',\n    y_col='label',\n    target_size=(IMG_SIZE, IMG_SIZE),\n    batch_size=32,\n    subset='validation',\n    class_mode = 'categorical',\n    shuffle = True\n)\ntrain_imgs, labels = next(train_generator)\nprint(train_imgs.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(20,10))\ntrain_imgs, labels = next(train_generator)\nprint(train_imgs.shape)\nfor i in range(25):\n    plt.subplot(5,5,i+1)\n    plt.xticks([])\n    plt.yticks([])\n    plt.grid(False)\n    plt.imshow(train_imgs[i])\n    label1 = np.argmax(labels[i])\n    plt.xlabel(diseases.get(label1))\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(train_imgs[0].shape)\nprint(labels[0])\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.applications.inception_v3 import InceptionV3\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.applications import VGG19\n\nfrom tensorflow.keras.layers import Dense, GlobalAveragePooling2D\n\nbase_model = InceptionV3(weights='imagenet', include_top=False)\n#base_model = VGG19(weights='imagenet', include_top=False)\nx = base_model.output\nx = GlobalAveragePooling2D()(x)\nx = Dense(2048, activation='relu')(x)\nx = Dropout(0.5)(x)\nx = Dense(1024, activation='relu')(x)\nx = Dropout(0.5)(x)\npredictions = Dense(5, activation='softmax')(x)\nmodel = Model(inputs=base_model.input, outputs=predictions)\n#for layer in base_model.layers:\n #   layer.trainable = False\n\nopt = tf.keras.optimizers.Adam(\n    learning_rate=0.001,\n    beta_1=0.9,\n    beta_2=0.999,\n    epsilon=1e-07,\n    amsgrad=False,\n    name=\"Adam\"\n)\nmodel.compile(optimizer = opt,\n              loss ='categorical_crossentropy',\n              metrics = ['acc'])\nmodel_save = ModelCheckpoint(\"Model\", \n                             save_best_only = True, \n                             save_weights_only = True,\n                             monitor = 'val_loss', \n                             mode = 'min', verbose = 1)\nearly_stop = EarlyStopping(monitor = 'val_loss', min_delta = 0.001, \n                           patience = 5, mode = 'min', verbose = 1,\n                           restore_best_weights = True)\nreduce_lr = ReduceLROnPlateau(monitor = 'val_loss', factor = 0.3, \n                              patience = 2, min_delta = 0.001, \n                              mode = 'min', verbose = 1)\n\nhistory = model.fit_generator(train_generator, steps_per_epoch=18188//32, epochs=15,\n                              validation_data=val_generator, validation_steps = 4279//32,\n                             callbacks = [model_save, early_stop])\n\nimport matplotlib.pyplot as plt\n\nplt.plot(history.history['acc'])\nplt.plot(history.history['val_acc'])\nplt.title('model accuracy')\nplt.ylabel('accuracy')\nplt.xlabel('epoch')\nplt.legend(['train', 'test'], loc='upper left')\nplt.show()\n# summarize history for loss\nplt.plot(history.history['loss'])\nplt.plot(history.history['val_loss'])\nplt.title('model loss')\nplt.ylabel('loss')\nplt.xlabel('epoch')\nplt.legend(['train', 'test'], loc='upper left')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.save('model.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.save('modelv2.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = tf.keras.models.Sequential([\n    tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(100, 100, 3)),\n    tf.keras.layers.GaussianDropout(0.5),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),\n    tf.keras.layers.Dropout(0.2),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),\n    tf.keras.layers.BatchNormalization(),\n    tf.keras.layers.MaxPooling2D(2,2),\n    tf.keras.layers.Flatten(),\n    tf.keras.layers.Dense(128, activation='relu'),\n    tf.keras.layers.Dropout(0.2),\n    tf.keras.layers.Dense(5, activation='softmax')\n])","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}