{"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":"from keras.layers import Dense, Activation, Flatten, Dropout, BatchNormalization, Conv2D, MaxPooling2D, Conv2D, MaxPooling2D, GlobalAveragePooling2D\nfrom tensorflow.keras.applications.mobilenet_v2 import MobileNetV2 \nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.preprocessing import MultiLabelBinarizer\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.optimizers import SGD, Adam, RMSprop\nfrom tensorflow.keras.models import Model\nfrom IPython.display import clear_output\nfrom tensorflow.keras import optimizers\nfrom keras_preprocessing import image\nfrom keras.models import Sequential\nimport matplotlib.pyplot as plt  \nfrom tqdm.notebook import tqdm\nfrom pandas import read_csv\nfrom os import walk\nimport numpy as np\nimport pandas as pd\nimport cv2\n\npd.set_option('display.max_rows', None)\npd.set_option('display.max_columns', None)\npd.set_option('display.width', None)\npd.set_option('display.max_colwidth', -1)\n\nclear_output()","metadata":{"id":"I7zmA8uTT6Gn","outputId":"34fc8a7f-559c-44e0-f23c-0606fb6069a1","execution":{"iopub.status.busy":"2021-11-17T13:32:35.685759Z","iopub.execute_input":"2021-11-17T13:32:35.686219Z","iopub.status.idle":"2021-11-17T13:32:40.604085Z","shell.execute_reply.started":"2021-11-17T13:32:35.686174Z","shell.execute_reply":"2021-11-17T13:32:40.603313Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data=pd.read_csv('/kaggle/input/imet-2020-fgvc7/train.csv')\nlabels_data=pd.read_csv('/kaggle/input/imet-2020-fgvc7/labels.csv')\nsample_submission=pd.read_csv('/kaggle/input/imet-2020-fgvc7/sample_submission.csv')","metadata":{"id":"Tvc2tFLaUeJD","execution":{"iopub.status.busy":"2021-11-17T13:32:40.606484Z","iopub.execute_input":"2021-11-17T13:32:40.606889Z","iopub.status.idle":"2021-11-17T13:32:40.876618Z","shell.execute_reply.started":"2021-11-17T13:32:40.606849Z","shell.execute_reply":"2021-11-17T13:32:40.875831Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data['id'] += '.png'\nsample_submission['id'] += '.png'","metadata":{"id":"VATZsnbUUyhm","execution":{"iopub.status.busy":"2021-11-17T13:32:40.878894Z","iopub.execute_input":"2021-11-17T13:32:40.879551Z","iopub.status.idle":"2021-11-17T13:32:41.040645Z","shell.execute_reply.started":"2021-11-17T13:32:40.879515Z","shell.execute_reply":"2021-11-17T13:32:41.039907Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# !unzip /content/drive/MyDrive/ML/imet-2020-fgvc7.zip -d /content/drive/MyDrive/ML/Data/\n# clear_output()","metadata":{"id":"2Mt2SZ9jXgPN","outputId":"312a34c1-a122-4bff-d3e7-2ade651d033d","execution":{"iopub.status.busy":"2021-11-17T13:32:41.042676Z","iopub.execute_input":"2021-11-17T13:32:41.043231Z","iopub.status.idle":"2021-11-17T13:32:41.046492Z","shell.execute_reply.started":"2021-11-17T13:32:41.043192Z","shell.execute_reply":"2021-11-17T13:32:41.045672Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# !ls /content/drive/MyDrive/ML/Data/train | wc -l","metadata":{"id":"wkZeeFEAXAI7","execution":{"iopub.status.busy":"2021-11-17T13:32:41.049654Z","iopub.execute_input":"2021-11-17T13:32:41.050216Z","iopub.status.idle":"2021-11-17T13:32:41.056893Z","shell.execute_reply.started":"2021-11-17T13:32:41.050179Z","shell.execute_reply":"2021-11-17T13:32:41.055956Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data['attribute_ids'] = train_data['attribute_ids'].apply(lambda x: x.split())","metadata":{"id":"5rhF0M-YVSrl","execution":{"iopub.status.busy":"2021-11-17T13:32:41.060090Z","iopub.execute_input":"2021-11-17T13:32:41.060348Z","iopub.status.idle":"2021-11-17T13:32:41.302113Z","shell.execute_reply.started":"2021-11-17T13:32:41.060324Z","shell.execute_reply":"2021-11-17T13:32:41.301380Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datagen = ImageDataGenerator(rescale=1./255)","metadata":{"id":"JH5yOF25VWdp","execution":{"iopub.status.busy":"2021-11-17T13:32:41.303482Z","iopub.execute_input":"2021-11-17T13:32:41.303829Z","iopub.status.idle":"2021-11-17T13:32:41.309191Z","shell.execute_reply.started":"2021-11-17T13:32:41.303796Z","shell.execute_reply":"2021-11-17T13:32:41.308203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 64\nsize = 32 \ninput_shape = (size,size,3)","metadata":{"id":"rlW0dh28VjzY","execution":{"iopub.status.busy":"2021-11-17T13:32:41.310617Z","iopub.execute_input":"2021-11-17T13:32:41.311242Z","iopub.status.idle":"2021-11-17T13:32:41.319195Z","shell.execute_reply.started":"2021-11-17T13:32:41.311202Z","shell.execute_reply":"2021-11-17T13:32:41.318205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_ds=datagen.flow_from_dataframe(dataframe=train_data,\n                                          directory=\"/kaggle/input/imet-2020-fgvc7/train\",\n                                          x_col='id',\n                                          y_col='attribute_ids',\n                                          class_mode='categorical',\n                                          subset='training',\n                                          shuffle=True,\n                                          batch_size=batch_size,\n                                          target_size=(size,size)\n                                          )","metadata":{"id":"0VQBMdB9VnyM","execution":{"iopub.status.busy":"2021-11-17T13:32:41.320727Z","iopub.execute_input":"2021-11-17T13:32:41.321170Z","iopub.status.idle":"2021-11-17T13:36:59.237600Z","shell.execute_reply.started":"2021-11-17T13:32:41.321134Z","shell.execute_reply":"2021-11-17T13:36:59.236645Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"valid_ds=datagen.flow_from_dataframe(dataframe=train_data,\n                                          directory=\"/kaggle/input/imet-2020-fgvc7/train\",\n                                          x_col='id',\n                                          y_col='attribute_ids',\n                                          class_mode='categorical',\n                                          subset='validation',\n                                          shuffle=True, \n                                          batch_size=batch_size,\n                                          target_size=(size,size)\n                                          )","metadata":{"id":"Rqik8srOVtdX","execution":{"iopub.status.busy":"2021-11-17T13:36:59.239018Z","iopub.execute_input":"2021-11-17T13:36:59.239400Z","iopub.status.idle":"2021-11-17T13:39:38.450160Z","shell.execute_reply.started":"2021-11-17T13:36:59.239340Z","shell.execute_reply":"2021-11-17T13:39:38.448643Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_ds=datagen.flow_from_dataframe(dataframe=sample_submission,\n                                        directory=\"/kaggle/input/imet-2020-fgvc7/test\",\n                                        x_col='id',\n                                        batch_size=batch_size,\n                                        shuffle=False,\n                                        class_mode=None,\n                                        target_size=(size,size))","metadata":{"id":"L-jYPf2iVufi","execution":{"iopub.status.busy":"2021-11-17T13:39:38.451462Z","iopub.execute_input":"2021-11-17T13:39:38.451829Z","iopub.status.idle":"2021-11-17T13:40:21.327703Z","shell.execute_reply.started":"2021-11-17T13:39:38.451794Z","shell.execute_reply":"2021-11-17T13:40:21.326642Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for image_batch,labels_batch in train_ds:\n    print(image_batch.shape)\n    print(labels_batch.shape)\n    break","metadata":{"id":"BdqD0gO2VydW","execution":{"iopub.status.busy":"2021-11-17T13:40:21.329530Z","iopub.execute_input":"2021-11-17T13:40:21.329964Z","iopub.status.idle":"2021-11-17T13:40:22.184142Z","shell.execute_reply.started":"2021-11-17T13:40:21.329920Z","shell.execute_reply":"2021-11-17T13:40:22.183386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_2 = Sequential()\n\nmodel_2.add(Conv2D(16,3 ,padding='same',input_shape=input_shape,activation='relu'))\nmodel_2.add(MaxPooling2D())\nmodel_2.add(Conv2D(32,3 ,padding='same',activation='relu'))\nmodel_2.add(MaxPooling2D())\nmodel_2.add(Conv2D(64,3 ,padding='same',activation='relu'))\nmodel_2.add(MaxPooling2D())\nmodel_2.add(Dropout(0.2))\nmodel_2.add(Dense(512,activation='relu'))\nmodel_2.add(BatchNormalization())\nmodel_2.add(Dropout(0.2))\nmodel_2.add(Flatten())\nmodel_2.add(Dense(1024,activation='relu'))\nmodel_2.add(BatchNormalization())\nmodel_2.add(Dropout(0.2))\nmodel_2.add(Dense(3471,activation='sigmoid'))\n\n\nbase_learning_rate = 0.001\nadam = Adam(learning_rate=base_learning_rate)\n\nmodel_2.compile(optimizer=adam,loss='binary_crossentropy',metrics=['accuracy'])\n\nmodel_2.summary()","metadata":{"id":"CDkAOqW2I7nI","execution":{"iopub.status.busy":"2021-11-17T13:40:22.186439Z","iopub.execute_input":"2021-11-17T13:40:22.186965Z","iopub.status.idle":"2021-11-17T13:40:24.622542Z","shell.execute_reply.started":"2021-11-17T13:40:22.186924Z","shell.execute_reply":"2021-11-17T13:40:24.621825Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Old Training Model","metadata":{"id":"2IIkcWBj_eRe"}},{"cell_type":"code","source":"# epochs=10\n# history=model_2.fit(train_ds,\n#                   epochs = epochs,\n#                   steps_per_epoch = 100,\n#                   validation_data = valid_ds,\n#                   validation_steps = 100,\n#                   verbose = 1,\n#                   callbacks = None,\n#                   use_multiprocessing = True)","metadata":{"id":"X83jUQqsWAbR","outputId":"9eeb6b34-b0da-4b78-b2a9-5030bed68067","execution":{"iopub.status.busy":"2021-11-17T13:40:24.623920Z","iopub.execute_input":"2021-11-17T13:40:24.624247Z","iopub.status.idle":"2021-11-17T13:40:24.630759Z","shell.execute_reply.started":"2021-11-17T13:40:24.624211Z","shell.execute_reply":"2021-11-17T13:40:24.629750Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Latest","metadata":{"id":"PaK6fRKb_mMj"}},{"cell_type":"code","source":"epochs=5\nhistory=model_2.fit(train_ds,\n                  epochs = epochs,\n                  steps_per_epoch = 1000,\n                  validation_data = valid_ds,\n                  validation_steps = 100,\n                  verbose = 1,\n                  callbacks = None,\n                  use_multiprocessing = True)","metadata":{"id":"29_ZejjG_mUc","execution":{"iopub.status.busy":"2021-11-17T13:40:24.632133Z","iopub.execute_input":"2021-11-17T13:40:24.632547Z","iopub.status.idle":"2021-11-17T14:36:22.013845Z","shell.execute_reply.started":"2021-11-17T13:40:24.632510Z","shell.execute_reply":"2021-11-17T14:36:22.012739Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"accuracy = history.history['accuracy']\n# val_accuracy = history.history['val_accuracy']\n\nloss = history.history['loss']\n# val_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,accuracy,label = 'Training Accuracy')\n# plt.plot(epochs_range,val_accuracy,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')\n# plt.plot(epochs_range,val_loss,label = 'Validation Loss')\nplt.legend(loc = 'upper right')\nplt.title('Training and validation loss')","metadata":{"id":"_3M_XwsCYMiF","execution":{"iopub.status.busy":"2021-11-17T14:36:48.572521Z","iopub.execute_input":"2021-11-17T14:36:48.572879Z","iopub.status.idle":"2021-11-17T14:36:49.014326Z","shell.execute_reply.started":"2021-11-17T14:36:48.572850Z","shell.execute_reply":"2021-11-17T14:36:49.013456Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = model_2.predict(test_ds,verbose = 1)","metadata":{"id":"YfYs-twBGDgg","execution":{"iopub.status.busy":"2021-11-17T14:36:53.920648Z","iopub.execute_input":"2021-11-17T14:36:53.920978Z","iopub.status.idle":"2021-11-17T14:41:49.583586Z","shell.execute_reply.started":"2021-11-17T14:36:53.920948Z","shell.execute_reply":"2021-11-17T14:41:49.582789Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_boolean = (predictions > 0.2)\n\nresult = []\n\nlabels = train_ds.class_indices\n\nlabels = dict((x,y) for y,x in labels.items())\n\nfor i in pred_boolean:\n    list_labels = []\n    for j,k in enumerate(i):\n        if k:\n            list_labels.append(labels[j])\n    result.append( \" \".join(list_labels))\n\n    \nimagenames = test_ds.filenames\n\nsubmission = pd.DataFrame({\"id\":imagenames,\"attribute_ids\":result})\nsubmission.to_csv('submission.csv', index = False)\nsubmission.head()","metadata":{"id":"FaF6t750E-kg","execution":{"iopub.status.busy":"2021-11-17T14:41:49.586788Z","iopub.execute_input":"2021-11-17T14:41:49.587054Z","iopub.status.idle":"2021-11-17T14:42:02.681488Z","shell.execute_reply.started":"2021-11-17T14:41:49.587028Z","shell.execute_reply":"2021-11-17T14:42:02.680645Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.DataFrame({\"id\":imagenames,\"attribute_ids\":result})\nsubmission['id']=submission['id'].apply( lambda x: x.split('.')[0])\nsubmission.to_csv('submission.csv', index = False)\nsubmission.head()","metadata":{"execution":{"iopub.status.busy":"2021-11-17T14:49:14.549159Z","iopub.execute_input":"2021-11-17T14:49:14.549485Z","iopub.status.idle":"2021-11-17T14:49:14.663186Z","shell.execute_reply.started":"2021-11-17T14:49:14.549454Z","shell.execute_reply":"2021-11-17T14:49:14.662504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"ใช้ f1 score: from sklearn.metrics import f1_score | f1_score(y_true, y_pred, average='macro')\n 1. สร้าง list ที่เก็บคำตอบจริง ๆทั้งหมดของทุก data ไว้\n 2. สร้าง list ที่เก็บคำ predict label จากข้อมูลใน sample submission\n\n   2.1 ใช้ for ดึงชื่อรูปจากไฟล์ sample submission \n\n   2.2 นำชื่อรูปไปดึงรูปใน Dataset\n\n   2.3 นำข้อมูลรูปที่ได้ไป predict","metadata":{"id":"QvaX04StvcvX"}}]}