{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport cv2\nimport time\nimport os\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import Sequential\nfrom tensorflow.keras.layers import Conv2D, Dense, Dropout, MaxPool2D, Flatten\nimport kerastuner as kt\nfrom kerastuner.tuners import RandomSearch\nfrom kerastuner.engine.hypermodel import HyperModel\nfrom kerastuner.engine.hyperparameters import HyperParameters\nfrom tensorflow.keras.callbacks import TensorBoard\nfrom sklearn.utils import shuffle\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"####SHWOING ONE IMAGE \n\nimport matplotlib.pyplot as plt\nfor f in os.listdir('../input/cassava-leaf-disease-classification/train_images')[1000:1001]:\n    img=cv2.imread(os.path.join('../input/cassava-leaf-disease-classification/train_images',f))\n    plt.imshow(img)\n    plt.show        \n\n    \n####DEFINING BATCH SIZE, NO. OF EPOCHS, VALIDATION SPLIT, INPUT SHAPE \nepochs=50\nINP_SHP=224\nBAT_SIZ=32\nVAL_SPL=0.05","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image_directory='../input/cassava-leaf-disease-classification/train_images'\ntrain=pd.read_csv('../input/cassava-leaf-disease-classification/train.csv') \n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def create_df(training_images=100,image_directory='../input/cassava-leaf-disease-classification/train_images',test_dir='../input/cassava-leaf-disease-classification/test_images'):\n    \n\n    '''\n    Returns dataframe given the training images and image directory  \n     \n    '''\n\n    train_df=pd.read_csv('../input/cassava-leaf-disease-classification/train.csv') \n    \n    train_df['label'] = train_df['label'].astype(str)\n    \n    train_df=train_df.iloc[:training_images,:]\n    \n    train_df=shuffle(train_df)\n\n    train_df.reset_index(inplace=True,drop=True)\n    test_di=[]\n    ####FOR TEST DATAFRAME \n    for fi in os.listdir(test_dir):\n        test_di.append(os.path.join(test_dir,fi))\n        \n        \n    test_df=pd.DataFrame(test_di,columns=['x'])\n    test_df['y']=None \n    \n    \n    return train_df,test_df\n\n\n\n####FUNCTION RETURNS THE MODEL####\n\ndef create_model():\n    \n    model = Sequential()\n    # initialize the model with input shape as (224,224,3)\n    model.add(tf.keras.applications.EfficientNetB0(input_shape = (INP_SHP, INP_SHP, 3), include_top = False, weights =None))\n    #for layer in model.layers[:-40]:  # Training just part of the architecture do not optimize the performance\n    #    layer.trainable = False\n    model.add(keras.layers.GlobalAveragePooling2D())\n    model.add(Flatten())\n    model.add(Dropout(0.7))\n    model.add(Dense(128,activation='relu'))\n    model.add(Dense(5, activation = 'softmax'))\n        \n    model.compile(optimizer = keras.optimizers.Adam(lr = 0.001),\n                  loss = \"sparse_categorical_crossentropy\",\n                  metrics = [\"acc\"])\n    \n    return model\n\n\n\n\ndef test_pre_process(dataframe,val_spl,test_df,image_size=INP_SHP,batch_size=BAT_SIZ):\n\n    '''\n    \n    Data preprocessing based on image size, batch size and validation split using image data generator\n    \n    returns train, validation and test image data generators \n    \n    '''\n    idx=int(len(dataframe)*(1-val_spl))\n        \n    im_dg=tf.keras.preprocessing.image.ImageDataGenerator(rescale=1.0/255,\n                                                          rotation_range = 40,\n                                                          width_shift_range = 0.2,\n                                                          height_shift_range = 0.2,\n                                                          shear_range = 0.2,\n                                                          zoom_range = 0.2,\n                                                          horizontal_flip = True,\n                                                          vertical_flip = True,\n                                                          fill_mode = 'nearest',\n                                                          validation_split=val_spl)\n            \n    te_dg=tf.keras.preprocessing.image.ImageDataGenerator(rescale=1.0/255)\n    \n    train=im_dg.flow_from_dataframe(dataframe,x_col=\"image_id\",y_col=\"label\",subset='training',directory='../input/cassava-leaf-disease-classification/train_images',class_mode='sparse',batch_size=BAT_SIZ,target_size=(INP_SHP,INP_SHP))\n    \n    valid=im_dg.flow_from_dataframe(dataframe,x_col=\"image_id\",y_col=\"label\",subset='validation',directory='../input/cassava-leaf-disease-classification/train_images',class_mode='sparse',batch_size=BAT_SIZ,target_size=(INP_SHP,INP_SHP))\n    \n    test =te_dg.flow_from_dataframe(test_df,x_col='x',y_col=None,batch_size=batch_size,target_size=(INP_SHP,INP_SHP),class_mode=None)\n\n    return train,valid,test\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#def model1():\n    \n#    model=Sequential()\n    \n#    model.add(Conv2D(64,kernel_size=3,activation='relu',input_shape=(INP_SHP,INP_SHP,3),padding='same'))\n        \n#    model.add(Conv2D(128,kernel_size=3,activation='relu',padding='same'))\n    \n#    model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\n    \n#    model.add(Conv2D(256,kernel_size=3,activation='relu',padding='same'))\n    \n#    model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\n    \n#    model.add(Conv2D(512,kernel_size=3,activation='relu',padding='same'))\n    \n#    model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\n            \n#    model.add(Conv2D(1024,kernel_size=3,activation='relu',padding='same'))\n    \n#    model.add(MaxPool2D(pool_size=(2,2),strides=(3,3)))\n\n#    model.add(Flatten())\n    \n#    model.add(Dense(units=512,activation='relu'))\n    \n#    model.add(Dense(units=128,activation='relu'))\n\n#    model.add(Dense(units=5,activation='softmax'))\n    \n#    model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.0001), loss=\"sparse_categorical_crossentropy\", metrics=[\"accuracy\"])\n\n#    return model \n\n\n\n#def hyper_model():  \n    \n#    '''\n#    Hypermodel for keras tuner \n    \n#    '''\n\n\n#    model = tf.keras.applications.ResNet50V2(include_top=False,classes=5,input_shape=(INP_SHP,INP_SHP,3))\n\n#    for layers in model.layers[:]:                      ####NON_TRAIN_LAY\n#        layers.trainable=False\n\n#    flat=tf.keras.layers.Flatten()(model.output)\n    \n    #drop=tf.keras.layers.Dropout(config['dpout1'])(flat)                       ####DROPOUT1\n    \n    #out1=Dense(config['dense_layer'],activation='relu')(drop)                  ####CONFIG DENSE LAYER NODES\n    \n#    out2=Dense(5,activation='softmax')(flat)\n\n#    f_mod=tf.keras.Model(inputs=model.input,outputs=out2)     \n    \n#    f_mod.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])\n    \n#    return f_mod","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#def keras_tuning(max_trials,executions_per_trial):\n    \n    #tuner=kt.tuners.RandomSearch(hyper_model,max_trials=max_trials,executions_per_trial=executions_per_trial,objective='val_loss')\n    \n    #tuner.search_space_summary()\n    \n    #ear_sto=tf.keras.callbacks.EarlyStopping(monitor=\"val_loss\",patience=3)\n\n    #history=tuner.search(x=train,epochs=epochs,verbose=2,callbacks=[ear_sto],validation_data=valid)  \n    \n    #tuner.results_summary()\n    \n    #return tuner.get_best_models(num_models=1)[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ear_sto=keras.callbacks.EarlyStopping(monitor=\"val_loss\",patience=3,mode='min')\nmod_chk=keras.callbacks.ModelCheckpoint('best_weights.hdf5',monitor='val_loss',mode='min',save_best_only=True)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df,test_df=create_df(training_images=21397)\ntrain,valid,test=test_pre_process(train_df,val_spl=VAL_SPL,test_df=test_df)\nmodel=create_model()\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":"history=model.fit(x=train,batch_size=BAT_SIZ,epochs=epochs,callbacks=[ear_sto],shuffle=True,validation_data=valid)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.save('./complete_model')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot(history.history['val_acc'])\nplt.plot(history.history['acc'])\nplt.title('model accuracy')\nplt.xlabel('epochs')\nplt.ylabel('accuracy')\n\nplt.legend(['val_accuracy','train_accuracy'],loc='upper left')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#def test_to_array(dir='../input/cassava-leaf-disease-classification/test_images'):\n#   test=np.array()\n#   for img in dir:\n#        arr=cv2.imread(os.path.join(dir,img))\n#       test=cv2.resize(arr,(128,128))\n#        \n#        test.append(arr)\n                  \n\n\n#img=cv2.imread('../input/cassava-leaf-disease-classification/test_images/2216849948.jpg')\n#test=cv2.resize(img,(128,128))\n#plt.imshow(test)\n#test=test.reshape(-1,128,128,3)\n#test.shape\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\npred=model2.predict(x=test)\nlabel=np.argmax(pred,axis=1)\n\nimage_id=test_df.iloc[:,0]\nimage_ids=[]\nfor path in image_id:\n    path=path.split('/')[-1]\n    image_ids.append(path)\n\n\n\nfinal_df=pd.DataFrame()\nfinal_df['image_id']=image_ids\nfinal_df['label']=label\n\nfinal_df.to_csv('submission.csv',index=False)\n","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":{"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}