{"cells":[{"metadata":{},"cell_type":"markdown","source":"Inference kernel\n\nfold : 5, tta : 5\n\nEfficientnetB5 , InceptionV3\n\n크롭된 이미지를 사용하였고, adabound optimizer를 사용하였습니다.\n\n두개의 모델의 결과를 평균내어 앙상블 하였습니다."},{"metadata":{"trusted":true},"cell_type":"code","source":"!ls '../input/kakr3model/kakr3model/kakr3model/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"DATA_PATH = '../input/2019-3rd-ml-month-with-kakr/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nimport tensorflow as tf\nimport keras\nimport numpy as np\nimport pandas as pd\n\nTRAIN_IMG_PATH = '../input/kakr3cropdata/cropdata/cropdata/train_crop/'\nTEST_IMG_PATH = '../input/kakr3cropdata/cropdata/cropdata/test_crop/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train = pd.read_csv(os.path.join(DATA_PATH, 'train.csv'))\ndf_test = pd.read_csv(os.path.join(DATA_PATH, 'test.csv'))\ndf_class = pd.read_csv(os.path.join(DATA_PATH, 'class.csv'))\n\nprint(\"The number of the target class : {}\".format(df_class.shape[0]))\nprint(\"The number of the target class of the Train data : {}\".format(df_train['class'].nunique()))\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras import backend as K\n\ndef get_steps(num_samples, batch_size):\n  if (num_samples % batch_size) > 0 :\n    return (num_samples // batch_size) + 1\n  else :\n    return num_samples // batch_size\n\ndef recall_m(y_target, y_pred):\n        true_positives = K.sum(K.round(K.clip(y_target * y_pred, 0, 1)))\n        possible_positives = K.sum(K.round(K.clip(y_target, 0, 1)))\n        recall = true_positives / (possible_positives + K.epsilon())\n        return recall\n\ndef precision_m(y_target, y_pred):\n        true_positives = K.sum(K.round(K.clip(y_target * y_pred, 0, 1)))\n        predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))\n        precision = true_positives / (predicted_positives + K.epsilon())\n        return precision\n\ndef f1_m(y_target, y_pred):\n    precision = precision_m(y_target, y_pred)\n    recall = recall_m(y_target, y_pred)\n    return 2*((precision*recall)/(precision+recall+K.epsilon()))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!pip install keras-adabound\n!pip install efficientnet","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.models import Sequential, Model\nfrom keras.layers import Dense, Dropout, Flatten, Activation, Conv2D, GlobalAveragePooling2D, ELU\nfrom keras.layers.merge import concatenate\nfrom keras.layers.normalization import BatchNormalization\nfrom keras.applications.xception import Xception\nfrom keras.applications.resnet50 import ResNet50\nfrom keras.applications.inception_v3 import InceptionV3\nfrom keras.optimizers import Adam, SGD, RMSprop\nfrom efficientnet import EfficientNetB5\nfrom efficientnet import EfficientNetB7\nfrom keras_adabound import AdaBound\nimport tensorflow as tf\nfrom keras import backend as K\n\ndef swish(x):\n    return (K.sigmoid(x) * x)\n\ndef build_model(model_name,learning_rate):\n    \n    if model_name == 'x':\n        pretrained_model = Xception(include_top = False, input_shape = (299,299,3), weights = 'imagenet')\n    elif model_name == 'e':\n        pretrained_model = EfficientNetB5(include_top = False, input_shape = (224,224,3), weights = 'imagenet')\n    elif model_name == 'i':\n        pretrained_model = InceptionV3(include_top = False, input_shape = (299,299,3), weights = 'imagenet')\n    #elif model_name == 'e7':\n        #pretrained_model = EfficientNetB7(include_top = True, input_shape = (224,224,3), weights = None)\n        #pretrained_model.load_weights(os.path.join(DATA_PATH,'efficientnet-b7/model'))\n        \n        #tf.reset_default_graph()\n        #saver = tf.train.import_meta_graph(os.path.join(DATA_PATH,'efficientnet-b7/model.ckpt.meta'))\n        #sess = tf.Session()\n        #saver.restore(sess,os.path.join(DATA_PATH,'efficientnet-b7/model.ckpt'))\n        #pretrained_model = tf.get_default_graph()\n        \n        #pretrained_model = tf.keras.models.Model()\n        #pretrained_model = tf.keras.models.load_model(os.path.join(DATA_PATH,'efficientnet-b7/model.ckpt.meta'),custom_objects={'Swish': swish})\n        \n        #pretrained_model.summary()\n    \n    model = Sequential()\n    model.add(pretrained_model)\n    \n    model.add(GlobalAveragePooling2D())\n    \n    model.add(Dense(1024,activation='relu'))\n    model.add(Dropout(0.4))\n    #model.add(ELU(alpha=1.0))\n    #model.add(Activation(swish))\n    #model.add(BatchNormalization())\n    \n    model.add(Dense(1024,activation='relu'))\n    model.add(Dropout(0.4))\n    #model.add(ELU(alpha=1.0))\n    #model.add(Activation(swish))\n    #model.add(BatchNormalization())\n    \n    model.add(Dense(196,activation='softmax'))\n    \n    model.summary()\n    \n    #opt = Adam(lr=0.001)\n    opt = AdaBound(lr=learning_rate, final_lr=0.1)\n    #opt = SGD(lr=0.001)\n    model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['acc',f1_m,precision_m, recall_m])\n\n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.callbacks import ModelCheckpoint, EarlyStopping,ReduceLROnPlateau,LearningRateScheduler\n\ndef step_decay_schedule(initial_lr=1e-3, decay_factor=0.97, step_size=1):\n    '''\n    Wrapper function to create a LearningRateScheduler with step decay schedule.\n    '''\n    def schedule(epoch):\n        new_lr = initial_lr * (decay_factor ** np.floor(epoch/step_size))\n        print(\"lr decayed to\",new_lr)\n        return new_lr\n    \n    return LearningRateScheduler(schedule)\n\ndef get_callback(mn,lr):\n    \n    file_path = get_file_path(mn)\n    \n    es = EarlyStopping(monitor='val_f1_m', min_delta = 0, patience = 9, verbose = 1, mode = 'max')\n    rr = ReduceLROnPlateau(monitor='val_f1_m', factor=0.5, min_delta = 0, patience = 3, verbose = 1,mode = 'max')\n    cp = ModelCheckpoint(file_path[fold-1], monitor='val_f1_m', verbose=1, save_best_only=True, mode='max')\n    lr_decay = step_decay_schedule(lr)\n    \n    return [es,cp,rr,lr_decay]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_size = (299,299)\n#img_size = (224,224)\n#img_size = (299,299)\nepochs = 100\nbatch_size = 16\nn_fold = 5\nmodel_name = 'i'\nlearning_rate = 0.00001","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import StratifiedKFold, KFold\nfrom keras.applications.xception import preprocess_input\nfrom keras.preprocessing.image import ImageDataGenerator\n\nnb_test_samples = len(df_test)\n\ndf_train[\"class\"] = df_train[\"class\"].astype('str')\n\ndf_train = df_train[['img_file','class']]\ndf_test = df_test[['img_file']]\n\nskf = StratifiedKFold(n_splits=n_fold, random_state=42)\n#skf = KFold(n_splits=n_fold, shuffle = False, random_state=42)\nvalid_accuracy = []\n\nX = df_train['img_file']\nY = df_train['class']\n\ntrain_datagen = ImageDataGenerator(\n    rescale = 1./255,\n    horizontal_flip = True,\n    vertical_flip = False,\n    zoom_range = 0.10,\n    rotation_range=40,\n    fill_mode='nearest'\n)\nval_datagen = ImageDataGenerator(\n    rescale = 1./255\n)\ntest_datagen = ImageDataGenerator(\n    rescale = 1./255,\n    horizontal_flip = True,\n    rotation_range=10,\n    fill_mode='nearest'\n)\n\ntest_generator = test_datagen.flow_from_dataframe(\n    dataframe = df_test,\n    directory = TEST_IMG_PATH,\n    x_col = 'img_file',\n    y_col = None,\n    target_size = img_size,\n    color_mode = 'rgb',\n    class_mode = None,\n    batch_size = batch_size,\n    shuffle = False\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_generator = train_datagen.flow_from_dataframe(\n            dataframe = df_train,\n            directory = TRAIN_IMG_PATH,\n            x_col = 'img_file',\n            y_col = 'class',\n            target_size = img_size,\n            color_mode = 'rgb',\n            class_mode = 'categorical',\n            batch_size = batch_size,\n            shuffle = True,\n            seed=42\n        )\n\ntest_generator_f = test_datagen.flow_from_dataframe(\n    dataframe = df_test,\n    directory = TEST_IMG_PATH,\n    x_col = 'img_file',\n    y_col = None,\n    target_size = (224,224),\n    color_mode = 'rgb',\n    class_mode = None,\n    batch_size = batch_size,\n    shuffle = False\n)\ntest_generator_n = test_datagen.flow_from_dataframe(\n    dataframe = df_test,\n    directory = TEST_IMG_PATH,\n    x_col = 'img_file',\n    y_col = None,\n    target_size = (299,299),\n    color_mode = 'rgb',\n    class_mode = None,\n    batch_size = batch_size,\n    shuffle = False\n)\n\nmodel_result = []\ninception_file_path = [\"../input/kakr3model/kakr3model/kakr3model//saved-inception-model-\"+str(i)+\".hdf5\" for i in range(1,n_fold+1)]\neffinet_file_path = [\"../input/kakr3model/kakr3model/kakr3model//saved-efficientnet-model-\"+str(i)+\".hdf5\" for i in range(1,n_fold+1)]\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#model = build_model('i',learning_rate)\n\nfor i in range(n_fold):\n    print(\"testing inception model\",i)\n    \n    model = keras.models.load_model(inception_file_path[i],custom_objects={'f1_m': f1_m,'precision_m':precision_m,'recall_m':recall_m, 'AdaBound':AdaBound})\n    \n    for j in range(0,5):\n        test_generator_n.reset()\n        prediction = model.predict_generator(\n            generator = test_generator_n,\n            steps = get_steps(nb_test_samples, batch_size),\n            verbose=1\n        )\n        \n        model_result.append(prediction)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#model = build_model('e',learning_rate)\n\nfor i in range(n_fold):\n    print(\"testing effinet model\",i)\n    \n    model = keras.models.load_model(effinet_file_path[i],custom_objects={'f1_m': f1_m,'precision_m':precision_m,'recall_m':recall_m, 'AdaBound':AdaBound})\n    \n    #model = keras.models.load_model(effinet_file_path[i],custom_objects={'f1_m': f1_m,'precision_m':precision_m,'recall_m':recall_m,'AdaBound':AdaBound})\n    #model.summary()\n    \n    for j in range(0,5):\n        test_generator_f.reset()\n        prediction = model.predict_generator(\n            generator = test_generator_f,\n            steps = get_steps(nb_test_samples, batch_size),\n            verbose=1\n        )\n        \n        model_result.append(prediction)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"mean_prediction_result = np.mean(model_result, axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predicted_class_indices = np.argmax(mean_prediction_result, axis=1)\n\nlabels = (train_generator.class_indices)\nlabels = dict((v,k) for k,v in labels.items())\npredictions = [labels[k] for k in predicted_class_indices]\n\nsubmission = pd.read_csv(os.path.join(DATA_PATH, 'sample_submission.csv'))\nsubmission[\"class\"] = predictions\nsubmission.to_csv(os.path.join(DATA_PATH,\"submission.csv\"),index=False)\nsubmission.head()","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}