{"cells":[{"metadata":{},"cell_type":"markdown","source":"이번 대회를 통해서 Classification 점수 향상에 대한 방법으로 TTA Ensemble을 집중적으로 테스트했고 이을 통한 점수 향상 방법을 익힐 수 있었습니다. 좋은 대회를 주최해 주셔서 감사드립니다. "},{"metadata":{},"cell_type":"markdown","source":"제가 한 학습법에 대한 정리입니다."},{"metadata":{},"cell_type":"markdown","source":"- model: se_resnext50_32x4d \n- loss : focal_loss\n- optimizer: adam\n- lr: 0.001\n- batch_size: 16\n- scheduler: cosine (t_max 10 / eta_min 0.00001)\n- input size (height 320 / width: 592) / bounding box cropped\n- split: StratifiedKFold 10 fold\n- transform\n  1. train : horizontalflip, randomresize, randomrotation\n  2. validation : none\n  3. test: tta2 + tta3 + tta4\n     \n     (1) tta2 : original + horizontalflip\n     (2) tta3 : original + horizontalflip + rnadomsizecrop\n     (3) tta4 : original + rnadomsizecrop + randomrotation \n"},{"metadata":{},"cell_type":"markdown","source":"## TTA Ensemble\n위에서 얻은 각 Fold(10fold)의 inference시에 TTA를 2,3,4를 Ensemble하여서 최종 결과물을 만들었습니다. TTA끼리도 Ensemble을 통해서 점수향상을 할 수 있었다는 것을 배울 수 있었습니다. "},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\n\ntta = None\nroot_folder = '/kaggle/input/kakr3-csv/infer_final/'\n\ndef make_submission_in_ensemble(df_test):\n    records = []\n    for Id, row in df_test.iterrows():\n        one_row=[]\n        probs = list(row.values)\n\n        final_pred = np.argmax(probs, axis=-1) + 1\n        one_row.append(Id)\n        one_row.append(final_pred)\n\n        records.append(one_row)\n    test_df = pd.read_csv('/kaggle/input/2019-3rd-ml-month-with-kakr/sample_submission.csv')\n    labels = test_df.columns[1:].tolist()\n    columns = ['img_file'] + [label for label in labels]\n    df_output = pd.DataFrame.from_records(records, columns=columns)\n    df_output = df_output.set_index('img_file')\n    return df_output\n\ndef ensemble():\n    import warnings\n    warnings.filterwarnings(\"ignore\")\n    print('make submission')\n\n    test_filenames = [\n                    \n\n                      root_folder+'resnet50_0.final_tta_2.csv',\n                      root_folder+'resnet50_1.final_tta_2.csv',\n                      root_folder+'resnet50_2.final_tta_2.csv',\n                      root_folder+'resnet50_3.final_tta_2.csv',\n                      root_folder+'resnet50_4.final_tta_2.csv',\n                      root_folder+'resnet50_5.final_tta_2.csv',\n                      root_folder+'resnet50_6.final_tta_2.csv',\n                      root_folder+'resnet50_7.final_tta_2.csv',\n                      root_folder+'resnet50_8.final_tta_2.csv',\n                      root_folder+'resnet50_9.final_tta_2.csv',\n\n                      root_folder+'resnet50_0.final_tta_3.csv',\n                      root_folder+'resnet50_1.final_tta_3.csv',\n                      root_folder+'resnet50_2.final_tta_3.csv',\n                      root_folder+'resnet50_3.final_tta_3.csv',\n                      root_folder+'resnet50_4.final_tta_3.csv',\n                      root_folder+'resnet50_5.final_tta_3.csv',\n                      root_folder+'resnet50_6.final_tta_3.csv',\n                      root_folder+'resnet50_7.final_tta_3.csv',\n                      root_folder+'resnet50_8.final_tta_3.csv',\n                      root_folder+'resnet50_9.final_tta_3.csv',\n\n                      root_folder+'resnet50_0.final_tta_4.csv',\n                      root_folder+'resnet50_1.final_tta_4.csv',\n                      root_folder+'resnet50_2.final_tta_4.csv',\n                      root_folder+'resnet50_3.final_tta_4.csv',\n                      root_folder+'resnet50_4.final_tta_4.csv',\n                      root_folder+'resnet50_5.final_tta_4.csv',\n                      root_folder+'resnet50_6.final_tta_4.csv',\n                      root_folder+'resnet50_7.final_tta_4.csv',\n                      root_folder+'resnet50_8.final_tta_4.csv',\n                      root_folder+'resnet50_9.final_tta_4.csv',\n\n                      ]\n\n    weights = [1/10,1/10,1/10,1/10,1/10,1/10,1/10,1/10,1/10,1/10,\n               1/10,1/10,1/10,1/10,1/10,1/10,1/10,1/10,1/10,1/10,\n               1/10,1/10,1/10,1/10,1/10,1/10,1/10,1/10,1/10,1/10]\n\n\n    output_filename = '/kaggle/working/submission.csv'\n    os.makedirs(os.path.dirname(output_filename), exist_ok=True)\n\n    df_test_list = [pd.read_csv(f, index_col='img_file') for f in test_filenames]\n\n    print('ensemble..')\n    df_test = sum([df * w for df, w in zip(df_test_list, weights)]) / sum(weights)\n\n    df_submission = make_submission_in_ensemble(df_test)\n\n    df_submission.to_csv(output_filename)\n\n\n\ndef getColumns():\n    return ['img_file'] + ['P{:02d}'.format(l) for l in range(196)]\n\n\ndef make_submission(df_infer, output_filename):\n    records = []\n    for Id, row in df_infer.iterrows():\n        one_row=[]\n        probs = list(row.values)\n        one_row.append(Id)\n        one_row.extend(probs)\n        records.append(one_row)\n    columns = getColumns()\n    df_output = pd.DataFrame.from_records(records, columns=columns)\n    df_output = df_output.set_index('img_file')\n    print('save {}'.format(output_filename))\n    df_output.to_csv(output_filename)\n\n\nif __name__ == '__main__':\n    ensemble()\n","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}