{"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 os\nimport cv2\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom keras.optimizers import SGD\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom keras.applications.inception_v3 import InceptionV3","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#multi-label binarization\n#splitting multiple labels and getting a list\n\ndf = pd.read_csv(\"../input/plant-pathology-2021-fgvc8/train.csv\")\ndf[\"labels\"]=df[\"labels\"].apply(lambda x:x.split(\" \")) \n\ntrain_path='../input/plant-pathology-2021-fgvc8/train_images'","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_size=(128,128)\n\ndatagen = ImageDataGenerator(\n    rescale=1./255,\n    zoom_range=0.2,\n    horizontal_flip=True\n)\n\ntrain_generator=datagen.flow_from_dataframe(\ndataframe=df[:16000],\ndirectory=train_path,\nx_col=\"image\",\ny_col=\"labels\",\nbatch_size=64,\nseed=42,\nshuffle=True,\nclass_mode=\"categorical\",\ntarget_size=img_size)\n\nval_generator=datagen.flow_from_dataframe(\ndataframe=df[16000:],\ndirectory=train_path,\nx_col=\"image\",\ny_col=\"labels\",\nbatch_size=64,\nseed=42,\nshuffle=True,\nclass_mode=\"categorical\",\ntarget_size=img_size)\n\nprint(train_generator.class_indices)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_pretrained = InceptionV3(weights='../input/inception/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5', \n                      include_top=False, \n                      input_shape=(128,128,3))\n\nmodel=keras.models.Sequential()\nmodel.add(model_pretrained)\nmodel.add(keras.layers.Flatten())\nmodel.add(keras.layers.Dense(300, activation=\"relu\"))\nmodel.add(keras.layers.Dropout(0.2))\nmodel.add(keras.layers.Dense(100,activation='relu'))\nmodel.add(keras.layers.Dropout(0.2))\nmodel.add(keras.layers.Dense(6,activation=\"sigmoid\"))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Time based learning rate scheduling\nepoch=8  # 8 epochs only because cpu training time should be<9 hours.\nlearning_rate=0.01\ndecay_rate=learning_rate/epoch\nmomentum=0.8\nsgd=SGD(lr=learning_rate,momentum=momentum,decay=decay_rate)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Early stopping callback\ncallback = keras.callbacks.EarlyStopping(monitor='val_loss', patience=3)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(loss='binary_crossentropy',\n              optimizer='sgd',\n              metrics=[tf.keras.metrics.Precision()])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_history=model.fit(train_generator,epochs=epoch,validation_data=val_generator,shuffle=True, callbacks=[callback])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plotting the varoius metrics\npd.DataFrame(model_history.history).plot(figsize=(8,5))\nplt.grid(True)\nplt.gca().set_ylim(0,1)\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_path='../input/plant-pathology-2021-fgvc8/sample_submission.csv'\nsample_sub=pd.read_csv(sub_path)\nsample_sub","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission=sample_sub[['image']].copy()\nsubmission","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_path='../input/plant-pathology-2021-fgvc8/test_images'\n\ntest_generator=datagen.flow_from_dataframe(\ndataframe=submission,\ndirectory=test_path,\nx_col=\"image\",\ny_col=None,\nbatch_size=1,\nseed=42,\nshuffle=True,\nclass_mode=None,\ntarget_size=img_size)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prediction = model.predict(test_generator)\nprint(prediction)\nprediction = prediction.tolist()\n\nindices = []\nfor pred in prediction:\n    temp = []\n    for category in pred:\n        if category>=0.35:\n            temp.append(pred.index(category))\n    if temp!=[]:\n        indices.append(temp)\n    else:\n        temp.append(np.argmax(pred))\n        indices.append(temp)\n    \nprint(indices)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"category=train_generator.class_indices\nkey_list = list(category.keys())\nresult=[]\n\nfor i in indices:\n    temp=[]\n    for j in i:\n        temp.append(str(key_list[j]))\n    result.append(' '.join(temp))\n\nprint(result)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission['labels']=result\nsubmission","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv(index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save_weights('my_model_weights.h5')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}