{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\n\nfrom tqdm import tqdm\nfrom shutil import copyfile\nimport zipfile\nimport os\nimport shutil","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"with zipfile.ZipFile('../input/dogs-vs-cats/train.zip','r') as zip_ref:\n    zip_ref.extractall('./')\n    \nwith zipfile.ZipFile('../input/dogs-vs-cats/test1.zip','r') as zip_ref:\n    zip_ref.extractall('./')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.makedirs('./PetImages')\nos.makedirs('./PetImages/Cat')\nos.makedirs('./PetImages/Dog')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"src_path = './train/'\n\n# seed(1)\n# val_ratio = 0.25\n\nfor file in tqdm(os.listdir(src_path)):\n    src = src_path + file\n    \n    dest_dir = './PetImages/'\n        \n    if file.startswith('cat'):\n        dest = dest_dir + 'Cat/' + file\n        copyfile(src,dest)\n    else:\n        dest = dest_dir + 'Dog/' + file\n        copyfile(src,dest)\n    \nshutil.rmtree('train')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image_size = (180,180)\nbatch_size = 32\n\ntrain_ds = tf.keras.preprocessing.image_dataset_from_directory(\n    \"PetImages\",\n    validation_split = 0.2,\n    subset = 'training',\n    seed = 1337,\n    image_size = image_size,\n    batch_size = batch_size\n)\n\nval_ds = tf.keras.preprocessing.image_dataset_from_directory(\n    \"PetImages\",\n    validation_split = 0.2,\n    subset = 'validation',\n    seed = 1337,\n    image_size = image_size,\n    batch_size = batch_size\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize =(10,15))\nfor images,labels in train_ds.take(1):\n    for i in range(9):\n        ax = plt.subplot(3,3,i+1)\n        plt.imshow(images[i].numpy().astype('uint8'))\n        plt.title(int(labels[i]))\n        plt.axis('off')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_augmentation = keras.Sequential([\n    layers.experimental.preprocessing.RandomFlip('horizontal'),\n    layers.experimental.preprocessing.RandomRotation(0.1),\n])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize = (10,10))\nfor images, _ in train_ds.take(1):\n    for i in range(9):\n        augmented_images = data_augmentation(images)\n        ax = plt.subplot(3,3,i+1)\n        plt.imshow(augmented_images[0].numpy().astype('uint8'))\n        plt.axis('off')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_ds = train_ds.prefetch(buffer_size=32)\nval_ds = val_ds.prefetch(buffer_size = 32)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_model(input_shape,num_classes):\n    inputs = keras.Input(shape = input_shape)\n    #Image Augmentation Block\n    x = data_augmentation(inputs)\n    \n    #Entry block\n    x = layers.experimental.preprocessing.Rescaling(1.0/255)(x)\n    x = layers.Conv2D(32,3,strides=2,padding='same')(x)\n    x = layers.BatchNormalization()(x)\n    x = layers.Activation('relu')(x)\n    \n    x = layers.Conv2D(64,3,padding = 'same')(x)\n    x = layers.BatchNormalization()(x)\n    x = layers.Activation('relu')(x)\n    \n    previous_block_activation = x #Set Aside Residual\n    \n    for size in [128,256,512,728]:\n        x = layers.Activation('relu')(x)\n        x = layers.SeparableConv2D(size, 3, padding = 'same')(x)\n        x = layers.BatchNormalization()(x)\n        \n        x = layers.Activation('relu')(x)\n        x = layers.SeparableConv2D(size, 3, padding = 'same')(x)\n        x = layers.BatchNormalization()(x)\n        \n        x = layers.MaxPooling2D(3, strides = 2, padding = 'same')(x)\n        \n        #Project Residual\n        residual = layers.Conv2D(size, 1, strides = 2, padding = 'same')(previous_block_activation)\n        x = layers.add([x,residual])\n        previous_block_activation = x #Setting Aside next residual\n    \n    x = layers.SeparableConv2D(1024,3,padding='same')(x)\n    x = layers.BatchNormalization()(x)\n    x = layers.Activation('relu')(x)\n    \n    x = layers.GlobalAveragePooling2D()(x)\n    if num_classes == 2:\n        activation = 'sigmoid'\n        units = 1\n    else:\n        activation = 'softmax'\n        units = num_classes\n        \n    x = layers.Dropout(0.5)(x)\n    outputs = layers.Dense(units, activation = activation)(x)\n    \n    return keras.Model(inputs,outputs)\n    \nmodel = make_model(input_shape=image_size + (3,), num_classes=2)\nkeras.utils.plot_model(model, show_shapes=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"epochs = 25\n\nmodel.compile(\n    optimizer = keras.optimizers.Adam(1e-3),\n    loss = 'binary_crossentropy',\n    metrics = ['accuracy']\n)\n\nmodel.fit( \n    train_ds,\n    epochs = epochs,\n    validation_data= val_ds\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.evaluate(val_ds)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img = keras.preprocessing.image.load_img(\n    \"PetImages/Cat/cat.0.jpg\", target_size=image_size\n)\nimg_array = keras.preprocessing.image.img_to_array(img)\nimg_array = tf.expand_dims(img_array, 0)  # Create batch axis\nplt.imshow(plt.imread('PetImages/Cat/cat.0.jpg'))\nplt.axis('off')\npredictions = model.predict(img_array)\nscore = predictions[0]\nprint(\n    \"This image is %.2f percent cat and %.2f percent dog.\"\n    % (100 * (1 - score), 100 * score)\n)","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}