{"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":"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","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-02-04T12:20:27.022766Z","iopub.execute_input":"2023-02-04T12:20:27.023944Z","iopub.status.idle":"2023-02-04T12:20:27.047891Z","shell.execute_reply.started":"2023-02-04T12:20:27.023829Z","shell.execute_reply":"2023-02-04T12:20:27.046705Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**INSTALL TENSORFLOW**","metadata":{}},{"cell_type":"code","source":"!pip install -U tensorflow==2.0.0\nimport tensorflow as tf\ntf.__version__","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"*Delete output*","metadata":{}},{"cell_type":"code","source":"os.remove(\"/kaggle/working/finalize_dogs_vs_cats\")","metadata":{"execution":{"iopub.status.busy":"2023-02-04T12:29:40.686644Z","iopub.execute_input":"2023-02-04T12:29:40.687035Z","iopub.status.idle":"2023-02-04T12:29:40.712945Z","shell.execute_reply.started":"2023-02-04T12:29:40.687000Z","shell.execute_reply":"2023-02-04T12:29:40.710153Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dogs vs. Cats Dataset Preparation","metadata":{}},{"cell_type":"markdown","source":"**import train folder**","metadata":{}},{"cell_type":"code","source":"import zipfile\npath_to_zip_file = '../input/dogs-vs-cats/train.zip'\nwith zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:\n    zip_ref.extractall('.')","metadata":{"execution":{"iopub.status.busy":"2023-02-04T12:20:50.979561Z","iopub.execute_input":"2023-02-04T12:20:50.980263Z","iopub.status.idle":"2023-02-04T12:21:03.394768Z","shell.execute_reply.started":"2023-02-04T12:20:50.980226Z","shell.execute_reply":"2023-02-04T12:21:03.393805Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Plot Dog and Cat Photos**","metadata":{}},{"cell_type":"code","source":"# plot dog photos from the dogs vs cats dataset\nfrom matplotlib import pyplot\nfrom matplotlib.image import imread\n# define location of dataset\nfolder = 'train/'\n# plot first few images\nfor i in range(9):\n # define subplot\n pyplot.subplot(330 + 1 + i)\n # define filename\n filename = folder + 'dog.' + str(i) + '.jpg'\n # load image pixels\n image = imread(filename)\n # plot raw pixel data\n pyplot.imshow(image)\n# show the figure\npyplot.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-04T12:21:33.541275Z","iopub.execute_input":"2023-02-04T12:21:33.542248Z","iopub.status.idle":"2023-02-04T12:21:34.385251Z","shell.execute_reply.started":"2023-02-04T12:21:33.542197Z","shell.execute_reply":"2023-02-04T12:21:34.384322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plot cat photos from the dogs vs cats dataset\nfrom matplotlib import pyplot\nfrom matplotlib.image import imread\n# define location of dataset\nfolder = 'train/'\n# plot first few images\nfor i in range(9):\n\t# define subplot\n\tpyplot.subplot(330 + 1 + i)\n\t# define filename\n\tfilename = folder + 'cat.' + str(i) + '.jpg'\n\t# load image pixels\n\timage = imread(filename)\n\t# plot raw pixel data\n\tpyplot.imshow(image)\n# show the figure\npyplot.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-04T02:22:28.405632Z","iopub.execute_input":"2023-02-04T02:22:28.406044Z","iopub.status.idle":"2023-02-04T02:22:29.239713Z","shell.execute_reply.started":"2023-02-04T02:22:28.406008Z","shell.execute_reply":"2023-02-04T02:22:29.238822Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Pre-Process Photos into Standard Directories**","metadata":{}},{"cell_type":"code","source":"# organize dataset into a useful structure\nfrom os import makedirs\nfrom os import listdir\nfrom shutil import copyfile\nfrom random import seed\nfrom random import random\n# create directories\ndataset_home = 'dataset_dogs_vs_cats/'\nsubdirs = ['train/', 'test/']\nfor subdir in subdirs:\n\t# create label subdirectories\n\tlabeldirs = ['dogs/', 'cats/']\n\tfor labldir in labeldirs:\n\t\tnewdir = dataset_home + subdir + labldir\n\t\tmakedirs(newdir, exist_ok=True)\n# seed random number generator\nseed(1)\n# define ratio of pictures to use for validation\nval_ratio = 0.25\n# copy training dataset images into subdirectories\nsrc_directory = 'train/'\nfor file in listdir(src_directory):\n\tsrc = src_directory + '/' + file\n\tdst_dir = 'train/'\n\tif random() < val_ratio:\n\t\tdst_dir = 'test/'\n\tif file.startswith('cat'):\n\t\tdst = dataset_home + dst_dir + 'cats/'  + file\n\t\tcopyfile(src, dst)\n\telif file.startswith('dog'):\n\t\tdst = dataset_home + dst_dir + 'dogs/'  + file\n\t\tcopyfile(src, dst)","metadata":{"execution":{"iopub.status.busy":"2023-02-04T12:21:40.534337Z","iopub.execute_input":"2023-02-04T12:21:40.534749Z","iopub.status.idle":"2023-02-04T12:21:43.070441Z","shell.execute_reply.started":"2023-02-04T12:21:40.534714Z","shell.execute_reply":"2023-02-04T12:21:43.069474Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Develop a Baseline CNN Model**","metadata":{}},{"cell_type":"markdown","source":"# ONE Block VGG Model","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd \nfrom keras.preprocessing.image import ImageDataGenerator, load_img\nfrom keras.utils import to_categorical\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt\nimport random\nimport os\nprint(os.listdir(\"../input\"))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# baseline model for the dogs vs cats dataset\nimport sys\nimport numpy as np\nimport pandas as pd \nimport random\nfrom matplotlib import pyplot\nfrom tensorflow.keras.utils import to_categorical\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D\nfrom keras.layers import MaxPooling2D\nfrom keras.layers import Dense\nfrom keras.layers import Flatten\nfrom tensorflow.keras.optimizers import SGD\nfrom keras.preprocessing.image import ImageDataGenerator\n\n# define cnn model\ndef define_model():\n\tmodel = Sequential()\n\tmodel.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(200, 200, 3)))\n\tmodel.add(MaxPooling2D((2, 2)))\n\tmodel.add(Flatten())\n\tmodel.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))\n\tmodel.add(Dense(1, activation='sigmoid'))\n\t# compile model\n\topt = SGD(lr=0.001, momentum=0.9)\n\tmodel.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])\n\treturn model\n\n# plot diagnostic learning curves\ndef summarize_diagnostics(history):\n\t# plot loss\n\tpyplot.subplot(211)\n\tpyplot.title('Cross Entropy Loss')\n\tpyplot.plot(history.history['loss'], color='blue', label='train')\n\tpyplot.plot(history.history['val_loss'], color='orange', label='test')\n\t# plot accuracy\n\tpyplot.subplot(212)\n\tpyplot.title('Classification Accuracy')\n\tpyplot.plot(history.history['accuracy'], color='blue', label='train')\n\tpyplot.plot(history.history['val_accuracy'], color='orange', label='test')\n\t# save plot to file\n\tfilename = sys.argv[0].split('/')[-1]\n\tpyplot.savefig(filename + '_plot.png')\n\tpyplot.close()\n\n# run the test harness for evaluating a model\ndef run_test_harness():\n\t# define model\n\tmodel = define_model()\n\t# create data generator\n\tdatagen = ImageDataGenerator(rescale=1.0/255.0)\n\t# prepare iterators\n\ttrain_it = datagen.flow_from_directory('dataset_dogs_vs_cats/train/',\n\t\tclass_mode='binary', batch_size=64, target_size=(200, 200))\n\ttest_it = datagen.flow_from_directory('dataset_dogs_vs_cats/test/',\n\t\tclass_mode='binary', batch_size=64, target_size=(200, 200))\n\t# fit model\n\thistory = model.fit_generator(train_it, steps_per_epoch=len(train_it),\n\t\tvalidation_data=test_it, validation_steps=len(test_it), epochs=20, verbose=0)\n\t# evaluate model\n\t_, acc = model.evaluate_generator(test_it, steps=len(test_it), verbose=0)\n\tprint('> %.3f' % (acc * 100.0))\n\t# learning curves\n\tsummarize_diagnostics(history)\n\n# entry point, run the test harness\nrun_test_harness()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Two Block VGG Model","metadata":{}},{"cell_type":"code","source":"# baseline model for the dogs vs cats dataset\nimport sys\nimport numpy as np\nimport pandas as pd \nimport random\nfrom matplotlib import pyplot\nfrom tensorflow.keras.utils import to_categorical\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D\nfrom keras.layers import MaxPooling2D\nfrom keras.layers import Dense\nfrom keras.layers import Flatten\nfrom tensorflow.keras.optimizers import SGD\nfrom keras.preprocessing.image import ImageDataGenerator\n\n# define cnn model\ndef define_model():\n\tmodel = Sequential()\n\tmodel.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(200, 200, 3)))\n\tmodel.add(MaxPooling2D((2, 2)))\n\tmodel.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))\n\tmodel.add(MaxPooling2D((2, 2)))\n\tmodel.add(Flatten())\n\tmodel.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))\n\tmodel.add(Dense(1, activation='sigmoid'))\n\t# compile model\n\topt = SGD(lr=0.001, momentum=0.9)\n\tmodel.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])\n\treturn model\n\n# plot diagnostic learning curves\ndef summarize_diagnostics(history):\n\t# plot loss\n\tpyplot.subplot(211)\n\tpyplot.title('Cross Entropy Loss')\n\tpyplot.plot(history.history['loss'], color='blue', label='train')\n\tpyplot.plot(history.history['val_loss'], color='orange', label='test')\n\t# plot accuracy\n\tpyplot.subplot(212)\n\tpyplot.title('Classification Accuracy')\n\tpyplot.plot(history.history['accuracy'], color='blue', label='train')\n\tpyplot.plot(history.history['val_accuracy'], color='orange', label='test')\n\t# save plot to file\n\tfilename = sys.argv[0].split('/')[-1]\n\tpyplot.savefig(filename + '_plot.png')\n\tpyplot.close()\n\n# run the test harness for evaluating a model\ndef run_test_harness():\n\t# define model\n\tmodel = define_model()\n\t# create data generator\n\tdatagen = ImageDataGenerator(rescale=1.0/255.0)\n\t# prepare iterators\n\ttrain_it = datagen.flow_from_directory('dataset_dogs_vs_cats/train/',\n\t\tclass_mode='binary', batch_size=64, target_size=(200, 200))\n\ttest_it = datagen.flow_from_directory('dataset_dogs_vs_cats/test/',\n\t\tclass_mode='binary', batch_size=64, target_size=(200, 200))\n\t# fit model\n\thistory = model.fit_generator(train_it, steps_per_epoch=len(train_it),\n\t\tvalidation_data=test_it, validation_steps=len(test_it), epochs=20, verbose=0)\n\t# evaluate model\n\t_, acc = model.evaluate_generator(test_it, steps=len(test_it), verbose=0)\n\tprint('> %.3f' % (acc * 100.0))\n\t# learning curves\n\tsummarize_diagnostics(history)\n\n# entry point, run the test harness\nrun_test_harness()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Three Block VGG Model","metadata":{}},{"cell_type":"code","source":"# baseline model for the dogs vs cats dataset\nimport sys\nimport numpy as np\nimport pandas as pd \nimport random\nfrom matplotlib import pyplot\nfrom tensorflow.keras.utils import to_categorical\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D\nfrom keras.layers import MaxPooling2D\nfrom keras.layers import Dense\nfrom keras.layers import Flatten\nfrom tensorflow.keras.optimizers import SGD\nfrom keras.preprocessing.image import ImageDataGenerator\n\n# define cnn model\ndef define_model():\n\tmodel = Sequential()\n\tmodel.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(200, 200, 3)))\n\tmodel.add(MaxPooling2D((2, 2)))\n\tmodel.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))\n\tmodel.add(MaxPooling2D((2, 2)))\n\tmodel.add(Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))\n\tmodel.add(MaxPooling2D((2, 2)))\n\tmodel.add(Flatten())\n\tmodel.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))\n\tmodel.add(Dense(1, activation='sigmoid'))\n\t# compile model\n\topt = SGD(lr=0.001, momentum=0.9)\n\tmodel.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])\n\treturn model\n\n# plot diagnostic learning curves\ndef summarize_diagnostics(history):\n\t# plot loss\n\tpyplot.subplot(211)\n\tpyplot.title('Cross Entropy Loss')\n\tpyplot.plot(history.history['loss'], color='blue', label='train')\n\tpyplot.plot(history.history['val_loss'], color='orange', label='test')\n\t# plot accuracy\n\tpyplot.subplot(212)\n\tpyplot.title('Classification Accuracy')\n\tpyplot.plot(history.history['accuracy'], color='blue', label='train')\n\tpyplot.plot(history.history['val_accuracy'], color='orange', label='test')\n\t# save plot to file\n\tfilename = sys.argv[0].split('/')[-1]\n\tpyplot.savefig(filename + '_plot.png')\n\tpyplot.close()\n\n# run the test harness for evaluating a model\ndef run_test_harness():\n\t# define model\n\tmodel = define_model()\n\t# create data generator\n\tdatagen = ImageDataGenerator(rescale=1.0/255.0)\n\t# prepare iterators\n\ttrain_it = datagen.flow_from_directory('dataset_dogs_vs_cats/train/',\n\t\tclass_mode='binary', batch_size=64, target_size=(200, 200))\n\ttest_it = datagen.flow_from_directory('dataset_dogs_vs_cats/test/',\n\t\tclass_mode='binary', batch_size=64, target_size=(200, 200))\n\t# fit model\n\thistory = model.fit_generator(train_it, steps_per_epoch=len(train_it),\n\t\tvalidation_data=test_it, validation_steps=len(test_it), epochs=20, verbose=0)\n\t# evaluate model\n\t_, acc = model.evaluate_generator(test_it, steps=len(test_it), verbose=0)\n\tprint('> %.3f' % (acc * 100.0))\n\t# learning curves\n\tsummarize_diagnostics(history)\n\n# entry point, run the test harness\nrun_test_harness()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Develop Model Improvements\n# Dropout Regularization","metadata":{}},{"cell_type":"code","source":"# baseline model with dropout for the dogs vs cats dataset\nimport sys\nfrom matplotlib import pyplot\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D\nfrom tensorflow.keras.layers import MaxPooling2D\nfrom tensorflow.keras.layers import Dense\nfrom tensorflow.keras.layers import Flatten\nfrom tensorflow.keras.layers import Dropout\nfrom tensorflow.keras.optimizers import SGD\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# define cnn model\ndef define_model():\n\tmodel = Sequential()\n\tmodel.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(200, 200, 3)))\n\tmodel.add(MaxPooling2D((2, 2)))\n\tmodel.add(Dropout(0.2))\n\tmodel.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))\n\tmodel.add(MaxPooling2D((2, 2)))\n\tmodel.add(Dropout(0.2))\n\tmodel.add(Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))\n\tmodel.add(MaxPooling2D((2, 2)))\n\tmodel.add(Dropout(0.2))\n\tmodel.add(Flatten())\n\tmodel.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))\n\tmodel.add(Dropout(0.5))\n\tmodel.add(Dense(1, activation='sigmoid'))\n\t# compile model\n\topt = SGD(lr=0.001, momentum=0.9)\n\tmodel.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])\n\treturn model\n\n# plot diagnostic learning curves\ndef summarize_diagnostics(history):\n\t# plot loss\n\tpyplot.subplot(211)\n\tpyplot.title('Cross Entropy Loss')\n\tpyplot.plot(history.history['loss'], color='blue', label='train')\n\tpyplot.plot(history.history['val_loss'], color='orange', label='test')\n\t# plot accuracy\n\tpyplot.subplot(212)\n\tpyplot.title('Classification Accuracy')\n\tpyplot.plot(history.history['accuracy'], color='blue', label='train')\n\tpyplot.plot(history.history['val_accuracy'], color='orange', label='test')\n\t# save plot to file\n\tfilename = sys.argv[0].split('/')[-1]\n\tpyplot.savefig(filename + '_plot.png')\n\tpyplot.close()\n\n# run the test harness for evaluating a model\ndef run_test_harness():\n\t# define model\n\tmodel = define_model()\n\t# create data generator\n\tdatagen = ImageDataGenerator(rescale=1.0/255.0)\n\t# prepare iterator\n\ttrain_it = datagen.flow_from_directory('dataset_dogs_vs_cats/train/',\n\t\tclass_mode='binary', batch_size=64, target_size=(200, 200))\n\ttest_it = datagen.flow_from_directory('dataset_dogs_vs_cats/test/',\n\t\tclass_mode='binary', batch_size=64, target_size=(200, 200))\n\t# fit model\n\thistory = model.fit_generator(train_it, steps_per_epoch=len(train_it),\n\t\tvalidation_data=test_it, validation_steps=len(test_it), epochs=50, verbose=0)\n\t# evaluate model\n\t_, acc = model.evaluate_generator(test_it, steps=len(test_it), verbose=0)\n\tprint('> %.3f' % (acc * 100.0))\n\t# learning curves\n\tsummarize_diagnostics(history)\n\n# entry point, run the test harness\nrun_test_harness()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Image Data Augmentation","metadata":{}},{"cell_type":"code","source":"# baseline model with data augmentation for the dogs vs cats dataset\nimport sys\nfrom matplotlib import pyplot\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D\nfrom tensorflow.keras.layers import MaxPooling2D\nfrom tensorflow.keras.layers import Dense\nfrom tensorflow.keras.layers import Flatten\nfrom tensorflow.keras.layers import Dropout\nfrom tensorflow.keras.optimizers import SGD\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# define cnn model\ndef define_model():\n\tmodel = Sequential()\n\tmodel.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(200, 200, 3)))\n\tmodel.add(MaxPooling2D((2, 2)))\n\tmodel.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))\n\tmodel.add(MaxPooling2D((2, 2)))\n\tmodel.add(Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))\n\tmodel.add(MaxPooling2D((2, 2)))\n\tmodel.add(Flatten())\n\tmodel.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))\n\tmodel.add(Dense(1, activation='sigmoid'))\n\t# compile model\n\topt = SGD(lr=0.001, momentum=0.9)\n\tmodel.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])\n\treturn model\n\n# plot diagnostic learning curves\ndef summarize_diagnostics(history):\n\t# plot loss\n\tpyplot.subplot(211)\n\tpyplot.title('Cross Entropy Loss')\n\tpyplot.plot(history.history['loss'], color='blue', label='train')\n\tpyplot.plot(history.history['val_loss'], color='orange', label='test')\n\t# plot accuracy\n\tpyplot.subplot(212)\n\tpyplot.title('Classification Accuracy')\n\tpyplot.plot(history.history['accuracy'], color='blue', label='train')\n\tpyplot.plot(history.history['val_accuracy'], color='orange', label='test')\n\t# save plot to file\n\tfilename = sys.argv[0].split('/')[-1]\n\tpyplot.savefig(filename + '_plot.png')\n\tpyplot.close()\n\n# run the test harness for evaluating a model\ndef run_test_harness():\n\t# define model\n\tmodel = define_model()\n\t# create data generators\n\ttrain_datagen = ImageDataGenerator(rescale=1.0/255.0,\n\t\twidth_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True)\n\ttest_datagen = ImageDataGenerator(rescale=1.0/255.0)\n\t# prepare iterators\n\ttrain_it = train_datagen.flow_from_directory('dataset_dogs_vs_cats/train/',\n\t\tclass_mode='binary', batch_size=64, target_size=(200, 200))\n\ttest_it = test_datagen.flow_from_directory('dataset_dogs_vs_cats/test/',\n\t\tclass_mode='binary', batch_size=64, target_size=(200, 200))\n\t# fit model\n\thistory = model.fit_generator(train_it, steps_per_epoch=len(train_it),\n\t\tvalidation_data=test_it, validation_steps=len(test_it), epochs=50, verbose=0)\n\t# evaluate model\n\t_, acc = model.evaluate_generator(test_it, steps=len(test_it), verbose=0)\n\tprint('> %.3f' % (acc * 100.0))\n\t# learning curves\n\tsummarize_diagnostics(history)\n\n# entry point, run the test harness\nrun_test_harness()","metadata":{"execution":{"iopub.status.busy":"2023-02-04T02:23:44.152706Z","iopub.execute_input":"2023-02-04T02:23:44.153446Z","iopub.status.idle":"2023-02-04T05:20:41.977064Z","shell.execute_reply.started":"2023-02-04T02:23:44.153413Z","shell.execute_reply":"2023-02-04T05:20:41.975918Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Explore Transfer Learning","metadata":{}},{"cell_type":"code","source":"# vgg16 model used for transfer learning on the dogs and cats dataset\n\n\nimport sys\nfrom matplotlib import pyplot\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.applications.vgg16 import VGG16\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D\nfrom tensorflow.keras.layers import MaxPooling2D\nfrom tensorflow.keras.layers import Dense\nfrom tensorflow.keras.layers import Flatten\nfrom tensorflow.keras.layers import Dropout\nfrom tensorflow.keras.optimizers import SGD\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# define cnn model\ndef define_model():\n\t# load model\n\tmodel = VGG16(include_top=False, input_shape=(224, 224, 3))\n\t# mark loaded layers as not trainable\n\tfor layer in model.layers:\n\t\tlayer.trainable = False\n\t# add new classifier layers\n\tflat1 = Flatten()(model.layers[-1].output)\n\tclass1 = Dense(128, activation='relu', kernel_initializer='he_uniform')(flat1)\n\toutput = Dense(1, activation='sigmoid')(class1)\n\t# define new model\n\tmodel = Model(inputs=model.inputs, outputs=output)\n\t# compile model\n\topt = SGD(lr=0.001, momentum=0.9)\n\tmodel.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])\n\treturn model\n\n# plot diagnostic learning curves\ndef summarize_diagnostics(history):\n\t# plot loss\n\tpyplot.subplot(211)\n\tpyplot.title('Cross Entropy Loss')\n\tpyplot.plot(history.history['loss'], color='blue', label='train')\n\tpyplot.plot(history.history['val_loss'], color='orange', label='test')\n\t# plot accuracy\n\tpyplot.subplot(212)\n\tpyplot.title('Classification Accuracy')\n\tpyplot.plot(history.history['accuracy'], color='blue', label='train')\n\tpyplot.plot(history.history['val_accuracy'], color='orange', label='test')\n\t# save plot to file\n\tfilename = sys.argv[0].split('/')[-1]\n\tpyplot.savefig(filename + '_plot.png')\n\tpyplot.close()\n\n# run the test harness for evaluating a model\ndef run_test_harness():\n\t# define model\n\tmodel = define_model()\n\t# create data generator\n\tdatagen = ImageDataGenerator(featurewise_center=True)\n\t# specify imagenet mean values for centering\n\tdatagen.mean = [123.68, 116.779, 103.939]\n\t# prepare iterator\n\ttrain_it = datagen.flow_from_directory('dataset_dogs_vs_cats/train/',\n\t\tclass_mode='binary', batch_size=64, target_size=(224, 224))\n\ttest_it = datagen.flow_from_directory('dataset_dogs_vs_cats/test/',\n\t\tclass_mode='binary', batch_size=64, target_size=(224, 224))\n\t# fit model\n\thistory = model.fit_generator(train_it, steps_per_epoch=len(train_it),\n\t\tvalidation_data=test_it, validation_steps=len(test_it), epochs=10, verbose=1)\n\t# evaluate model\n\t_, acc = model.evaluate_generator(test_it, steps=len(test_it), verbose=0)\n\tprint('> %.3f' % (acc * 100.0))\n\t# learning curves\n\tsummarize_diagnostics(history)\n\n# entry point, run the test harness\nrun_test_harness()","metadata":{"execution":{"iopub.status.busy":"2023-02-04T06:13:54.289015Z","iopub.execute_input":"2023-02-04T06:13:54.289379Z","iopub.status.idle":"2023-02-04T06:39:13.536063Z","shell.execute_reply.started":"2023-02-04T06:13:54.289349Z","shell.execute_reply":"2023-02-04T06:39:13.534958Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# How to Finalize the Model and Make Predictions","metadata":{}},{"cell_type":"markdown","source":"# Prepare Final Dataset","metadata":{}},{"cell_type":"code","source":"# organize dataset into a useful structure\nfrom os import makedirs\nfrom os import listdir\nfrom shutil import copyfile\n# create directories\ndataset_home = 'finalize_dogs_vs_cats/'\n# create label subdirectories\nlabeldirs = ['dogs/', 'cats/']\nfor labldir in labeldirs:\n\tnewdir = dataset_home + labldir\n\tmakedirs(newdir, exist_ok=True)\n# copy training dataset images into subdirectories\nsrc_directory = 'train/'\nfor file in listdir(src_directory):\n\tsrc = src_directory + '/' + file\n\tif file.startswith('cat'):\n\t\tdst = dataset_home + 'cats/'  + file\n\t\tcopyfile(src, dst)\n\telif file.startswith('dog'):\n\t\tdst = dataset_home + 'dogs/'  + file\n\t\tcopyfile(src, dst)","metadata":{"execution":{"iopub.status.busy":"2023-02-04T12:31:32.008690Z","iopub.execute_input":"2023-02-04T12:31:32.009062Z","iopub.status.idle":"2023-02-04T12:31:34.588462Z","shell.execute_reply.started":"2023-02-04T12:31:32.009030Z","shell.execute_reply":"2023-02-04T12:31:34.587398Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Save Final Model","metadata":{}},{"cell_type":"code","source":"# save the final model to file\nfrom tensorflow.keras.applications.vgg16 import VGG16\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Dense\nfrom tensorflow.keras.layers import Flatten\nfrom tensorflow.keras.optimizers import SGD\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# define cnn model\ndef define_model():\n\t# load model\n\tmodel = VGG16(include_top=False, input_shape=(224, 224, 3))\n\t# mark loaded layers as not trainable\n\tfor layer in model.layers:\n\t\tlayer.trainable = False\n\t# add new classifier layers\n\tflat1 = Flatten()(model.layers[-1].output)\n\tclass1 = Dense(128, activation='relu', kernel_initializer='he_uniform')(flat1)\n\toutput = Dense(1, activation='sigmoid')(class1)\n\t# define new model\n\tmodel = Model(inputs=model.inputs, outputs=output)\n\t# compile model\n\topt = SGD(lr=0.001, momentum=0.9)\n\tmodel.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])\n\treturn model\n\n# run the test harness for evaluating a model\ndef run_test_harness():\n# define model\n\tmodel = define_model()\n\t# create data generator\n\tdatagen = ImageDataGenerator(featurewise_center=True)\n\t# specify imagenet mean values for centering\n\tdatagen.mean = [123.68, 116.779, 103.939]\n\t# prepare iterator\n\ttrain_it = datagen.flow_from_directory('finalize_dogs_vs_cats/',\n\t\tclass_mode='binary', batch_size=64, target_size=(224, 224))\n\t# fit model\n\tmodel.fit_generator(train_it, steps_per_epoch=len(train_it), epochs=10, verbose=0)\n\t# save model\n\tmodel.save('final_model.h5')\n\n# entry point, run the test harness\nrun_test_harness()","metadata":{"execution":{"iopub.status.busy":"2023-02-04T12:32:59.845123Z","iopub.execute_input":"2023-02-04T12:32:59.845541Z","iopub.status.idle":"2023-02-04T12:58:11.728718Z","shell.execute_reply.started":"2023-02-04T12:32:59.845505Z","shell.execute_reply":"2023-02-04T12:58:11.727615Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Make Prediction","metadata":{}},{"cell_type":"markdown","source":"![sample_image.jpg](attachment:dedd347b-de78-435d-af82-eb69982e6337.jpg)","metadata":{},"attachments":{"dedd347b-de78-435d-af82-eb69982e6337.jpg":{"image/jpeg":"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"}}},{"cell_type":"code","source":"# make a prediction for a new image.\nfrom keras.preprocessing.image import load_img\nfrom keras.preprocessing.image import img_to_array\nfrom keras.models import load_model\n\n# load and prepare the image\ndef load_image(filename):\n\t# load the image\n\timg = load_img(filename, target_size=(224, 224))\n\t# convert to array\n\timg = img_to_array(img)\n\t# reshape into a single sample with 3 channels\n\timg = img.reshape(1, 224, 224, 3)\n\t# center pixel data\n\timg = img.astype('float32')\n\timg = img - [123.68, 116.779, 103.939]\n\treturn img\n\n# load an image and predict the class\ndef run_example():\n\t# load the image\n\timg = load_image('/kaggle/input/simple/sample_image.jpg')\n\t# load model\n\tmodel = load_model('final_model.h5')\n\t# predict the class\n\tresult = model.predict(img)\n\tprint(result[0])\n\n# entry point, run the example\nrun_example()","metadata":{"execution":{"iopub.status.busy":"2023-02-04T13:20:20.765174Z","iopub.execute_input":"2023-02-04T13:20:20.765551Z","iopub.status.idle":"2023-02-04T13:20:21.499211Z","shell.execute_reply.started":"2023-02-04T13:20:20.765520Z","shell.execute_reply":"2023-02-04T13:20:21.498091Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Above Markdown this is Statement Make Prediction ","metadata":{}}]}