LAPICES_VS_PLUMAS
de Jose Luis Pacheco Maldonado @jlps862
- 10
- 0
- 0
Introducción
Mi código hace uso de lo aprendido durante el curso y consiste en una red de aprendizaje capaz de diferenciar entre plumas y lápices. Para su desarrollo, primero recopilé un conjunto de imágenes representativas de ambas clases (plumas y lápices), organizándolas en carpetas separadas. Estas imágenes se utilizaron para entrenar dos modelos distintos:
Un modelo de red neuronal convolucional (CNN) creado desde cero.
Un modelo basado en transferencia de aprendizaje utilizando MobileNetV2, un modelo preentrenado.
Ambos modelos fueron entrenados con un conjunto de datos previamente dividido en entrenamiento y validación, con el objetivo de evaluar su rendimiento y evitar el sobreajuste. Se aplicaron técnicas básicas de preprocesamiento y normalización de imágenes, y se experimentó con diferentes hiperparámetros como el número de épocas y capas.
Finalmente, el modelo fue probado con nuevas imágenes no vistas durante el entrenamiento, permitiendo validar su capacidad de generalización. Esta experiencia me permitió comparar el rendimiento entre un modelo propio y uno basado en un modelo preentrenado, entendiendo mejor los beneficios de la transferencia de aprendizaje

Materiales
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import os
# Paso 1: Cargar el dataset
ruta = "dataset" # ← cámbialo según tu carpeta real
img_size = (224, 224)
batch_size = 32
train_ds = tf.keras.utils.image_dataset_from_directory(
ruta,
validation_split=0.2,
subset="training",
seed=123,
image_size=img_size,
batch_size=batch_size
)
val_ds = tf.keras.utils.image_dataset_from_directory(
ruta,
validation_split=0.2,
subset="validation",
seed=123,
image_size=img_size,
batch_size=batch_size
)
class_names = train_ds.class_names
print("Clases:", class_names)
# Paso 2: Mejorar rendimiento
AUTOTUNE = tf.data.AUTOTUNE
train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
# Paso 3a: Modelo desde cero (CNN simple)
modelo_cnn = tf.keras.Sequential([
tf.keras.layers.Rescaling(1./255, input_shape=(224, 224, 3)),
tf.keras.layers.Conv2D(32, 3, activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Conv2D(64, 3, activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(len(class_names), activation='softmax')
])
modelo_cnn.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
print("\n📌 Entrenando modelo CNN desde cero...")
hist_cnn = modelo_cnn.fit(train_ds, validation_data=val_ds, epochs=10)
# Paso 3b: Modelo con transferencia de aprendizaje
import tensorflow_hub as hub
url = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4"
base_model = hub.KerasLayer(url, input_shape=(224, 224, 3), trainable=False)
modelo_transfer = tf.keras.Sequential([
base_model,
tf.keras.layers.Dense(len(class_names), activation='softmax')
])
modelo_transfer.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
print("\n📌 Entrenando modelo con MobileNetV2...")
hist_transfer = modelo_transfer.fit(train_ds, validation_data=val_ds, epochs=5)
# Paso 4: Gráficas de resultados
def plot_history(hist, title):
plt.plot(hist.history['accuracy'], label='Entrenamiento')
plt.plot(hist.history['val_accuracy'], label='Validación')
plt.title(title)
plt.xlabel("Épocas")
plt.ylabel("Precisión")
plt.legend()
plt.grid(True)
plt.show()
plot_history(hist_cnn, "Precisión del modelo CNN")
plot_history(hist_transfer, "Precisión del modelo Transferencia")
# Paso 5: Probar con nuevas imágenes
def cargar_predecir_imagen(ruta_img, modelo):
img = tf.keras.preprocessing.image.load_img(ruta_img, target_size=img_size)
img_array = tf.keras.preprocessing.image.img_to_array(img)
img_array = tf.expand_dims(img_array, 0) / 255.0 # Normalizar
pred = modelo.predict(img_array)
clase = class_names[np.argmax(pred)]
print(f"Imagen: {ruta_img} → Clase predicha: {clase}")
plt.imshow(img)
plt.title(f"Predicción: {clase}")
plt.axis("off")
plt.show()
# Ejemplo de prueba
cargar_predecir_imagen("imagenes_para_prueba/pluma_test.jpg", modelo_transfer)
LAPICES_VS_PLUMAS
Gracias a este curso podre mejorar mis conocimientos en progrmaacion y con el tiempo ir afilando mis hablidades en diferentes diciplinas, de este modo podre mejorar mi CV y con ellos poder ir escalando en los puestos a los que vaya asendiendo.

0 comentários
Faça login ou cadastre-se Gratuitamente para comentar