{"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":"# 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:39:07.296642Z","iopub.execute_input":"2024-09-12T15:39:07.297061Z","iopub.status.idle":"2024-09-12T15:39:07.703157Z","shell.execute_reply.started":"2024-09-12T15:39:07.297012Z","shell.execute_reply":"2024-09-12T15:39:07.702159Z"},"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:39:11.169059Z","iopub.execute_input":"2024-09-12T15:39:11.169609Z","iopub.status.idle":"2024-09-12T15:39:26.461241Z","shell.execute_reply.started":"2024-09-12T15:39:11.169566Z","shell.execute_reply":"2024-09-12T15:39:26.460204Z"},"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":{"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:39:35.844244Z","iopub.execute_input":"2024-09-12T15:39:35.844652Z","iopub.status.idle":"2024-09-12T15:39:36.791486Z","shell.execute_reply.started":"2024-09-12T15:39:35.844612Z","shell.execute_reply":"2024-09-12T15:39:36.790410Z"},"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-12T14:01:35.203217Z","iopub.execute_input":"2024-09-12T14:01:35.203684Z","iopub.status.idle":"2024-09-12T14:01:35.615377Z","shell.execute_reply.started":"2024-09-12T14:01:35.203645Z","shell.execute_reply":"2024-09-12T14:01:35.613797Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"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:39:43.153016Z","iopub.execute_input":"2024-09-12T15:39:43.153431Z","iopub.status.idle":"2024-09-12T15:39:56.938592Z","shell.execute_reply.started":"2024-09-12T15:39:43.153389Z","shell.execute_reply":"2024-09-12T15:39:56.937359Z"},"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:40:16.985625Z","iopub.execute_input":"2024-09-12T15:40:16.986896Z","iopub.status.idle":"2024-09-12T15:40:16.992148Z","shell.execute_reply.started":"2024-09-12T15:40:16.986848Z","shell.execute_reply":"2024-09-12T15:40:16.991143Z"},"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:40:24.193846Z","iopub.execute_input":"2024-09-12T15:40:24.194243Z","iopub.status.idle":"2024-09-12T15:40:24.365085Z","shell.execute_reply.started":"2024-09-12T15:40:24.194208Z","shell.execute_reply":"2024-09-12T15:40:24.363885Z"},"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:40:39.770524Z","iopub.execute_input":"2024-09-12T15:40:39.771547Z","iopub.status.idle":"2024-09-12T15:46:39.074386Z","shell.execute_reply.started":"2024-09-12T15:40:39.771493Z","shell.execute_reply":"2024-09-12T15:46:39.073206Z"},"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:46:39.076594Z","iopub.execute_input":"2024-09-12T15:46:39.077900Z","iopub.status.idle":"2024-09-12T15:47:20.414480Z","shell.execute_reply.started":"2024-09-12T15:46:39.077844Z","shell.execute_reply":"2024-09-12T15:47:20.413332Z"},"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:18:32.158265Z","iopub.execute_input":"2024-09-12T16:18:32.158672Z","iopub.status.idle":"2024-09-12T16:18:32.175389Z","shell.execute_reply.started":"2024-09-12T16:18:32.158631Z","shell.execute_reply":"2024-09-12T16:18:32.174273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nfrom 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)\n\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T16:23:15.106151Z","iopub.execute_input":"2024-09-12T16:23:15.106584Z","iopub.status.idle":"2024-09-12T16:24:09.983255Z","shell.execute_reply.started":"2024-09-12T16:23:15.106542Z","shell.execute_reply":"2024-09-12T16:24:09.982159Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"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\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T16:24:14.170949Z","iopub.execute_input":"2024-09-12T16:24:14.171882Z","iopub.status.idle":"2024-09-12T16:24:14.672138Z","shell.execute_reply.started":"2024-09-12T16:24:14.171839Z","shell.execute_reply":"2024-09-12T16:24:14.671092Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Visualizamos unas cuantas imagenes para ver como las ha clasificado","metadata":{}}]}