{"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":"none","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"dockerImageVersionId":30761,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os              # Permite interactuar con el sistema de archivos.\nimport numpy as np      # Trabaja con arrays y operaciones matemáticas eficientes.\nimport pandas as pd     # Maneja y analiza grandes conjuntos de datos estructurados.\nimport random as rnd    # Genera números aleatorios para simulaciones o muestreo.\nimport matplotlib.pyplot as plt  # Crea gráficos y visualizaciones de datos.\n%matplotlib inline      \n# Muestra gráficos dentro de notebooks.\n\nfrom sklearn.model_selection import train_test_split  # Divide datos en conjuntos de entrenamiento y prueba.\n\nimport keras                          # Biblioteca para construir redes neuronales.\nfrom keras.models import Sequential   # Construye modelos de redes neuronales secuenciales.\nfrom keras.utils import to_categorical  # Convierte etiquetas a formato categórico.\nfrom keras.preprocessing.image import load_img  # Carga imágenes para su procesamiento.\nfrom keras.layers import Flatten, Dense, Dropout  # Define capas de redes neuronales.\nfrom keras.layers import Conv2D, MaxPool2D, BatchNormalization, Activation  # Capas para redes neuronales convolucionales.\n\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator  # Aumenta y prepara imágenes para el entrenamiento.\n\nprint(os.listdir(\"/kaggle/input/dogs-vs-cats\"))  # Muestra los archivos en la carpeta especificada.","metadata":{"execution":{"iopub.status.busy":"2024-09-12T11:03:52.177498Z","iopub.execute_input":"2024-09-12T11:03:52.177992Z","iopub.status.idle":"2024-09-12T11:03:52.193119Z","shell.execute_reply.started":"2024-09-12T11:03:52.177949Z","shell.execute_reply":"2024-09-12T11:03:52.191757Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Paso 1: Cargar y descomprimir los archivos si no lo has hecho aún\ntrain_dir = \"/kaggle/input/dogs-vs-cats/train.zip\"\ntest_dir = \"/kaggle/input/dogs-vs-cats/test1.zip\"\n\n# Descomprimir los archivos zip\nimport zipfile\n\n# Descomprimir el conjunto de entrenamiento\nwith zipfile.ZipFile(train_dir, 'r') as zip_ref:\n    zip_ref.extractall('/kaggle/working/train/')\n\n# Descomprimir el conjunto de prueba\nwith zipfile.ZipFile(test_dir, 'r') as zip_ref:\n    zip_ref.extractall('/kaggle/working/test/')\n\n# Paso 2: Preparar las imágenes y asignar etiquetas\ntrain_path = '/kaggle/working/train/'\ntest_path = '/kaggle/working/test/'\n\n# Obtener nombres de imágenes\ntrain_images = os.listdir(train_path)\ntest_images = os.listdir(test_path)\n\n# Filtrar solo archivos .jpg (evitar directorios)\ntrain_images = [img for img in train_images if img.endswith('.jpg')]\ntest_images = [img for img in test_images if img.endswith('.jpg')]\n\n# Crear etiquetas basadas en los nombres de archivo (cat = 0, dog = 1)\ntrain_labels = [0 if 'cat' in img else 1 for img in train_images]\n\n# Paso 3: Cargar las imágenes en un formato adecuado para el modelo\n\n# Definir el tamaño de las imágenes y el tamaño del lote\nimg_size = (128, 128)\nbatch_size = 32\n\n# Aumentar las imágenes con técnicas de aumento de datos\ntrain_datagen = ImageDataGenerator(\n    rescale=1./255,              # Normalización de imágenes\n    shear_range=0.2,             # Distorsión para generar más datos\n    zoom_range=0.2,              # Hacer zoom a las imágenes\n    horizontal_flip=True,        # Invertir imágenes horizontalmente\n    validation_split=0.2         # Separar un 20% para validación\n)\n\n# Cargar las imágenes desde los directorios\ntrain_generator = train_datagen.flow_from_directory(\n    '/kaggle/working/train',       # Directorio donde están las imágenes\n    target_size=img_size,          # Redimensionar imágenes a 128x128\n    batch_size=batch_size,\n    class_mode='binary',           # Clasificación binaria: perros y gatos\n    subset='training'              # Usar el conjunto de entrenamiento\n)\n\nvalidation_generator = train_datagen.flow_from_directory(\n    '/kaggle/working/train',       # Usar el mismo directorio\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode='binary',\n    subset='validation'            # Usar el conjunto de validación\n)\n\n# Ahora tienes tus generadores de datos listos para el entrenamiento.\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T11:13:02.265601Z","iopub.execute_input":"2024-09-12T11:13:02.266836Z","iopub.status.idle":"2024-09-12T11:13:15.205811Z","shell.execute_reply.started":"2024-09-12T11:13:02.266769Z","shell.execute_reply":"2024-09-12T11:13:15.204467Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Paso 4: Construcción del modelo CNN corregido\n\nfrom keras.layers import Input\n\n# Definir el modelo secuencial\nmodel = Sequential()\n\n# Definir la capa de entrada\nmodel.add(Input(shape=(128, 128, 3)))  # Capa de entrada con la forma de la imagen (128x128x3)\n\n# Primera capa convolucional\nmodel.add(Conv2D(32, (3, 3), padding='same'))\nmodel.add(BatchNormalization())  # Normalización para acelerar el entrenamiento\nmodel.add(Activation('relu'))    # Función de activación ReLU\nmodel.add(MaxPool2D(pool_size=(2, 2)))  # Capa de pooling\n\n# Segunda capa convolucional\nmodel.add(Conv2D(64, (3, 3), padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(MaxPool2D(pool_size=(2, 2)))\n\n# Tercera capa convolucional\nmodel.add(Conv2D(128, (3, 3), padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(MaxPool2D(pool_size=(2, 2)))\n\n# Aplanar las características 2D para prepararlas para las capas densas\nmodel.add(Flatten())\n\n# Capa densa totalmente conectada\nmodel.add(Dense(512))  # 512 neuronas\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.5))  # Regularización para evitar el sobreajuste\n\n# Capa de salida (binaria)\nmodel.add(Dense(1))       # 1 neurona de salida para clasificación binaria\nmodel.add(Activation('sigmoid'))  # Función de activación sigmoid para salida binaria\n\n# Mostrar el resumen del modelo\nmodel.summary()\n\n# Compilar el modelo\nmodel.compile(\n    loss='binary_crossentropy',    # Pérdida binaria ya que es una clasificación binaria\n    optimizer='adam',              # Optimizador Adam (efectivo y popular)\n    metrics=['accuracy']           # Métrica de evaluación: exactitud\n)\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T11:16:00.629117Z","iopub.execute_input":"2024-09-12T11:16:00.630533Z","iopub.status.idle":"2024-09-12T11:16:01.204041Z","shell.execute_reply.started":"2024-09-12T11:16:00.630454Z","shell.execute_reply":"2024-09-12T11:16:01.202186Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Paso 5: Entrenar el modelo (sin multiprocessing)\n\n# Definir el número de épocas y los pasos por época\nepochs = 10  # Puedes ajustar el número de épocas según tus necesidades\nsteps_per_epoch = train_generator.n // train_generator.batch_size\nvalidation_steps = validation_generator.n // validation_generator.batch_size\n\n# Entrenar el modelo sin multiprocessing\nhistory = model.fit(\n    train_generator,\n    steps_per_epoch=steps_per_epoch,\n    epochs=epochs,\n    validation_data=validation_generator,\n    validation_steps=validation_steps\n)\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T11:18:09.840451Z","iopub.execute_input":"2024-09-12T11:18:09.840949Z","iopub.status.idle":"2024-09-12T12:32:51.363347Z","shell.execute_reply.started":"2024-09-12T11:18:09.840906Z","shell.execute_reply":"2024-09-12T12:32:51.359346Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Gráfico de la exactitud del entrenamiento y la validación\nplt.plot(history.history['accuracy'], label='Train Accuracy')\nplt.plot(history.history['val_accuracy'], label='Validation Accuracy')\nplt.title('Exactitud del modelo durante el entrenamiento')\nplt.ylabel('Exactitud')\nplt.xlabel('Épocas')\nplt.legend(loc='upper left')\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T12:34:30.680517Z","iopub.execute_input":"2024-09-12T12:34:30.681326Z","iopub.status.idle":"2024-09-12T12:34:31.133533Z","shell.execute_reply.started":"2024-09-12T12:34:30.681253Z","shell.execute_reply":"2024-09-12T12:34:31.131295Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Gráfico de la pérdida del entrenamiento y la validación\nplt.plot(history.history['loss'], label='Train Loss')\nplt.plot(history.history['val_loss'], label='Validation Loss')\nplt.title('Pérdida del modelo durante el entrenamiento')\nplt.ylabel('Pérdida')\nplt.xlabel('Épocas')\nplt.legend(loc='upper left')\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T12:34:51.056188Z","iopub.execute_input":"2024-09-12T12:34:51.056657Z","iopub.status.idle":"2024-09-12T12:34:51.321257Z","shell.execute_reply.started":"2024-09-12T12:34:51.056615Z","shell.execute_reply":"2024-09-12T12:34:51.319621Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}