{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"dockerImageVersionId":30761,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"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":"2024-09-12T15:43:26.698784Z","iopub.execute_input":"2024-09-12T15:43:26.699789Z","iopub.status.idle":"2024-09-12T15:43:26.708240Z","shell.execute_reply.started":"2024-09-12T15:43:26.699748Z","shell.execute_reply":"2024-09-12T15:43:26.707286Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Descomprimimos y leemos los datos.\n","metadata":{}},{"cell_type":"code","source":"import zipfile\nimport os\n\n# Definir las rutas\ntrain_zip = '/kaggle/input/dogs-vs-cats/train.zip'\ntest_zip ='/kaggle/input/dogs-vs-cats/test1.zip'\nextract_path = '/kaggle/working/dogs-vs-cats/'\n\n# Extraer el conjunto de entrenamiento\nwith zipfile.ZipFile(train_zip, 'r') as zip_ref:\n    zip_ref.extractall(extract_path)\n\n# Extraer el conjunto de prueba\nwith zipfile.ZipFile(test_zip, 'r') as zip_ref:\n    zip_ref.extractall(extract_path)\n\nprint(\"Datos extraídos exitosamente\")\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T15:43:26.710452Z","iopub.execute_input":"2024-09-12T15:43:26.711198Z","iopub.status.idle":"2024-09-12T15:43:35.263596Z","shell.execute_reply.started":"2024-09-12T15:43:26.711154Z","shell.execute_reply":"2024-09-12T15:43:35.262615Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\n#for dirname, _, filenames in os.walk('/kaggle/working'):\n    #for filename in filenames:\n        #print(os.path.join(dirname, filename))","metadata":{"execution":{"iopub.status.busy":"2024-09-12T15:43:35.264873Z","iopub.execute_input":"2024-09-12T15:43:35.265266Z","iopub.status.idle":"2024-09-12T15:43:35.269511Z","shell.execute_reply.started":"2024-09-12T15:43:35.265221Z","shell.execute_reply":"2024-09-12T15:43:35.268593Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Movemos los archivos de perros y gatos a carpetas separadas","metadata":{}},{"cell_type":"code","source":"\nimport shutil\n\n# Definir la ruta a la carpeta de entrenamiento\ntrain_dir = '/kaggle/working/dogs-vs-cats/train/'\n\n# Crear subdirectorios para gatos y perros\nos.makedirs(os.path.join(train_dir, 'cats'), exist_ok=True)\nos.makedirs(os.path.join(train_dir, 'dogs'), exist_ok=True)\n\n# Mover imágenes a sus carpetas correspondientes\nfor filename in os.listdir(train_dir):\n    #print (filename)\n    if filename =='cats': continue\n    if filename =='dogs': continue\n    # Ignorar las subcarpetas ya creadas\n    if os.path.isdir(filename):\n        continue\n    if 'cat' in filename:\n        shutil.move(os.path.join(train_dir, filename), os.path.join(train_dir, 'cats', filename))\n    elif 'dog' in filename:\n        shutil.move(os.path.join(train_dir, filename), os.path.join(train_dir, 'dogs', filename))\n\nprint(\"Imágenes organizadas en carpetas 'cats' y 'dogs'.\")\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T15:43:35.270699Z","iopub.execute_input":"2024-09-12T15:43:35.271069Z","iopub.status.idle":"2024-09-12T15:43:40.664726Z","shell.execute_reply.started":"2024-09-12T15:43:35.271036Z","shell.execute_reply":"2024-09-12T15:43:40.663764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Comprobamos que se han movido correctamente los archivos","metadata":{}},{"cell_type":"code","source":"#for dirname, _, filenames in os.walk('/kaggle/working'):\n    #for filename in filenames:\n        #print(os.path.join(dirname, filename))","metadata":{"execution":{"iopub.status.busy":"2024-09-12T15:43:40.667881Z","iopub.execute_input":"2024-09-12T15:43:40.668256Z","iopub.status.idle":"2024-09-12T15:43:40.672764Z","shell.execute_reply.started":"2024-09-12T15:43:40.668222Z","shell.execute_reply":"2024-09-12T15:43:40.671660Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"cargamos las imagenes de Gatos y Perros","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# Definir el directorio base donde están organizadas las imágenes en subcarpetas 'cats' y 'dogs'\ntrain_dir = '/kaggle/working/dogs-vs-cats/train/'\n\n# Crear un generador de imágenes con aumento de datos y normalización (rescale)\ndatagen = ImageDataGenerator(\n    rescale=1./255,       # Escalar los valores de píxeles al rango [0, 1]\n    validation_split=0.2, # Reservar un 20% de los datos para validación\n    horizontal_flip=True, # Aumentación de datos: voltear horizontalmente\n    rotation_range=20,    # Aumentación: rotación de 0 a 20 grados\n    width_shift_range=0.1, # Aumentación: desplazamiento horizontal\n    height_shift_range=0.1 # Aumentación: desplazamiento vertical\n)\n\n# Crear generador de entrenamiento\ntrain_generator = datagen.flow_from_directory(\n    train_dir,            # La carpeta que contiene las subcarpetas 'cats' y 'dogs'\n    target_size=(128, 128),  # Redimensionar las imágenes a 128x128 píxeles\n    batch_size=32,\n    class_mode='binary',     # Clasificación binaria (gatos vs perros)\n    subset='training'        # Usar el 80% de los datos para entrenamiento\n)\n\n# Crear generador de validación\nvalidation_generator = datagen.flow_from_directory(\n    train_dir,\n    target_size=(128, 128),\n    batch_size=32,\n    class_mode='binary',\n    subset='validation'      # Usar el 20% restante para validación\n)\n\nprint(\"Generadores de datos listos.\")\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T15:43:40.674114Z","iopub.execute_input":"2024-09-12T15:43:40.674404Z","iopub.status.idle":"2024-09-12T15:43:41.494555Z","shell.execute_reply.started":"2024-09-12T15:43:40.674374Z","shell.execute_reply":"2024-09-12T15:43:41.493602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\n\n# Verificar la ruta\ntrain_dir = '/kaggle/working'\nprint(os.listdir(train_dir))\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T15:43:41.495744Z","iopub.execute_input":"2024-09-12T15:43:41.496130Z","iopub.status.idle":"2024-09-12T15:43:41.502057Z","shell.execute_reply.started":"2024-09-12T15:43:41.496090Z","shell.execute_reply":"2024-09-12T15:43:41.500939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense\n\n# Definir el modelo\nmodel = Sequential([\n    Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 3)),\n    MaxPooling2D(pool_size=(2, 2)),\n    Conv2D(64, (3, 3), activation='relu'),\n    MaxPooling2D(pool_size=(2, 2)),\n    Conv2D(128, (3, 3), activation='relu'),\n    MaxPooling2D(pool_size=(2, 2)),\n    Flatten(),\n    Dense(128, activation='relu'),\n    Dense(1, activation='sigmoid')\n])\n\n# Compilar el modelo\nmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n\n# Mostrar el resumen del modelo\nmodel.summary()\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T15:43:41.503551Z","iopub.execute_input":"2024-09-12T15:43:41.503906Z","iopub.status.idle":"2024-09-12T15:43:41.581830Z","shell.execute_reply.started":"2024-09-12T15:43:41.503866Z","shell.execute_reply":"2024-09-12T15:43:41.580916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"Entrenamos el modelo","metadata":{}},{"cell_type":"code","source":"#Entrenamos el modelo\nhistory = model.fit(\n    train_generator,\n    epochs=1,                 # Ajusta el número de épocas según sea necesario\n    validation_data=validation_generator\n)\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T15:43:41.583025Z","iopub.execute_input":"2024-09-12T15:43:41.583324Z","iopub.status.idle":"2024-09-12T15:45:55.760522Z","shell.execute_reply.started":"2024-09-12T15:43:41.583293Z","shell.execute_reply":"2024-09-12T15:45:55.759665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Evaluación de modelo","metadata":{}},{"cell_type":"code","source":"# Evaluar el modelo en el conjunto de validación\nval_loss, val_accuracy = model.evaluate(validation_generator)\nprint(f'Pérdida en validación: {val_loss}')\nprint(f'Precisión en validación: {val_accuracy}')\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T15:45:55.761888Z","iopub.execute_input":"2024-09-12T15:45:55.762213Z","iopub.status.idle":"2024-09-12T15:46:22.292767Z","shell.execute_reply.started":"2024-09-12T15:45:55.762180Z","shell.execute_reply":"2024-09-12T15:46:22.291786Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"Hacer Predicciones\n","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# Ruta a la carpeta de imágenes de prueba\ntest_dir = '/kaggle/working/dogs-vs-cats/test1'\n\n# Crear un DataFrame con los nombres de las imágenes\nimage_files = [f for f in os.listdir(test_dir) if f.endswith('.jpg')]\ndf_test = pd.DataFrame({\n    'filename': image_files\n})\n\n\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T16:37:05.305961Z","iopub.execute_input":"2024-09-12T16:37:05.306322Z","iopub.status.idle":"2024-09-12T16:37:05.325131Z","shell.execute_reply.started":"2024-09-12T16:37:05.306288Z","shell.execute_reply":"2024-09-12T16:37:05.324246Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# Crear el generador para las imágenes de prueba\ndatagen = ImageDataGenerator(rescale=1./255)  # Normalización de las imágenes\n\n# Generar las imágenes desde el DataFrame\ntest_generator = datagen.flow_from_dataframe(\n    df_test,\n    directory=test_dir,      # Carpeta que contiene las imágenes\n    x_col='filename',        # Columna que contiene los nombres de las imágenes\n    target_size=(128, 128),  # Tamaño al que se redimensionarán las imágenes\n    batch_size=32,\n    class_mode=None,         # No necesitas etiquetas para el conjunto de prueba\n    shuffle=False            # Importante para que las predicciones se alineen con las imágenes\n)\n\n# Realizar las predicciones\npredictions = model.predict(test_generator)","metadata":{"execution":{"iopub.status.busy":"2024-09-12T16:44:41.998183Z","iopub.execute_input":"2024-09-12T16:44:41.999220Z","iopub.status.idle":"2024-09-12T16:44:58.585191Z","shell.execute_reply.started":"2024-09-12T16:44:41.999166Z","shell.execute_reply":"2024-09-12T16:44:58.584360Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Visualizamos el entrenamiento","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport numpy as np\n\n# Convertir predicciones a clases (por ejemplo, 0 para gatos y 1 para perros)\npredicted_classes = (predictions > 0.5).astype(int)\n\n# Mostrar algunas imágenes con sus predicciones\nplt.figure(figsize=(12, 12))\nfor i in range(5):\n    img_path = os.path.join(test_dir, df_test['filename'].iloc[i])\n    img = plt.imread(img_path)\n    \n    plt.subplot(1, 5, i+1)\n    plt.imshow(img)\n    plt.title(f'Predicción: {\"Dog\" if predicted_classes[i] == 1 else \"Cat\"}')\n    plt.axis('off')\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T16:46:24.767033Z","iopub.execute_input":"2024-09-12T16:46:24.767951Z","iopub.status.idle":"2024-09-12T16:46:25.210414Z","shell.execute_reply.started":"2024-09-12T16:46:24.767907Z","shell.execute_reply":"2024-09-12T16:46:25.209527Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Visualizamos unas cunatas imagenes para ver como las ha clasificado","metadata":{}},{"cell_type":"code","source":"test_generator = datagen.flow_from_directory(\n    '/kaggle/working/dogs-vs-cats/test1',  # La carpeta que contiene las imágenes de prueba\n    target_size=(128, 128),\n    batch_size=5,  # Cargar solo 5 imágenes a la vez para visualización\n    class_mode=None,  # No se necesita etiquetado para las imágenes de prueba\n    shuffle=False  # Importante para que las predicciones correspondan a las imágenes\n)\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T16:45:07.012130Z","iopub.execute_input":"2024-09-12T16:45:07.012486Z","iopub.status.idle":"2024-09-12T16:45:07.116269Z","shell.execute_reply.started":"2024-09-12T16:45:07.012453Z","shell.execute_reply":"2024-09-12T16:45:07.115330Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\n\n# Obtener un lote de imágenes del generador\nimages, _ = next(test_generator)\n\n# Realizar predicciones en el lote de imágenes\npredictions = model.predict(images)\n\n# Convertir las predicciones a etiquetas (0 o 1)\npredicted_classes = (predictions > 0.5).astype(int)\n\n# Visualizar las imágenes y sus predicciones\nplt.figure(figsize=(10, 10))\nfor i in range(len(images)):\n    plt.subplot(1, 5, i+1)\n    plt.imshow(images[i])\n    plt.title(f'Predicción: {\"Dog\" if predicted_classes[i] == 1 else \"Cat\"}')\n    plt.axis('off')\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T16:26:05.877774Z","iopub.execute_input":"2024-09-12T16:26:05.878178Z","iopub.status.idle":"2024-09-12T16:26:05.917759Z","shell.execute_reply.started":"2024-09-12T16:26:05.878143Z","shell.execute_reply":"2024-09-12T16:26:05.916614Z"},"trusted":true},"execution_count":null,"outputs":[]}]}