{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"dockerImageVersionId":30786,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os, re, random\nimport pandas as pd\nimport numpy as np\nimport zipfile\nnp.random.seed(2)\nfrom PIL import Image\nimport io\n# Visualisation\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport seaborn as sns\n%matplotlib inline\n\n# Tools for cross-validation, error calculation\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import confusion_matrix\nimport itertools\nfrom keras.utils import to_categorical\n\n# Machine Learning\nfrom keras.models import Sequential\nfrom keras import layers\nfrom keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D\nfrom keras.layers import MaxPooling2D, GlobalMaxPooling2D, Activation\nfrom keras.optimizers import RMSprop\n# from keras.preprocessing.image import ImageDataGenerator, load_img\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom keras import optimizers\n# from keras.callbacks import ReduceLROnPlateau, EarlyStopping\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau\nfrom keras.models import Model\nfrom keras.applications import VGG16\nfrom keras.applications.resnet50 import ResNet50","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-25T13:20:55.738003Z","iopub.execute_input":"2024-11-25T13:20:55.738314Z","iopub.status.idle":"2024-11-25T13:21:09.493363Z","shell.execute_reply.started":"2024-11-25T13:20:55.738285Z","shell.execute_reply":"2024-11-25T13:21:09.492421Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"zip_train_path = '/kaggle/input/dogs-vs-cats/train.zip'\nzip_test_path = '/kaggle/input/dogs-vs-cats/test1.zip'\nnew_size = (128, 128)\ndef preprocess(input_zip, size=new_size):\n    images_processed = []\n    \n    with zipfile.ZipFile(input_zip, 'r') as archive_zip:\n        archives = archive_zip.namelist()\n        \n        images = [archive for archive in archives if archive.endswith(('.png', '.jpg', '.jpeg'))]\n        \n        for img_path in images:\n            with archive_zip.open(img_path) as image_zip:\n                img = Image.open(io.BytesIO(image_zip.read()))\n                \n                img = img.convert('L')\n                \n                img = img.resize(size)\n                \n                img_array = np.array(img) / 255.0\n                \n                images_processed.append(img_array)\n    \n    dataset = np.array(images_processed)\n    \n    return dataset\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-25T13:21:09.495043Z","iopub.execute_input":"2024-11-25T13:21:09.495646Z","iopub.status.idle":"2024-11-25T13:21:09.501677Z","shell.execute_reply.started":"2024-11-25T13:21:09.495616Z","shell.execute_reply":"2024-11-25T13:21:09.500653Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dataset = preprocess(zip_train_path, new_size)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-25T13:21:09.502965Z","iopub.execute_input":"2024-11-25T13:21:09.503361Z","iopub.status.idle":"2024-11-25T13:22:04.126527Z","shell.execute_reply.started":"2024-11-25T13:21:09.503316Z","shell.execute_reply":"2024-11-25T13:22:04.125694Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def extract_tags(input_zip):\n    results = []\n    with zipfile.ZipFile(input_zip, 'r') as archive_zip:\n        archives = archive_zip.namelist()\n        \n        images = [archive for archive in archives if archive.endswith(('.png', '.jpg', '.jpeg'))]\n        \n        for img_path in images:\n            if 'dog' in img_path.lower():\n                results.append(('dog', img_path))\n            elif 'cat' in img_path.lower():\n                results.append(('cat', img_path))\n            else:\n                results.append(('unknown', img_path))  # Si no es identificable\n        \n    return results\ntrain_labels = extract_tags(zip_train_path)\ntrain_binary = np.array([1 if label == 'dog' else 0 for label, _ in train_labels])\n\ntrain_dataset = np.expand_dims(train_dataset, axis=-1)\n\n# Train split\nX_train, X_temp, y_train, y_temp = train_test_split(train_dataset, train_binary, test_size=0.2, random_state=42)\n\n# Validation-Test Split\nX_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-25T13:22:04.128435Z","iopub.execute_input":"2024-11-25T13:22:04.128725Z","iopub.status.idle":"2024-11-25T13:22:05.598082Z","shell.execute_reply.started":"2024-11-25T13:22:04.128697Z","shell.execute_reply":"2024-11-25T13:22:05.597067Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"j=480\nplt.imshow(X_val[j])\nprint(y_val[j])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T08:40:10.528986Z","iopub.execute_input":"2024-11-24T08:40:10.530040Z","iopub.status.idle":"2024-11-24T08:40:10.896869Z","shell.execute_reply.started":"2024-11-24T08:40:10.529984Z","shell.execute_reply":"2024-11-24T08:40:10.895841Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 1)))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Conv2D(64, (3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Conv2D(128, (3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Flatten())\nmodel.add(Dense(128, activation='relu'))\nmodel.add(Dense(1, activation='sigmoid'))\nmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-25T13:22:05.599219Z","iopub.execute_input":"2024-11-25T13:22:05.599498Z","iopub.status.idle":"2024-11-25T13:22:06.557972Z","shell.execute_reply.started":"2024-11-25T13:22:05.599473Z","shell.execute_reply":"2024-11-25T13:22:06.557036Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history = model.fit(X_train, y_train, epochs=10, validation_data=(X_val, y_val))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-25T13:22:06.559196Z","iopub.execute_input":"2024-11-25T13:22:06.559857Z","iopub.status.idle":"2024-11-25T13:23:39.897808Z","shell.execute_reply.started":"2024-11-25T13:22:06.559813Z","shell.execute_reply":"2024-11-25T13:23:39.897057Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"loss, accuracy = model.evaluate(X_test, y_test)\nprint(f'Accuracy: {accuracy:.4f}')\nprint(f'Loss: {loss:.4f}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-25T13:23:51.137986Z","iopub.execute_input":"2024-11-25T13:23:51.138720Z","iopub.status.idle":"2024-11-25T13:23:52.087582Z","shell.execute_reply.started":"2024-11-25T13:23:51.138685Z","shell.execute_reply":"2024-11-25T13:23:52.086675Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Confusion Matrix\ny_pred = model.predict(X_test)\ny_pred = (y_pred > 0.5).astype(int)\ncm = confusion_matrix(y_test, y_pred)\nplt.figure(figsize=(8, 6))\nsns.heatmap(cm, annot=True, fmt='d', cmap='Blues', cbar=False, \n            xticklabels=['Class 0', 'Class 1'], yticklabels=['Class 0', 'Class 1'])\nplt.xlabel('Predicted Labels')\nplt.ylabel('True Labels')\nplt.title('Confusion Matrix')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-25T13:23:56.189679Z","iopub.execute_input":"2024-11-25T13:23:56.190373Z","iopub.status.idle":"2024-11-25T13:23:57.629241Z","shell.execute_reply.started":"2024-11-25T13:23:56.190338Z","shell.execute_reply":"2024-11-25T13:23:57.628202Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_dataset = preprocess(zip_test_path, new_size)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-25T13:24:23.304073Z","iopub.execute_input":"2024-11-25T13:24:23.305012Z","iopub.status.idle":"2024-11-25T13:24:51.942523Z","shell.execute_reply.started":"2024-11-25T13:24:23.304977Z","shell.execute_reply":"2024-11-25T13:24:51.941771Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_real = model.predict(X_test)\ny_real = (y_real > 0.5).astype(int)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-25T13:25:22.054361Z","iopub.execute_input":"2024-11-25T13:25:22.054718Z","iopub.status.idle":"2024-11-25T13:25:22.923704Z","shell.execute_reply.started":"2024-11-25T13:25:22.054687Z","shell.execute_reply":"2024-11-25T13:25:22.922777Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"num_samples = 5  # Number of samples to display\nrandom_indices = np.random.choice(len(y_real), num_samples, replace=False)\nplt.figure(figsize=(15, 5))\nfor i, idx in enumerate(random_indices):\n    plt.subplot(1, num_samples, i + 1)\n    plt.imshow(X_test[idx].reshape(128, 128), cmap='gray')  # Reshape for display and use grayscale\n    # true_label = 'dog' if y_test[idx] == 1 else 'cat'  # True label\n    # pred_label = 'dog' if y_pred[idx][0] == 1 else 'cat'  # Predicted label\n    plt.title(f'Pred: {y_real[random_indices][0]}')\n    plt.axis('off')\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-25T13:28:02.027186Z","iopub.execute_input":"2024-11-25T13:28:02.027564Z","iopub.status.idle":"2024-11-25T13:28:02.592051Z","shell.execute_reply.started":"2024-11-25T13:28:02.027535Z","shell.execute_reply":"2024-11-25T13:28:02.591198Z"}},"outputs":[],"execution_count":null}]}