{"cells":[{"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 os\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras import models, layers\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau\nfrom tensorflow.keras.applications import EfficientNetB4\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.losses import CategoricalCrossentropy\n\nimport warnings\nwarnings.simplefilter(\"ignore\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.read_csv(\"../input/cassava-leaf-disease-classification/train.csv\")\ntrain_df['label'] = train_df['label'].astype('str')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df['label'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.info()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"BATCH_SIZE = 16","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_datagen = ImageDataGenerator(rotation_range=180,\n                                    width_shift_range=0.2,\n                                    height_shift_range=0.2,\n                                    brightness_range=[0.1,0.9],\n                                    shear_range=25,\n                                    zoom_range=0.3,\n                                    channel_shift_range=0.2,\n                                    horizontal_flip=True,\n                                    vertical_flip=True,\n                                    validation_split=0.2\n                                    ) \nvalid_datagen = ImageDataGenerator(validation_split = 0.2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_generator = train_datagen.flow_from_dataframe(train_df,directory = \"../input/cassava-leaf-disease-classification/train_images\",subset = \"training\",x_col = \"image_id\",y_col = \"label\",target_size = (384,384),batch_size = BATCH_SIZE,class_mode = \"categorical\",seed = 42,shuffle= True)\nvalid_generator = valid_datagen.flow_from_dataframe(train_df,directory = \"../input/cassava-leaf-disease-classification/train_images\",subset = \"validation\",x_col = \"image_id\",y_col = \"label\",target_size = (384,384),batch_size = BATCH_SIZE,class_mode = \"categorical\",seed = 42,shuffle= True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"tf.keras.backend.clear_session()\nbase_model = EfficientNetB4(include_top=False, weights='imagenet', input_shape=(384, 384, 3))\ntemp_model = base_model.get_layer('top_activation').output\npool_layer = layers.GlobalAveragePooling2D()(temp_model)\ndense_1 = layers.Dense(256,activation = 'relu')(pool_layer)\ndrop_out = layers.Dropout(0.4)(dense_1)\noutput_layer = layers.Dense(5, activation='softmax')(drop_out)\n# for layer in base_model.layers:\n#     layer.trainable = False\nmodel = tf.keras.Model(base_model.input,output_layer)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"filepath = '/kaggle/working/best_model-{epoch:02d}.hdf5'\nmodel_check = ModelCheckpoint(filepath,monitor = \"val_accuracy\",verbose = 1,save_best_only = True,save_weights_only = False,mode = \"max\")\nearly_stop= EarlyStopping(monitor = \"val_loss\",min_delta=0.001,patience=7,verbose=1,mode=\"min\")\nreduce_lr = ReduceLROnPlateau(monitor=\"val_loss\",factor=0.1,patience=2,verbose=1,mode=\"min\",min_delta=0.0001)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(optimizer = \"adam\",loss = CategoricalCrossentropy(label_smoothing=0.3),metrics = [\"accuracy\"])\nstep_size_train_epoch = train_generator.n//train_generator.batch_size\nstep_size_valid_epoch = valid_generator.n//valid_generator.batch_size\nmodel.fit(train_generator,steps_per_epoch=step_size_train_epoch, epochs = 30,validation_data = valid_generator, validation_steps=step_size_valid_epoch, callbacks = [model_check,early_stop,reduce_lr])","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}