{"metadata":{"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":13836,"databundleVersionId":1718836,"sourceType":"competition"}],"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true},"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.13"},"papermill":{"default_parameters":{},"duration":14488.284463,"end_time":"2024-07-18T09:44:45.347489","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2024-07-18T05:43:17.063026","version":"2.5.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Libraries","metadata":{"papermill":{"duration":0.004865,"end_time":"2024-07-18T05:43:19.816147","exception":false,"start_time":"2024-07-18T05:43:19.811282","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport json\nimport tensorflow as tf\nimport keras\nimport matplotlib.pyplot as plt\nfrom keras import utils\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.applications import InceptionResNetV2,Xception, ResNet50\nfrom keras.models import Sequential, Model\nfrom keras.callbacks import ReduceLROnPlateau, ModelCheckpoint\nfrom keras.layers import Dense, Dropout, Flatten, GlobalAveragePooling2D\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom keras.optimizers import Adam\nimport os\nimport random\n\ntrain_path = '/kaggle/input/cassava-leaf-disease-classification/train_images'\ndata = pd.read_csv('../input/cassava-leaf-disease-classification/train.csv')","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.execute_input":"2024-07-18T05:43:19.826663Z","iopub.status.busy":"2024-07-18T05:43:19.826073Z","iopub.status.idle":"2024-07-18T05:43:32.586028Z","shell.execute_reply":"2024-07-18T05:43:32.584972Z"},"papermill":{"duration":12.767787,"end_time":"2024-07-18T05:43:32.588450","exception":false,"start_time":"2024-07-18T05:43:19.820663","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seed = 18114\ndef seed_everything(seed):\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    os.environ['TF_DETERMINISTIC_OPS']= '1'\n    os.environ['TF_CUDNN_DETERMINISTIC'] = '1'\n    random.seed(seed)\n    tf.random.set_seed(seed)\n    np.random.seed(seed)\n    \nseed_everything(seed)","metadata":{"execution":{"iopub.execute_input":"2024-07-18T05:43:32.599227Z","iopub.status.busy":"2024-07-18T05:43:32.598913Z","iopub.status.idle":"2024-07-18T05:43:32.604274Z","shell.execute_reply":"2024-07-18T05:43:32.603535Z"},"papermill":{"duration":0.012826,"end_time":"2024-07-18T05:43:32.606188","exception":false,"start_time":"2024-07-18T05:43:32.593362","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"strategy = tf.distribute.MirroredStrategy()\nprint('Devices Available: {}'.format(strategy.num_replicas_in_sync))","metadata":{"execution":{"iopub.execute_input":"2024-07-18T05:43:32.616042Z","iopub.status.busy":"2024-07-18T05:43:32.615769Z","iopub.status.idle":"2024-07-18T05:43:33.643338Z","shell.execute_reply":"2024-07-18T05:43:33.642244Z"},"papermill":{"duration":1.034812,"end_time":"2024-07-18T05:43:33.645453","exception":false,"start_time":"2024-07-18T05:43:32.610641","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Importing and preparing dataset","metadata":{"papermill":{"duration":0.004528,"end_time":"2024-07-18T05:43:33.654687","exception":false,"start_time":"2024-07-18T05:43:33.650159","status":"completed"},"tags":[]}},{"cell_type":"code","source":"with open('/kaggle/input/cassava-leaf-disease-classification/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()}\ndata['class_name'] = data['label'].map(real_labels)\n\nbalance = data['label'].value_counts(normalize = True)\nclass_weight = dict()\nfor i in range(2):\n    class_weight[i]  = (1-balance[i])/(1-balance.min())\n\n    \ntrain,test = train_test_split (data,test_size = 0.2,random_state = 41)\n\n\ndatagen_train = ImageDataGenerator(rescale = 1./255,\n                            zoom_range = 0.3,\n                            rotation_range = 30,\n                            horizontal_flip = True,\n                            vertical_flip = True,\n                            width_shift_range = 0.3,\n                            height_shift_range = 0.3\n                                  )\ndatagen_val = ImageDataGenerator(rescale = 1./255)","metadata":{"execution":{"iopub.execute_input":"2024-07-18T05:43:33.664804Z","iopub.status.busy":"2024-07-18T05:43:33.664499Z","iopub.status.idle":"2024-07-18T05:43:33.703109Z","shell.execute_reply":"2024-07-18T05:43:33.702374Z"},"papermill":{"duration":0.045776,"end_time":"2024-07-18T05:43:33.704983","exception":false,"start_time":"2024-07-18T05:43:33.659207","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model settings","metadata":{"papermill":{"duration":0.004503,"end_time":"2024-07-18T05:43:33.713988","exception":false,"start_time":"2024-07-18T05:43:33.709485","status":"completed"},"tags":[]}},{"cell_type":"code","source":"Batch_size = 32\nepochs = 30\nimg_size = 350","metadata":{"execution":{"iopub.execute_input":"2024-07-18T05:43:33.724314Z","iopub.status.busy":"2024-07-18T05:43:33.723791Z","iopub.status.idle":"2024-07-18T05:43:33.727585Z","shell.execute_reply":"2024-07-18T05:43:33.726768Z"},"papermill":{"duration":0.010981,"end_time":"2024-07-18T05:43:33.729436","exception":false,"start_time":"2024-07-18T05:43:33.718455","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Reading images","metadata":{"papermill":{"duration":0.004243,"end_time":"2024-07-18T05:43:33.738238","exception":false,"start_time":"2024-07-18T05:43:33.733995","status":"completed"},"tags":[]}},{"cell_type":"code","source":"training_set = datagen_train.flow_from_dataframe(\ntrain,\ndirectory = train_path,\nx_col = 'image_id',\ny_col = 'class_name',\nclass_mode = 'categorical',\ntarget_size = (img_size,img_size),\nbatch_size = Batch_size,\nshuffle = True,\nseed = seed\n)\n\nvalidation_set = datagen_val.flow_from_dataframe(\ntest,\ndirectory = train_path,\nx_col = 'image_id',\ny_col = 'class_name',\nclass_mode = 'categorical',\ntarget_size = (img_size,img_size),\nbatch_size = Batch_size,\nshuffle = True,\nseed = seed\n)\n\n\ntraining_steps = training_set.n//training_set.batch_size\nvalidation_steps = validation_set.n//validation_set.batch_size\n\n\nx,y = next(training_set)\nfor i in range (0,2):\n    plt.imshow(x[i])\n    plt.title(f'label:{y[i].argmax()}')\n    plt.show()","metadata":{"execution":{"iopub.execute_input":"2024-07-18T05:43:33.748760Z","iopub.status.busy":"2024-07-18T05:43:33.748178Z","iopub.status.idle":"2024-07-18T05:44:24.074998Z","shell.execute_reply":"2024-07-18T05:44:24.074132Z"},"papermill":{"duration":50.337279,"end_time":"2024-07-18T05:44:24.080192","exception":false,"start_time":"2024-07-18T05:43:33.742913","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Checking the model","metadata":{"papermill":{"duration":0.01287,"end_time":"2024-07-18T05:44:24.106220","exception":false,"start_time":"2024-07-18T05:44:24.093350","status":"completed"},"tags":[]}},{"cell_type":"code","source":"print('class_weight=',class_weight)\nprint('batch_size=',Batch_size)\nprint('img_size=',(img_size,img_size))\nprint('training_steps=',training_steps)\nprint('validation_steps=',validation_steps)\nprint('epoch=',epochs)","metadata":{"execution":{"iopub.execute_input":"2024-07-18T05:44:24.134221Z","iopub.status.busy":"2024-07-18T05:44:24.133335Z","iopub.status.idle":"2024-07-18T05:44:24.141169Z","shell.execute_reply":"2024-07-18T05:44:24.139949Z"},"papermill":{"duration":0.023984,"end_time":"2024-07-18T05:44:24.143265","exception":false,"start_time":"2024-07-18T05:44:24.119281","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Defining and training the model","metadata":{"papermill":{"duration":0.018322,"end_time":"2024-07-18T05:44:24.179659","exception":false,"start_time":"2024-07-18T05:44:24.161337","status":"completed"},"tags":[]}},{"cell_type":"code","source":"### The problem here was tf thought I'm creating multiple models\n### below is established using one model\nwith strategy.scope():\n    base_model = ResNet50(include_top=False, input_shape=(img_size, img_size, 3), weights=None, classes=5)\n    x = GlobalAveragePooling2D()(base_model.output)\n    x = Dropout(0.5)(x)\n    x = Dense(256,activation = 'relu')(x)\n    x = Dropout(0.5)(x)\n    output = Dense(5, activation='sigmoid')(x)\n    model = Model(inputs=base_model.input, outputs=output)\n    opt = tf.keras.optimizers.Adam(learning_rate=0.05)\n    reducelronplateau = ReduceLROnPlateau(monitor = 'val_loss',mode = 'auto',\n                        factor = 0.7,patience = 2, min_delta = 0.001,\n                        min_lr = 0.0,cooldown=0)\n    call_backs = []\n    model.compile(optimizer = 'adam',loss='categorical_crossentropy',\n                  metrics=  ['categorical_accuracy'])\n    history = model.fit(training_set,epochs=epochs,validation_data=validation_set,\n                verbose=1,class_weight=class_weight,callbacks=call_backs)","metadata":{"execution":{"iopub.execute_input":"2024-07-18T05:44:24.212564Z","iopub.status.busy":"2024-07-18T05:44:24.212245Z","iopub.status.idle":"2024-07-18T09:44:36.664115Z","shell.execute_reply":"2024-07-18T09:44:36.663205Z"},"papermill":{"duration":14413.346184,"end_time":"2024-07-18T09:44:37.542070","exception":false,"start_time":"2024-07-18T05:44:24.195886","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Checking model logs","metadata":{"papermill":{"duration":0.947676,"end_time":"2024-07-18T09:44:39.463139","exception":false,"start_time":"2024-07-18T09:44:38.515463","status":"completed"},"tags":[]}},{"cell_type":"code","source":"plt.plot(history.history['categorical_accuracy'])\nplt.plot(history.history['val_categorical_accuracy'])\nplt.ylabel('categorical_accuracy')\nplt.xlabel('epoch')\nplt.legend(['train','test'],loc = 'upper left')\nplt.show()","metadata":{"execution":{"iopub.execute_input":"2024-07-18T09:44:41.296879Z","iopub.status.busy":"2024-07-18T09:44:41.296497Z","iopub.status.idle":"2024-07-18T09:44:41.510369Z","shell.execute_reply":"2024-07-18T09:44:41.509375Z"},"papermill":{"duration":1.169724,"end_time":"2024-07-18T09:44:41.512696","exception":false,"start_time":"2024-07-18T09:44:40.342972","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]}]}