{"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\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 read-only \"../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\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Import Libraries"},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator, load_img\nimport numpy as np\nimport pandas as pd\nimport cv2\nfrom matplotlib import pyplot as plt\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D, Dropout, Dense, MaxPooling2D, BatchNormalization, Flatten\nimport random\nimport os\nfrom zipfile import ZipFile\nfrom keras.optimizers import Adam\nfrom sklearn.model_selection import train_test_split\nfrom PIL import Image\nfrom keras.callbacks import EarlyStopping, ReduceLROnPlateau","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Get Data from Zipfile"},{"metadata":{"trusted":true},"cell_type":"code","source":"ZipFile(\"/kaggle/input/dogs-vs-cats/train.zip\",\"r\").extractall()\nZipFile(\"/kaggle/input/dogs-vs-cats/test1.zip\", \"r\").extractall()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Define Constants"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dir = \"./train/\"\ntest_dir = \"./test1/\"\nIMG_HEIGHT = 128\nIMG_WIDTH = 128\nIMG_CHANNEL = 3\nIMG_SIZE = (IMG_WIDTH, IMG_HEIGHT)\nbatch_size = 64\nepochs = 50","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Prepare Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"Dtrain = os.listdir(train_dir)\ncategories = []\nfor filename in Dtrain:\n    category = filename.split(\".\")[0]\n    if category == \"dog\":\n        categories.append(\"dog\")\n    else:\n        categories.append(\"cat\")\ndf = pd.DataFrame({\n    \"filename\" : Dtrain,\n    \"category\" : categories\n})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(df.head())\nprint(df.tail())","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Plot Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"df.category.value_counts().plot.bar()\nplt.title(str(len(df[df['category'] == 'cat']))+\" cats\" + \" | \" +str(len(df[df['category'] == 'dog']))+\" dogs\", fontsize=18)\nplt.ylabel(len(df), fontsize = 14)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Build Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"model=Sequential()\n\nmodel.add(Conv2D(32, (3,3), input_shape=(IMG_WIDTH, IMG_HEIGHT, IMG_CHANNEL), activation=\"relu\"))\nmodel.add((MaxPooling2D(2,2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Conv2D(64, (3,3), activation=\"relu\"))\nmodel.add((MaxPooling2D(2,2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Conv2D(128, (3,3), activation=\"relu\"))\nmodel.add((MaxPooling2D(2,2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Flatten())\nmodel.add(Dense(1024, activation=\"relu\"))\nmodel.add(Dropout(0.25))\n\nmodel.add(Dense(2, activation=\"sigmoid\"))\n\nmodel.compile(loss='binary_crossentropy',optimizer=Adam(lr=0.0001, decay=1e-6),metrics=['accuracy'])\n\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Show sample\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"sampel = random.choice(df.filename)\nimg = load_img(train_dir+sampel)\nplt.imshow(img)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Split Data to Train and Validation set"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df, validate_df = train_test_split(df, test_size = 0.2, random_state = 42)\ntrain_df = train_df.reset_index(drop=True)\nvalidate_df = validate_df.reset_index(drop=True)\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Plot Train and Validation"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.category.value_counts().plot.bar()\nplt.ylabel(len(train_df), fontsize = 14)\nplt.title(str(len(train_df[train_df['category'] == 'dog']))+\" Dogs  |  \"+str((len(train_df[train_df['category'] == 'cat'])))+\" Cats\", fontsize=18)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"validate_df.category.value_counts().plot.bar()\nplt.ylabel(len(train_df), fontsize = 14)\nplt.title(str(len(validate_df[validate_df['category'] == 'cat']))+\" Cats  |  \"+str((len(validate_df[validate_df['category'] == 'dog'])))+\" Dogs\", fontsize=18)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Callbacks"},{"metadata":{"trusted":true},"cell_type":"code","source":"earlystop = EarlyStopping(patience=10)\n\nlearning_rate_reduction = ReduceLROnPlateau(monitor='val_acc', \n                                            patience=2, \n                                            verbose=1, \n                                            factor=0.5, \n                                            min_lr=0.00001)\n\ncallbacks = [earlystop, learning_rate_reduction]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Traning Generator"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_datagen = ImageDataGenerator(rotation_range=20,\n    rescale=1./255,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    width_shift_range=0.1,\n    height_shift_range=0.1\n)\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    train_df, \n    \"./train/\", \n    x_col='filename',\n    y_col='category',\n    target_size=IMG_SIZE,\n    class_mode='categorical',\n    batch_size=batch_size,\n    color_mode=\"rgb\",\n    shuffle=True\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Validation Generator"},{"metadata":{"trusted":true},"cell_type":"code","source":"validation_datagen = ImageDataGenerator(rescale=1./255)\n\nvalidation_generator = validation_datagen.flow_from_dataframe(\n    validate_df, \n    \"./train/\", \n    x_col='filename',\n    y_col='category',\n    target_size=IMG_SIZE,\n    class_mode='categorical',\n    batch_size=batch_size,\n    color_mode=\"rgb\",\n    shuffle=True\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Example Generator"},{"metadata":{"trusted":true},"cell_type":"code","source":"example_df = train_df.sample(n=1).reset_index(drop=True)\nexample_generator = train_datagen.flow_from_dataframe(\n    example_df, \n    \"./train/\", \n    x_col='filename',\n    y_col='category',\n    target_size=IMG_SIZE,\n    class_mode='categorical',\n    color_mode=\"rgb\",\n    shuffle=True\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Show how Generator works"},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(12,12))\nfor i in range(0,8):\n    plt.subplot(2, 4, i+1)\n    for x_batch, y_batch in example_generator:\n        img = x_batch[0]\n        plt.imshow(img)\n        break\nplt.tight_layout()\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Fit Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit_generator(\n    train_generator,\n    steps_per_epoch=len(train_df)//64,\n    epochs=epochs,\n    validation_data=validation_generator,\n    validation_steps=len(validate_df)//64,\n    callbacks=callbacks\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Save model's weights"},{"metadata":{"trusted":true},"cell_type":"code","source":"model.save_weights(\"CatsVsDogs.h5\")\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Virtualize Training"},{"metadata":{"trusted":true},"cell_type":"code","source":"fig,(ax1, ax2) = plt.subplots(2, 1, figsize = (12,12))\nax1.plot(history.history[\"loss\"], color= \"red\", label = \"Training loss\")\nax1.plot(history.history[\"val_loss\"], color= \"b\", label = \"Validation loss\")\n\nax1.set_xticks(np.arange(1, epochs, 1))\nax1.set_yticks(np.arange(0, 1, 0.1))\n\nax2.plot(history.history[\"accuracy\"], color = \"red\", label = \"Training accuracy\")\nax2.plot(history.history[\"val_accuracy\"], color = \"b\", label = \"Validation accuracy\")\n\nax2.set_xticks(np.arange(1,epochs, 1))\nax2.set_yticks(np.arange(0, 1, 0.1))\n\nlegend = plt.legend(loc = \"best\", shadow = True)\nplt.tight_layout()\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Prepare Test set"},{"metadata":{"trusted":true},"cell_type":"code","source":"Dtest = os.listdir(test_dir)\ndf_test = pd.DataFrame({\n    \"filename\" : Dtest\n})","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Test Generator"},{"metadata":{"trusted":true},"cell_type":"code","source":"test_dataGen = ImageDataGenerator(1./255)\n\ntest_gen = test_dataGen.flow_from_dataframe(\n    df_test,\n    test_dir,\n    target_size = IMG_SIZE,\n    x_col = \"filename\",\n    y_col = None,\n    batch_size = batch_size,\n    class_mode = None,\n    shuffle = True,\n    color_mode=\"rgb\",\n\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Predict Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"predicted = model.predict(test_gen)\ndf_test[\"category\"] = np.argmax(predicted, axis=-1)\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Show model accuracy"},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Train Accuracy:{:.3f}\".format(history.history['accuracy'][-1]))\nprint(\"Test Accuracy:{:.3f}\".format(history.history['val_accuracy'][-1]))\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Plot Test Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_test[\"category\"] = df_test[\"category\"].replace({1 : \"cat\", 0 : \"dog\"})\ndf_test['category'].value_counts().plot.bar()\nplt.ylabel(len(df_test), fontsize = 14)\nplt.title(str(len(df_test[df_test['category'] == 'dog']))+\" Dogs  |  \"+str((len(df_test[df_test['category'] == 'cat'])))+\" Cats\", fontsize=18)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Show the result"},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_test = df_test.head(18)\nsample_test.head()\nplt.figure(figsize=(12, 24))\nfor index, row in sample_test.iterrows():\n    filename = row['filename']\n    category = row['category']\n    img = load_img(test_dir+filename, target_size=IMG_SIZE)\n    plt.subplot(6, 3, index+1)\n    plt.imshow(img)\n    plt.xlabel(\"{}\".format(category))\nplt.tight_layout()\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Submission"},{"metadata":{"trusted":true},"cell_type":"code","source":"submission_df = df_test.copy()\nsubmission_df['id'] = submission_df['filename'].str.split('.').str[0]\nsubmission_df['label'] = submission_df['category']\nsubmission_df.drop(['filename', 'category'], axis=1, inplace=True)\nsubmission_df.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"FAST_RUN = False\nIMAGE_WIDTH=128\nIMAGE_HEIGHT=128\nIMAGE_SIZE=(IMAGE_WIDTH, IMAGE_HEIGHT)\nIMAGE_CHANNELS=3","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Prepare Traning Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"filenames = os.listdir(\"/kaggle/working/train\")\ncategories = []\nfor filename in filenames:\n    category = filename.split('.')[0]\n    if category == 'dog':\n        categories.append(1)\n    else:\n        categories.append(0)\n\ndf = pd.DataFrame({\n    'filename': filenames,\n    'category': categories\n})","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"See Total In count"},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.applications import ResNet50\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Flatten, GlobalAveragePooling2D\n\nnum_classes = 2\nresnet_weights_path = 'https://github.com/fchollet/deep-learning-models/releases/download/v0.2/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5'\n\n\nmy_new_model = Sequential()\nmy_new_model.add(ResNet50(include_top=False, pooling='avg', weights=resnet_weights_path))\nmy_new_model.add(Dense(num_classes, activation='softmax'))\n\n# Indicate whether the first layer should be trained/changed or not.\nmy_new_model.layers[0].trainable = False\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Compile the Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"my_new_model.compile(optimizer='sgd', \n                     loss='categorical_crossentropy', \n                     metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Fit Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"!ls images/train/upright","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import load_img\nimg = load_img('images/kaggle/input/dogs-vs-cats/train.zip')\nimg","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import load_img\nimg = load_img('kaggle/input/dogs-vs-cats/train.zip')\nimg","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.applications.resnet50 import preprocess_input\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img\n\nimage_size = 224\ndata_generator = ImageDataGenerator(preprocess_input)\n\ntrain_generator = data_generator.flow_from_directory(\n                                        directory='images/train',\n                                        target_size=(image_size, image_size),\n                                        batch_size=10,\n                                        class_mode='categorical')\n\n\n\nvalidation_generator = data_generator.flow_from_directory(\n                                        directory='images/val',\n                                        target_size=(image_size, image_size),\n                                        class_mode='categorical')\n\n\n\n# fit_stats below saves some statistics describing how model fitting went\n# the key role of the following line is how it changes my_new_model by fitting to data\nfit_stats = my_new_model.fit_generator(train_generator,\n                                       epochs=2,\n                                       steps_per_epoch=22,\n                                       validation_data=validation_generator,\n                                       validation_steps=1)\n\n#step_4.check()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"filenames = validation_generator.filenames\nnb_samples = len(filenames)\n\npredict = my_new_model.predict_generator(validation_generator,steps = nb_samples)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\npred = np.argmax(predict, axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.metrics import confusion_matrix,accuracy_score\nconfusion_matrix(pred,test_generator.labels)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"accuracy_score(pred,test_generator.labels)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Data Augumentation"},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.python.keras.preprocessing.image import ImageDataGenerator\ndata_generator_with_aug = ImageDataGenerator(preprocessing_function=preprocess_input,\n                                   horizontal_flip=True,\n                                   width_shift_range = 0.2,\n                                   height_shift_range = 0.2)\n\ntrain_generator_aug = data_generator_with_aug.flow_from_directory(\n        'images/train',\n        target_size=(image_size, image_size),\n        batch_size=24,\n        class_mode='categorical')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_generator_no_aug = ImageDataGenerator(preprocessing_function=preprocess_input)\nvalidation_generator_no_aug = data_generator_no_aug.flow_from_directory(\n        'images/val',\n        target_size=(image_size, image_size),\n        class_mode='categorical')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fit_stats = my_new_model.fit_generator(train_generator_aug,\n                                       epochs=2,\n                                       steps_per_epoch=22,\n                                       validation_data=validation_generator_no_aug,\n                                       validation_steps=1)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_datagen = ImageDataGenerator(preprocess_input)\n\ntest_generator = test_datagen.flow_from_directory(\n        'images/val',\n        target_size=(image_size, image_size),\n        color_mode=\"rgb\",\n        shuffle = False,\n        class_mode='categorical',\n        batch_size=1)\n\nfilenames = test_generator.filenames\nnb_samples = len(filenames)\n\npredict = my_new_model.predict_generator(test_generator,steps = nb_samples)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\npred = np.argmax(predict, axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.metrics import confusion_matrix,accuracy_score\nconfusion_matrix(pred,test_generator.labels)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"accuracy_score(pred,test_generator.labels)","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":4}