{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# `VGG16` Fine-Tuning On Dogs-Cats Classification Task 🙂‍↕️","metadata":{}},{"cell_type":"markdown","source":"Ok.. before we get started let's discuss how things will go here.\n\nThe topic is simple, we will answer the following question: \n**What are the main components in a Dogs Cats classification code using VGG16 with Fine-Tuning?**\n__________________________________________________________________________\nThe code usually contains the following sections:\n\n**1- Data preparation**: Using `ImageDataGenerator` to load the data and apply optimizations such as augmentation.\n\n**2- Building the model**: Loading the `VGG16` model without top layers and freezing the base layers, then adding new layers (such as `GlobalAveragePooling2D`, `Dense`, `Dropout`) to create the final model.\n\n**3- Training the model**: Clustering the model using appropriate loss functions (such as `binary_crossentropy`) and an optimization algorithm (such as `Adam`), then training the model using callbacks such as `EarlyStopping` and `ModelCheckpoint`.\n\n**4- Evaluating the model and displaying the results**: Plotting the accuracy and loss curves, calculating the `confusion matrix`, displaying the classification report, and displaying some images with predictions.","metadata":{}},{"cell_type":"markdown","source":"Well, as you can see, the data needs to be extracted to start working on it, so we will start by import the libraries that we will use and adding everything we need to them, then we will extract the data, and after that we will start working 💡.","metadata":{}},{"cell_type":"markdown","source":"![2.png](attachment:f91f77f8-84d1-470c-990d-a7aceb0d8520.png)","metadata":{},"attachments":{"fc26efb0-77c8-44e4-883a-43127065bdc5.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAhwAAAIcCAMAAACKIIdOAAAACXBIWXMAAAdiAAAHYgE4epnbAAADAFBMVEVHcExAAACtyedgIiNXEhdJABJVEhZxNzROCgpNDQ1aGBxRDQ1WEhZNAABaFRpcGRxWExdWFBdQEBBJAABWExdZFRpREBZWFBhqIyVZFhpVEhdUExdbFxutyeZaFxqGWVuTam1WExWDU1ZiJSbu7u6kg4V5LzCWRkViHiD804tmKi7u7u7HmWaMYWNXFhnzzIXr6elXFRpWExdfICNoKSuwXFe4PT7XzM1VFBimU0/w8PCGeIrGtbaIOztYFRmVYlxrMTTEQ0Ofe31eHR/V1dVgIiXt7e3w8PDaqJiSLC/ArK3AaWLp6emBNzdxOj7FoJJxOj54RUjQw8TwyYPd1dagUEzv7+/t7e2YZ2ju7u7t7e2cS0ru7u7OhGvw8PDv7+/v7+/v7+/u7u6vyuj81ov/5M7qdGjoioDiUFCuyef71Yr+482SY1nmiH6pvdiRYljt7e3hT0/od0v94sxkKCvndkqlt9L504l9Skr838movNd1OTian7jb0tNwSlVnLTFsQUxWFRl0Pj6pjI2qwt9fGx7j3t+KWVFpMDR6XGvo5eZvMDDrzrprNjt6QkCHMjB3REd0JSahr8jlcWa7pabt6eiEUUqNhJjlxbP428aRjaPLvL3QwsOZPTp7QTRaGRx2Kip0UV3YtqbMc2v02MN+ZnWqeW/qwX6whXqXYUeBSTu6kYX2z4agQ0CgcWrx1L+adninREDs6+vIXlXf2tqdqMGJfZCEcoODTEngv63Cmo7Ga2BqOkKvk5SaaWKsxOK1UkuUlap2VmPnhmDjunnXrHGPW1ftxoH+wa63Yl3Brq+2hFp+TlH/0Lzm4uPbamD5pqSPNjTvuKaWmbDdgXj+vKiseVO+j2DJpJZnHR/ghHqmclCRWkHWSkqyl5nofU/okG2cpb7yr3C0nJ3d1taKUjyAa3yPOjnUyMmVb3LVe3KPYFbcsXX4raLRpW2daEnTr6DAhnrslIns3dektM3afnXNoGrvn2becEfOR0fYfHShfoHRY1rUkoXs1s3w8PCpWzqPAAAAYnRSTlMABP3+OA5F/RoUuCZ0Csz2hVkgB9+nL5f9wWNP71HX/f5r/vE7/v3+6FHkS/79r/7+n+fN/f7+/o3+Ef3+/nz++f3+3AbUK0L+/v7+Ivfw/uj0/v7+/m6uM4VXleRuso6+kPuU0lQAAASXaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pgo8eDp4bXBtZXRhIHhtbG5zOng9J2Fkb2JlOm5zOm1ldGEvJz4KPHJkZjpSREYgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJz4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0nJwogIHhtbG5zOkF0dHJpYj0naHR0cDovL25zLmF0dHJpYnV0aW9uLmNvbS9hZHMvMS4wLyc+CiAgPEF0dHJpYjpBZHM+CiAgIDxyZGY6U2VxPgogICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSdSZXNvdXJjZSc+CiAgICAgPEF0dHJpYjpDcmVhdGVkPjIwMjQtMTItMjk8L0F0dHJpYjpDcmVhdGVkPgogICAgIDxBdHRyaWI6RXh0SWQ+YzI2NDA5NDUtYjEyOS00ZDE0LTkxNDUtYWIxNGU1YmUyYzk2PC9BdHRyaWI6RXh0SWQ+CiAgICAgPEF0dHJpYjpGYklkPjUyNTI2NTkxNDE3OTU4MDwvQXR0cmliOkZiSWQ+CiAgICAgPEF0dHJpYjpUb3VjaFR5cGU+MjwvQXR0cmliOlRvdWNoVHlwZT4KICAgIDwvcmRmOmxpPgogICA8L3JkZjpTZXE+CiAgPC9BdHRyaWI6QWRzPgogPC9yZGY6RGVzY3JpcHRpb24+CgogPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9JycKICB4bWxuczpkYz0naHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nPgogIDxkYzp0aXRsZT4KICAgPHJkZjpBbHQ+CiAgICA8cmRmOmxpIHhtbDpsYW5nPSd4LWRlZmF1bHQnPkNvcHkgb2Yga2FnZ2dlbCAtIDE8L3JkZjpsaT4KICAgPC9yZGY6QWx0PgogIDwvZGM6dGl0bGU+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91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"},"f91f77f8-84d1-470c-990d-a7aceb0d8520.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAhwAAAIcCAMAAACKIIdOAAAACXBIWXMAAAdiAAAHYgE4epnbAAADAFBMVEVHcEzMWh3MVRHLWh7MWRzOVxvMWB3LWR3MWR3RYxzKWRzacRjMWxzMVRrLWh7KWR7MWh3RZhrOWx3////2tgz3tAv3uhD3vBL3sgv2uA/LWR73sAz3rQz4xBv89bb4wxn5xx/4ow32tw3o6+kjHyD4pQ34wRf3qwz3rgz4pg34ySD2uRH2tQz4yyT50jH520j53EHO0ND3vhX3qAz4zin3vhDyng/78qv4yiP56o/40Szm6Ob52UL67Zn55WD563D52ED50DX4zi/51DX4vhX51zf53WK66fvn9/343k/56GfQZR/4mw/6/f/51T765Hv573vUbBr654b54VTNXR34qQ33wyX77p/06sD44XH430X4yy7vog7L7vz50jf4oQ778abD7Pv676FtIRf6+bL3lg/4wxfiiRT45Er786/54lj511T51FD3khD0+/740kTmkRJHabzdfBbIysnX8v3nmR5EYLX69pL3sgxCWLDi5OP3vArV2NrNYB3tkg/50zr0sxKkp6T52lvsmBD68oTVch/cdRff4ODXchnyqA388tE1Qoj532vR8Py8vrv3ugooNXjR1dX19vbc9P2/xMb99+f0tx765YHkgxWEQx+YnZ7wrBWdoqDdgRjy68axtLHZex0vKSXriBP3sBXa3t07UKH0uh3t6dNKcsGu5frm7/n2iBLBeBNRhMyqsLH6wkdZnNr//PPwpg36+anehxzCWiRwQBrqpiX461QvPHxOfMe1ubjU1M760mmNUi74pA741EvfjyI2R5mXmZmtZxGshG1OW5Lhkw7koTCnz97Lk3ZOQC28ckr4uxHMtqj4ylLetqDtsSjDXieeVhfs7uypwNmceGSiqsfo48vkfRW4ZzletOf5vTNbcHlWkNNHMx1tTz6PlpvOpI5qc6Kpq6Whs9DtszmOjI1SZZtyi5VPXF/UhTNuNhvPw7vv7+/SeUPQc0DprC6s2+27nIqJlrpIRUZ5nKnwuTrOgg+ZaU7m1J3j0MKMWVn4oiR0gn2Bf4DLNfhoAAAAE3RSTlMA9g/oZC+LnlD3P/XHHth5r+u7LLiIxwAABJdpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0n77u/JyBpZD0nVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkJz8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0nYWRvYmU6bnM6bWV0YS8nPgo8cmRmOlJERiB4bWxuczpyZGY9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMnPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PScnCiAgeG1sbnM6QXR0cmliPSdodHRwOi8vbnMuYXR0cmlidXRpb24uY29tL2Fkcy8xLjAvJz4KICA8QXR0cmliOkFkcz4KICAgPHJkZjpTZXE+CiAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9J1Jlc291cmNlJz4KICAgICA8QXR0cmliOkNyZWF0ZWQ+MjAyNC0xMi0yOTwvQXR0cmliOkNyZWF0ZWQ+CiAgICAgPEF0dHJpYjpFeHRJZD5mYmRjNTFkNS01ZjY2LTQ4YWEtYWVlMy0zYmY4MmNhZGU5NTg8L0F0dHJpYjpFeHRJZD4KICAgICA8QXR0cmliOkZiSWQ+NTI1MjY1OTE0MTc5NTgwPC9BdHRyaWI6RmJJZD4KICAgICA8QXR0cmliOlRvdWNoVHlwZT4yPC9BdHRyaWI6VG91Y2hUeXBlPgogICAgPC9yZGY6bGk+CiAgIDwvcmRmOlNlcT4KICA8L0F0dHJpYjpBZHM+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0nJwogIHhtbG5zOmRjPSdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyc+CiAgPGRjOnRpdGxlPgogICA8cmRmOkFsdD4KICAgIDxyZGY6bGkgeG1sOmxhbmc9J3gtZGVmYXVsdCc+Q29weSBvZiBrYWdnZ2VsIC0gMjwvcmRmOmxpPgogICA8L3JkZjpBbHQ+CiAgPC9kYzp0aXRsZT4KIDwvcmRmOkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PScnCiAgeG1sbnM6cGRmPSdodHRwOi8vbnMuYWRvYmUuY29tL3BkZi8xLjMvJz4KICA8cGRmOkF1dGhvcj5BUldBIEFCT1UtQVRUSUE8L3BkZjpBdXRob3I+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0nJwogIHhtbG5zOnhtcD0naHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyc+CiAgPHhtcDpDcmVhdG9yVG9vbD5DYW52YSBkb2M9REFHYXJYYV9kUTAgdXNlcj1VQUdRR0E4aWxpdzwveG1wOkNyZWF0b3JUb29sPgogPC9yZGY6RGVzY3JpcHRpb24+CjwvcmRmOlJERj4KPC94OnhtcG1ldGE+Cjw/eHBhY2tldCBlbmQ9J3InPz7jWfNQAAAgAElEQVR4Ae2dCVyU1frHRdx3ZRl4BwJmgGEZFwYlFFNAyWXQnByIBOPa/SOkqQhpqAxCKKIULqGxKipp3r9FkmZmSqaZWmS5tPi3upbVvW223up2u/f/e877zsJS2b1o9LnPmWIZXobj9/zmOc95znOet1MnbkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbA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tD8ixk7shYgPtE1GieEpvX/yPdprAArKZtJCxa4NiMS2mlUiHkIaIq5OAtQUInm5X/+Wvkazf1APZ6eaYCGP5r0SW3dqdfrA1r5Ks9/nb9qNQN/+TgPLI0Rsk3ZX0cRuSA5l4xT2lga04RhY/3bf/s5IDs+KcFQHBTbkIIejOORX1qdkIZ18wC8mbnXu5uTUOy+YEslkq2Pdn1HrMns7OXX7mS5Zu8af24tAl0FSz6zMCBpNjAZ9CgpCCfKekvMvjkPXbtCH2ZRum1d+0nKkZGE2cRrU5WeNhvVf1LlLH0nqWZyeF5FA3REtIjMLrsqgn7c61hfgz+1HoG//Pk4wAsVFtVk1Wb0HDsSIOw3q35av0fpvdhW/aykuT4lA4KstyxGRXkQnUJy697gqZch/onOv/t37oVOSuafJ1BOpQJLzoG6/5gVa95Sf+bcJ9O3Rv1v3AYMGDejerX+XXr/OdPft0r0fHYGiGy0UZZVnFjaoUwoz02uKio0WetqpT7cuVye1Ft3v3LdXrx49uvTo1avrrxBWixfhb397Al279ujfvQ+Mjr05Offp3u3XKu23/5dwD5gAE2ACTIAJMAEmwASYABNgAkyAos0KRgAAAoRJREFUCTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMQCHw/3d1VkXynYo5AAAAAElFTkSuQmCC"}}},{"cell_type":"markdown","source":"# 1- Import Library📚","metadata":{}},{"cell_type":"code","source":"import os\nimport zipfile\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport cv2\nimport random\nimport shutil\n\n\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n\nfrom tensorflow.keras.applications import VGG16\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Dense, GlobalAveragePooling2D, Dropout\n\nfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping\n\nfrom sklearn.metrics import classification_report, confusion_matrix","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-02-21T11:17:53.916600Z","iopub.execute_input":"2025-02-21T11:17:53.918305Z","iopub.status.idle":"2025-02-21T11:17:53.936892Z","shell.execute_reply.started":"2025-02-21T11:17:53.918208Z","shell.execute_reply":"2025-02-21T11:17:53.935291Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(os.listdir(\"../input\"))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:27:04.522302Z","iopub.execute_input":"2025-02-21T01:27:04.522646Z","iopub.status.idle":"2025-02-21T01:27:04.528412Z","shell.execute_reply.started":"2025-02-21T01:27:04.522618Z","shell.execute_reply":"2025-02-21T01:27:04.527311Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 2- Extract and Prepare The Data 📦","metadata":{}},{"cell_type":"code","source":"train_zip_path = '/kaggle/input/dogs-vs-cats/train.zip'\ntest_zip_path = '/kaggle/input/dogs-vs-cats/test1.zip'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:27:05.052937Z","iopub.execute_input":"2025-02-21T01:27:05.053277Z","iopub.status.idle":"2025-02-21T01:27:05.057468Z","shell.execute_reply.started":"2025-02-21T01:27:05.053252Z","shell.execute_reply":"2025-02-21T01:27:05.056404Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_dir = '/kaggle/working/data'\nos.makedirs(base_dir, exist_ok=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:27:05.439334Z","iopub.execute_input":"2025-02-21T01:27:05.439681Z","iopub.status.idle":"2025-02-21T01:27:05.444263Z","shell.execute_reply.started":"2025-02-21T01:27:05.439654Z","shell.execute_reply":"2025-02-21T01:27:05.443135Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"with zipfile.ZipFile(train_zip_path, 'r') as zip_ref:\n    zip_ref.extractall('/kaggle/working')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:27:07.720831Z","iopub.execute_input":"2025-02-21T01:27:07.721199Z","iopub.status.idle":"2025-02-21T01:27:18.187952Z","shell.execute_reply.started":"2025-02-21T01:27:07.721165Z","shell.execute_reply":"2025-02-21T01:27:18.186905Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"with zipfile.ZipFile(test_zip_path, 'r') as zip_ref:\n    zip_ref.extractall('/kaggle/working')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:27:18.189362Z","iopub.execute_input":"2025-02-21T01:27:18.189658Z","iopub.status.idle":"2025-02-21T01:27:23.030478Z","shell.execute_reply.started":"2025-02-21T01:27:18.189632Z","shell.execute_reply":"2025-02-21T01:27:23.029568Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dir = os.path.join(base_dir, 'train')\nval_dir = os.path.join(base_dir, 'validation')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:27:23.032055Z","iopub.execute_input":"2025-02-21T01:27:23.032337Z","iopub.status.idle":"2025-02-21T01:27:23.036838Z","shell.execute_reply.started":"2025-02-21T01:27:23.032314Z","shell.execute_reply":"2025-02-21T01:27:23.035652Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_cats_dir = os.path.join(train_dir, 'cats')\ntrain_dogs_dir = os.path.join(train_dir, 'dogs')\nval_cats_dir = os.path.join(val_dir, 'cats')\nval_dogs_dir = os.path.join(val_dir, 'dogs')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:27:23.038262Z","iopub.execute_input":"2025-02-21T01:27:23.038604Z","iopub.status.idle":"2025-02-21T01:27:23.055875Z","shell.execute_reply.started":"2025-02-21T01:27:23.038576Z","shell.execute_reply":"2025-02-21T01:27:23.054806Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"os.makedirs(train_cats_dir, exist_ok=True)\nos.makedirs(train_dogs_dir, exist_ok=True)\nos.makedirs(val_cats_dir, exist_ok=True)\nos.makedirs(val_dogs_dir, exist_ok=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:27:23.056763Z","iopub.execute_input":"2025-02-21T01:27:23.057091Z","iopub.status.idle":"2025-02-21T01:27:23.074363Z","shell.execute_reply.started":"2025-02-21T01:27:23.057065Z","shell.execute_reply":"2025-02-21T01:27:23.073205Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"extracted_train_dir = '/kaggle/working/train'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:27:23.075482Z","iopub.execute_input":"2025-02-21T01:27:23.075835Z","iopub.status.idle":"2025-02-21T01:27:23.093910Z","shell.execute_reply.started":"2025-02-21T01:27:23.075770Z","shell.execute_reply":"2025-02-21T01:27:23.092832Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cat_files = [f for f in os.listdir(extracted_train_dir) if f.startswith('cat')]\ndog_files = [f for f in os.listdir(extracted_train_dir) if f.startswith('dog')]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:27:23.094978Z","iopub.execute_input":"2025-02-21T01:27:23.095266Z","iopub.status.idle":"2025-02-21T01:27:23.143906Z","shell.execute_reply.started":"2025-02-21T01:27:23.095241Z","shell.execute_reply":"2025-02-21T01:27:23.142740Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_cat_files, val_cat_files = train_test_split(cat_files, test_size=0.2, random_state=42)\ntrain_dog_files, val_dog_files = train_test_split(dog_files, test_size=0.2, random_state=42)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:27:23.146143Z","iopub.execute_input":"2025-02-21T01:27:23.146464Z","iopub.status.idle":"2025-02-21T01:27:23.159173Z","shell.execute_reply.started":"2025-02-21T01:27:23.146431Z","shell.execute_reply":"2025-02-21T01:27:23.157644Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for fname in train_cat_files:\n    src = os.path.join(extracted_train_dir, fname)\n    dst = os.path.join(train_cats_dir, fname)\n    shutil.copyfile(src, dst)\n\nfor fname in val_cat_files:\n    src = os.path.join(extracted_train_dir, fname)\n    dst = os.path.join(val_cats_dir, fname)\n    shutil.copyfile(src, dst)\n\n\nfor fname in train_dog_files:\n    src = os.path.join(extracted_train_dir, fname)\n    dst = os.path.join(train_dogs_dir, fname)\n    shutil.copyfile(src, dst)\n\nfor fname in val_dog_files:\n    src = os.path.join(extracted_train_dir, fname)\n    dst = os.path.join(val_dogs_dir, fname)\n    shutil.copyfile(src, dst)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:27:23.160592Z","iopub.execute_input":"2025-02-21T01:27:23.161081Z","iopub.status.idle":"2025-02-21T01:27:25.850645Z","shell.execute_reply.started":"2025-02-21T01:27:23.161034Z","shell.execute_reply":"2025-02-21T01:27:25.849711Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f\"Number of cat training images: {len(train_cat_files)}\")\nprint(f\"Number of dog training images: {len(train_dog_files)}\")\nprint(f\"Number of cat verification images: {len(val_cat_files)}\")\nprint(f\"Number of dog verification images: {len(val_dog_files)}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:27:25.851641Z","iopub.execute_input":"2025-02-21T01:27:25.851927Z","iopub.status.idle":"2025-02-21T01:27:25.858410Z","shell.execute_reply.started":"2025-02-21T01:27:25.851903Z","shell.execute_reply":"2025-02-21T01:27:25.857225Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"img_size = (224, 224)\nbatch_size = 32\n\ntrain_datagen = ImageDataGenerator(\n    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)\n\nval_datagen = ImageDataGenerator(rescale=1./255)\n\ntrain_generator = train_datagen.flow_from_directory(\n    train_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode='binary'\n)\n\nvalidation_generator = val_datagen.flow_from_directory(\n    val_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode='binary'\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:48:44.396464Z","iopub.execute_input":"2025-02-21T01:48:44.397012Z","iopub.status.idle":"2025-02-21T01:48:44.837858Z","shell.execute_reply.started":"2025-02-21T01:48:44.396975Z","shell.execute_reply":"2025-02-21T01:48:44.836890Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 3- Building the model 🪜","metadata":{}},{"cell_type":"code","source":"base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:27:25.859470Z","iopub.execute_input":"2025-02-21T01:27:25.859769Z","iopub.status.idle":"2025-02-21T01:27:26.890974Z","shell.execute_reply.started":"2025-02-21T01:27:25.859743Z","shell.execute_reply":"2025-02-21T01:27:26.889897Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_model.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:27:39.307555Z","iopub.execute_input":"2025-02-21T01:27:39.307938Z","iopub.status.idle":"2025-02-21T01:27:39.339675Z","shell.execute_reply.started":"2025-02-21T01:27:39.307910Z","shell.execute_reply":"2025-02-21T01:27:39.338731Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for layer in base_model.layers:\n    layer.trainable = False\n\nx = base_model.output\nx = GlobalAveragePooling2D()(x)\nx = Dense(256, activation='relu')(x)\nx = Dropout(0.5)(x)\npredictions = Dense(1, activation='sigmoid')(x)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:32:41.104692Z","iopub.execute_input":"2025-02-21T01:32:41.105135Z","iopub.status.idle":"2025-02-21T01:32:41.133968Z","shell.execute_reply.started":"2025-02-21T01:32:41.105101Z","shell.execute_reply":"2025-02-21T01:32:41.132923Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = Model(inputs=base_model.input, outputs=predictions)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:32:42.303219Z","iopub.execute_input":"2025-02-21T01:32:42.303567Z","iopub.status.idle":"2025-02-21T01:32:42.311695Z","shell.execute_reply.started":"2025-02-21T01:32:42.303539Z","shell.execute_reply":"2025-02-21T01:32:42.310528Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:34:11.837230Z","iopub.execute_input":"2025-02-21T01:34:11.837607Z","iopub.status.idle":"2025-02-21T01:34:11.875248Z","shell.execute_reply.started":"2025-02-21T01:34:11.837579Z","shell.execute_reply":"2025-02-21T01:34:11.873969Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:37:38.775414Z","iopub.execute_input":"2025-02-21T01:37:38.776817Z","iopub.status.idle":"2025-02-21T01:37:38.809666Z","shell.execute_reply.started":"2025-02-21T01:37:38.776749Z","shell.execute_reply":"2025-02-21T01:37:38.808201Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 4- Model Training ⏰","metadata":{}},{"cell_type":"code","source":"checkpoint = ModelCheckpoint('best_model.keras', monitor='val_accuracy', save_best_only=True, verbose=1)\nearlystop = EarlyStopping(monitor='val_loss', patience=5, verbose=1, restore_best_weights=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:43:31.611097Z","iopub.execute_input":"2025-02-21T01:43:31.611541Z","iopub.status.idle":"2025-02-21T01:43:31.616754Z","shell.execute_reply.started":"2025-02-21T01:43:31.611500Z","shell.execute_reply":"2025-02-21T01:43:31.615364Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history = model.fit(\n    train_generator,\n    steps_per_epoch=train_generator.samples // batch_size,\n    epochs=20,\n    validation_data=validation_generator,\n    validation_steps=validation_generator.samples // batch_size,\n    callbacks=[checkpoint, earlystop]\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T01:48:52.944830Z","iopub.execute_input":"2025-02-21T01:48:52.945244Z","iopub.status.idle":"2025-02-21T10:41:44.861046Z","shell.execute_reply.started":"2025-02-21T01:48:52.945208Z","shell.execute_reply":"2025-02-21T10:41:44.857144Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 5- Evaluation & Data Visualization 📊","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(12,5))\n\nplt.subplot(1,2,1)\nplt.plot(history.history['accuracy'], label='Train Accuracy')\nplt.plot(history.history['val_accuracy'], label='Validation Accuracy')\nplt.title('Model Accuracy')\nplt.xlabel('Epoch')\nplt.ylabel('Accuracy')\nplt.legend()\n\nplt.subplot(1,2,2)\nplt.plot(history.history['loss'], label='Train Loss')\nplt.plot(history.history['val_loss'], label='Validation Loss')\nplt.title('Model Loss')\nplt.xlabel('Epoch')\nplt.ylabel('Loss')\nplt.legend()\n\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T11:18:19.804314Z","iopub.execute_input":"2025-02-21T11:18:19.804757Z","iopub.status.idle":"2025-02-21T11:18:20.405650Z","shell.execute_reply.started":"2025-02-21T11:18:19.804725Z","shell.execute_reply":"2025-02-21T11:18:20.404483Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"From the figure, there appears to be a **huge** fluctuation in both Accuracy and Loss over several Epochs 🫨. This fluctuation means that the model is **unstable** during the training process; as we can see, the accuracy increases in one epoch and drops sharply in the next, and so on.\n\nOkay, I know what's causing the fluctuation here, I'll tell you about it and the solution if you're curious about it, but I'll finish the project because I don't have time to apply the modifications here 🫠.\n\nYou can also see the following warning message that appeared during the training process:\n```\nUserWarning: Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least 'steps_per_epoch' batches.\n```\n\nThis warning means that the number of samples in the `train_generator` (or the number of available batches) is less than the value specified in `steps_per_epoch`. That is, the model reaches the end of the data before completing all the steps specified for one epoch, so it suddenly stops and starts a new epoch.\n\nThis interruption in the middle of the road makes the amount of data that the model sees in each epoch **unstable**. Therefore, it will not be able to update the parameters regularly and **sharp fluctuations** in accuracy and loss may appear between one epoch and another.\n\nLet me explain the subject in a simpler way, let's start by explaining each term in detail with clear examples:\nThe difference between **batch**, **epoch**, and **steps_per_epoch**\n\n---\n\n## **🔹 1. What is a Batch?**\nA **batch** is a small set of samples that are passed to the model once during training.\n\nWhen we have a large dataset, we do not pass it all at once to the model, but rather divide it into small parts called **batches**.\n\nImagine that you have **1000 images** and you want to train a model on them, but **it is difficult to pass 1000 images at once to the neural network** due to limited memory.\nSo, we divide the images into smaller parts (batches).\nFor example, if you choose `batch_size = 32`, it means that each batch contains **only 32 images**.\n\n---\n\n## **🔹 2. What is an Epoch?**\nAn **Epoch** is a complete training cycle, meaning that it goes through **all the training data once**.\n\nIf you have **1000 images** and you train the model for **10 epochs (`epochs = 10`)**, it means that the model will **see all the images 10 times** during the training period.\n\n---\n\n## **🔹 3. What is Steps per Epoch?**\n`steps_per_epoch` is the number of batches (**batches**) that the model needs to complete **one epoch** of training.\n\n💡 **How ​​do we calculate it?**\n[\n\\text{steps_per_epoch} = \\frac{\\text{Total number of samples}}{\\text{batch_size}}\n\n\\]\n\nIf you have **1000 images** and `batch_size = 32`, the number of steps in each epoch is calculated as follows:\n[\n\\frac{1000}{32} = 31.25\n\n\\]\nSince the number of steps must be an integer, we take `steps_per_epoch = 31`.\n\n✋ **But if we put `steps_per_epoch = 50` in the code, we will face a problem!**\n\nBecause the data will end at step 31, and after that the model will not find any data to complete the remaining steps, which will lead to an error or warning **\"Your input ran out of data\"**.\n\nAnd this is exactly the problem we are facing.\n\n---\n\n##### **🔴 Once again**\n❌ **If `steps_per_epoch` is larger than the actual number of batches, the model will run out of data before the epoch is finished!**\nThis causes **training jitter**, because each epoch uses an unstable amount of data, leading to large fluctuations in accuracy and loss.\n\n---","metadata":{}},{"cell_type":"markdown","source":"### ✅ **SOLUTION**\n\nTo resolve the **Out of data before `steps_per_epoch`** error, the value of `steps_per_epoch` must be modified to match the actual number of samples available in `train_generator`.\n\n---\n\n### **✅ 1. Calculate the number of batches available in `train_generator`**\nIn your code, if you are using `ImageDataGenerator` or `flow_from_directory()`, you can find out the number of available samples via the `train_generator.samples` property:\n\n```python\nnum_samples = train_generator.samples\nbatch_size = train_generator.batch_size\nsteps_per_epoch = num_samples // batch_size\n```\n---\n\n### **✅ 2. Modify `steps_per_epoch` in `model.fit()`**\nNow that we have calculated `steps_per_epoch`, we need to modify it inside `model.fit()`:\n\n```python\nmodel.fit(\ntrain_generator,\nsteps_per_epoch=steps_per_epoch, # Use the automatically calculated number\nepochs=20,\nvalidation_data=val_generator,\nvalidation_steps=val_generator.samples // val_generator.batch_size\n)\n```\n\n---\n\n### **🔴 What happens if there are samples left after division?**\n\nIf `num_samples` is not exactly divisible by `batch_size`, some samples may remain unused.\n\nTo ensure that all data is used, add this modification:\n\n```python\nsteps_per_epoch = (num_samples // batch_size) + (1 if num_samples % batch_size != 0 else 0)\n```\nThis way, all available data will be included.\n\n---\n\n#### **✅ After modification (correct solution)**\n```python\nsteps_per_epoch = train_generator.samples // train_generator.batch_size\n\nmodel.fit(\ntrain_generator,\nsteps_per_epoch=steps_per_epoch, # Correctly calculated value ✅\nepochs=20,\nvalidation_data=val_generator,\nvalidation_steps=val_generator.samples // val_generator.batch_size\n)\n```","metadata":{}},{"cell_type":"code","source":"validation_generator.reset()\npredictions = model.predict(validation_generator, steps=validation_generator.samples // batch_size + 1)\npredicted_classes = (predictions > 0.5).astype(\"int32\").flatten()\n\ntrue_classes = validation_generator.classes\nclass_labels = list(validation_generator.class_indices.keys())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T11:19:17.903309Z","iopub.execute_input":"2025-02-21T11:19:17.903872Z","iopub.status.idle":"2025-02-21T11:40:20.281431Z","shell.execute_reply.started":"2025-02-21T11:19:17.903822Z","shell.execute_reply":"2025-02-21T11:40:20.280099Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Classification Report:\")\nprint(classification_report(true_classes, predicted_classes, target_names=class_labels))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T12:11:08.817276Z","iopub.execute_input":"2025-02-21T12:11:08.818919Z","iopub.status.idle":"2025-02-21T12:11:08.856335Z","shell.execute_reply.started":"2025-02-21T12:11:08.818841Z","shell.execute_reply":"2025-02-21T12:11:08.855077Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### **📌 Classification Report Analysis**\nThe classification report gives us **Precision**, **Recall** and **F1-score**:\n\n| Class | Precision | Recall | F1-score | Support |\n\n|---|---|---|---|\n\n**Cats** | 0.50 | 0.54 | 0.52 | 2500 |\n\n**Dogs** | 0.50 | 0.46 | 0.47 | 2500 |\n\n**Overall Average** | 0.50 | 0.50 | 0.50 | 0.50 | 5000 |\n\n🔹 **Precision:** means the correct proportion of samples classified as belonging to a certain class (how often the model was right when predicting a certain class).\n🔹 **Recall:** measures how well the model can retrieve all the true samples from the class.\n🔹 **F1-score:** A balanced measure between precision and recall.\n\n✅ **Analysis:**\n- All values ​​are close to **0.50**, which indicates that the model is performing like **random guessing**.\n- **Precision and recall are very close** for both cats and dogs, which means that the model does not distinguish between them well.","metadata":{}},{"cell_type":"markdown","source":"### **The reason for the bad performance is that `steps_per_epoch` is not set correctly** 🫣🫣🫣","metadata":{}},{"cell_type":"code","source":"cm = confusion_matrix(true_classes, predicted_classes)\nplt.figure(figsize=(6,5))\nsns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=class_labels, yticklabels=class_labels)\nplt.title('Confusion Matrix')\nplt.ylabel('Actual')\nplt.xlabel('Predicted')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T12:12:52.775954Z","iopub.execute_input":"2025-02-21T12:12:52.776481Z","iopub.status.idle":"2025-02-21T12:12:53.312002Z","shell.execute_reply.started":"2025-02-21T12:12:52.776447Z","shell.execute_reply":"2025-02-21T12:12:53.310871Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### **🔍 Analysis of the matrix results and the classification report**\n\n#### **📌 1. Analysis of the confusion matrix**\nThe confusion matrix tells us how many samples were correctly or incorrectly classified for each category:\n\n| | **Predicted: Cats** | **Predicted: Dogs** |\n|---|---|---|\n| **Actual: Cats** | 1342 (True Positive) ✅ | 1158 (False Negative) ❌ |\n| **Actual: Dogs** | 1361 (False Positive) ❌ | 1139 (True Negative) ✅ |\n\n- **True Positives (TP - Cats classified as cats)** = 1342\n- **True Negatives (TN - Dogs classified as dogs)** = 1139\n- **False Positives (FP - Dogs classified as cats)** = 1361\n- **False Negatives (FN - Cats classified as dogs)** = 1158\n\n➡️ There are a large number of errors, indicating that the model does not distinguish well between the two classes.","metadata":{}},{"cell_type":"code","source":"sample_imgs, sample_labels = next(validation_generator)\npreds_sample = model.predict(sample_imgs)\npredicted_sample = (preds_sample > 0.5).astype(\"int32\")\n\nplt.figure(figsize=(12, 12))\nfor i in range(min(9, len(sample_imgs))):\n    plt.subplot(3,3,i+1)\n    plt.imshow(sample_imgs[i])\n    true_label = 'Dog' if sample_labels[i] == 1 else 'Cat'\n    pred_label = 'Dog' if predicted_sample[i] == 1 else 'Cat'\n    plt.title(f\"True: {true_label}\\nPred: {pred_label}\")\n    plt.axis('off')\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T12:15:27.685131Z","iopub.execute_input":"2025-02-21T12:15:27.685596Z","iopub.status.idle":"2025-02-21T12:15:37.709335Z","shell.execute_reply.started":"2025-02-21T12:15:27.685559Z","shell.execute_reply":"2025-02-21T12:15:37.707957Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 6- A function to test the model on a number of test images and display the results with a confidence percentage🫡","metadata":{}},{"cell_type":"code","source":"def predict_test_images(test_dir, model, img_size=(224, 224)):\n    test_files = os.listdir(test_dir)\n    results = []\n    \n    for i, fname in enumerate(test_files[:12]):  # افتراضياً يعرض أول 12 صورة\n        if fname.lower().endswith('.jpg'):\n            img_path = os.path.join(test_dir, fname)\n            img = cv2.imread(img_path)\n            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n            img_resized = cv2.resize(img, img_size)\n            \n            img_array = img_resized / 255.0\n            \n            pred = model.predict(np.expand_dims(img_array, axis=0))[0][0]\n            pred_label = \"Dog\" if pred > 0.5 else \"Cat\"\n            confidence = pred if pred > 0.5 else 1 - pred\n            \n            results.append((img_resized, pred_label, confidence))\n    \n    if results:\n        plt.figure(figsize=(15, 12))\n        for i, (img, label, conf) in enumerate(results):\n            plt.subplot(3, 4, i+1)\n            plt.imshow(img)\n            plt.title(f\"Pred: {label}\\nConf: {conf:.2f}\")\n            plt.axis('off')\n        plt.tight_layout()\n        plt.show()\n    \n    return results","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T12:20:34.405827Z","iopub.execute_input":"2025-02-21T12:20:34.406299Z","iopub.status.idle":"2025-02-21T12:20:34.416474Z","shell.execute_reply.started":"2025-02-21T12:20:34.406266Z","shell.execute_reply":"2025-02-21T12:20:34.415027Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_dir = '/kaggle/working/test1'\npredict_test_images(test_dir, model, img_size=(224, 224))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-21T12:21:01.072129Z","iopub.execute_input":"2025-02-21T12:21:01.072535Z","iopub.status.idle":"2025-02-21T12:21:08.956582Z","shell.execute_reply.started":"2025-02-21T12:21:01.072502Z","shell.execute_reply":"2025-02-21T12:21:08.955061Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# The End 🩷\n----","metadata":{}}]}