{"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":"#Data management\nimport numpy as np\nimport pandas as pd\nfrom collections import Counter\nfrom sklearn.model_selection import train_test_split\nimport cv2\nimport re\nimport string\nimport os\n\n#Model management\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers,models\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping\nimport torch\nimport joblib\n\n#data visualize\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n#image\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-01-12T12:25:14.806242Z","iopub.execute_input":"2022-01-12T12:25:14.806763Z","iopub.status.idle":"2022-01-12T12:25:23.655049Z","shell.execute_reply.started":"2022-01-12T12:25:14.806639Z","shell.execute_reply":"2022-01-12T12:25:23.653951Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prepare data","metadata":{}},{"cell_type":"markdown","source":"* **Input** : Path , setting etc.\n\n* **output**: train_data , test_data , train_label","metadata":{}},{"cell_type":"code","source":"class setting:\n    amount_data = 10000\n    train_folder = \"../input/resized-plant2021/img_sz_256\"\n    test_folder = \"../input/resized-plant2021/img_sz_256\"\n    x_col = \"image\"\n    y_col = \"labels\"\n    target_size = (128,128)\n    batch_size = 32\n    seed = 57","metadata":{"execution":{"iopub.status.busy":"2022-01-12T12:25:23.657672Z","iopub.execute_input":"2022-01-12T12:25:23.657944Z","iopub.status.idle":"2022-01-12T12:25:23.665656Z","shell.execute_reply.started":"2022-01-12T12:25:23.657910Z","shell.execute_reply":"2022-01-12T12:25:23.664834Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv(\"../input/plant-pathology-2021-fgvc8/train.csv\")[:setting.amount_data]\n\ntrain_datagen = ImageDataGenerator(rescale = 1/255.,\n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    horizontal_flip=True,\n    validation_split = 0.10,\n    zoom_range = 0.2,\n    shear_range = 0.2,\n    vertical_flip = False)\n\ntrain_ds = train_datagen.flow_from_dataframe(\n    train_df,\n    directory = setting.train_folder,\n    x_col = setting.x_col,\n    y_col = setting.y_col,\n    target_size = setting.target_size,\n    class_mode='categorical',\n    batch_size = setting.batch_size,\n    subset = \"training\",\n    shuffle = True,\n    seed = setting.seed,\n    validate_filenames = False\n)\n\nvalidate_ds = train_datagen.flow_from_dataframe(\n    train_df,\n    directory = setting.train_folder,\n    x_col = setting.x_col,\n    y_col = setting.y_col,\n    target_size = setting.target_size,\n    class_mode='categorical',\n    batch_size = setting.batch_size,\n    subset = \"validation\",\n    shuffle = True,\n    seed = setting.seed,\n    validate_filenames = False\n)","metadata":{"execution":{"iopub.status.busy":"2022-01-12T12:25:23.667927Z","iopub.execute_input":"2022-01-12T12:25:23.668679Z","iopub.status.idle":"2022-01-12T12:25:23.795119Z","shell.execute_reply.started":"2022-01-12T12:25:23.668633Z","shell.execute_reply":"2022-01-12T12:25:23.794035Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"test","metadata":{}},{"cell_type":"code","source":"test_df = pd.read_csv(\"../input/plant-pathology-2021-fgvc8/train.csv\")[setting.amount_data:]\ntest_df.index = range(len(test_df))\n\ntest_datagen = ImageDataGenerator(rescale = 1/255.)\ntest_ds = test_datagen.flow_from_dataframe(\n    test_df,\n    directory = setting.test_folder,\n    x_col = \"image\",\n    y_col = \"labels\",\n    target_size = setting.target_size,\n    class_mode= 'categorical',\n)","metadata":{"execution":{"iopub.status.busy":"2022-01-12T12:25:23.797630Z","iopub.execute_input":"2022-01-12T12:25:23.798558Z","iopub.status.idle":"2022-01-12T12:25:31.914589Z","shell.execute_reply.started":"2022-01-12T12:25:23.798511Z","shell.execute_reply":"2022-01-12T12:25:31.913562Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Get Models","metadata":{}},{"cell_type":"markdown","source":"* Input : -\n\n* output: model\n","metadata":{}},{"cell_type":"code","source":"def get_VGG():\n    model = keras.Sequential()\n    model.add(layers.Conv2D(64,(3,3), padding=\"same\", activation=\"relu\", input_shape=(*setting.target_size,3)))\n    model.add(layers.Conv2D(64,(3,3), padding=\"same\", activation=\"relu\"))\n    model.add(layers.MaxPool2D())\n    model.add(layers.Conv2D(128, (3,3), padding=\"same\", activation=\"relu\"))\n    model.add(layers.Conv2D(128, (3,3), padding=\"same\", activation=\"relu\"))\n    model.add(layers.MaxPool2D())\n    model.add(layers.Conv2D(256, (3,3), padding=\"same\", activation=\"relu\"))\n    model.add(layers.Conv2D(256, (3,3), padding=\"same\", activation=\"relu\"))\n    model.add(layers.Conv2D(256, (3,3), padding=\"same\", activation=\"relu\"))\n    model.add(layers.MaxPool2D())\n    model.add(layers.Conv2D(512, (3,3), padding=\"same\", activation=\"relu\"))\n    model.add(layers.Conv2D(512, (3,3), padding=\"same\", activation=\"relu\"))\n    model.add(layers.Conv2D(512, (3,3), padding=\"same\", activation=\"relu\"))\n    model.add(layers.MaxPool2D())\n    model.add(layers.Conv2D(512, (3,3), padding=\"same\", activation=\"relu\"))\n    model.add(layers.Conv2D(512, (3,3), padding=\"same\", activation=\"relu\"))\n    model.add(layers.Conv2D(512, (3,3), padding=\"same\", activation=\"relu\"))\n    model.add(layers.MaxPool2D())\n    ######\n    model.add(layers.Flatten())\n    model.add(layers.Dense(4096,activation=\"relu\"))\n    model.add(layers.Dropout(0.2))\n    model.add(layers.Dense(2048,activation=\"relu\"))\n    model.add(layers.Dropout(0.2))\n    model.add(layers.Dense(12, activation=\"softmax\"))\n    model.compile(optimizer=keras.optimizers.Adam(learning_rate=0.0001), \n                  loss='categorical_crossentropy',\n                  metrics=[\"accuracy\"])\n    return model\n\ndef get_CNN():\n    model=keras.Sequential()\n    model.add(layers.Conv2D(64,(3,3),activation='relu',padding='same',input_shape=(*setting.target_size,3)))\n    model.add(layers.MaxPooling2D(2,2))\n    model.add(layers.Conv2D(64,(3,3),activation='relu',padding='same'))\n    model.add(layers.MaxPooling2D(2,2))\n    model.add(layers.Conv2D(64,(3,3),activation='relu',padding='same'))\n    model.add(layers.MaxPooling2D(2,2))\n    model.add(layers.Conv2D(128,(3,3),activation='relu',padding='same'))\n    model.add(layers.MaxPooling2D(2,2))\n    model.add(layers.Flatten())\n    model.add(layers.Dense(12,activation='softmax'))\n\n    # Compile the Model\n    model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),\n        loss='categorical_crossentropy',\n        metrics=['accuracy'])\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-01-12T12:25:31.916334Z","iopub.execute_input":"2022-01-12T12:25:31.916864Z","iopub.status.idle":"2022-01-12T12:25:31.943191Z","shell.execute_reply.started":"2022-01-12T12:25:31.916817Z","shell.execute_reply":"2022-01-12T12:25:31.941944Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = get_VGG()","metadata":{"execution":{"iopub.status.busy":"2022-01-12T12:25:31.946717Z","iopub.execute_input":"2022-01-12T12:25:31.947494Z","iopub.status.idle":"2022-01-12T12:25:38.150938Z","shell.execute_reply.started":"2022-01-12T12:25:31.947446Z","shell.execute_reply":"2022-01-12T12:25:38.149883Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# FineTune model and submission","metadata":{}},{"cell_type":"markdown","source":"* **Input** : 1. train_x, 2. train_y , 3. test_x, 4. model , 5. relabels_dict\n\n* **output**: submission\n","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, CSVLogger\ndef fit_model(train_x,train_y,model):\n    ES = EarlyStopping(monitor='val_loss', \n                       patience=5, \n                       verbose=1,\n                       min_delta=0.001,\n                       restore_best_weights=True)\n    model.fit(train_x,train_y,\n              epochs=30,\n              validation_split=0.05,\n              callbacks = [ES])\n\ndef fit_generator_model(train_ds,validate_ds,model):\n\n    ES = EarlyStopping(monitor='val_loss', patience=10, verbose=1,min_delta=0.001,restore_best_weights=True)\n    callbacks=[ES]\n    \n    model.fit(train_ds,\n              epochs=30,\n              validation_data =validate_ds,\n              callbacks = callbacks)\n\n\n    \n    \ndef get_submission(test_x,submission_id,model):\n    Ztest = model.predict(test_x).argmax(axis=1)\n    Ztest = pd.Series(Ztest,name=\"labels\")\n    ID = submission_id\n    submission = pd.concat([ID,Ztest],axis=1)\n    print(submission)\n    submission.to_csv(\"submission.csv\",index=False)\n    return submission","metadata":{"execution":{"iopub.status.busy":"2022-01-12T12:25:38.152494Z","iopub.execute_input":"2022-01-12T12:25:38.154618Z","iopub.status.idle":"2022-01-12T12:25:38.168834Z","shell.execute_reply.started":"2022-01-12T12:25:38.154584Z","shell.execute_reply":"2022-01-12T12:25:38.167749Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fit_generator_model(train_ds,validate_ds,model)","metadata":{"execution":{"iopub.status.busy":"2022-01-12T12:25:38.170454Z","iopub.execute_input":"2022-01-12T12:25:38.171355Z","iopub.status.idle":"2022-01-12T12:59:42.076386Z","shell.execute_reply.started":"2022-01-12T12:25:38.171300Z","shell.execute_reply":"2022-01-12T12:59:42.075329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.evaluate(test_ds)","metadata":{"execution":{"iopub.status.busy":"2022-01-12T12:59:42.078391Z","iopub.execute_input":"2022-01-12T12:59:42.078942Z","iopub.status.idle":"2022-01-12T13:01:04.268819Z","shell.execute_reply.started":"2022-01-12T12:59:42.078872Z","shell.execute_reply":"2022-01-12T13:01:04.267925Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = get_submission(test_ds,test_df[\"image\"],model)","metadata":{"execution":{"iopub.status.busy":"2022-01-12T13:01:04.272032Z","iopub.execute_input":"2022-01-12T13:01:04.272377Z","iopub.status.idle":"2022-01-12T13:01:19.953250Z","shell.execute_reply.started":"2022-01-12T13:01:04.272323Z","shell.execute_reply":"2022-01-12T13:01:19.952122Z"},"trusted":true},"execution_count":null,"outputs":[]}]}