{"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":"markdown","source":"# [Dogs vs. Cats Redux: Kernels Edition](https://www.kaggle.com/competitions/dogs-vs-cats-redux-kernels-edition)","metadata":{}},{"cell_type":"markdown","source":"# Imports","metadata":{}},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nimport tensorflow as tf\nimport keras\nimport matplotlib.pyplot as plt\n\nfrom keras import layers\nfrom keras import models, Model\nfrom keras import optimizers\nfrom keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator\nfrom keras import applications\n\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn import metrics\n\nimport os","metadata":{"execution":{"iopub.status.busy":"2022-08-11T18:45:39.502085Z","iopub.execute_input":"2022-08-11T18:45:39.502990Z","iopub.status.idle":"2022-08-11T18:45:45.141429Z","shell.execute_reply.started":"2022-08-11T18:45:39.502894Z","shell.execute_reply":"2022-08-11T18:45:45.140448Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* [Data Description](https://www.kaggle.com/c/dogs-vs-cats/data)\n* [Kaggle API installation](https://github.com/Kaggle/kaggle-api)","metadata":{}},{"cell_type":"code","source":"import zipfile\n\nzip_files = ['test1', 'train']\n\nfor zip_file in zip_files:\n    with zipfile.ZipFile(\"../input/dogs-vs-cats/{}.zip\".format(zip_file),\"r\") as z:\n        z.extractall(\".\")\n        print(\"{} unzipped\".format(zip_file))","metadata":{"execution":{"iopub.status.busy":"2022-08-11T18:45:45.152726Z","iopub.execute_input":"2022-08-11T18:45:45.153387Z","iopub.status.idle":"2022-08-11T18:46:02.626235Z","shell.execute_reply.started":"2022-08-11T18:45:45.153352Z","shell.execute_reply":"2022-08-11T18:46:02.625169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TRAIN_IMAGE_FOLDER_PATH=\"./train\"\nTRAIN_FILE_NAMES=os.listdir(TRAIN_IMAGE_FOLDER_PATH)\n\nTEST_IMAGE_FOLDER_PATH=\"./test1\"\nTEST_FILE_NAMES=os.listdir(TEST_IMAGE_FOLDER_PATH)\n\nWIDTH=150\nHEIGHT=150","metadata":{"execution":{"iopub.status.busy":"2022-08-11T18:46:17.880776Z","iopub.execute_input":"2022-08-11T18:46:17.881123Z","iopub.status.idle":"2022-08-11T18:46:17.906336Z","shell.execute_reply.started":"2022-08-11T18:46:17.881093Z","shell.execute_reply":"2022-08-11T18:46:17.905443Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"targets=list()\ntrain_full_paths=list()\n\nfor train_file_name in TRAIN_FILE_NAMES:\n    target=train_file_name.split(\".\")[0]\n    train_full_path=os.path.join(TRAIN_IMAGE_FOLDER_PATH, train_file_name)\n    train_full_paths.append(train_full_path)\n    targets.append(target)\n\ntrain_dataset=pd.DataFrame()\ntrain_dataset['train_image_path']=train_full_paths\ntrain_dataset['target']=targets\n\n\n\ntest_full_paths=list()\n\nfor test_file_name in TEST_FILE_NAMES:\n    test_full_path=os.path.join(TEST_IMAGE_FOLDER_PATH, test_file_name)\n    test_full_paths.append(test_full_path)\n\n\ntest_dataset=pd.DataFrame()\ntest_dataset['test_image_path']=test_full_paths","metadata":{"execution":{"iopub.status.busy":"2022-08-11T18:46:28.116202Z","iopub.execute_input":"2022-08-11T18:46:28.116895Z","iopub.status.idle":"2022-08-11T18:46:28.258840Z","shell.execute_reply.started":"2022-08-11T18:46:28.116852Z","shell.execute_reply":"2022-08-11T18:46:28.257668Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataset.head()","metadata":{"execution":{"iopub.status.busy":"2022-08-11T18:46:32.231628Z","iopub.execute_input":"2022-08-11T18:46:32.231983Z","iopub.status.idle":"2022-08-11T18:46:32.249094Z","shell.execute_reply.started":"2022-08-11T18:46:32.231952Z","shell.execute_reply":"2022-08-11T18:46:32.248132Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"target_counts=train_dataset['target'].value_counts()\n\ntarget_counts","metadata":{"execution":{"iopub.status.busy":"2022-08-11T18:46:36.203716Z","iopub.execute_input":"2022-08-11T18:46:36.204507Z","iopub.status.idle":"2022-08-11T18:46:36.216465Z","shell.execute_reply.started":"2022-08-11T18:46:36.204470Z","shell.execute_reply":"2022-08-11T18:46:36.215504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_train, dataset_val=train_test_split(train_dataset, test_size=0.2, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2022-08-11T18:46:43.085926Z","iopub.execute_input":"2022-08-11T18:46:43.086301Z","iopub.status.idle":"2022-08-11T18:46:43.098947Z","shell.execute_reply.started":"2022-08-11T18:46:43.086270Z","shell.execute_reply":"2022-08-11T18:46:43.097911Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen=ImageDataGenerator(rotation_range=15,\n                                 rescale=1./255,\n                                 shear_range=0.1,\n                                 zoom_range=0.2,\n                                 horizontal_flip=True,\n                                 width_shift_range=0.1,\n                                 height_shift_range=0.1)\n\ntrain_datagenerator=train_datagen.flow_from_dataframe(dataframe=dataset_train,\n                                                      x_col=\"train_image_path\",\n                                                      y_col=\"target\",\n                                                      target_size=(WIDTH, HEIGHT),\n                                                      class_mode=\"categorical\",\n                                                      batch_size=150)","metadata":{"execution":{"iopub.status.busy":"2022-08-11T18:46:47.548245Z","iopub.execute_input":"2022-08-11T18:46:47.549316Z","iopub.status.idle":"2022-08-11T18:46:48.117558Z","shell.execute_reply.started":"2022-08-11T18:46:47.549274Z","shell.execute_reply":"2022-08-11T18:46:48.115878Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_datagen=ImageDataGenerator(rescale=1./255)\n\nval_datagenerator=val_datagen.flow_from_dataframe(dataframe=dataset_val,\n                                                   x_col=\"train_image_path\",\n                                                   y_col=\"target\",\n                                                   target_size=(WIDTH, HEIGHT),\n                                                   class_mode=\"categorical\",\n                                                   batch_size=150)","metadata":{"execution":{"iopub.status.busy":"2022-08-11T18:46:49.272973Z","iopub.execute_input":"2022-08-11T18:46:49.273340Z","iopub.status.idle":"2022-08-11T18:46:49.331848Z","shell.execute_reply.started":"2022-08-11T18:46:49.273309Z","shell.execute_reply":"2022-08-11T18:46:49.330732Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale=1/255.)\n\ntest_generator = test_datagen.flow_from_dataframe(test_dataset,\n                                                  x_col='test_image_path',\n                                                  y_col=None,\n                                                  class_mode=None,\n                                                  shuffle=False,\n                                                  target_size=(WIDTH, HEIGHT))\n","metadata":{"execution":{"iopub.status.busy":"2022-08-11T18:46:51.251024Z","iopub.execute_input":"2022-08-11T18:46:51.251957Z","iopub.status.idle":"2022-08-11T18:46:51.347480Z","shell.execute_reply.started":"2022-08-11T18:46:51.251919Z","shell.execute_reply":"2022-08-11T18:46:51.346457Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Implementing CNN Architecture with Keras","metadata":{"_kg_hide-output":true}},{"cell_type":"code","source":"model=models.Sequential()\n\nmodel.add(layers.Conv2D(32, (3,3), activation=\"relu\", input_shape=(WIDTH, HEIGHT, 3)))\nmodel.add(layers.Conv2D(32, (3,3), activation=\"relu\"))\nmodel.add(layers.BatchNormalization())\nmodel.add(layers.MaxPooling2D((2,2)))\nmodel.add(layers.Dropout(0.25))\n\nmodel.add(layers.Conv2D(64, (3,3), activation=\"relu\"))\nmodel.add(layers.Conv2D(64, (3,3), activation=\"relu\"))\nmodel.add(layers.BatchNormalization())\nmodel.add(layers.MaxPooling2D(2,2))\nmodel.add(layers.Dropout(0.25))\n\nmodel.add(layers.Conv2D(128, (3,3), activation=\"relu\"))\nmodel.add(layers.Conv2D(128, (3,3), activation=\"relu\"))\nmodel.add(layers.BatchNormalization())\nmodel.add(layers.MaxPooling2D((2,2)))\nmodel.add(layers.Dropout(0.25))\n\nmodel.add(layers.Conv2D(64, (3,3), activation=\"relu\"))\nmodel.add(layers.Conv2D(64, (3,3), activation=\"relu\"))\nmodel.add(layers.BatchNormalization())\nmodel.add(layers.MaxPooling2D((2,2)))\nmodel.add(layers.Dropout(0.25))\n\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(512, activation=\"relu\"))\nmodel.add(layers.Dropout(0.5))\nmodel.add(layers.Dense(2, activation=\"softmax\"))\n\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2022-08-11T18:47:07.546003Z","iopub.execute_input":"2022-08-11T18:47:07.546369Z","iopub.status.idle":"2022-08-11T18:47:07.700359Z","shell.execute_reply.started":"2022-08-11T18:47:07.546339Z","shell.execute_reply":"2022-08-11T18:47:07.699017Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(loss=\"binary_crossentropy\", \n             optimizer='adam',\n             metrics=[\"accuracy\"])","metadata":{"execution":{"iopub.status.busy":"2022-08-11T18:47:16.505602Z","iopub.execute_input":"2022-08-11T18:47:16.505955Z","iopub.status.idle":"2022-08-11T18:47:16.516294Z","shell.execute_reply.started":"2022-08-11T18:47:16.505926Z","shell.execute_reply":"2022-08-11T18:47:16.515344Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"modelHistory=model.fit(train_datagenerator,\n                       epochs=15,\n                       validation_data  = val_datagenerator,\n                       validation_steps = dataset_val.shape[0]//150,\n                       steps_per_epoch  = dataset_val.shape[0]//150)","metadata":{"execution":{"iopub.status.busy":"2022-08-11T18:47:22.984571Z","iopub.execute_input":"2022-08-11T18:47:22.985346Z","iopub.status.idle":"2022-08-11T19:03:54.046622Z","shell.execute_reply.started":"2022-08-11T18:47:22.985300Z","shell.execute_reply":"2022-08-11T19:03:54.045595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = model.predict(test_generator)\n\ntest_dataset['category'] = np.argmax(preds, axis=-1)","metadata":{"execution":{"iopub.status.busy":"2022-08-11T19:09:58.936719Z","iopub.execute_input":"2022-08-11T19:09:58.937084Z","iopub.status.idle":"2022-08-11T19:10:35.687383Z","shell.execute_reply.started":"2022-08-11T19:09:58.937053Z","shell.execute_reply":"2022-08-11T19:10:35.686406Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# submission_df = test_dataset.copy()\n# submission_df['id'] = submission_df['test_image_path'].str.split('.').str[0]\n# submission_df['label'] = submission_df['category']\n# submission_df.drop(['test_image_path', 'category'], axis=1, inplace=True)\n# submission_df.to_csv('CNN_submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-08-11T19:11:17.555371Z","iopub.execute_input":"2022-08-11T19:11:17.555823Z","iopub.status.idle":"2022-08-11T19:11:17.775557Z","shell.execute_reply.started":"2022-08-11T19:11:17.555787Z","shell.execute_reply":"2022-08-11T19:11:17.774607Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"output = pd.DataFrame({'id': list(range(1, 12501)),\n                       'label': test_dataset['category'] })\n\noutput.to_csv('submission2.csv', index=False)\nprint(\"Your submission was successfully saved!\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Transfer Learning ","metadata":{}},{"cell_type":"code","source":"model = tf.keras.applications.Xception(weights= \"imagenet\", include_top=False, input_shape=(WIDTH, HEIGHT, 3))","metadata":{"execution":{"iopub.status.busy":"2022-08-11T19:12:07.244650Z","iopub.execute_input":"2022-08-11T19:12:07.245017Z","iopub.status.idle":"2022-08-11T19:12:08.476777Z","shell.execute_reply.started":"2022-08-11T19:12:07.244984Z","shell.execute_reply":"2022-08-11T19:12:08.475771Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x = model.layers[-1].output\nx = layers.Flatten()(x)\nx = layers.Dense(256,activation = 'relu')(x)\nx = layers.BatchNormalization()(x)\nx = layers.Dropout(0.5)(x)\nx = layers.Dense(2, activation = 'softmax')(x)\n\nmodel = Model(inputs = model.input, outputs = x)","metadata":{"execution":{"iopub.status.busy":"2022-08-11T19:12:08.523072Z","iopub.execute_input":"2022-08-11T19:12:08.523824Z","iopub.status.idle":"2022-08-11T19:12:08.567654Z","shell.execute_reply.started":"2022-08-11T19:12:08.523793Z","shell.execute_reply":"2022-08-11T19:12:08.566774Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for layer in model.layers[-10:]:\n    layer.trainable = True\n    \nfor layer in model.layers[:-10]:\n    layer.trainable = False\n\n\n\nmodel.compile(optimizer= 'adam'\n             ,loss     = keras.losses.BinaryCrossentropy(from_logits=True)\n             ,metrics  = keras.metrics.BinaryAccuracy())","metadata":{"execution":{"iopub.status.busy":"2022-08-11T19:12:15.565739Z","iopub.execute_input":"2022-08-11T19:12:15.566121Z","iopub.status.idle":"2022-08-11T19:12:15.590395Z","shell.execute_reply.started":"2022-08-11T19:12:15.566086Z","shell.execute_reply":"2022-08-11T19:12:15.589432Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_xception_History=model.fit(train_datagenerator,\n                                epochs=5,\n                                validation_data =val_datagenerator,\n                                validation_steps=dataset_val.shape[0]//150,\n                                steps_per_epoch =dataset_val.shape[0]//150)","metadata":{"execution":{"iopub.status.busy":"2022-08-11T20:02:31.330245Z","iopub.execute_input":"2022-08-11T20:02:31.330612Z","iopub.status.idle":"2022-08-11T20:02:41.169436Z","shell.execute_reply.started":"2022-08-11T20:02:31.330582Z","shell.execute_reply":"2022-08-11T20:02:41.166793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}