{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# # This Python 3 environment comes with many helpful analytics libraries installed\n# # It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# # For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# # Input data files are available in the \"../input/\" directory.\n# # For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\n# for dirname, _, filenames in os.walk('/kaggle/input'):\n#     for filename in filenames:\n#         print(os.path.join(dirname, filename))\n\n# # Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import gc\nimport os\nimport warnings\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom tqdm import tqdm\n\nfrom keras import backend as K\nwarnings.filterwarnings(action='ignore')\n\nK.image_data_format()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"DATA_PATH = '/kaggle/input/dogs-vs-cats-redux-kernels-edition/'\n\nimport re\nlist_for_df = []\nfor traindata in os.listdir(os.path.join(DATA_PATH, 'train/train')):\n#   print(traindata)\n  tmplist = []\n  if traindata[0] == 'c':\n    tmplist.append(0)\n  else:\n    tmplist.append(1)\n  tmplist.append(traindata)\n  list_for_df.append(tmplist)\n\ntrain_df = pd.DataFrame(data=list_for_df, columns=['class','fname'])\ntrain_df['class'] = train_df['class'].astype('str')\ntrain_df.head()\ntrain_df.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"list_for_df = []\nfor testdata in os.listdir(os.path.join(DATA_PATH, 'test/test')):\n#   print(traindata)\n  tmplist = []\n  tmplist.append(testdata)\n  list_for_df.append(tmplist)\n\ndf_test = pd.DataFrame(data=list_for_df, columns=['fname'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_test.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_test.shape","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Load Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\ndf_train, df_val = train_test_split(train_df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_val.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"original_dataset_dir = os.path.join(DATA_PATH, 'train/train')\n\nimport PIL\nfrom PIL import ImageDraw\n\ntmp_imgs = df_train['fname'][100:110]\nplt.figure(figsize=(12,20))\n\nfor num, f_name in enumerate(tmp_imgs):\n  img = PIL.Image.open(os.path.join(original_dataset_dir, f_name))\n  plt.subplot(5,2,num+1)\n  plt.title(f_name)\n  plt.imshow(img)\n  plt.axis('off')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Xception with fine tuning + data_gen"},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.applications import Xception\n\nconv_base = Xception(weights='imagenet',\n                  include_top=False,\n                  input_shape=(224,224,3))\n\nconv_base.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"conv_base.trainable = True\n\nset_trainable = False\nfor layer in conv_base.layers:\n  if layer.name.split('_')[0] == 'block1':\n    set_trainable = True\n  if layer.name.split('_')[0] == 'block2':\n    set_trainable = True\n  if layer.name.split('_')[0] == 'block13':\n    set_trainable = True\n  if layer.name.split('_')[0] == 'block14':\n    set_trainable = True\n  if set_trainable:\n    layer.trainable = True\n  else:\n    layer.trainable = False","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.applications.resnet50 import ResNet50, preprocess_input\nfrom keras.preprocessing.image import ImageDataGenerator\n\nimg_size = (224,224)\nnb_train_samples = len(df_train)\nnb_validation_samples = len(df_val)\nnb_test_samples = len(df_test)\nepochs = 12\nbatch_size = 64\n\n# Define Generator config\ntrain_datagen = ImageDataGenerator(\n  horizontal_flip = True,\n  vertical_flip = False,\n  zoom_range = 0.10,\n  rescale=1./255\n)\n\nval_datagen = ImageDataGenerator(rescale=1./255)\ntest_datagen = ImageDataGenerator(rescale=1./255)\n\noriginal_dataset_dir = os.path.join(DATA_PATH, 'train/train')\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    dataframe = df_train,\n    directory = original_dataset_dir,\n    x_col = 'fname',\n    y_col = 'class',\n    target_size = img_size,\n    color_mode = 'rgb',\n    class_mode = 'binary',\n    batch_size = batch_size,\n    seed = 42\n)\n\nvalidation_generator = val_datagen.flow_from_dataframe(\n    dataframe = df_val,\n    directory = original_dataset_dir,\n    x_col = 'fname',\n    y_col = 'class',\n    target_size = img_size,\n    color_mode = 'rgb',\n    class_mode = 'binary',\n    batch_size = batch_size,\n    shuffle = False\n)\n\ntest_data_path = os.path.join(DATA_PATH, 'test/test')\n\ntest_generator = test_datagen.flow_from_dataframe(\n    dataframe = df_test,\n    directory = test_data_path,\n    x_col = 'fname',\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":"from sklearn.metrics import f1_score\n\ndef micro_f1(y_true, y_pred):\n  return f1_score(y_true, y_pred, average='micro')\n\ndef get_step(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\nimport keras\n\nclass LossHistory(keras.callbacks.Callback):\n  def on_train_begin(self, logs={}):\n    self.losses = []\n    self.val_losses = []\n    self.acces = []\n    self.val_acces = []\n\n\n  def on_batch_end(self, batch, logs={}):\n    self.losses.append(logs.get('loss'))\n    self.val_losses.append(logs.get('val_loss'))\n    self.acces.append(logs.get('acc'))\n    self.val_acces.append(logs.get('val_acc'))\n\nloss_history = LossHistory()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def freeze(model):\n    \"\"\"Freeze model weights in every layer.\"\"\"\n    for layer in model.layers:\n        layer.trainable = False\n\n        if isinstance(layer, models.Model):\n            freeze(layer)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras import models\nfrom keras import layers\nfrom keras import optimizers\n\nfrom keras.callbacks import ModelCheckpoint, EarlyStopping\n\nfilepath = \"Xception_bin.h5\"\n\nes = EarlyStopping(monitor='val_acc', min_delta=0, patience=3, verbose=1, mode='auto')\ncallbackList = [es, loss_history]\n\n\nmodel = models.Sequential()\nmodel.add(conv_base)\nmodel.add(layers.GlobalAveragePooling2D())\n# model.add(layers.Flatten())\n# model.add(layers.Dropout(0.5))\nmodel.add(layers.Dense(256,activation='relu'))\nmodel.add(layers.Dropout(0.5))\nmodel.add(layers.Dense(1))\nmodel.add(layers.Activation('sigmoid'))\nmodel.compile(optimizer=optimizers.RMSprop(lr=1e-4), loss='binary_crossentropy', metrics=['acc'])\n\nhistory = model.fit_generator(train_generator,\n                   steps_per_epoch=100,\n                   epochs=50,\n                   validation_data=validation_generator,\n                   validation_steps=100,\n                   callbacks=callbackList)\n\n# freeze 해줘야함\nfrom keras import models\n\ndef freeze(model):\n    \"\"\"Freeze model weights in every layer.\"\"\"\n    for layer in model.layers:\n        layer.trainable = False\n\n        if isinstance(layer, models.Model):\n            freeze(layer)\n\nfreeze(model)\nmodel.save(filepath)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nhistory = model.history\n\nplt.plot(history.history['loss'])\nplt.plot(history.history['val_loss'])\nplt.title('Model loss')\nplt.ylabel('Loss')\nplt.xlabel('Epoch')\nplt.legend(['Train', 'Test'], loc='upper left')\nplt.show()\n\nplt.plot(history.history['acc'])\nplt.plot(history.history['val_acc'])\nplt.title('Model accuracy')\nplt.ylabel('Accuracy')\nplt.xlabel('Epoch')\nplt.legend(['Train', 'Test'], loc='upper left')\nplt.show()\n\nplt.plot(loss_history.acces)\nplt.plot(loss_history.val_acces)\nplt.title('Model accuracy')\nplt.ylabel('Accuracy')\nplt.xlabel('Epoch')\nplt.legend(['Train', 'Test'], loc='upper left')\nplt.show()\n\nplt.plot(loss_history.losses)\nplt.plot(loss_history.val_losses)\nplt.title('Model loss')\nplt.ylabel('Loss')\nplt.xlabel('Epoch')\nplt.legend(['Train', 'Test'], loc='upper left')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# get answer"},{"metadata":{"trusted":true},"cell_type":"code","source":"steps = len(df_test) // batch_size + 1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"mypred = model.predict_generator(\n    test_generator,\n    steps=steps\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"mypred_val = mypred\nmypred_val.shape","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# check_by_eye"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_test.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"id_val = df_test['fname'].str.split(\".\").str[0].values\nid_val","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"np.shape(id_val)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sptl = df_test['fname'][:30].values","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sptl","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\nplt.figure(figsize=(20,40))\n\ntestdir = os.path.join(DATA_PATH, 'test/test')\n\nimport PIL\n\nnum = 0\n\nfor fname in sptl:\n  img = PIL.Image.open(os.path.join(testdir, fname))\n  plt.subplot(8,4,num+1)\n  if mypred_val[num]<0.5:\n    plt.title('cat')\n  else:\n    plt.title('dog')\n  plt.axis('off')\n  plt.imshow(img)\n  num += 1","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# submit!"},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.read_csv(os.path.join(DATA_PATH, \"sample_submission.csv\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission['id'] = id_val\nsubmission['label'] = mypred_val","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"my_submission = submission.set_index('id')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"my_submission.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"my_submission.to_csv(\"Xception_submit.csv\")","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}