{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom keras.applications import ResNet50\nfrom keras.layers import GlobalAveragePooling2D, Dropout, Dense\nfrom keras.models import Model\nimport keras\nfrom sklearn.preprocessing import LabelBinarizer\nfrom sklearn.model_selection import train_test_split\nfrom math import ceil, floor\nimport cv2\nfrom tqdm import tqdm_notebook as tqdm\nfrom PIL import Image\nimport matplotlib.pyplot as plt\nfrom keras_efficientnet import EfficientNetB0","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"BASE_DIR = '/kaggle/input/bengaliai-cv19/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_resized_dataset(data, size=(64, 64)):\n    resized_data = []\n    for arr in tqdm(data):\n        resized_img = cv2.resize(arr.reshape(137,236), size, interpolation = cv2.INTER_AREA)\n        resized_data.append(resized_img.reshape(-1))\n    return np.array(resized_data)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_test_batch():\n    for i in range(4):\n        # load train.csv\n#         test_df = pd.read_csv(BASE_DIR + 'test.csv')\n        test_df = pd.read_parquet(BASE_DIR + f'test_image_data_{i}.parquet')\n\n#         test_df = pd.concat([pq_df_0, pq_df_1, pq_df_2, pq_df_3], ignore_index=True)\n        test_image_ids = test_df['image_id'].values        \n        test_df.drop(columns=['image_id'], inplace=True)\n        final_test_data = get_resized_dataset(test_df.values, size=(128, 128))\n\n        del test_df\n        \n        yield final_test_data, test_image_ids","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class DataTestGenerator(keras.utils.Sequence):\n\n    def __init__(self, data, batch_size=1, img_size=(128, 128, 1), *args, **kwargs):\n\n        self.data = data\n        self.list_IDs = np.arange(data.shape[0])\n        self.batch_size = batch_size\n        self.img_size = img_size\n        self.on_epoch_end()\n\n    def __len__(self):\n        return int(ceil(len(self.indices) / self.batch_size))\n\n    def __getitem__(self, index):\n        indices = self.indices[index*self.batch_size:(index+1)*self.batch_size]\n        list_IDs_temp = [self.list_IDs[k] for k in indices]\n        \n        return self.__data_generation(list_IDs_temp)\n\n        \n    def on_epoch_end(self):\n        self.indices = np.arange(len(self.list_IDs))\n\n    def __data_generation(self, list_IDs_temp):\n        X = np.empty((len(list_IDs_temp), *self.img_size))\n        for i, ID in enumerate(list_IDs_temp):\n                X[i,] = self.data[ID].reshape(*self.img_size)\n\n        \n        return X","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# base_model = ResNet50(weights= None, include_top=False, input_shape= (64, 64, 1))\n# base_model.trainable = False\n\n# x = GlobalAveragePooling2D()(base_model.output)\n# x = Dropout(0.25)(x)\n# x = Dense(1000, activation='relu')(x)\n# x = Dropout(0.25)(x)\n# x = Dense(256, activation='relu')(x)\n\n# vowel_diacritic_fc1 = Dense(11, activation='softmax', name='vowel_diacritic')(x)\n# grapheme_root_fc1 = Dense(168, activation='softmax', name='grapheme_root')(x)\n# consonant_diacritic_fc1 = Dense(7, activation='softmax', name='consonant_diacritic')(x)\n\n# model = Model(inputs = base_model.input, outputs = [vowel_diacritic_fc1, \\\n#                                                     grapheme_root_fc1, \\\n#                                                     consonant_diacritic_fc1])\n# model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=[\"accuracy\"])\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"base_model =  EfficientNetB0(weights =None, include_top = False, \\\n                                 pooling = 'avg', input_shape = (128, 128, 1))\nx = base_model.output\n# x = GlobalAveragePooling2D()(base_model.output)\nx = Dropout(0.25)(x)\nx = Dense(1000, activation='relu')(x)\nx = Dropout(0.25)(x)\nx = Dense(256, activation='relu')(x)\n\nvowel_diacritic_fc1 = Dense(11, activation='softmax', name='vowel_diacritic')(x)\ngrapheme_root_fc1 = Dense(168, activation='softmax', name='grapheme_root')(x)\nconsonant_diacritic_fc1 = Dense(7, activation='softmax', name='consonant_diacritic')(x)\n\nmodel = Model(inputs = base_model.input, outputs = [vowel_diacritic_fc1, \\\n                                                    grapheme_root_fc1, \\\n                                                    consonant_diacritic_fc1])\nmodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=[\"accuracy\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.load_weights('/kaggle/input/bairesnet50/model_effnet_b0.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"preds = []\nimage_ids = []\nfor sample, test_image_ids in get_test_batch():    \n    test_gen = DataTestGenerator(sample/255, batch_size=64)\n    print(test_gen.__len__())\n    # model.load_weights(filepath)\n    vowel_diacritic, grapheme_root, consonant_diacritic = model.predict_generator(test_gen, \\\n                                                                                  verbose=1)\n    for i in range(len(test_image_ids)):\n        image_ids.append(f\"{test_image_ids[i]}_consonant_diacritic\")\n        image_ids.append(f\"{test_image_ids[i]}_grapheme_root\")\n        image_ids.append(f\"{test_image_ids[i]}_vowel_diacritic\")\n\n        preds.append(np.argmax(consonant_diacritic[i]))\n        preds.append(np.argmax(grapheme_root[i]))\n        preds.append(np.argmax(vowel_diacritic[i]))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"subm_df = pd.DataFrame()\nsubm_df['row_id'] = image_ids\nsubm_df['target'] = preds\nsubm_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"subm_df.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"subm_df.shape","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":1}