{"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":"code","source":"import numpy as np\nimport pandas as pd \nimport tensorflow as tf\nimport random as rn\nimport os\nSEED=42","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-08-01T05:38:01.160912Z","iopub.execute_input":"2022-08-01T05:38:01.161290Z","iopub.status.idle":"2022-08-01T05:38:01.168166Z","shell.execute_reply.started":"2022-08-01T05:38:01.161256Z","shell.execute_reply":"2022-08-01T05:38:01.167162Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.environ['PYTHONHASHSEED'] = f'{SEED}'\nnp.random.seed(SEED)\nrn.seed(SEED)\ntf.random.set_seed(SEED)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-08-01T05:38:01.524006Z","iopub.execute_input":"2022-08-01T05:38:01.524650Z","iopub.status.idle":"2022-08-01T05:38:01.534811Z","shell.execute_reply.started":"2022-08-01T05:38:01.524613Z","shell.execute_reply":"2022-08-01T05:38:01.533839Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"EXPERIMENTAL = 1\nFINAL = 2\nMODE = FINAL","metadata":{"execution":{"iopub.status.busy":"2022-08-01T05:38:01.812846Z","iopub.execute_input":"2022-08-01T05:38:01.813736Z","iopub.status.idle":"2022-08-01T05:38:01.818378Z","shell.execute_reply.started":"2022-08-01T05:38:01.813700Z","shell.execute_reply":"2022-08-01T05:38:01.817440Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom kerastuner import RandomSearch\nimport tensorflow as tf\nfrom tensorflow.keras import Model\nfrom tensorflow.keras.optimizers import Adam, SGD, RMSprop\nfrom tensorflow.keras.applications import ResNet50\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Dropout\nfrom tensorflow.keras.losses import sparse_categorical_crossentropy\nfrom tensorflow.keras.optimizers import Adam\nfrom sklearn.model_selection import KFold\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-08-01T05:38:02.050385Z","iopub.execute_input":"2022-08-01T05:38:02.050978Z","iopub.status.idle":"2022-08-01T05:38:02.058287Z","shell.execute_reply.started":"2022-08-01T05:38:02.050945Z","shell.execute_reply":"2022-08-01T05:38:02.057348Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_csv_path = \"../input/paddy-disease-classification/train.csv\"\ntrain_df = pd.read_csv(train_csv_path)","metadata":{"execution":{"iopub.status.busy":"2022-08-01T05:38:02.296890Z","iopub.execute_input":"2022-08-01T05:38:02.297546Z","iopub.status.idle":"2022-08-01T05:38:02.314773Z","shell.execute_reply.started":"2022-08-01T05:38:02.297506Z","shell.execute_reply":"2022-08-01T05:38:02.313910Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_images = os.listdir(\"../input/paddy-disease-classification/test_images\")\ntest_df = pd.DataFrame()\ntest_df[\"image_id\"] = test_images","metadata":{"execution":{"iopub.status.busy":"2022-08-01T05:38:02.519088Z","iopub.execute_input":"2022-08-01T05:38:02.519383Z","iopub.status.idle":"2022-08-01T05:38:02.529322Z","shell.execute_reply.started":"2022-08-01T05:38:02.519357Z","shell.execute_reply":"2022-08-01T05:38:02.528419Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_directory = '../input/paddy-disease-classification/train_images'\ntest_directory = '../input/paddy-disease-classification/test_images'\n","metadata":{"execution":{"iopub.status.busy":"2022-08-01T05:38:02.743221Z","iopub.execute_input":"2022-08-01T05:38:02.743827Z","iopub.status.idle":"2022-08-01T05:38:02.748974Z","shell.execute_reply.started":"2022-08-01T05:38:02.743783Z","shell.execute_reply":"2022-08-01T05:38:02.747962Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df[\"path\"] = train_df.label+\"/\"+train_df.image_id\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-08-01T05:38:02.983403Z","iopub.execute_input":"2022-08-01T05:38:02.983988Z","iopub.status.idle":"2022-08-01T05:38:03.001354Z","shell.execute_reply.started":"2022-08-01T05:38:02.983956Z","shell.execute_reply":"2022-08-01T05:38:03.000440Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model():\n    vgg16_model = tf.keras.applications.vgg16.VGG16() \n    model = Sequential()\n    for layer in vgg16_model.layers[:-1]:\n        model.add(layer)\n    for layer in model.layers[:-7]:\n        layer.trainable = False\n    model.add(Dense(units=10, activation='softmax'))\n    model.compile(loss='categorical_crossentropy', optimizer = Adam(learning_rate = 0.0001), metrics=['accuracy'])\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-08-01T05:38:03.210175Z","iopub.execute_input":"2022-08-01T05:38:03.210645Z","iopub.status.idle":"2022-08-01T05:38:03.220290Z","shell.execute_reply.started":"2022-08-01T05:38:03.210613Z","shell.execute_reply":"2022-08-01T05:38:03.219316Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IMG_SIZE = 224\nEPOCHS = 25\nN_SPLIT = 5","metadata":{"execution":{"iopub.status.busy":"2022-08-01T05:38:03.425411Z","iopub.execute_input":"2022-08-01T05:38:03.426331Z","iopub.status.idle":"2022-08-01T05:38:03.430825Z","shell.execute_reply.started":"2022-08-01T05:38:03.426292Z","shell.execute_reply":"2022-08-01T05:38:03.429930Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train, valid = train_test_split(train_df, test_size=0.1, random_state=SEED)","metadata":{"execution":{"iopub.status.busy":"2022-08-01T05:38:03.643293Z","iopub.execute_input":"2022-08-01T05:38:03.644936Z","iopub.status.idle":"2022-08-01T05:38:03.653403Z","shell.execute_reply.started":"2022-08-01T05:38:03.644895Z","shell.execute_reply":"2022-08-01T05:38:03.652480Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"acc_per_fold=[]\nloss_per_fold=[]","metadata":{"execution":{"iopub.status.busy":"2022-08-01T05:38:03.858023Z","iopub.execute_input":"2022-08-01T05:38:03.858979Z","iopub.status.idle":"2022-08-01T05:38:03.864058Z","shell.execute_reply.started":"2022-08-01T05:38:03.858936Z","shell.execute_reply":"2022-08-01T05:38:03.862775Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', mode = 'min', patience=5)","metadata":{"execution":{"iopub.status.busy":"2022-08-01T05:54:07.644798Z","iopub.execute_input":"2022-08-01T05:54:07.645159Z","iopub.status.idle":"2022-08-01T05:54:07.649922Z","shell.execute_reply.started":"2022-08-01T05:54:07.645126Z","shell.execute_reply":"2022-08-01T05:54:07.648952Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input,\n                                   rescale = 1./255,\n                                   zoom_range = 0.2,\n                                   horizontal_flip = True,\n                                   width_shift_range=0.2, height_shift_range=0.2,\n                                  rotation_range=90)\n\nvalidation_datagen = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input,\n                                        rescale = 1./255)\n\ntest_datagen = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input,\n                                        rescale = 1./255)\n","metadata":{"execution":{"iopub.status.busy":"2022-08-01T05:54:08.056135Z","iopub.execute_input":"2022-08-01T05:54:08.056680Z","iopub.status.idle":"2022-08-01T05:54:08.066389Z","shell.execute_reply.started":"2022-08-01T05:54:08.056645Z","shell.execute_reply":"2022-08-01T05:54:08.063121Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator=train_datagen.flow_from_dataframe(\ndataframe=train,\ndirectory=train_directory,\nx_col=\"path\",\ny_col=\"label\",\nbatch_size=32,\nseed=SEED,\nshuffle=True,\nclass_mode=\"categorical\",\ntarget_size=(224,224))\n\nvalid_generator=validation_datagen.flow_from_dataframe(\ndataframe=valid,\ndirectory=train_directory,\nx_col=\"path\",\ny_col=\"label\",\nbatch_size=32,\nseed=SEED,\nshuffle=False,\nclass_mode=\"categorical\",\ntarget_size=(224,224))\n    \ntest_generator=test_datagen.flow_from_dataframe(\ndataframe=test_df,\ndirectory=test_directory,\nx_col=\"image_id\",\ny_col=None,\nbatch_size=32,\nseed=SEED,\nshuffle=False,\nclass_mode=None,\ntarget_size=(224,224))","metadata":{"execution":{"iopub.status.busy":"2022-08-01T05:54:08.350951Z","iopub.execute_input":"2022-08-01T05:54:08.352165Z","iopub.status.idle":"2022-08-01T05:54:14.262355Z","shell.execute_reply.started":"2022-08-01T05:54:08.352113Z","shell.execute_reply":"2022-08-01T05:54:14.261328Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import keras_tuner as kt\nclass MyHyperModel(kt.HyperModel):\n    def build(self, hp):\n        vgg16_model = tf.keras.applications.vgg16.VGG16() \n        model = Sequential()\n        for layer in vgg16_model.layers[:-1]:\n            model.add(layer)\n        for layer in model.layers[:-7]:\n            layer.trainable = False\n        model.add(Dense(units=10, activation='softmax'))\n        hp_lr = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])\n        hp_optimizer = hp.Choice('optimizer', values=['sgd', 'rmsprop', 'adam'])\n        if hp_optimizer == 'sgd':\n            optimizer = SGD(learning_rate=hp_lr)\n        elif hp_optimizer == 'rmsprop':\n            optimizer = RMSprop(learning_rate=hp_lr)\n        elif hp_optimizer == 'adam':\n            optimizer = Adam(learning_rate=hp_lr)\n        else:\n            raise\n        model.compile(loss='categorical_crossentropy', optimizer = optimizer, metrics=['accuracy'])\n        return model\n","metadata":{"execution":{"iopub.status.busy":"2022-08-01T05:54:14.264421Z","iopub.execute_input":"2022-08-01T05:54:14.264796Z","iopub.status.idle":"2022-08-01T05:54:14.274010Z","shell.execute_reply.started":"2022-08-01T05:54:14.264757Z","shell.execute_reply":"2022-08-01T05:54:14.273038Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if MODE == EXPERIMENTAL:\n    #creating randomsearch object\n    tuner = RandomSearch(MyHyperModel(),\n                         seed=SEED,\n                        objective='val_accuracy',\n                        max_trials = 12,\n                        overwrite=True,\n                        directory=\".\",\n                        project_name=\"tune_hypermodel\",\n                        )\n    # search best parameter\n    tuner.search(train_generator, epochs=50, callbacks = [callback], validation_data=valid_generator)\n    print(tuner.get_best_hyperparameters()[0].values)\n    \nelif MODE == FINAL:\n    model = get_model()\n    model.fit(train_generator, epochs = 500, callbacks = [callback], validation_data=valid_generator)\n    model.fit(valid_generator, epochs = 10)","metadata":{"execution":{"iopub.status.busy":"2022-08-01T05:54:14.275427Z","iopub.execute_input":"2022-08-01T05:54:14.276016Z","iopub.status.idle":"2022-08-01T07:28:59.402529Z","shell.execute_reply.started":"2022-08-01T05:54:14.275980Z","shell.execute_reply":"2022-08-01T07:28:59.401504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class_labels = sorted(os.listdir('../input/paddy-disease-classification/train_images'))\npredictions = model.predict(test_generator)\nclass_predictions = predictions.argmax(axis=-1)\npredicted_labels = [class_labels[prediction] for prediction in class_predictions]","metadata":{"execution":{"iopub.status.busy":"2022-08-01T07:31:21.963983Z","iopub.execute_input":"2022-08-01T07:31:21.964362Z","iopub.status.idle":"2022-08-01T07:31:47.361186Z","shell.execute_reply.started":"2022-08-01T07:31:21.964328Z","shell.execute_reply":"2022-08-01T07:31:47.360202Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"output = pd.DataFrame({'image_id': test_df.image_id,\n                       'label': predicted_labels})\noutput.to_csv('submission.csv', index=False)\n","metadata":{"execution":{"iopub.status.busy":"2022-08-01T07:32:01.087501Z","iopub.execute_input":"2022-08-01T07:32:01.087961Z","iopub.status.idle":"2022-08-01T07:32:01.112008Z","shell.execute_reply.started":"2022-08-01T07:32:01.087919Z","shell.execute_reply":"2022-08-01T07:32:01.111048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}