{"cells":[{"metadata":{},"cell_type":"markdown","source":"# **Import Library**"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import pandas as pd\nimport os\nimport zipfile\nprint(os.listdir(\"../input/dogs-vs-cats\"))\nimport tensorflow as tf\n\n\n#For splitting the dataset in test and val sets\nfrom sklearn.model_selection import train_test_split\n\n#For use of Keras Squence class that allows the load of batches\nfrom skimage.io import imread\nfrom skimage.transform import resize\nimport numpy as np\nimport math\n\n#For plot the images and graphs\n#pd.plotting.register_matplotlib_converters()\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\n#magic function that work much like OS command-line calls\n%matplotlib inline \n#with this backend, the output of plotting commands is displayed inline within frontends like Jupyter notebooks, directly below the code cell that produced it\nimport seaborn as sns\nimport random\n\n#For metrics\nfrom sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\nfrom sklearn.metrics import (precision_recall_curve, PrecisionRecallDisplay)\n\n#For tensorflow dataset\nimport tensorflow_datasets as tfds","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<img src=\"attachment:directory.JPG\" width=\"280px\">","attachments":{"directory.JPG":{"image/jpeg":"/9j/4AAQSkZJRgABAQEAeAB4AAD/4REERXhpZgAATU0AKgAAAAgABAE7AAIAAAATAAAISodpAAQAAAABAAAIXpydAAEAAAAmAAAQ1uocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEdpdWxpYSBFdmFuZ2VsaXN0aQAAAAWQAwACAAAAFAAAEKyQBAACAAAAFAAAEMCSkQACAAAAAzQyAACSkgACAAAAAzQyAADqHAAHAAAIDAAACKAAAAAAHOoAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMDIxOjAyOjI3IDE2OjAwOjEyADIwMjE6MDI6MjcgMTY6MDA6MTIAAABHAGkAdQBsAGkAYQAgAEUAdgBhAG4AZwBlAGwAaQBzAHQAaQAAAP/hCyVodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0n77u/JyBpZD0nVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkJz8+DQo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIj48cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPjx4bXA6Q3JlYXRlRGF0ZT4yMDIxLTAyLTI3VDE2OjAwOjEyLjQxOTwveG1wOkNyZWF0ZURhdGU+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjxkYzpjcmVhdG9yPjxyZGY6U2VxIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpsaT5HaXVsaWEgRXZhbmdlbGlzdGk8L3JkZjpsaT48L3JkZjpTZXE+DQoJCQk8L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PC9yZGY6UkRGPjwveDp4bXBtZXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg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"}}},{"metadata":{},"cell_type":"markdown","source":"# Prepare Training Data"},{"metadata":{},"cell_type":"markdown","source":"# With TFDS"},{"metadata":{"trusted":true},"cell_type":"code","source":"#TFDS - download the data and save it as tfrecord files\n(tfds_train, tfds_test), ds_info = tfds.load(\n    'cats_vs_dogs',\n    split=['train', 'train'],\n    shuffle_files=True, #shuffles files during training\n    as_supervised=True, #memorizes files as tuple rather than dict (default)\n    with_info=True,\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def normalize_img(image, label):\n  \"\"\"Normalizes images: `uint8` -> `float32`.\"\"\"\n  return tf.cast(image, tf.float32) / 255., label\n\ntfds_train = tfds_train.map(\n    normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)\ntfds_train = tfds_train.cache()\ntfds_train = tfds_train.shuffle(ds_info.splits['train'].num_examples)\ntfds_train = tfds_train.batch(128)\ntfds_train = tfds_train.prefetch(tf.data.experimental.AUTOTUNE)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"tfds_test = tfds_test.map(\n    normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)\ntfds_test = tfds_test.batch(128)\ntfds_test = tfds_test.cache()\ntfds_test = tfds_test.prefetch(tf.data.experimental.AUTOTUNE)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# With Keras Sequence"},{"metadata":{"trusted":true},"cell_type":"code","source":"with zipfile.ZipFile(\"../input/dogs-vs-cats/train.zip\",\"r\") as z:\n    z.extractall(\".\")\n\n    \nwith zipfile.ZipFile(\"../input/dogs-vs-cats/test1.zip\",\"r\") as z:\n    z.extractall(\".\")\n    \ntrain_path = \"/kaggle/working/train\"\ntrain_filenames = os.listdir(train_path)\nprint(train_filenames[:5])\n\n\ntrain_labels = []\nfor filename in train_filenames:\n    category = filename.split('.')[0]\n    if category == 'dog':\n        train_labels.append(1)\n    else:\n        train_labels.append(0)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.DataFrame({\n    'filename': [train_path+'/'+filename for filename in train_filenames],\n    'category': train_labels\n})\n\ntype(train_df)\n","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":"train_df.tail()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Reduce the df for do some tests\ntrain_df = train_df[0:12000]\ntrain_df.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df['category'].value_counts().plot.bar()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"As we can see the distributions are balanced."},{"metadata":{},"cell_type":"markdown","source":"# See sample image"},{"metadata":{"trusted":true},"cell_type":"code","source":"w=10\nh=10\nfig=plt.figure(figsize=(12, 12))\ncolumns = 3\nrows = 3\nfor i in range(1, columns*rows +1):\n    sample = imread(train_df['filename'][i])\n    fig.add_subplot(rows, columns, i)\n    plt.imshow(sample)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Splitting in train set e validation set\ntrain_df, valid_df = train_test_split(train_df, test_size=0.2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import tensorflow \nfrom tensorflow.keras import utils\nfrom keras.utils import Sequence\n\n#Use of Keras Sequence for extraction of mini-batches from dataset\nclass DFTOBATCHSequence(Sequence):\n\n    def __init__(self, x_set, y_set, batch_size):\n        self.x, self.y = x_set, y_set\n        self.batch_size = batch_size\n\n    def __len__(self):\n        return math.ceil(len(self.x) / self.batch_size)\n\n# This method __getitem__ returns a batch in numpy array format\n    def __getitem__(self, idx):\n        batch_x = self.x[idx * self.batch_size:(idx + 1) *\n        self.batch_size]\n        batch_y = self.y[idx * self.batch_size:(idx + 1) *\n        self.batch_size]\n\n        return np.array([\n            resize(imread(file_name), (128, 128))\n               for file_name in batch_x]), np.array(batch_y)\n\n    \n    \n#Use of Keras Sequence for extraction labels of mini-batches from dataset\nclass PREDICTSequence(Sequence):\n\n    def __init__(self, x_set, y_set, batch_size):\n        self.x, self.y = x_set, y_set\n        self.batch_size = batch_size\n\n    def __len__(self):\n        return math.ceil(len(self.x) / self.batch_size)\n\n# This method __getitem__ returns a batch in numpy array format without labels\n    def __getitem__(self, idx):\n        batch_x = self.x[idx * self.batch_size:(idx + 1) *\n        self.batch_size]\n        batch_y = self.y[idx * self.batch_size:(idx + 1) *\n        self.batch_size]\n\n        return np.array([\n            resize(imread(file_name), (128, 128))\n               for file_name in batch_x])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_x = train_df.filename\ntrain_y = train_df.category\n\n\nprint(train_y.shape)\ntrain_y = np.asarray(train_y).astype('float32').reshape((-1,1)) \nprint(train_y.shape)\n\nval_x = valid_df.filename\nval_y = valid_df.category\n\n\nprint(val_y.shape)\nval_y = np.asarray(val_y).astype('float32').reshape((-1,1)) \nprint(val_y.shape)\n\nbatch_size = 15\n\nds_train = DFTOBATCHSequence(train_x, train_y, batch_size)\nds_val = DFTOBATCHSequence(val_x, val_y, batch_size)\n\nds_train_ = PREDICTSequence(train_x, train_y, batch_size)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ds_train.__getitem__(0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense, Activation, BatchNormalization\nfrom tensorflow.keras import layers, callbacks\n\nearly_stopping = callbacks.EarlyStopping(\n    min_delta=0.0001, # minimium amount of change to count as an improvement\n    patience=2, # how many epochs to wait before stopping\n    restore_best_weights=True, \n)\n\n\nmodel = Sequential()\n\nmodel.add(Conv2D(32, (3, 3), padding='valid', activation='relu', input_shape=(128, 128, 3)))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Conv2D(64, (3, 3), activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Conv2D(128, (3, 3), activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\n\nmodel.add(Flatten())\nmodel.add(Dense(512, activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(Dropout(0.5))\nmodel.add(Dense(1, activation='sigmoid')) # 1 or 2? because we have cat and dog classes\n\nmodel.compile(loss='binary_crossentropy', optimizer='adam', metrics=['binary_accuracy'])\n\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Method fit is called for 500 epochs on the training dataset and use the callbacks for stop when there is no improvement of val_loss\nhisotry = model.fit(ds_train,\n                    validation_data=ds_val,\n                    epochs=30,\n                    callbacks=[early_stopping], # callbacks are put in a list\n                    )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Evaluation of the model performance\nhistory_frame = pd.DataFrame(hisotry.history)\nhistory_frame.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.lineplot(data=history_frame.loc[:, ['loss', 'val_loss']])\nplt.title(\"Loss Function on training set and validation set\")\nplt.xlabel(\"Epochs\")\n\n#history_frame.loc[:, ['loss', 'val_loss']].plot()\n#history_frame.loc[:, ['binary_accuracy', 'val_binary_accuracy']].plot();","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.lineplot(data=history_frame.loc[:, ['binary_accuracy', 'val_binary_accuracy']])\nplt.title(\"Accuracy on training set and validation set\")\nplt.xlabel(\"Epochs\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Predictions by fitted model\ny_predict = model.predict(ds_train_)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Confusion Matrix\ncm = confusion_matrix(train_y, y_predict.round())\ndisp = ConfusionMatrixDisplay(confusion_matrix=cm)\ndisp.plot() ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Precision and Recall\nprecision, recall, thresholds = precision_recall_curve(train_y, y_predict)\ndisp = PrecisionRecallDisplay(precision=precision, recall=recall)\ndisp.plot()","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}