{"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-07-13T10:50:27.953350Z","iopub.execute_input":"2023-07-13T10:50:27.953749Z","iopub.status.idle":"2023-07-13T10:50:27.962299Z","shell.execute_reply.started":"2023-07-13T10:50:27.953717Z","shell.execute_reply":"2023-07-13T10:50:27.961019Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\nimport tensorflow as tf\nfrom tensorflow.keras.layers import Input, Dense, Concatenate,Flatten,Lambda,Conv2D,BatchNormalization,Add,MaxPool2D,GlobalAveragePooling2D,Dropout\nfrom tensorflow.keras.models import Model,Sequential\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split\nfrom keras.utils import plot_model\nfrom tensorflow.keras.optimizers import RMSprop,Adam\nfrom PIL import Image, ImageFont, ImageDraw\nfrom keras import backend as K\n# import seaborn as sns\n\n","metadata":{"execution":{"iopub.status.busy":"2023-07-13T10:50:27.964362Z","iopub.execute_input":"2023-07-13T10:50:27.965005Z","iopub.status.idle":"2023-07-13T10:50:27.975763Z","shell.execute_reply.started":"2023-07-13T10:50:27.964973Z","shell.execute_reply":"2023-07-13T10:50:27.974617Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!unzip '/kaggle/input/dogs-vs-cats/train.zip'","metadata":{"execution":{"iopub.status.busy":"2023-07-13T10:50:27.977149Z","iopub.execute_input":"2023-07-13T10:50:27.977651Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport glob \nimage = []\nlabel = []\nbase_dir = '/kaggle/working'\ntrain_path_content = os.listdir(f'{base_dir}/train')\nprint(f'train_size: {len(train_path_content)}')\ntrain_dir = os.path.join(base_dir, 'train')\n\ntrain_imgs = glob.glob(os.path.join(train_dir, \"*\"))\nfor img in train_imgs:\n    image_name = os.path.splitext(os.path.basename(img))[0]\n    if 'cat' in image_name:\n    # move it to directory /content/train/cats\n        image.append(img)\n        label.append('cat')\n    elif 'dog' in image_name:\n    # move it to directory /content/train/dogs\n        image.append(img)\n        label.append('dog')\ndf = pd.DataFrame({'path':image,'label':label})      ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\ndf['label'].value_counts()\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\n\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n# Define the input shape expected by the model\ninput_shape = (150, 150, 3)\n\n# Define the data generator\ndatagen = ImageDataGenerator(rescale=1./255,\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                            validation_split=0.2)\n\n\ntrain_generator = datagen.flow_from_dataframe(dataframe=df,\n                                              directory=None,\n                                              x_col='path',\n                                              y_col='label',\n                                              subset='training',\n                                              target_size=input_shape[:2],\n                                              batch_size=16,\n                                              class_mode='categorical')\n\nval_generator = datagen.flow_from_dataframe(dataframe=df,\n                                            directory=None,\n                                            x_col='path',\n                                            y_col='label',\n                                            subset='validation',\n                                            target_size=input_shape[:2],\n                                            batch_size=16,\n                                            class_mode='categorical')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_learning_curve(history):\n    # Plot the training and validation accuracy\n    plt.plot(history.history['accuracy'])\n    plt.plot(history.history['val_accuracy'])\n    plt.title('Model accuracy')\n    plt.ylabel('Accuracy')\n    plt.xlabel('Epoch')\n    plt.legend(['Train', 'Validation'], loc='upper left')\n    plt.show()\n\n    # Plot the training and validation loss\n    plt.plot(history.history['loss'])\n    plt.plot(history.history['val_loss'])\n    plt.title('Model loss')\n    plt.ylabel('Loss')\n    plt.xlabel('Epoch')\n    plt.legend(['Train', 'Validation'], loc='upper left')\n    plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CNNModel(tf.keras.Model):\n    def __init__(self,layers,filters,kernel_size):\n        super(CNNModel,self).__init__()\n        self.conv     = [Conv2D(filters,kernel_size,padding='same') for _ in range(layers)]\n        self.max_pool = [MaxPool2D((2,2)) for _ in range(layers)]\n        self.act      = [tf.keras.layers.Activation('relu') for _ in range(layers)]\n        self.conc      = Concatenate()\n    def call(self,inputs):\n        x = inputs\n        for conv,max_,act in zip(self.conv,self.max_pool,self.act):\n            x = conv(x)\n            x = act(x)\n            x = max_(x)\n#         x = self.conc([x, inputs])\n        return x\n\nclass DNNModel(tf.keras.Model):\n    def __init__(self,layers,units,activation):\n        super(DNNModel,self).__init__()\n        \n        self.hidden = [Dense(units,activation) for _ in range(layers)]\n        self.out    = Dense(units = 2,activation ='softmax')\n        self.dropout = Dropout(rate = 0.2)\n        self.flat   = Flatten()\n    def call(self,inputs):\n        x  = self.flat(inputs)\n        for layer in self.hidden:\n            x = layer(x)\n#             x = self.dropout(x)\n        return self.out(x)    \n            \n        \nclass CustomModel(tf.keras.Model):\n    def __init__(self,\n                 cnn_layers,\n                 filters,\n                 kernel_size,\n                 dnn_layers,\n                 dnn_units,\n                dnn_activation):\n        super(CustomModel,self).__init__()\n        self.block1 = CNNModel(cnn_layers,filters,kernel_size)\n        self.block2 = DNNModel(dnn_layers,dnn_units,dnn_activation)\n    def call (self,inputs):\n        x = self.block1(inputs)\n        x = self.block2(x)\n        return x","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CNNModel2(tf.keras.Model):\n    def __init__(self,layers,filters,kernel_size):\n        super(CNNModel2,self).__init__()\n        self.conv     = [Conv2D(filters,kernel_size,padding='same') for _ in range(layers)]\n        self.max_pool = [MaxPool2D((2,2)) for _ in range(layers)]\n        self.act      = [tf.keras.layers.Activation('relu') for _ in range(layers)]\n        self.conc      = Concatenate()\n    def call(self,inputs):\n        x = inputs\n        for conv,max_,act in zip(self.conv,self.max_pool,self.act):\n            x = conv(x)\n            x = act(x)\n            x = max_(x)\n#         x = self.conc([x, inputs])\n        return x\n\nclass DNNModel2(tf.keras.Model):\n    def __init__(self,layers,units,activation):\n        super(DNNModel2,self).__init__()\n        \n        self.hidden = [Dense(units,activation) for _ in range(layers)]\n        self.out    = Dense(units = 2,activation ='softmax')\n        self.dropout = Dropout(rate = 0.2)\n        self.flat   = Flatten()\n    def call(self,inputs):\n        x  = self.flat(inputs)\n        for index,layer in enumerate(self.hidden):\n            x = layer(x)\n            if index != 0 and index%2==0:\n                x = self.dropout(x)\n        return self.out(x)    \n            \n        \nclass CustomModel2(tf.keras.Model):\n    def __init__(self,\n                 cnn_layers,\n                 filters,\n                 kernel_size,\n                 dnn_layers,\n                 dnn_units,\n                dnn_activation):\n        super(CustomModel2,self).__init__()\n        self.block1 = CNNModel2(cnn_layers,filters,kernel_size)\n        self.block2 = DNNModel2(dnn_layers,dnn_units,dnn_activation)\n    def call (self,inputs):\n        x = self.block1(inputs)\n        x = self.block2(x)\n        return x","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model7 = CustomModel2(cnn_layers = 4,\n               filters=124,\n               kernel_size= 3,\n               dnn_layers = 1,\n              dnn_units = 512,\n              dnn_activation = 'relu')\n# callback = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=3)\nmodel7.compile(optimizer='adam',\n              loss='categorical_crossentropy',\n              metrics=['accuracy'])\nhistory = model7.fit(train_generator,\n                    epochs=50,\n                    validation_data=val_generator)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_learning_curve(history)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\n# assign location\npath='/kaggle/working/Weights'\n \n# save\nmodel7.save_weights(path)\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"! unzip /kaggle/input/dogs-vs-cats/test1.zip","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_filenames = os.listdir(\"/kaggle/working/test1\")\ntest_df = pd.DataFrame({\n    'filename': test_filenames\n})\nnb_samples = test_df.shape[0]\n\ntest_gen = ImageDataGenerator(rescale=1./255)\ntest_generator = test_gen.flow_from_dataframe(\n    test_df, \n    \"./test1/\", \n    x_col='filename',\n    y_col=None,\n    class_mode=None,\n    target_size=(150,150),\n    batch_size=16,\n    shuffle=False\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\npredict = model7.predict(test_generator)\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predict","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\ntest_df['category'] = np.argmax(predict, axis=-1)\nlabel_map = dict((category,filename) for filename,category in train_generator.class_indices.items())\ntest_df['category'] = test_df['category'].replace(label_map)\ntest_df['category'] = test_df['category'].replace({ 'dog': 1, 'cat': 0 })\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import seaborn as sns\ncategory_counts = test_df['category'].value_counts()\ncategory_percentages = category_counts / category_counts.sum() * 100\n\nplt.figure(figsize=(6, 6))\nsns.set(style='darkgrid')\nlabels = ['Dog', 'Cat']\ncolors = ['#ff9999', '#66b3ff']\n\nexplode = (0.1, 0)\n\nplt.pie(category_counts, labels=labels, colors=colors, explode=explode, autopct='%1.1f%%', startangle=90)\nplt.title('Distribution of Dogs & Cats in the predicted dataset')\nplt.axis('equal')\nplt.show()\n\nfor label, count, percentage in zip(labels, category_counts, category_percentages):\n    print(f\"{label}: {count} samples, {percentage:.1f}%\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df.to_csv('submission.csv')","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}