{"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":"Hi all! This is a starter kernel of Deep Learning for Computer Vision.","metadata":{}},{"cell_type":"markdown","source":" ![](data:image/jpeg;base64,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)","metadata":{}},{"cell_type":"markdown","source":"# **Importing Libraries**","metadata":{}},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nfrom tensorflow import keras \nfrom tensorflow.keras import layers\nfrom tensorflow.keras.utils import to_categorical\nfrom sklearn.model_selection import train_test_split","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:00:37.784377Z","iopub.execute_input":"2022-01-27T13:00:37.7847Z","iopub.status.idle":"2022-01-27T13:00:43.584945Z","shell.execute_reply.started":"2022-01-27T13:00:37.784614Z","shell.execute_reply":"2022-01-27T13:00:43.5842Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The data is preset in zip files, hence we need to extract the images from the zipfile.","metadata":{}},{"cell_type":"code","source":"%%time\nimport zipfile\nwith zipfile.ZipFile(\"../input/dogs-vs-cats/train.zip\",'r') as z:\n    z.extractall(\".\")\nwith zipfile.ZipFile(\"../input/dogs-vs-cats/test1.zip\",'r') as z:\n    z.extractall(\".\")","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:00:43.588276Z","iopub.execute_input":"2022-01-27T13:00:43.588475Z","iopub.status.idle":"2022-01-27T13:01:00.802903Z","shell.execute_reply.started":"2022-01-27T13:00:43.588451Z","shell.execute_reply":"2022-01-27T13:01:00.801368Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Label training data**","metadata":{}},{"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(str(1))\n    else:\n        categories.append(str(0))\n\ndf = pd.DataFrame({\n    'filename': filenames,\n    'category': categories\n})","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:00.804183Z","iopub.execute_input":"2022-01-27T13:01:00.804429Z","iopub.status.idle":"2022-01-27T13:01:00.851955Z","shell.execute_reply.started":"2022-01-27T13:01:00.804394Z","shell.execute_reply":"2022-01-27T13:01:00.851204Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:00.854138Z","iopub.execute_input":"2022-01-27T13:01:00.854464Z","iopub.status.idle":"2022-01-27T13:01:00.873815Z","shell.execute_reply.started":"2022-01-27T13:01:00.854426Z","shell.execute_reply":"2022-01-27T13:01:00.873137Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"We can see that there are two categories of dogs (1) and cats (0).","metadata":{}},{"cell_type":"code","source":"df[\"category\"].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:00.875786Z","iopub.execute_input":"2022-01-27T13:01:00.87626Z","iopub.status.idle":"2022-01-27T13:01:00.890706Z","shell.execute_reply.started":"2022-01-27T13:01:00.876222Z","shell.execute_reply":"2022-01-27T13:01:00.889809Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The categories are equally divided into two proportions i.e. there are 12500 pictures of each category.","metadata":{}},{"cell_type":"markdown","source":"# **Data Visualization**","metadata":{}},{"cell_type":"code","source":"import random\nfrom keras.preprocessing.image import load_img\nsample = random.choice(filenames)\nimage = load_img(\"/kaggle/working/train/\"+sample)\nplt.imshow(image)","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:00.892382Z","iopub.execute_input":"2022-01-27T13:01:00.892711Z","iopub.status.idle":"2022-01-27T13:01:01.165638Z","shell.execute_reply.started":"2022-01-27T13:01:00.892676Z","shell.execute_reply":"2022-01-27T13:01:01.164988Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Oh wow! Such a cute dog!","metadata":{}},{"cell_type":"markdown","source":"# **Split into Train and Validation sets**","metadata":{}},{"cell_type":"code","source":"x_train, x_val = train_test_split(df, test_size=0.2, random_state=2)","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:01.166595Z","iopub.execute_input":"2022-01-27T13:01:01.166821Z","iopub.status.idle":"2022-01-27T13:01:01.178382Z","shell.execute_reply.started":"2022-01-27T13:01:01.166789Z","shell.execute_reply":"2022-01-27T13:01:01.177664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train.head(), x_val.head()","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:01.179577Z","iopub.execute_input":"2022-01-27T13:01:01.179912Z","iopub.status.idle":"2022-01-27T13:01:01.189584Z","shell.execute_reply.started":"2022-01-27T13:01:01.179877Z","shell.execute_reply":"2022-01-27T13:01:01.188848Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"We can see that the index are not ordered, let's try to change them.","metadata":{}},{"cell_type":"code","source":"x_train = x_train.reset_index(drop=True)\nx_val = x_val.reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:01.191201Z","iopub.execute_input":"2022-01-27T13:01:01.191759Z","iopub.status.idle":"2022-01-27T13:01:01.197313Z","shell.execute_reply.started":"2022-01-27T13:01:01.191723Z","shell.execute_reply":"2022-01-27T13:01:01.196535Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train.head(), x_val.head()","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:01.200973Z","iopub.execute_input":"2022-01-27T13:01:01.201286Z","iopub.status.idle":"2022-01-27T13:01:01.211816Z","shell.execute_reply.started":"2022-01-27T13:01:01.201255Z","shell.execute_reply":"2022-01-27T13:01:01.210785Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(x_train.shape)\nprint(x_val.shape)","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:01.213222Z","iopub.execute_input":"2022-01-27T13:01:01.213473Z","iopub.status.idle":"2022-01-27T13:01:01.218942Z","shell.execute_reply.started":"2022-01-27T13:01:01.21344Z","shell.execute_reply":"2022-01-27T13:01:01.217865Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Data Preprocessing**","metadata":{}},{"cell_type":"markdown","source":"As you already know by now, data should be formatted into appropriately pre-processed\nfloating point tensors before being fed into our network. Currently, our data sits on a\ndrive as JPEG files, so the steps for getting it into our network are roughly:\n\n* Read the picture files.\n* Decode the JPEG content to RBG grids of pixels.\n* Convert these into floating point tensors.\n* Rescale the pixel values (between 0 and 255) to the [0,1] interval (as you know, neural\nnetworks prefer to deal with small input values).\n\nThe saviour for this task is keras!!","metadata":{}},{"cell_type":"markdown","source":"# **Data Augmentation**","metadata":{}},{"cell_type":"markdown","source":"Overfitting is caused by having too few samples to learn from, rendering us unable to\ntrain a model able to generalize to new data. Given infinite data, our model would be\nexposed to every possible aspect of the data distribution at hand: we would never overfit.\nData augmentation takes the approach of generating more training data from existing\ntraining samples, by \"augmenting\" the samples via a number of random transformations\nthat yield believable-looking images. The goal is that at training time, our model would\nnever see the exact same picture twice. This helps the model get exposed to more aspects\nof the data and generalize better.","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\ntrain_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    rescale=1./255)\n\n\nvalid_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    rescale=1./255)","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:01.220701Z","iopub.execute_input":"2022-01-27T13:01:01.221277Z","iopub.status.idle":"2022-01-27T13:01:01.229628Z","shell.execute_reply.started":"2022-01-27T13:01:01.221241Z","shell.execute_reply":"2022-01-27T13:01:01.228949Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Let’s quickly go over what we just wrote:\n\n1. rotation_range is a value in degrees (0-180), a range within which to randomly rotate\npictures.\n2. width_shift and height_shift are ranges (as a fraction of total width or height)\nwithin which to randomly translate pictures vertically or horizontally.\n3. shear_range is for randomly applying shearing transformations.\n4. zoom_range is for randomly zooming inside pictures.\n5. horizontal_flip is for randomly flipping half of the images horizontally—relevant\nwhen there are no assumptions of horizontal asymmetry (e.g. real-world pictures).\n6. fill_mode is the strategy used for filling in newly created pixels, which can appear after\na rotation or a width/height shift.","metadata":{}},{"cell_type":"markdown","source":"Let's see augmented image!","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.preprocessing import image\nfnames = [os.path.join('/kaggle/working/train', filename) for filename in os.listdir('/kaggle/working/train')]\nimg_path = fnames[3]\n\nimg = image.load_img(img_path, target_size=(128, 128))\nx = image.img_to_array(img)\nx = x.reshape((1,) + x.shape)\n\ni = 0\nfor batch in train_datagen.flow(x, batch_size=1):\n plt.figure(i)\n imgplot = plt.imshow(image.array_to_img(batch[0]))\n i += 1\n if i % 4 == 0:\n        break\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:01.232553Z","iopub.execute_input":"2022-01-27T13:01:01.232749Z","iopub.status.idle":"2022-01-27T13:01:02.104041Z","shell.execute_reply.started":"2022-01-27T13:01:01.232726Z","shell.execute_reply":"2022-01-27T13:01:02.103292Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Looks like cat is waiting for someone! Hahaha!!","metadata":{}},{"cell_type":"code","source":"train_generator = train_datagen.flow_from_dataframe(\n    x_train,\n    \"/kaggle/working/train/\", \n    x_col='filename',\n    y_col='category',\n    target_size=(128,128),\n    class_mode='categorical',\n    batch_size=15\n )\n\nvalid_generator = valid_datagen.flow_from_dataframe( \n    x_val,\n    \"/kaggle/working/train/\", \n    x_col='filename',\n    y_col='category',\n    target_size=(128,128),\n    class_mode='categorical',\n    batch_size=15\n )","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:02.105205Z","iopub.execute_input":"2022-01-27T13:01:02.105838Z","iopub.status.idle":"2022-01-27T13:01:02.356291Z","shell.execute_reply.started":"2022-01-27T13:01:02.105783Z","shell.execute_reply":"2022-01-27T13:01:02.355572Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Let's see the shape.","metadata":{}},{"cell_type":"code","source":"for data_batch, labels_batch in train_generator:\n    print('data batch shape:', data_batch.shape)\n    print('labels batch shape:', labels_batch.shape)\n    break","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:02.357701Z","iopub.execute_input":"2022-01-27T13:01:02.357962Z","iopub.status.idle":"2022-01-27T13:01:02.447618Z","shell.execute_reply.started":"2022-01-27T13:01:02.357929Z","shell.execute_reply":"2022-01-27T13:01:02.446891Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Here the shape of data batch is (15, 128, 128, 3), where 15 is the number of samples in each batch, 128 * 128 refers to the height and width of the image and 3 refers to the RGB.","metadata":{}},{"cell_type":"code","source":"for data_batch, labels_batch in valid_generator:\n    print('data batch shape:', data_batch.shape)\n    print('labels batch shape:', labels_batch.shape)\n    break","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:02.448807Z","iopub.execute_input":"2022-01-27T13:01:02.44955Z","iopub.status.idle":"2022-01-27T13:01:02.537097Z","shell.execute_reply.started":"2022-01-27T13:01:02.449511Z","shell.execute_reply":"2022-01-27T13:01:02.536252Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **CNN Model**","metadata":{}},{"cell_type":"code","source":"model = keras.models.Sequential([\n                         keras.layers.Conv2D(filters=64, kernel_size=3, strides=(1,1), padding='valid',activation= 'relu', input_shape=(128,128,3)),\n                         keras.layers.MaxPooling2D(pool_size=(2,2)),\n                         keras.layers.Conv2D(filters=128, kernel_size=3, strides=(2,2), padding='same', activation='relu'),\n                         keras.layers.MaxPooling2D(pool_size=(2,2)),\n                         keras.layers.Conv2D(filters=64, kernel_size=3, strides=(2,2), padding='same', activation='relu'),\n                         keras.layers.MaxPooling2D(pool_size=(2,2)),\n                         keras.layers.Flatten(),\n                         keras.layers.Dense(units=128, activation='relu'),\n                         keras.layers.Dropout(0.25),\n                         keras.layers.Dense(units=256, activation='relu'),\n                         keras.layers.Dropout(0.5),\n                         keras.layers.Dense(units=256, activation='relu'),\n                         keras.layers.Dropout(0.25),                        \n                         keras.layers.Dense(units=128, activation='relu'),\n                         keras.layers.Dropout(0.10),                         \n                         keras.layers.Dense(units=2, activation='softmax')\n])\n","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:02.538447Z","iopub.execute_input":"2022-01-27T13:01:02.538784Z","iopub.status.idle":"2022-01-27T13:01:05.136803Z","shell.execute_reply.started":"2022-01-27T13:01:02.538746Z","shell.execute_reply":"2022-01-27T13:01:05.136074Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:05.137921Z","iopub.execute_input":"2022-01-27T13:01:05.138357Z","iopub.status.idle":"2022-01-27T13:01:05.152059Z","shell.execute_reply.started":"2022-01-27T13:01:05.138319Z","shell.execute_reply":"2022-01-27T13:01:05.151357Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Compile Model**","metadata":{}},{"cell_type":"code","source":"model.compile(loss='categorical_crossentropy',\n optimizer=\"adam\",\n metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:05.152947Z","iopub.execute_input":"2022-01-27T13:01:05.153129Z","iopub.status.idle":"2022-01-27T13:01:05.16725Z","shell.execute_reply.started":"2022-01-27T13:01:05.153105Z","shell.execute_reply":"2022-01-27T13:01:05.166436Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Fit Model**","metadata":{}},{"cell_type":"code","source":"history = model.fit(train_generator, epochs=30, verbose=1, validation_data=valid_generator)","metadata":{"execution":{"iopub.status.busy":"2022-01-27T13:01:05.168876Z","iopub.execute_input":"2022-01-27T13:01:05.169378Z","iopub.status.idle":"2022-01-27T14:13:57.928745Z","shell.execute_reply.started":"2022-01-27T13:01:05.169341Z","shell.execute_reply":"2022-01-27T14:13:57.928049Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Save Model**","metadata":{}},{"cell_type":"code","source":"model.save('cats_and_dogs_2.h5')","metadata":{"execution":{"iopub.status.busy":"2022-01-27T14:13:57.930098Z","iopub.execute_input":"2022-01-27T14:13:57.930353Z","iopub.status.idle":"2022-01-27T14:13:57.990145Z","shell.execute_reply.started":"2022-01-27T14:13:57.930319Z","shell.execute_reply":"2022-01-27T14:13:57.989414Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Plots Between Accuracy and Loss**","metadata":{}},{"cell_type":"code","source":"history.history.keys()","metadata":{"execution":{"iopub.status.busy":"2022-01-27T14:13:57.991204Z","iopub.execute_input":"2022-01-27T14:13:57.991934Z","iopub.status.idle":"2022-01-27T14:13:57.996529Z","shell.execute_reply.started":"2022-01-27T14:13:57.991905Z","shell.execute_reply":"2022-01-27T14:13:57.995886Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nacc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\nloss = history.history['loss']\nval_loss = history.history['val_loss']\nepochs = range(1, len(acc) + 1)\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()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-27T14:14:40.99124Z","iopub.execute_input":"2022-01-27T14:14:40.99153Z","iopub.status.idle":"2022-01-27T14:14:41.387887Z","shell.execute_reply.started":"2022-01-27T14:14:40.991498Z","shell.execute_reply":"2022-01-27T14:14:41.387143Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Conclusion**","metadata":{}},{"cell_type":"markdown","source":"We can see that with the number of epochs the training as well as validation accuracy increases and hence after using data augmentation we have prevented overfitting. And the loss also increases as the number of epochs increases.\n\nIf you find my work helpful, please upvote! Open for criticism!!\n\nThanks You!","metadata":{}}]}