{"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\n\nOnly pick up 1000 images to train the CNN model.","metadata":{}},{"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)\nimport cv2\nimport matplotlib.pyplot as plt\nfrom matplotlib import image\nimport seaborn as sns\nimport os\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.model_selection import train_test_split\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","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-04-19T12:49:53.933887Z","iopub.execute_input":"2023-04-19T12:49:53.934269Z","iopub.status.idle":"2023-04-19T12:49:55.456007Z","shell.execute_reply.started":"2023-04-19T12:49:53.934236Z","shell.execute_reply":"2023-04-19T12:49:55.454755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Loading images","metadata":{}},{"cell_type":"code","source":"# !unzip /kaggle/input/dogs-vs-cats/train.zip\n# !unzip /kaggle/input/dogs-vs-cats/test1.zip\n\nfrom zipfile import ZipFile\n\nzf = ZipFile('/kaggle/input/dogs-vs-cats/test1.zip', 'r')\nzf.extractall('/kaggle/working')\nzf.close()\n\nzf = ZipFile('/kaggle/input/dogs-vs-cats/train.zip', 'r')\nzf.extractall('/kaggle/working')\nzf.close()","metadata":{"_kg_hide-output":false,"_kg_hide-input":false,"execution":{"iopub.status.busy":"2023-04-19T12:49:55.458301Z","iopub.execute_input":"2023-04-19T12:49:55.458993Z","iopub.status.idle":"2023-04-19T12:50:12.755539Z","shell.execute_reply.started":"2023-04-19T12:49:55.458953Z","shell.execute_reply":"2023-04-19T12:50:12.754371Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os, shutil\n\noriginal_dataset_dir = '/kaggle/working/train' \ntrain_place = '/kaggle/working' \nbase_dir = os.path.join(train_place, 'class')\nos.mkdir(base_dir)\ntrain_dir = os.path.join(base_dir, 'train')\nos.mkdir(train_dir)\nvalidation_dir = os.path.join(base_dir, 'validation') \nos.mkdir(validation_dir)\ntest_dir = os.path.join(base_dir, 'test')\nos.mkdir(test_dir)","metadata":{"execution":{"iopub.status.busy":"2023-04-19T12:50:12.757538Z","iopub.execute_input":"2023-04-19T12:50:12.757975Z","iopub.status.idle":"2023-04-19T12:50:12.766036Z","shell.execute_reply.started":"2023-04-19T12:50:12.757934Z","shell.execute_reply":"2023-04-19T12:50:12.764715Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_cats_dir = os.path.join(train_dir, 'cats') \nos.mkdir(train_cats_dir)\ntrain_dogs_dir = os.path.join(train_dir, 'dogs') \nos.mkdir(train_dogs_dir)\nvalidation_cats_dir = os.path.join(validation_dir, 'cats') \nos.mkdir(validation_cats_dir)\nvalidation_dogs_dir = os.path.join(validation_dir, 'dogs') \nos.mkdir(validation_dogs_dir)\ntest_cats_dir = os.path.join(test_dir, 'cats') \nos.mkdir(test_cats_dir)\ntest_dogs_dir = os.path.join(test_dir, 'dogs') \nos.mkdir(test_dogs_dir)","metadata":{"execution":{"iopub.status.busy":"2023-04-19T12:50:12.767533Z","iopub.execute_input":"2023-04-19T12:50:12.768599Z","iopub.status.idle":"2023-04-19T12:50:12.782847Z","shell.execute_reply.started":"2023-04-19T12:50:12.768562Z","shell.execute_reply":"2023-04-19T12:50:12.781695Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fnames = ['cat.{}.jpg'.format(i) for i in range(1000)] \nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname) \n    dst = os.path.join(train_cats_dir, fname) \n    shutil.copyfile(src, dst)\n    \nfnames = ['cat.{}.jpg'.format(i) for i in range(1000, 1500)] \nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname) \n    dst = os.path.join(validation_cats_dir, fname) \n    shutil.copyfile(src, dst)\n    \nfnames = ['cat.{}.jpg'.format(i) for i in range(1500, 2000)] \nfor fname in fnames:\n        src = os.path.join(original_dataset_dir, fname) \n        dst = os.path.join(test_cats_dir, fname) \n        shutil.copyfile(src, dst)\n        \nfnames = ['dog.{}.jpg'.format(i) for i in range(1000)] \nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname) \n    dst = os.path.join(train_dogs_dir, fname) \n    shutil.copyfile(src, dst)\n    \nfnames = ['dog.{}.jpg'.format(i) for i in range(1000, 1500)] \nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname) \n    dst = os.path.join(validation_dogs_dir, fname) \n    shutil.copyfile(src, dst)\n\nfnames = ['dog.{}.jpg'.format(i) for i in range(1500, 2000)] \nfor fname in fnames:\n    src = os.path.join(original_dataset_dir, fname) \n    dst = os.path.join(test_dogs_dir, fname) \n    shutil.copyfile(src, dst)","metadata":{"execution":{"iopub.status.busy":"2023-04-19T12:50:12.785801Z","iopub.execute_input":"2023-04-19T12:50:12.786266Z","iopub.status.idle":"2023-04-19T12:50:13.204105Z","shell.execute_reply.started":"2023-04-19T12:50:12.786221Z","shell.execute_reply":"2023-04-19T12:50:13.202909Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('total training cat images:', len(os.listdir(train_cats_dir)))\nprint('total training dog images:', len(os.listdir(train_dogs_dir)))\nprint('total validation cat images:', len(os.listdir(validation_cats_dir)))\nprint('total validation dog images:', len(os.listdir(validation_dogs_dir)))\nprint('total test cat images:', len(os.listdir(test_cats_dir)))\nprint('total test dog images:', len(os.listdir(test_dogs_dir)))","metadata":{"execution":{"iopub.status.busy":"2023-04-19T12:50:13.205464Z","iopub.execute_input":"2023-04-19T12:50:13.205892Z","iopub.status.idle":"2023-04-19T12:50:13.218704Z","shell.execute_reply.started":"2023-04-19T12:50:13.205849Z","shell.execute_reply":"2023-04-19T12:50:13.216940Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras import layers\nfrom keras import models\n\ndef build_model():\n    \n    model = models.Sequential()\n    \n    model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3))) \n    model.add(layers.MaxPooling2D((2, 2))) \n    model.add(layers.Conv2D(64, (3, 3), activation='relu')) \n    model.add(layers.MaxPooling2D((2, 2))) \n    model.add(layers.Conv2D(128, (3, 3), activation='relu')) \n    model.add(layers.MaxPooling2D((2, 2))) \n    model.add(layers.Conv2D(128, (3, 3), activation='relu')) \n    model.add(layers.MaxPooling2D((2, 2))) \n    model.add(layers.Flatten())\n    model.add(layers.Dense(512, activation='relu')) \n    model.add(layers.Dense(1, activation='sigmoid'))\n    \n    return model","metadata":{"execution":{"iopub.status.busy":"2023-04-19T12:50:13.220539Z","iopub.execute_input":"2023-04-19T12:50:13.221398Z","iopub.status.idle":"2023-04-19T12:50:13.232517Z","shell.execute_reply.started":"2023-04-19T12:50:13.221368Z","shell.execute_reply":"2023-04-19T12:50:13.231055Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = build_model()\nmodel.summary()\n\n# 3 * 3 * 32 * 3(r, g, b) = # 896\n# 3 * 3 * 64 * 32 + 64 = # 18496\n# 3 * 3 * 128 * 64 + 128 = # 73856\n# 3 * 3 * 128 * 128 + 128 = # 147584\n# 7 * 7 * 128 * 512 + 512 = # 3211776","metadata":{"execution":{"iopub.status.busy":"2023-04-19T12:50:13.234430Z","iopub.execute_input":"2023-04-19T12:50:13.234820Z","iopub.status.idle":"2023-04-19T12:50:13.350952Z","shell.execute_reply.started":"2023-04-19T12:50:13.234767Z","shell.execute_reply":"2023-04-19T12:50:13.350156Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras import optimizers \n\nmodel.compile(\n    loss='binary_crossentropy',\n    optimizer=optimizers.RMSprop(learning_rate=1e-4), \n    metrics=['acc']\n)","metadata":{"execution":{"iopub.status.busy":"2023-04-19T12:50:13.351954Z","iopub.execute_input":"2023-04-19T12:50:13.352299Z","iopub.status.idle":"2023-04-19T12:50:13.373496Z","shell.execute_reply.started":"2023-04-19T12:50:13.352261Z","shell.execute_reply":"2023-04-19T12:50:13.372691Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator \n\ntrain_datagen = ImageDataGenerator(rescale=1./255) \ntest_datagen = ImageDataGenerator(rescale=1./255) \n\ntrain_generator = train_datagen.flow_from_directory(\n    train_dir, \n    target_size=(150, 150),\n    batch_size=20, \n    class_mode='binary'\n)\n\nvalidation_generator = test_datagen.flow_from_directory( \n    validation_dir,\n    target_size=(150, 150), \n    batch_size=20, \n    class_mode='binary'\n)","metadata":{"execution":{"iopub.status.busy":"2023-04-19T12:50:13.374683Z","iopub.execute_input":"2023-04-19T12:50:13.375050Z","iopub.status.idle":"2023-04-19T12:50:13.599956Z","shell.execute_reply.started":"2023-04-19T12:50:13.375013Z","shell.execute_reply":"2023-04-19T12:50:13.598822Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for data_batch, labels_batch in train_generator:\n    \n    print('data batch shape:', data_batch.shape)\n    print('labels batch shape:', labels_batch.shape)\n    break","metadata":{"execution":{"iopub.status.busy":"2023-04-19T12:50:13.603922Z","iopub.execute_input":"2023-04-19T12:50:13.604295Z","iopub.status.idle":"2023-04-19T12:50:13.686445Z","shell.execute_reply.started":"2023-04-19T12:50:13.604265Z","shell.execute_reply":"2023-04-19T12:50:13.685107Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(\n    train_generator,\n    steps_per_epoch=100,\n    epochs=30, \n    validation_data=validation_generator, \n    validation_steps=50,\n)","metadata":{"execution":{"iopub.status.busy":"2023-04-19T12:50:13.689680Z","iopub.execute_input":"2023-04-19T12:50:13.691074Z","iopub.status.idle":"2023-04-19T12:51:04.615156Z","shell.execute_reply.started":"2023-04-19T12:50:13.691021Z","shell.execute_reply":"2023-04-19T12:51:04.613182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('/kaggle/working/cats_and_dogs_small_1.h5')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nacc = history.history['acc']\nval_acc = history.history['val_acc']\nloss = history.history['loss']\nval_loss = history.history['val_loss']\nepochs = range(1, len(acc) + 1)\n\nplt.plot(epochs, acc, 'bo', label='Training acc') \nplt.plot(epochs, val_acc, 'b', label='Validation acc') \nplt.title('Training and validation accuracy') \nplt.legend()\nplt.figure()\nplt.plot(epochs, loss, 'bo', label='Training loss') \nplt.plot(epochs, val_loss, 'b', label='Validation loss') \nplt.title('Training and validation loss')\nplt.legend()\n\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datagen = ImageDataGenerator( \n    rotation_range=40,\n    width_shift_range=0.2, \n    height_shift_range=0.2, \n    shear_range=0.2, \n    zoom_range=0.2, \n    horizontal_flip=True, \n    fill_mode='nearest',\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Using data augmentation","metadata":{}},{"cell_type":"code","source":"\"\"\"\nfrom keras.preprocessing import image\n\nAttributeError: module 'keras.preprocessing.image' has no attribute 'load_img'\n\"\"\"\n\nimport keras.utils as image\n\n\nfnames = [os.path.join(train_cats_dir, fname) for fname in os.listdir(train_cats_dir)]\nimg_path = fnames[3]\nimg = image.load_img(img_path, target_size=(150, 150))\nx = image.img_to_array(img)\nx = x.reshape((1,) + x.shape)\ni = 0\n\nfor batch in datagen.flow(x, batch_size=1):\n    plt.figure(i)\n    imgplot = plt.imshow(image.array_to_img(batch[0])) \n    i += 1\n\n    if i % 4 == 0:\n        break\n    \nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def build_model_with_dropout():\n\n    model = models.Sequential() \n    model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3))) \n    model.add(layers.MaxPooling2D((2, 2)))\n    model.add(layers.Conv2D(64, (3, 3), activation='relu')) \n    model.add(layers.MaxPooling2D((2, 2))) \n    model.add(layers.Conv2D(128, (3, 3), activation='relu')) \n    model.add(layers.MaxPooling2D((2, 2))) \n    model.add(layers.Conv2D(128, (3, 3), activation='relu')) \n    model.add(layers.MaxPooling2D((2, 2))) \n    model.add(layers.Flatten()) \n    model.add(layers.Dropout(0.5)) \n    model.add(layers.Dense(512, activation='relu')) \n    model.add(layers.Dense(1, activation='sigmoid')) \n    model.compile(\n        loss='binary_crossentropy',\n        optimizer=optimizers.RMSprop(learning_rate=1e-4), \n        metrics=['acc']\n    )\n    \n    return model","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = build_model_with_dropout()\nmodel.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator( \n    rescale=1./255,\n    rotation_range=40, \n    width_shift_range=0.2, \n    height_shift_range=0.2, \n    shear_range=0.2, \n    zoom_range=0.2, \n    horizontal_flip=True,\n)\ntest_datagen = ImageDataGenerator(rescale=1./255) \n\ntrain_generator = train_datagen.flow_from_directory(\n    train_dir, \n    target_size=(150, 150), \n    batch_size=32, \n    class_mode='binary'\n)\n\nvalidation_generator = test_datagen.flow_from_directory( \n    validation_dir,\n    target_size=(150, 150),\n    batch_size=32,\n    class_mode='binary',\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit( \n    train_generator,\n    steps_per_epoch=100,\n    epochs=100, \n    validation_data=validation_generator, \n    validation_steps=50\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('/kaggle/working/cats_and_dogs_small_2.h5')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nacc = history.history['acc']\nval_acc = history.history['val_acc']\nloss = history.history['loss']\nval_loss = history.history['val_loss']\nepochs = range(1, len(acc) + 1)\n\nplt.plot(epochs, acc, 'bo', label='Training acc') \nplt.plot(epochs, val_acc, 'b', label='Validation acc') \nplt.title('Training and validation accuracy') \nplt.legend()\nplt.figure()\nplt.plot(epochs, loss, 'bo', label='Training loss') \nplt.plot(epochs, val_loss, 'b', label='Validation loss') \nplt.title('Training and validation loss')\nplt.legend()\n\nplt.show()","metadata":{},"execution_count":null,"outputs":[]}]}