{"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":"2022-06-27T04:04:07.795257Z","iopub.execute_input":"2022-06-27T04:04:07.795904Z","iopub.status.idle":"2022-06-27T04:04:07.804143Z","shell.execute_reply.started":"2022-06-27T04:04:07.795867Z","shell.execute_reply":"2022-06-27T04:04:07.803376Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!unzip '/kaggle/input/dogs-vs-cats-redux-kernels-edition/train.zip' >&NULL\n!unzip '/kaggle/input/dogs-vs-cats-redux-kernels-edition/test.zip' >&NULL","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:04:08.071369Z","iopub.execute_input":"2022-06-27T04:04:08.072061Z","iopub.status.idle":"2022-06-27T04:04:25.118852Z","shell.execute_reply.started":"2022-06-27T04:04:08.072025Z","shell.execute_reply":"2022-06-27T04:04:25.117789Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.listdir('/kaggle/working/')","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:04:25.120888Z","iopub.execute_input":"2022-06-27T04:04:25.121639Z","iopub.status.idle":"2022-06-27T04:04:25.131561Z","shell.execute_reply.started":"2022-06-27T04:04:25.121599Z","shell.execute_reply":"2022-06-27T04:04:25.130478Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir=\"train\"\ntest_dir=\"test\"","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:04:25.132917Z","iopub.execute_input":"2022-06-27T04:04:25.133273Z","iopub.status.idle":"2022-06-27T04:04:25.140408Z","shell.execute_reply.started":"2022-06-27T04:04:25.13324Z","shell.execute_reply":"2022-06-27T04:04:25.139713Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from glob import glob\nimport random\n\ntrain_list = glob(os.path.join(train_dir,\"*\"))\ntest_list = glob(os.path.join(test_dir,\"*\"))\ntest_list=sorted(test_list)\nrandom.shuffle(train_list)\nprint( \"Training Images:\",len(train_list) )\nprint( \"Testing Images:\",len(test_list) )","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:04:25.142882Z","iopub.execute_input":"2022-06-27T04:04:25.143397Z","iopub.status.idle":"2022-06-27T04:04:25.298823Z","shell.execute_reply.started":"2022-06-27T04:04:25.143338Z","shell.execute_reply":"2022-06-27T04:04:25.298Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_list[:4],test_list[:4]","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:04:25.299958Z","iopub.execute_input":"2022-06-27T04:04:25.301658Z","iopub.status.idle":"2022-06-27T04:04:25.307988Z","shell.execute_reply.started":"2022-06-27T04:04:25.301615Z","shell.execute_reply":"2022-06-27T04:04:25.307144Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def check_data(image_list):\n    labels=['cat','dog']\n    labels_count=[0,0]\n    for i in range(len(image_list)):\n        image_path=image_list[i]\n        image_label=image_path.rsplit('/',1)[1]\n        image_label=image_label.split('.',1)[0]\n        if image_label not in labels:\n            print(\"error in :\",image_path)\n            continue\n        labels_count[labels.index(image_label)]+=1\n    for i in range(len(labels)):\n        print(\"Images with label \\\"\",labels[i],\"\\\":\",labels_count[i])\n        \n\nprint(\"Training data:\\n\")        \ncheck_data(train_list)","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:04:25.309182Z","iopub.execute_input":"2022-06-27T04:04:25.309696Z","iopub.status.idle":"2022-06-27T04:04:25.343532Z","shell.execute_reply.started":"2022-06-27T04:04:25.309658Z","shell.execute_reply":"2022-06-27T04:04:25.342812Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import PIL\n\nPIL.Image.open(\"test/9760.jpg\")","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:04:25.344534Z","iopub.execute_input":"2022-06-27T04:04:25.345495Z","iopub.status.idle":"2022-06-27T04:04:25.463114Z","shell.execute_reply.started":"2022-06-27T04:04:25.345458Z","shell.execute_reply":"2022-06-27T04:04:25.462249Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels=['cat','dog']\nlabel2idx={label:i for i,label in enumerate(labels)}\nidx2label={i:label for i,label in enumerate(labels)}","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:04:25.4644Z","iopub.execute_input":"2022-06-27T04:04:25.466798Z","iopub.status.idle":"2022-06-27T04:04:25.472535Z","shell.execute_reply.started":"2022-06-27T04:04:25.466761Z","shell.execute_reply":"2022-06-27T04:04:25.471407Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\n# build a lookup table\ntensor_label_to_idx = tf.lookup.StaticHashTable(\n    initializer=tf.lookup.KeyValueTensorInitializer(\n        keys=tf.constant(labels),\n        values=tf.constant([i for i in range(len(labels))]),\n    ),\n    default_value=tf.constant(-1),\n)\n\n# now let us do a lookup\ninput_tensor = tf.constant(['dog','cat'])\nout = tensor_label_to_idx.lookup(input_tensor)\nprint(out)","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:04:25.474929Z","iopub.execute_input":"2022-06-27T04:04:25.47595Z","iopub.status.idle":"2022-06-27T04:04:28.850611Z","shell.execute_reply.started":"2022-06-27T04:04:25.47591Z","shell.execute_reply":"2022-06-27T04:04:28.84796Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# label2idx['dog']\n\n# tf.compat.v1.enable_eager_execution()\n# tf.compat.v1.disable_eager_execution()\ninput_size=227\n# input_size=256\ntf.executing_eagerly()","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:04:28.853943Z","iopub.execute_input":"2022-06-27T04:04:28.854235Z","iopub.status.idle":"2022-06-27T04:04:28.860261Z","shell.execute_reply.started":"2022-06-27T04:04:28.854209Z","shell.execute_reply":"2022-06-27T04:04:28.859244Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install -q -U albumentations\n!echo \"$(pip freeze | grep albumentations) is successfully installed\"","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:25:59.1577Z","iopub.execute_input":"2022-06-27T04:25:59.158061Z","iopub.status.idle":"2022-06-27T04:26:18.032392Z","shell.execute_reply.started":"2022-06-27T04:25:59.158029Z","shell.execute_reply":"2022-06-27T04:26:18.0314Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nimport tensorflow.keras.backend as K\nimport albumentations as A\n\n\ndef read_data(img_path):\n    \n    label=tf.strings.split(img_path,\"/\")[-1]   # asdsada,cat.2324.jpg \n    label=tf.strings.split(label,\".\")[0]    # cat, 2324.jpg \n    \n    label=tensor_label_to_idx.lookup(label)\n    label=K.expand_dims(label,axis=-1)\n#     label=tf.one_hot(label,2)\n    \n    image=tf.io.read_file(img_path)\n    image=tf.image.decode_image(image,expand_animations=False)\n    image=tf.image.resize(image,[input_size,input_size])\n    image/=255\n    image.set_shape([input_size,input_size,3])\n    \n    return image,label\n\ndef augment(image,label):\n    \n    def f(img):\n        img*=255\n        img=img.astype('uint8')\n        # transforms = A.Compose([\n        #         A.Rotate(limit=40),\n        #         A.RandomBrightness(limit=0.1),\n        #         A.HorizontalFlip(),\n        #     ])\n        transforms = A.Compose([\n            A.Rotate(limit=40),\n            A.RandomBrightness(limit=0.1),\n            A.JpegCompression(quality_lower=85, quality_upper=100, p=0.5),\n            A.HueSaturationValue(hue_shift_limit=20, sat_shift_limit=30, val_shift_limit=20, p=0.5),\n            A.RandomContrast(limit=0.2, p=0.5),\n            A.HorizontalFlip(),\n        ])\n        aug_img = transforms(image=img)['image']\n        aug_img=aug_img/255\n        return aug_img.astype('float32')\n        \n    image=tf.numpy_function(f,[image],tf.float32)\n    return image,label\n\ndef tf_dataset(img_list,batch_size=32,aug=False):\n    \n    dataset=tf.data.Dataset.from_tensor_slices(img_list)\n    dataset=dataset.map(read_data)\n    if aug: dataset=dataset.map(augment)\n    dataset=dataset.shuffle(1000)\n    dataset=dataset.batch(batch_size)\n    dataset=dataset.prefetch(tf.data.AUTOTUNE)\n    \n    return dataset","metadata":{"execution":{"iopub.status.busy":"2022-06-27T05:09:24.82737Z","iopub.execute_input":"2022-06-27T05:09:24.828057Z","iopub.status.idle":"2022-06-27T05:09:24.839618Z","shell.execute_reply.started":"2022-06-27T05:09:24.828021Z","shell.execute_reply":"2022-06-27T05:09:24.838658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds=tf_dataset(train_list,aug=True)\nfor batch in ds.take(2):\n    x=batch[0].numpy()\n    print(batch[0].shape,batch[1].shape)\ndel ds","metadata":{"execution":{"iopub.status.busy":"2022-06-27T05:09:25.956112Z","iopub.execute_input":"2022-06-27T05:09:25.956515Z","iopub.status.idle":"2022-06-27T05:09:29.581107Z","shell.execute_reply.started":"2022-06-27T05:09:25.956481Z","shell.execute_reply":"2022-06-27T05:09:29.580309Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.min(batch[0]),np.max(batch[0])","metadata":{"execution":{"iopub.status.busy":"2022-06-27T05:09:33.124821Z","iopub.execute_input":"2022-06-27T05:09:33.12542Z","iopub.status.idle":"2022-06-27T05:09:33.136691Z","shell.execute_reply.started":"2022-06-27T05:09:33.125384Z","shell.execute_reply":"2022-06-27T05:09:33.135525Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nfig=plt.figure(figsize=(15,20))\nfor i in range(32):\n    fig.add_subplot(7,5,i+1)\n    plt.axis('off')\n    plt.imshow((x[i]*255).astype(np.uint8))\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-06-27T05:09:37.14613Z","iopub.execute_input":"2022-06-27T05:09:37.146548Z","iopub.status.idle":"2022-06-27T05:10:05.361714Z","shell.execute_reply.started":"2022-06-27T05:09:37.146498Z","shell.execute_reply":"2022-06-27T05:10:05.360394Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# models","metadata":{}},{"cell_type":"markdown","source":"## model 1","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras import layers\n\ndef modelv1():\n    x_input=layers.Input((input_size,input_size,3))\n    x=layers.Conv2D(32,(3,3),activation='relu',padding='valid')(x_input) # [(d-f+2p)/s]  + 1 :254,254,32\n    x=layers.Conv2D(32,(3,3),activation='relu',padding='valid')(x)  #  [(d-f+2p)/s]  + 1 :252,252,32\n    x=layers.MaxPooling2D((2,2))(x) # 126,126,32\n    x=layers.Conv2D(64,(3,3),activation='relu',padding='valid')(x)\n    x=layers.Conv2D(64,(3,3),activation='relu',padding='valid')(x)\n    x=layers.MaxPooling2D((2,2))(x)\n    x=layers.Conv2D(128,(3,3),activation='relu',padding='valid')(x)\n    x=layers.Conv2D(128,(3,3),activation='relu',padding='valid')(x)\n    x=layers.MaxPooling2D((2,2))(x)\n    x=layers.Flatten()(x)\n    x=layers.Dense(128,activation='relu')(x)\n    x=layers.Dense(64,activation='relu')(x)\n    x=layers.Dense(32,activation='relu')(x)\n    y=layers.Dense(1,activation='sigmoid')(x)\n\n\n\n    model=tf.keras.models.Model(inputs=x_input,outputs=y,name=\"cat_dog_model\")\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:04:33.77109Z","iopub.execute_input":"2022-06-27T04:04:33.771447Z","iopub.status.idle":"2022-06-27T04:04:33.785379Z","shell.execute_reply.started":"2022-06-27T04:04:33.771414Z","shell.execute_reply":"2022-06-27T04:04:33.78448Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# model 2","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras import layers\n\ndef modelv2():\n    x_input=layers.Input((input_size,input_size,3))\n    x=layers.Conv2D(32,(3,3),activation='relu',padding='valid')(x_input) # [(d-f+2p)/s]  + 1 :254,254,32\n    x=layers.MaxPooling2D((2,2))(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Conv2D(32,(3,3),activation='relu',padding='valid')(x)\n    x=layers.MaxPooling2D((2,2))(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Conv2D(64,(3,3),activation='relu',padding='valid')(x)\n    x=layers.MaxPooling2D((2,2))(x)\n    x=layers.Flatten()(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Dense(64,activation='relu')(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Dense(32,activation='relu')(x)\n    x=layers.BatchNormalization()(x)\n    y=layers.Dense(1,activation='sigmoid')(x)\n\n\n\n    model=tf.keras.models.Model(inputs=x_input,outputs=y,name=\"cat_dog_model_v2\")\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:04:33.787185Z","iopub.execute_input":"2022-06-27T04:04:33.787578Z","iopub.status.idle":"2022-06-27T04:04:33.801274Z","shell.execute_reply.started":"2022-06-27T04:04:33.787532Z","shell.execute_reply":"2022-06-27T04:04:33.800391Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Model 3 (light weight)","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras import layers\n\ndef modelv3():\n    x_input=layers.Input((input_size,input_size,3))\n    x=layers.Conv2D(32,(3,3),activation='relu',padding='valid')(x_input) # [(d-f+2p)/s]  + 1 :254,254,32\n    x=layers.MaxPooling2D((2,2))(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Conv2D(32,(3,3),activation='relu',padding='valid')(x)\n    x=layers.MaxPooling2D((2,2))(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Conv2D(32,(3,3),activation='relu',padding='valid')(x)\n    x=layers.MaxPooling2D((2,2))(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Conv2D(32,(3,3),activation='relu',padding='valid')(x)\n    x=layers.MaxPooling2D((2,2))(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Conv2D(32,(3,3),activation='relu',padding='valid')(x)\n    x=layers.MaxPooling2D((2,2))(x)\n    x=layers.Flatten()(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Dense(64,activation='relu')(x)\n    x=layers.Dense(32,activation='relu')(x)\n    y=layers.Dense(1,activation='sigmoid')(x)\n\n\n\n    model=tf.keras.models.Model(inputs=x_input,outputs=y,name=\"cat_dog_model_v3\")\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:04:33.803027Z","iopub.execute_input":"2022-06-27T04:04:33.803413Z","iopub.status.idle":"2022-06-27T04:04:33.819341Z","shell.execute_reply.started":"2022-06-27T04:04:33.803319Z","shell.execute_reply":"2022-06-27T04:04:33.818205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# model 4 (model 2 with he initialization)","metadata":{}},{"cell_type":"code","source":"def modelv4():\n    x_input=layers.Input((input_size,input_size,3))\n    x=layers.Conv2D(32,(3,3),activation='relu',padding='valid',kernel_initializer=tf.keras.initializers.he_uniform())(x_input) # [(d-f+2p)/s]  + 1 :254,254,32\n    x=layers.MaxPooling2D((2,2))(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Conv2D(32,(3,3),activation='relu',padding='valid',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.MaxPooling2D((2,2))(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Conv2D(64,(3,3),activation='relu',padding='valid',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.MaxPooling2D((2,2))(x)\n    x=layers.Flatten()(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Dense(64,activation='relu',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Dense(32,activation='relu',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.BatchNormalization()(x)\n    y=layers.Dense(1,activation='sigmoid',kernel_initializer=tf.keras.initializers.GlorotUniform())(x)\n\n\n\n    model=tf.keras.models.Model(inputs=x_input,outputs=y,name=\"cat_dog_model_v4\")\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:04:33.820991Z","iopub.execute_input":"2022-06-27T04:04:33.821677Z","iopub.status.idle":"2022-06-27T04:04:33.836499Z","shell.execute_reply.started":"2022-06-27T04:04:33.82164Z","shell.execute_reply":"2022-06-27T04:04:33.835705Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def modelv4_overlapping_pooling():\n    x_input=layers.Input((input_size,input_size,3))\n    x=layers.Conv2D(32,(3,3),activation='relu',padding='valid',kernel_initializer=tf.keras.initializers.he_uniform())(x_input) # [(d-f+2p)/s]  + 1 :254,254,32\n    x=layers.MaxPooling2D((3,3),2)(x)\n    x=layers.BatchNormalization()(x)\n\n    x=layers.Conv2D(32,(3,3),activation='relu',padding='valid',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.MaxPooling2D((3,3),2)(x)\n    x=layers.BatchNormalization()(x)\n\n    x=layers.Conv2D(64,(3,3),activation='relu',padding='valid',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.MaxPooling2D((3,3),2)(x)\n    x=layers.Flatten()(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Dense(64,activation='relu',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Dense(32,activation='relu',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.BatchNormalization()(x)\n    y=layers.Dense(1,activation='sigmoid',kernel_initializer=tf.keras.initializers.GlorotUniform())(x)\n\n    model=tf.keras.models.Model(inputs=x_input,outputs=y,name=\"cat_dog_model_v4_op_no_bn\")\n    return model","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def modelv4_overlapping_pooling_max():\n    x_input=layers.Input((input_size,input_size,3))\n    x=layers.Conv2D(32,(3,3),activation='relu',padding='valid',kernel_initializer=tf.keras.initializers.he_uniform())(x_input) # [(d-f+2p)/s]  + 1 :254,254,32\n    x=layers.MaxPooling2D((3,3),2)(x)\n    x=layers.BatchNormalization()(x)\n\n    x=layers.Conv2D(32,(3,3),activation='relu',padding='valid',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.MaxPooling2D((3,3),2)(x)\n    x=layers.BatchNormalization()(x)\n\n    x=layers.Conv2D(64,(3,3),activation='relu',padding='valid',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.MaxPooling2D((3,3),2)(x)\n    x=layers.BatchNormalization()(x)\n\n    x=layers.Conv2D(64,(3,3),activation='relu',padding='valid',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.MaxPooling2D((3,3),2)(x)\n    x=layers.BatchNormalization()(x)\n\n    x=layers.Conv2D(128,(3,3),activation='relu',padding='valid',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.MaxPooling2D((3,3),2)(x)\n    x=layers.Flatten()(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Dense(128,activation='relu',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Dense(64,activation='relu',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Dense(64,activation='relu',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Dense(32,activation='relu',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.BatchNormalization()(x)\n    x=layers.Dense(16,activation='relu',kernel_initializer=tf.keras.initializers.he_uniform())(x)\n    x=layers.BatchNormalization()(x)\n    y=layers.Dense(1,activation='sigmoid',kernel_initializer=tf.keras.initializers.GlorotUniform())(x)\n\n    model=tf.keras.models.Model(inputs=x_input,outputs=y,name=\"cat_dog_model_v4_op_no_bn\")\n    return model","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def LeNet5():\n    x_input=layers.Input((input_size,input_size,3))\n    x=layers.Conv2D(6,(5,5),strides=1,activation='tanh')(x_input)\n    x=layers.AveragePooling2D((2,2),strides=2)(x)\n    x=layers.Conv2D(16,(5,5),strides=1,activation='tanh')(x)\n    x=layers.AveragePooling2D((2,2),strides=2)(x)\n    x=layers.Flatten()(x)\n    x=layers.Dense(120,activation='tanh')(x)\n    x=layers.Dense(84,activation='tanh')(x)\n    y=layers.Dense(1,activation='sigmoid')(x)\n    model=tf.keras.models.Model(inputs=x_input,outputs=y,name=\"LeNet5\")\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:04:33.837822Z","iopub.execute_input":"2022-06-27T04:04:33.838623Z","iopub.status.idle":"2022-06-27T04:04:33.852378Z","shell.execute_reply.started":"2022-06-27T04:04:33.838583Z","shell.execute_reply":"2022-06-27T04:04:33.851556Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def AlexNet():\n    x_input=layers.Input((227,227,3))\n    x=layers.Conv2D(96,(11,11),strides=4,activation='relu')(x_input)\n    x=layers.MaxPooling2D((3,3),strides=2)(x)\n    x=layers.Conv2D(256,(5,5),padding='same',activation='relu')(x)\n    x=layers.MaxPooling2D((3,3),strides=2)(x)\n    x=layers.Conv2D(384,(3,3),padding='same',activation='relu')(x)\n    x=layers.Conv2D(384,(3,3),padding='same',activation='relu')(x)\n    x=layers.Conv2D(256,(3,3),padding='same',activation='relu')(x)\n    x=layers.MaxPooling2D((3,3),strides=2)(x)\n\n    x=layers.Flatten()(x)\n    x=layers.Dense(4096,activation='relu')(x)\n    x=layers.Dense(4096,activation='relu')(x)\n    x=layers.Dense(1000,activation='relu')(x)\n    y=layers.Dense(1,activation='sigmoid')(x)\n    model=tf.keras.models.Model(inputs=x_input,outputs=y,name=\"AlexNet\")\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:44:06.387324Z","iopub.execute_input":"2022-06-27T04:44:06.388127Z","iopub.status.idle":"2022-06-27T04:44:06.398704Z","shell.execute_reply.started":"2022-06-27T04:44:06.388085Z","shell.execute_reply":"2022-06-27T04:44:06.397626Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def AlexNet_dropout(d):\n    x_input=layers.Input((227,227,3))\n    x=layers.Conv2D(96,(11,11),strides=4,activation='relu')(x_input)\n    x=layers.MaxPooling2D((3,3),strides=2)(x)\n    x=layers.Dropout(d)(x)\n    x=layers.Conv2D(256,(5,5),padding='same',activation='relu')(x)\n    x=layers.MaxPooling2D((3,3),strides=2)(x)\n    x=layers.Dropout(d)(x)\n    x=layers.Conv2D(384,(3,3),padding='same',activation='relu')(x)\n    x=layers.Conv2D(384,(3,3),padding='same',activation='relu')(x)\n    x=layers.Dropout(d)(x)\n    x=layers.Conv2D(256,(3,3),padding='same',activation='relu')(x)\n    x=layers.MaxPooling2D((3,3),strides=2)(x)\n\n    x=layers.Flatten()(x)\n    x=layers.Dropout(d)(x)\n    x=layers.Dense(4096,activation='relu')(x)\n    x=layers.Dropout(d)(x)\n    x=layers.Dense(4096,activation='relu')(x)\n    x=layers.Dropout(d)(x)\n    x=layers.Dense(1000,activation='relu')(x)\n    y=layers.Dense(1,activation='sigmoid')(x)\n    model=tf.keras.models.Model(inputs=x_input,outputs=y,name=\"AlexNet\")\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:44:06.581493Z","iopub.execute_input":"2022-06-27T04:44:06.581853Z","iopub.status.idle":"2022-06-27T04:44:06.59384Z","shell.execute_reply.started":"2022-06-27T04:44:06.581822Z","shell.execute_reply":"2022-06-27T04:44:06.593005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def vgg16():\n    x_input=layers.Input((224,224,3))\n    x=layers.Conv2D(64,(3,3),padding=\"same\",activation='relu')(x_input)\n    x=layers.Conv2D(64,(3,3),padding=\"same\",activation='relu')(x)\n    x=layers.MaxPooling2D(pool_size=(2,2),strides=(2,2))(x)\n    \n    x=layers.Conv2D(128,(3,3),padding=\"same\",activation='relu')(x)\n    x=layers.Conv2D(128,(3,3),padding=\"same\",activation='relu')(x)\n    x=layers.MaxPooling2D(pool_size=(2,2),strides=(2,2))(x)\n    \n    x=layers.Conv2D(256,(3,3),padding=\"same\",activation='relu')(x)\n    x=layers.Conv2D(256,(3,3),padding=\"same\",activation='relu')(x)\n    x=layers.Conv2D(256,(3,3),padding=\"same\",activation='relu')(x)\n    x=layers.MaxPooling2D(pool_size=(2,2),strides=(2,2))(x)\n    \n    x=layers.Conv2D(512,(3,3),padding=\"same\",activation='relu')(x)\n    x=layers.Conv2D(512,(3,3),padding=\"same\",activation='relu')(x)\n    x=layers.Conv2D(512,(3,3),padding=\"same\",activation='relu')(x)\n    x=layers.MaxPooling2D(pool_size=(2,2),strides=(2,2))(x)\n    \n    x=layers.Conv2D(512,(3,3),padding=\"same\",activation='relu')(x)\n    x=layers.Conv2D(512,(3,3),padding=\"same\",activation='relu')(x)\n    x=layers.Conv2D(512,(3,3),padding=\"same\",activation='relu')(x)\n    x=layers.MaxPooling2D(pool_size=(2,2),strides=(2,2))(x)\n    \n    x=layers.Flatten()(x)\n    x=layers.Dense(4096,activation='relu')(x)\n    x=layers.Dense(4096,activation='relu')(x)\n    x=layers.Dense(1,activation='sigmoid')(x)\n    model=tf.keras.models.Model(inputs=x_input,outputs=x,name=\"Vgg16\")\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:44:08.446235Z","iopub.execute_input":"2022-06-27T04:44:08.446876Z","iopub.status.idle":"2022-06-27T04:44:08.463576Z","shell.execute_reply.started":"2022-06-27T04:44:08.44684Z","shell.execute_reply":"2022-06-27T04:44:08.462721Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.applications.vgg16 import VGG16\nimport tensorflow as tf\ndef vgg16_pretrained(d):\n    vggmodel = VGG16(weights='imagenet', include_top=True)\n    for layers in (vggmodel.layers)[:19]:\n        layers.trainable = False\n    X=vggmodel.layers[-4].output # flatten\n    X=tf.keras.layers.Dropout(d)(X)\n    X=vggmodel.layers[-3](X)     # fc1\n    X=tf.keras.layers.Dropout(d)(X)\n    X=vggmodel.layers[-2](X)     # fc2\n    X=tf.keras.layers.Dropout(d)(X)\n    predictions = tf.keras.layers.Dense(1, activation=\"sigmoid\")(X)\n    model = tf.keras.models.Model(inputs = vggmodel.input, outputs = predictions)\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-06-27T04:44:08.686808Z","iopub.execute_input":"2022-06-27T04:44:08.687653Z","iopub.status.idle":"2022-06-27T04:44:08.69587Z","shell.execute_reply.started":"2022-06-27T04:44:08.687599Z","shell.execute_reply":"2022-06-27T04:44:08.695003Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"input_size=227\n# model=modelv4()\n# model=modelv4_overlapping_pooling()\nmodel=modelv4_overlapping_pooling_max()\n# model=AlexNet()\n# model=vgg16()\n# model=vgg16_pretrained(trainable=False)\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2022-06-27T05:10:05.363226Z","iopub.execute_input":"2022-06-27T05:10:05.3641Z","iopub.status.idle":"2022-06-27T05:10:05.463419Z","shell.execute_reply.started":"2022-06-27T05:10:05.364063Z","shell.execute_reply":"2022-06-27T05:10:05.462586Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"! nvidia-smi -L","metadata":{"execution":{"iopub.status.busy":"2022-06-27T05:10:05.464745Z","iopub.execute_input":"2022-06-27T05:10:05.465245Z","iopub.status.idle":"2022-06-27T05:10:06.25162Z","shell.execute_reply.started":"2022-06-27T05:10:05.465209Z","shell.execute_reply":"2022-06-27T05:10:06.250595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_val_split=0.96\nsplit_idx=round(train_val_split*len(train_list))\nprint(\"train samples:\",len(train_list[:split_idx]))\nprint(\"validation samples:\",len(train_list[split_idx:]))","metadata":{"execution":{"iopub.status.busy":"2022-06-27T05:10:06.254425Z","iopub.execute_input":"2022-06-27T05:10:06.255034Z","iopub.status.idle":"2022-06-27T05:10:06.621578Z","shell.execute_reply.started":"2022-06-27T05:10:06.254992Z","shell.execute_reply":"2022-06-27T05:10:06.620722Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_checkpoint=tf.keras.callbacks.ModelCheckpoint(\"cat_dog.h5\", monitor='val_loss', verbose=1, save_best_only=True, save_weights_only=False)\nlr_plateau=tf.keras.callbacks.ReduceLROnPlateau(monitor=\"loss\",factor=0.5,patience=2,verbose=1,mode=\"auto\",min_delta=0.0001,cooldown=0,min_lr=0)","metadata":{"execution":{"iopub.status.busy":"2022-06-27T05:10:06.622984Z","iopub.execute_input":"2022-06-27T05:10:06.623513Z","iopub.status.idle":"2022-06-27T05:10:06.629864Z","shell.execute_reply.started":"2022-06-27T05:10:06.623477Z","shell.execute_reply":"2022-06-27T05:10:06.628905Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),loss='binary_crossentropy',metrics=['acc']) \n# model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),loss='binary_crossentropy',metrics=['acc']) \ntrain_dataset=tf_dataset(train_list[:split_idx],batch_size=128,aug=True)\nval_dataset=tf_dataset(train_list[split_idx:],batch_size=128)\nhistory=model.fit(train_dataset,validation_data=val_dataset,verbose=1,epochs=5,callbacks=[model_checkpoint,lr_plateau])","metadata":{"execution":{"iopub.status.busy":"2022-06-27T05:10:06.64383Z","iopub.execute_input":"2022-06-27T05:10:06.644435Z","iopub.status.idle":"2022-06-27T06:35:00.793017Z","shell.execute_reply.started":"2022-06-27T05:10:06.644409Z","shell.execute_reply":"2022-06-27T06:35:00.79146Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),loss='binary_crossentropy',metrics=['acc'])\nhistory=model.fit(train_dataset,validation_data=val_dataset,verbose=1,epochs=20,callbacks=[model_checkpoint,lr_plateau])","metadata":{"execution":{"iopub.status.busy":"2022-06-26T08:35:39.117701Z","iopub.execute_input":"2022-06-26T08:35:39.118065Z","iopub.status.idle":"2022-06-26T08:35:39.123283Z","shell.execute_reply.started":"2022-06-26T08:35:39.118034Z","shell.execute_reply":"2022-06-26T08:35:39.122484Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nfig=plt.figure(figsize=(20,6))\nfig.add_subplot(1,2,1)\nplt.title(\"loss\")\nplt.plot(history.epoch,history.history['loss'],label='train_loss')\nplt.plot(history.epoch,history.history['val_loss'],label='val_loss')\nplt.xlabel(\"epochs\")\nplt.ylabel(\"loss\")\nplt.legend(loc=\"best\")\n\nfig.add_subplot(1,2,2)\nplt.title(\"accuracy\")\nplt.plot(history.epoch,history.history['acc'],label='train_acc')\nplt.plot(history.epoch,history.history['val_acc'],label='val_acc')\nplt.xlabel(\"epochs\")\nplt.ylabel(\"acc\")\nplt.legend(loc=\"best\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-06-26T05:09:25.943274Z","iopub.execute_input":"2022-06-26T05:09:25.943671Z","iopub.status.idle":"2022-06-26T05:09:26.161673Z","shell.execute_reply.started":"2022-06-26T05:09:25.943643Z","shell.execute_reply":"2022-06-26T05:09:26.159851Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model=tf.keras.models.load_model(\"cat_dog.h5\")","metadata":{"execution":{"iopub.status.busy":"2022-06-27T06:35:09.101188Z","iopub.execute_input":"2022-06-27T06:35:09.101727Z","iopub.status.idle":"2022-06-27T06:35:10.95897Z","shell.execute_reply.started":"2022-06-27T06:35:09.101682Z","shell.execute_reply":"2022-06-27T06:35:10.958085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_test_data(img_path):\n    img_id=tf.strings.split(img_path,\"/\")[-1]\n    img_id=tf.strings.split(img_id,\".\")[0]\n    file=tf.io.read_file(img_path)\n    img=tf.image.decode_image(file,expand_animations=False)\n    img=tf.image.resize(img,[input_size,input_size])\n    img=img/255\n    return img_id,img\n\ntest_dataset=tf.data.Dataset.from_tensor_slices((test_list))\ntest_dataset=test_dataset.map(load_test_data)\ntest_dataset=test_dataset.batch(64)","metadata":{"execution":{"iopub.status.busy":"2022-06-27T06:35:14.548772Z","iopub.execute_input":"2022-06-27T06:35:14.549127Z","iopub.status.idle":"2022-06-27T06:35:14.741187Z","shell.execute_reply.started":"2022-06-27T06:35:14.549096Z","shell.execute_reply":"2022-06-27T06:35:14.740388Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for data in test_dataset.take(1):\n    print(data[0].shape,data[1].shape)\n    print(list(map(lambda x: x.decode(),data[0].numpy())))","metadata":{"execution":{"iopub.status.busy":"2022-06-27T06:35:14.932676Z","iopub.execute_input":"2022-06-27T06:35:14.9333Z","iopub.status.idle":"2022-06-27T06:35:15.163942Z","shell.execute_reply.started":"2022-06-27T06:35:14.933265Z","shell.execute_reply":"2022-06-27T06:35:15.162996Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i,data in enumerate(test_dataset):\n    test_preds= model.predict(data[1]) if i==0 else np.r_[test_preds,model.predict(data[1])]\n    test_ids= data[0].numpy() if i==0 else np.r_[test_ids,data[0].numpy()]\ntest_ids.shape,test_preds.shape","metadata":{"execution":{"iopub.status.busy":"2022-06-27T06:35:16.300586Z","iopub.execute_input":"2022-06-27T06:35:16.301407Z","iopub.status.idle":"2022-06-27T06:35:41.572433Z","shell.execute_reply.started":"2022-06-27T06:35:16.301364Z","shell.execute_reply":"2022-06-27T06:35:41.571588Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_ids=list(map(lambda x: x.decode(),test_ids))","metadata":{"execution":{"iopub.status.busy":"2022-06-27T06:35:41.574829Z","iopub.execute_input":"2022-06-27T06:35:41.575373Z","iopub.status.idle":"2022-06-27T06:35:41.583092Z","shell.execute_reply.started":"2022-06-27T06:35:41.575335Z","shell.execute_reply":"2022-06-27T06:35:41.582143Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(test_ids),test_preds.shape","metadata":{"execution":{"iopub.status.busy":"2022-06-27T06:35:41.584269Z","iopub.execute_input":"2022-06-27T06:35:41.584821Z","iopub.status.idle":"2022-06-27T06:35:41.595339Z","shell.execute_reply.started":"2022-06-27T06:35:41.584783Z","shell.execute_reply":"2022-06-27T06:35:41.594352Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if os.path.exists('submission.csv'):\n    os.remove('submission.csv')\ndata = {'id': test_ids, 'label': test_preds[:,0]}          \ndf = pd.DataFrame(data)\ndf.to_csv('submission.csv', mode='a', index=False, header=True)","metadata":{"execution":{"iopub.status.busy":"2022-06-27T06:35:41.597605Z","iopub.execute_input":"2022-06-27T06:35:41.598074Z","iopub.status.idle":"2022-06-27T06:35:41.657226Z","shell.execute_reply.started":"2022-06-27T06:35:41.598037Z","shell.execute_reply":"2022-06-27T06:35:41.656382Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def label_test_data():\n    if os.path.exists('submission.csv'):\n        os.remove('submission.csv')\n    df=pd.DataFrame({\"id\":[],\"label\":[]})\n    df.to_csv('submission.csv', mode='a', index=False, header=True)\n    ids=[]\n    imgs=np.array([])\n    batch_size=32\n    for i,test_path in enumerate(test_list):\n        test_id=test_path.rsplit('/',1)[-1]\n        test_id=test_id.rsplit('.',1)[0]\n        img=PIL.Image.open(test_path).resize((input_size,input_size))\n        img=np.array(img)\n        img=img/255\n        img=np.expand_dims(img,axis=0)\n        \n        if imgs.shape==(0,):\n            imgs=img\n        else:\n            imgs=np.r_[imgs,img]\n            \n        ids.append(test_id)\n        if i!=0 and (i+1)%batch_size==0:\n            pred=model.predict(imgs)\n            labels=pred[:,0]\n#             labels=np.round(pred[:,0],2)\n\n            data = {'id': ids, 'label': labels}  \n            df = pd.DataFrame(data)\n            df.to_csv('submission.csv', mode='a', index=False, header=False)\n            ids=[]\n            imgs=np.array([])\n        if(i%1000==0):\n            print(i,\"out of\",len(test_list))\n            \n    if imgs.shape!=(0,):\n        pred=model.predict(imgs)\n        labels=pred[:,0]\n        data = {'id': ids, 'label': labels}  \n        df = pd.DataFrame(data)\n        df.to_csv('submission.csv', mode='a', index=False, header=False)\n        ids=[]\n        imgs=np.array([])\n# label_test_data()","metadata":{"execution":{"iopub.status.busy":"2022-06-27T06:35:41.658307Z","iopub.execute_input":"2022-06-27T06:35:41.658997Z","iopub.status.idle":"2022-06-27T06:35:41.672254Z","shell.execute_reply.started":"2022-06-27T06:35:41.658962Z","shell.execute_reply":"2022-06-27T06:35:41.671434Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df=pd.read_csv(\"submission.csv\")\ndf","metadata":{"execution":{"iopub.status.busy":"2022-06-27T06:35:41.673673Z","iopub.execute_input":"2022-06-27T06:35:41.67478Z","iopub.status.idle":"2022-06-27T06:35:41.710108Z","shell.execute_reply.started":"2022-06-27T06:35:41.67474Z","shell.execute_reply":"2022-06-27T06:35:41.709303Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}