{"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":"# 0. Introduction\n> Cats vs Dogs Dataset\n\n<img src=\"https://user-images.githubusercontent.com/54783158/168794846-6a2d82ff-3f3f-43b3-be7d-adb73167e563.png\" width=\"300\" height=\"300\">\n\n\n\nThis dataset is very easy to start CNN. \nSo our study group select this to practice convolutinal modeling.\n## EDA\nThe purpose of this competition is classifier which is cat, and which is dog by using deeplearning models\nthis dataset produce 2 Zip files, (sampleSubmission is just sample)\n### Train.zip\nnumber_train.jpg\n### test.zip\nlabel\n","metadata":{}},{"cell_type":"markdown","source":"# 1. Data Preprocessing","metadata":{}},{"cell_type":"markdown","source":"## 1.1 Data load","metadata":{}},{"cell_type":"code","source":"import pandas as pd # data preprocessing\nimport numpy as np # linear algebra\nimport os\n\nimport matplotlib.pyplot as plt\nfrom tqdm import tqdm\nimport cv2\n\nimport tensorflow as tf\nfrom keras.datasets import mnist\nfrom keras import models\nfrom keras import layers\nfrom keras import optimizers\nfrom keras import Sequential\nfrom keras.layers import Dense,MaxPooling2D,Conv2D,Flatten,Dropout, Activation, BatchNormalization\n\nfrom keras.preprocessing.image import load_img\nfrom sklearn.model_selection import train_test_split\nfrom keras.preprocessing.image import ImageDataGenerator\n\n# First we find which files are included\nprint(\"Root directory contains: \")\nprint(os.listdir(\"../input/dogs-vs-cats\"))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-05-16T01:15:03.827814Z","iopub.execute_input":"2022-05-16T01:15:03.828204Z","iopub.status.idle":"2022-05-16T01:15:03.839612Z","shell.execute_reply.started":"2022-05-16T01:15:03.828171Z","shell.execute_reply":"2022-05-16T01:15:03.838497Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## library\n1. matplotlib - data visualization\n2. tqdm - check process learning\n3. tensorflow.keras - deeplearning library\n4. cv2 - image","metadata":{}},{"cell_type":"code","source":"# file path\ntrain_path = \"../input/dogs-vs-cats/train.zip\"\ntest_path = \"../input/dogs-vs-cats/test1.zip\"","metadata":{"execution":{"iopub.status.busy":"2022-05-16T01:15:03.846584Z","iopub.execute_input":"2022-05-16T01:15:03.847068Z","iopub.status.idle":"2022-05-16T01:15:03.851018Z","shell.execute_reply.started":"2022-05-16T01:15:03.847033Z","shell.execute_reply":"2022-05-16T01:15:03.850077Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# unzip file\n%time\nimport zipfile\n\nzip_files = ['test1', 'train']\n\nfor zip_file in tqdm(zip_files):\n    with zipfile.ZipFile(\"../input/dogs-vs-cats/{}.zip\".format(zip_file), \"r\") as z:\n        z.extractall('.') # unzip\n        print(\"{} unzipped\".format(zip_file))","metadata":{"execution":{"iopub.status.busy":"2022-05-16T01:15:03.858415Z","iopub.execute_input":"2022-05-16T01:15:03.858612Z","iopub.status.idle":"2022-05-16T01:15:17.934816Z","shell.execute_reply.started":"2022-05-16T01:15:03.858589Z","shell.execute_reply":"2022-05-16T01:15:17.934091Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### If input file is provided zip?\nyou can use ```ZipFile()``` to unzip\n1. ```import zipfile```\n2. ```ZipFile(filepath, 'r')```\n3. ```extractall(directory_path)```","metadata":{}},{"cell_type":"markdown","source":"\n### If you want to use tqdm \n tqdm library show process easy to understand\n1. ```import tqdm```\n2. find Sequence datatype\n3. wrap it in a function like this\n```tqdm(range(10))```\n\nthen you can make process bar easily","metadata":{}},{"cell_type":"code","source":"WIDTH=128\nHEIGHT=128\nimage_size = (WIDTH, HEIGHT)\nimage_channel =3","metadata":{"execution":{"iopub.status.busy":"2022-05-16T01:15:17.9366Z","iopub.execute_input":"2022-05-16T01:15:17.937389Z","iopub.status.idle":"2022-05-16T01:15:17.941928Z","shell.execute_reply.started":"2022-05-16T01:15:17.937349Z","shell.execute_reply":"2022-05-16T01:15:17.940927Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_df \nfilenames=os.listdir(\"./train\")\ncategories=[]\nfor filename in filenames:\n    # class dog, cat \n    category=filename.split('.')[0]\n    if category=='dog':\n        categories.append(1) # dog = 1\n    else:\n        categories.append(0) # cat = 0\ntrain_df = pd.DataFrame({\n    'filename':filenames,\n    'category':categories\n})","metadata":{"execution":{"iopub.status.busy":"2022-05-16T01:15:17.943621Z","iopub.execute_input":"2022-05-16T01:15:17.944306Z","iopub.status.idle":"2022-05-16T01:15:17.988379Z","shell.execute_reply.started":"2022-05-16T01:15:17.944268Z","shell.execute_reply":"2022-05-16T01:15:17.987726Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-05-16T01:15:17.990239Z","iopub.execute_input":"2022-05-16T01:15:17.990547Z","iopub.status.idle":"2022-05-16T01:15:17.99953Z","shell.execute_reply.started":"2022-05-16T01:15:17.990512Z","shell.execute_reply":"2022-05-16T01:15:17.998492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# test_df \ntest_filenames = os.listdir(\"./test1\")\ntest_df = pd.DataFrame({\n    'filename': test_filenames\n})\nnb_samples = test_df.shape[0]","metadata":{"execution":{"iopub.status.busy":"2022-05-16T01:15:18.001094Z","iopub.execute_input":"2022-05-16T01:15:18.001396Z","iopub.status.idle":"2022-05-16T01:15:18.018976Z","shell.execute_reply.started":"2022-05-16T01:15:18.00136Z","shell.execute_reply":"2022-05-16T01:15:18.018298Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-05-16T01:15:18.020336Z","iopub.execute_input":"2022-05-16T01:15:18.020576Z","iopub.status.idle":"2022-05-16T01:15:18.02862Z","shell.execute_reply.started":"2022-05-16T01:15:18.020543Z","shell.execute_reply":"2022-05-16T01:15:18.027869Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('train:{}\\n test:{}'.format(train_df.shape[0], test_df.shape[0]))","metadata":{"execution":{"iopub.status.busy":"2022-05-16T01:15:18.030279Z","iopub.execute_input":"2022-05-16T01:15:18.030851Z","iopub.status.idle":"2022-05-16T01:15:18.038048Z","shell.execute_reply.started":"2022-05-16T01:15:18.030813Z","shell.execute_reply":"2022-05-16T01:15:18.037178Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Split dataset","metadata":{}},{"cell_type":"code","source":"## next time","metadata":{"execution":{"iopub.status.busy":"2022-05-16T01:17:56.722767Z","iopub.execute_input":"2022-05-16T01:17:56.723357Z","iopub.status.idle":"2022-05-16T01:17:56.806695Z","shell.execute_reply.started":"2022-05-16T01:17:56.72332Z","shell.execute_reply":"2022-05-16T01:17:56.805497Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2. Visualization","metadata":{}},{"cell_type":"code","source":"%matplotlib inline\nfrom keras.preprocessing.image import load_img\nimport random\n\nsample = random.choice(filenames)\nimage = load_img(\"/kaggle/working/train/\"+sample)\nplt.imshow(image)","metadata":{"execution":{"iopub.status.busy":"2022-05-16T01:15:18.039741Z","iopub.execute_input":"2022-05-16T01:15:18.040355Z","iopub.status.idle":"2022-05-16T01:15:18.27509Z","shell.execute_reply.started":"2022-05-16T01:15:18.040316Z","shell.execute_reply":"2022-05-16T01:15:18.273724Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3. Modeling","metadata":{}},{"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.layers import Conv2D, MaxPooling2D,\\\n    Dropout, Flatten, Dense, Activation,\\\n    BatchNormalization","metadata":{"execution":{"iopub.status.busy":"2022-05-16T01:15:18.27656Z","iopub.execute_input":"2022-05-16T01:15:18.277022Z","iopub.status.idle":"2022-05-16T01:15:18.281373Z","shell.execute_reply.started":"2022-05-16T01:15:18.276989Z","shell.execute_reply":"2022-05-16T01:15:18.280261Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\nWIDTH=128\nHEIGHT=128\nimage_size = (WIDTH, HEIGHT)\nimage_channel =3\n'''\n\nmodel = Sequential()\n\n# layer 1\nmodel.add(Conv2D(32,(3,3), activation='relu',input_shape=(WIDTH, HEIGHT, image_channel)))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2,2)))\nmodel.add(Dropout(0.25))\n\n# layer 2\nmodel.add(Conv2D(64,(3,3),activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2,2)))\nmodel.add(Dropout(0.25))\n\n# layer 3\nmodel.add(Conv2D(128,(3,3),activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPooling2D(pool_size=(2,2)))\nmodel.add(Dropout(0.25))\n\n#layer 4\nmodel.add(Flatten())\nmodel.add(Dense(512,activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(Dropout(0.5))\nmodel.add(Dense(2,activation='softmax')) \n\nmodel.compile(loss='categorical_crossentropy',\n  optimizer='rmsprop',metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2022-05-16T01:15:18.28408Z","iopub.execute_input":"2022-05-16T01:15:18.28459Z","iopub.status.idle":"2022-05-16T01:15:18.396308Z","shell.execute_reply.started":"2022-05-16T01:15:18.284554Z","shell.execute_reply":"2022-05-16T01:15:18.395632Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2022-05-16T01:15:18.397296Z","iopub.execute_input":"2022-05-16T01:15:18.398826Z","iopub.status.idle":"2022-05-16T01:15:18.415064Z","shell.execute_reply.started":"2022-05-16T01:15:18.398787Z","shell.execute_reply":"2022-05-16T01:15:18.414344Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"- Conv2D\n- BatchNormalization\n- MaxPooling\n- Dropout\n- Flatten\n","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 4. accuracy","metadata":{}}]}