{"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 numpy as np\nimport os\nimport PIL\nfrom PIL import Image\nfrom PIL import ImageOps\nimport tensorflow as tf\nfrom keras import layers\nfrom keras.layers import Conv2D, Dense, Dropout, Flatten, Rescaling, MaxPooling2D\nfrom keras.models import Sequential, load_model\nimport matplotlib.pyplot as plt\nimport tensorflow_hub as hub\nprint(tf.__version__)\n","metadata":{"execution":{"iopub.status.busy":"2022-12-11T15:28:02.637267Z","iopub.execute_input":"2022-12-11T15:28:02.638023Z","iopub.status.idle":"2022-12-11T15:28:02.644490Z","shell.execute_reply.started":"2022-12-11T15:28:02.637981Z","shell.execute_reply":"2022-12-11T15:28:02.643674Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pre_train_df = pd.read_csv(\"../input/sorghum-id-fgvc-9/train_cultivar_mapping.csv\")\npre_train_df['cultivar'] = pre_train_df['cultivar'].astype(str)\nsample_submission = pd.read_csv(\"../input/sorghum-id-fgvc-9/sample_submission.csv\")","metadata":{"execution":{"iopub.status.busy":"2022-12-11T15:28:04.871181Z","iopub.execute_input":"2022-12-11T15:28:04.871881Z","iopub.status.idle":"2022-12-11T15:28:04.910193Z","shell.execute_reply.started":"2022-12-11T15:28:04.871844Z","shell.execute_reply":"2022-12-11T15:28:04.909443Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pre_train_df.info()\n\npre_train_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-12-11T15:28:06.509253Z","iopub.execute_input":"2022-12-11T15:28:06.509975Z","iopub.status.idle":"2022-12-11T15:28:06.530272Z","shell.execute_reply.started":"2022-12-11T15:28:06.509939Z","shell.execute_reply":"2022-12-11T15:28:06.529576Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Cultivar 'coding'","metadata":{}},{"cell_type":"code","source":"cultivars = list(pre_train_df['cultivar'].unique())\ncultivars.pop(-1)\ncultivars.sort()\ncultivars_code = range(100)\ncultivars_mapping = pd.DataFrame(\n    {'cultivar': cultivars,\n     'code': cultivars_code\n    })\ncultivars_mapping","metadata":{"execution":{"iopub.status.busy":"2022-12-11T15:28:11.901967Z","iopub.execute_input":"2022-12-11T15:28:11.902247Z","iopub.status.idle":"2022-12-11T15:28:11.917252Z","shell.execute_reply.started":"2022-12-11T15:28:11.902214Z","shell.execute_reply":"2022-12-11T15:28:11.916529Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df=pre_train_df.replace(cultivars_mapping\\\n                              .set_index('cultivar')\\\n                              ['code'])\ntrain_df","metadata":{"execution":{"iopub.status.busy":"2022-12-11T15:28:14.709188Z","iopub.execute_input":"2022-12-11T15:28:14.709478Z","iopub.status.idle":"2022-12-11T15:28:14.844781Z","shell.execute_reply.started":"2022-12-11T15:28:14.709446Z","shell.execute_reply":"2022-12-11T15:28:14.843900Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.to_csv('train_df.csv')","metadata":{"execution":{"iopub.status.busy":"2022-12-11T15:28:17.470692Z","iopub.execute_input":"2022-12-11T15:28:17.470962Z","iopub.status.idle":"2022-12-11T15:28:17.511815Z","shell.execute_reply.started":"2022-12-11T15:28:17.470931Z","shell.execute_reply":"2022-12-11T15:28:17.511088Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#parasite cleaning\ntrain_df=train_df[~train_df.image.str.contains(\".DS_Store\")]","metadata":{"execution":{"iopub.status.busy":"2022-12-11T15:28:20.609134Z","iopub.execute_input":"2022-12-11T15:28:20.609564Z","iopub.status.idle":"2022-12-11T15:28:20.651086Z","shell.execute_reply.started":"2022-12-11T15:28:20.609510Z","shell.execute_reply":"2022-12-11T15:28:20.650355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(dtype = 'uint8',validation_split=0.2)\ntrain_ds = train_datagen.flow_from_dataframe(train_df,\n                                            directory = '/kaggle/input/sorghum-id-fgvc-9/train_images',\n                                            x_col = 'image', y_col = 'cultivar',\n                                            target_size=(64, 64),#were 224\n                                            batch_size=2,#were 16\n                                            class_mode = \"raw\",\n                                             subset=\"training\"\n                                            )\nval_ds = train_datagen.flow_from_dataframe(train_df,\n                                            directory = '/kaggle/input/sorghum-id-fgvc-9/train_images',\n                                            x_col = 'image', y_col = 'cultivar',\n                                            target_size=(64, 64),#were 224\n                                            batch_size=2,#were 16\n                                            class_mode = \"raw\",\n                                           subset=\"validation\"\n                                            )","metadata":{"execution":{"iopub.status.busy":"2022-12-11T15:28:26.977279Z","iopub.execute_input":"2022-12-11T15:28:26.978091Z","iopub.status.idle":"2022-12-11T15:29:56.196965Z","shell.execute_reply.started":"2022-12-11T15:28:26.978031Z","shell.execute_reply":"2022-12-11T15:29:56.196066Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images_4_view, labels_4_view = train_ds[0][0],train_ds[0][1]\nplt.figure(figsize=(10, 10))\nfor i in range(9):\n    ax = plt.subplot(3, 3, i + 1)\n    plt.imshow(np.array(images_4_view[i], dtype = 'uint8'))\n    plt.title(labels_4_view[i])\n    plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2022-12-11T15:29:59.891725Z","iopub.execute_input":"2022-12-11T15:29:59.891999Z","iopub.status.idle":"2022-12-11T15:30:00.404591Z","shell.execute_reply.started":"2022-12-11T15:29:59.891969Z","shell.execute_reply":"2022-12-11T15:30:00.403586Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Data augmentation","metadata":{}},{"cell_type":"code","source":"data_augmentation = Sequential(\n  [\n    layers.RandomFlip(\"horizontal\",\n                      input_shape=(64,\n                                  64,\n                                  3)),\n    layers.RandomRotation(0.1),\n    layers.RandomZoom(0.1),\n  ]\n)\n","metadata":{"execution":{"iopub.status.busy":"2022-12-11T15:32:50.768970Z","iopub.execute_input":"2022-12-11T15:32:50.769244Z","iopub.status.idle":"2022-12-11T15:32:50.899067Z","shell.execute_reply.started":"2022-12-11T15:32:50.769212Z","shell.execute_reply":"2022-12-11T15:32:50.898347Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images_4_view, labels_4_view = train_ds[0][0],train_ds[0][1]\nfor i in range(10):\n    augmented_image = data_augmentation(images_4_view[i])\n    plt.imshow(np.array(augmented_image, dtype = 'uint8'))","metadata":{"execution":{"iopub.status.busy":"2022-12-11T15:39:07.105429Z","iopub.execute_input":"2022-12-11T15:39:07.106132Z","iopub.status.idle":"2022-12-11T15:39:07.508798Z","shell.execute_reply.started":"2022-12-11T15:39:07.106096Z","shell.execute_reply":"2022-12-11T15:39:07.507198Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_ds[0][1]","metadata":{"execution":{"iopub.status.busy":"2022-12-11T15:41:41.769736Z","iopub.execute_input":"2022-12-11T15:41:41.770020Z","iopub.status.idle":"2022-12-11T15:41:41.846684Z","shell.execute_reply.started":"2022-12-11T15:41:41.769987Z","shell.execute_reply":"2022-12-11T15:41:41.846046Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## model 1 (good train, bad validation)","metadata":{}},{"cell_type":"code","source":"model = Sequential([\n    data_augmentation,\n  Rescaling(1./255, input_shape=(64,64, 3)),\n  Conv2D(16, 3, padding='same', activation='relu'),\n  MaxPooling2D(),\n  Conv2D(32, 3, padding='same', activation='relu'),\n  MaxPooling2D(),\n  Conv2D(64, 3, padding='same', activation='relu'),\n  MaxPooling2D(),\n  Flatten(),\n  Dense(128, activation='relu'),\n  Dense(100)\n])\n\nmodel.compile(optimizer='adam',\n              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n              metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2022-12-11T15:03:59.040676Z","iopub.execute_input":"2022-12-11T15:03:59.040996Z","iopub.status.idle":"2022-12-11T15:03:59.224532Z","shell.execute_reply.started":"2022-12-11T15:03:59.040964Z","shell.execute_reply":"2022-12-11T15:03:59.223743Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with tf.device('/GPU:0'):\n    epochs=10\n    history = model.fit(\n      train_ds,\n      validation_data=val_ds,\n      epochs=epochs\n    )","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train visualization","metadata":{}},{"cell_type":"code","source":"acc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\n\nloss = history.history['loss']\nval_loss = history.history['val_loss']\n\nepochs_range = range(epochs)\n\nplt.figure(figsize=(8, 8))\nplt.subplot(1, 2, 1)\nplt.plot(epochs_range, acc, label='Training Accuracy')\nplt.plot(epochs_range, val_acc, label='Validation Accuracy')\nplt.legend(loc='lower right')\nplt.title('Training and Validation Accuracy')\n\nplt.subplot(1, 2, 2)\nplt.plot(epochs_range, loss, label='Training Loss')\nplt.plot(epochs_range, val_loss, label='Validation Loss')\nplt.legend(loc='upper right')\nplt.title('Training and Validation Loss')\n#plt.show()\nplt.savefig('train_history.png')","metadata":{"execution":{"iopub.status.busy":"2022-12-11T14:39:29.504313Z","iopub.status.idle":"2022-12-11T14:39:29.511064Z","shell.execute_reply.started":"2022-12-11T14:39:29.510857Z","shell.execute_reply":"2022-12-11T14:39:29.510888Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prediction","metadata":{}},{"cell_type":"code","source":"probability_model = tf.keras.Sequential([model, \n                                         tf.keras.layers.Softmax()])","metadata":{"execution":{"iopub.status.busy":"2022-03-30T23:31:41.574564Z","iopub.execute_input":"2022-03-30T23:31:41.575105Z","iopub.status.idle":"2022-03-30T23:31:41.847306Z","shell.execute_reply.started":"2022-03-30T23:31:41.575054Z","shell.execute_reply":"2022-03-30T23:31:41.846426Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"arr = os.listdir('../input/sorghum-id-fgvc-9/test')\nfilename_list = arr\nprediction_list=[]\nfrom tqdm import tqdm\nfor i in tqdm(arr):\n    img = tf.keras.utils.load_img(\n    \"/kaggle/input/sorghum-id-fgvc-9/test/\"+i, target_size=(64, 64)\n    )\n    img_array = tf.keras.utils.img_to_array(img)\n    img_array = tf.expand_dims(img_array, 0) # dimension extension, for predict method\n    predictions = probability_model.predict(img_array)\n    prediction_list.append(np.argmax(predictions[0]))","metadata":{"execution":{"iopub.status.busy":"2022-03-30T23:40:20.42983Z","iopub.execute_input":"2022-03-30T23:40:20.430817Z","iopub.status.idle":"2022-03-31T00:57:35.792505Z","shell.execute_reply.started":"2022-03-30T23:40:20.43077Z","shell.execute_reply":"2022-03-31T00:57:35.791431Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pre_submission_df = pd.DataFrame(\n    {'filename': filename_list,\n     'cultivar': prediction_list\n     })\nsubmission_df=pre_submission_df.replace(cultivars_mapping.set_index('code')['cultivar'])\nsubmission_df.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-03-31T00:59:47.384883Z","iopub.execute_input":"2022-03-31T00:59:47.385242Z","iopub.status.idle":"2022-03-31T00:59:47.524389Z","shell.execute_reply.started":"2022-03-31T00:59:47.385206Z","shell.execute_reply":"2022-03-31T00:59:47.523524Z"},"trusted":true},"execution_count":null,"outputs":[]}]}