{"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\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nsns.set_style('darkgrid')\n\nfrom tensorflow import keras\nfrom keras.models import Sequential,load_model\nfrom keras.layers import Dense,GlobalAveragePooling2D,Flatten,Conv2D,BatchNormalization,Dropout,MaxPooling2D,Activation\nfrom keras.preprocessing import image\nfrom keras.preprocessing.image import ImageDataGenerator as Imgen\n\nfrom PIL import Image\nfrom sklearn.metrics import confusion_matrix,classification_report","metadata":{"execution":{"iopub.status.busy":"2021-06-26T10:19:22.748255Z","iopub.execute_input":"2021-06-26T10:19:22.748744Z","iopub.status.idle":"2021-06-26T10:19:29.872206Z","shell.execute_reply.started":"2021-06-26T10:19:22.748649Z","shell.execute_reply":"2021-06-26T10:19:29.871095Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv(\"../input/plant-pathology-2021-fgvc8/train.csv\")","metadata":{"execution":{"iopub.status.busy":"2021-06-26T10:19:44.592869Z","iopub.execute_input":"2021-06-26T10:19:44.593258Z","iopub.status.idle":"2021-06-26T10:19:44.621032Z","shell.execute_reply.started":"2021-06-26T10:19:44.593226Z","shell.execute_reply":"2021-06-26T10:19:44.61998Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.DataFrame(train_df,columns = ['image','labels'])\ntrain_df['labels'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2021-06-26T10:19:46.906877Z","iopub.execute_input":"2021-06-26T10:19:46.907265Z","iopub.status.idle":"2021-06-26T10:19:46.932364Z","shell.execute_reply.started":"2021-06-26T10:19:46.907233Z","shell.execute_reply":"2021-06-26T10:19:46.930393Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = train_df[train_df['labels'].str.contains(\" \")==False]\ntrain_df['labels'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2021-06-26T10:19:51.769601Z","iopub.execute_input":"2021-06-26T10:19:51.770062Z","iopub.status.idle":"2021-06-26T10:19:51.819701Z","shell.execute_reply.started":"2021-06-26T10:19:51.770029Z","shell.execute_reply":"2021-06-26T10:19:51.818657Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Image Data Gen**","metadata":{}},{"cell_type":"code","source":"datagen = Imgen(preprocessing_function=keras.applications.xception.preprocess_input,\n                 rotation_range=4,\n                  shear_range=0.2,\n                  zoom_range=0.2,\n                  horizontal_flip=True,\n                  validation_split=0.2\n                 )","metadata":{"execution":{"iopub.status.busy":"2021-06-21T04:51:15.253864Z","iopub.execute_input":"2021-06-21T04:51:15.254186Z","iopub.status.idle":"2021-06-21T04:51:15.259244Z","shell.execute_reply.started":"2021-06-21T04:51:15.254155Z","shell.execute_reply":"2021-06-21T04:51:15.258029Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Data Generation**","metadata":{}},{"cell_type":"code","source":"train_ds = datagen.flow_from_dataframe(\n    train_df,\n    directory = '../input/resized-plant2021/img_sz_256', \n    x_col = 'image',\n    y_col = 'labels',\n    subset=\"training\",\n    color_mode=\"rgb\",\n    target_size = (224,224),\n    class_mode=\"categorical\",\n    batch_size=32,\n    shuffle=True,\n    seed=123,\n)\n\n\nval_ds = datagen.flow_from_dataframe(\n    train_df,\n    directory = '../input/resized-plant2021/img_sz_256',\n    x_col = 'image',\n    y_col = 'labels',\n    subset=\"validation\",\n    color_mode=\"rgb\",\n    target_size = (224,224),\n    class_mode=\"categorical\",\n    batch_size=32,\n    shuffle=True,\n    seed=123,\n)","metadata":{"execution":{"iopub.status.busy":"2021-06-21T04:51:18.047222Z","iopub.execute_input":"2021-06-21T04:51:18.04769Z","iopub.status.idle":"2021-06-21T04:51:46.778878Z","shell.execute_reply.started":"2021-06-21T04:51:18.047651Z","shell.execute_reply":"2021-06-21T04:51:46.778022Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"a = train_ds.class_indices\nclass_names = list(a.keys())\nclass_names","metadata":{"execution":{"iopub.status.busy":"2021-06-20T03:22:48.825872Z","iopub.execute_input":"2021-06-20T03:22:48.826223Z","iopub.status.idle":"2021-06-20T03:22:48.831667Z","shell.execute_reply.started":"2021-06-20T03:22:48.826187Z","shell.execute_reply":"2021-06-20T03:22:48.830868Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x,y = next(train_ds)\nx.shape","metadata":{"execution":{"iopub.status.busy":"2021-06-20T03:34:37.093718Z","iopub.execute_input":"2021-06-20T03:34:37.094037Z","iopub.status.idle":"2021-06-20T03:34:37.589932Z","shell.execute_reply.started":"2021-06-20T03:34:37.094007Z","shell.execute_reply":"2021-06-20T03:34:37.589177Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Visualize some images**","metadata":{}},{"cell_type":"code","source":"#plot function\ndef plot_images(img,labels):\n    plt.figure(figsize=(12,10))\n    for i in range(16):\n        plt.subplot(4, 4,i+1)\n        plt.imshow(img[i])\n        plt.title(class_names[np.argmax(labels[i])])\n        plt.axis('off')","metadata":{"execution":{"iopub.status.busy":"2021-06-20T03:34:39.976616Z","iopub.execute_input":"2021-06-20T03:34:39.977025Z","iopub.status.idle":"2021-06-20T03:34:39.983616Z","shell.execute_reply.started":"2021-06-20T03:34:39.976979Z","shell.execute_reply":"2021-06-20T03:34:39.98248Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_images(x,y)","metadata":{"execution":{"iopub.status.busy":"2021-06-20T03:34:42.753971Z","iopub.execute_input":"2021-06-20T03:34:42.75433Z","iopub.status.idle":"2021-06-20T03:34:43.997019Z","shell.execute_reply.started":"2021-06-20T03:34:42.754299Z","shell.execute_reply":"2021-06-20T03:34:43.996023Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## **MODEL**","metadata":{}},{"cell_type":"code","source":"model=Sequential()\n\nmodel.add(Conv2D(32, (3, 3), padding=\"same\", activation='relu', input_shape=(224, 224,3)))\nmodel.add(BatchNormalization(axis=3))\nmodel.add(MaxPooling2D(pool_size=(3, 3)))\n#model.add(Dropout(0.25))\n        \nmodel.add(Conv2D(64, (3, 3), padding=\"same\", activation='relu'))\nmodel.add(BatchNormalization(axis=3))\nmodel.add(Conv2D(64, (3, 3), padding=\"same\", activation='relu'))\nmodel.add(BatchNormalization(axis=3))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n#model.add(Dropout(0.25))\n\nmodel.add(Conv2D(128, (3, 3), padding=\"same\", activation='relu'))\nmodel.add(BatchNormalization(axis=3))\nmodel.add(Conv2D(128, (3, 3), padding=\"same\", activation='relu'))\nmodel.add(BatchNormalization(axis=3))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\n#model.add(Dropout(0.25))\n\nmodel.add(Flatten())\nmodel.add(Dense(128,activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(Dropout(0.25))\nmodel.add(Dense(64,activation='relu'))\nmodel.add(Dropout(0.50))\nmodel.add(Dense(6,activation='softmax'))\n\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2021-06-20T05:02:17.474479Z","iopub.execute_input":"2021-06-20T05:02:17.474817Z","iopub.status.idle":"2021-06-20T05:02:17.626576Z","shell.execute_reply.started":"2021-06-20T05:02:17.474787Z","shell.execute_reply":"2021-06-20T05:02:17.625155Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Sequential()\nmodel.add(keras.applications.ResNet152V2(\n    include_top=False,\n    weights=\"imagenet\",\n    input_shape=(224,224,3),\n))\nmodel.add(BatchNormalization())\nmodel.add(Flatten())\nmodel.add(Dropout(0.5))\nmodel.add(Dense(6,activation='softmax'))\nmodel.layers[0].trainable = False\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2021-06-21T04:51:46.780313Z","iopub.execute_input":"2021-06-21T04:51:46.780674Z","iopub.status.idle":"2021-06-21T04:51:58.108875Z","shell.execute_reply.started":"2021-06-21T04:51:46.780637Z","shell.execute_reply":"2021-06-21T04:51:58.106354Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"keras.utils.plot_model(model,\n                      show_shapes=True,\n                      show_dtype=True,\n                      show_layer_names=True)","metadata":{"execution":{"iopub.status.busy":"2021-06-21T04:52:08.879873Z","iopub.execute_input":"2021-06-21T04:52:08.880194Z","iopub.status.idle":"2021-06-21T04:52:09.305921Z","shell.execute_reply.started":"2021-06-21T04:52:08.880165Z","shell.execute_reply":"2021-06-21T04:52:09.304949Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer=keras.optimizers.Adam(),loss='categorical_crossentropy',metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2021-06-21T04:51:58.110591Z","iopub.execute_input":"2021-06-21T04:51:58.110947Z","iopub.status.idle":"2021-06-21T04:51:58.135491Z","shell.execute_reply.started":"2021-06-21T04:51:58.110907Z","shell.execute_reply":"2021-06-21T04:51:58.134695Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"my_calls = [keras.callbacks.EarlyStopping(monitor='val_accuracy',patience=2),\n            keras.callbacks.ModelCheckpoint(\"Model_xcp.h5\",verbose=1,save_best_only=True)]","metadata":{"execution":{"iopub.status.busy":"2021-06-21T05:34:21.514549Z","iopub.execute_input":"2021-06-21T05:34:21.514884Z","iopub.status.idle":"2021-06-21T05:34:21.519449Z","shell.execute_reply.started":"2021-06-21T05:34:21.514854Z","shell.execute_reply":"2021-06-21T05:34:21.518298Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Train**","metadata":{}},{"cell_type":"code","source":"hist = model.fit(train_ds,epochs=25,validation_data=val_ds,callbacks=my_calls)","metadata":{"execution":{"iopub.status.busy":"2021-06-21T05:34:24.756839Z","iopub.execute_input":"2021-06-21T05:34:24.757155Z","iopub.status.idle":"2021-06-21T05:50:35.276668Z","shell.execute_reply.started":"2021-06-21T05:34:24.757125Z","shell.execute_reply":"2021-06-21T05:50:35.275887Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(15,6))\n\nplt.subplot(1,2,1)\nplt.plot(hist.epoch,hist.history['accuracy'],label = 'Training')\nplt.plot(hist.epoch,hist.history['val_accuracy'],label = 'validation')\n\nplt.title(\"Accuracy\")\nplt.legend()\n\nplt.subplot(1,2,2)\nplt.plot(hist.epoch,hist.history['loss'],label = 'Training')\nplt.plot(hist.epoch,hist.history['val_loss'],label = 'validation')\n\nplt.title(\"Loss\")\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-06-21T05:50:44.782696Z","iopub.execute_input":"2021-06-21T05:50:44.783013Z","iopub.status.idle":"2021-06-21T05:50:45.180417Z","shell.execute_reply.started":"2021-06-21T05:50:44.782982Z","shell.execute_reply":"2021-06-21T05:50:45.179424Z"},"trusted":true},"execution_count":null,"outputs":[]}]}