Clasificación de Deportes con Redes Neuronales

Proyecto utilizando TensorFlow y un dataset de Kaggle

1. Descripción del Dataset

2. Preparación de los Datos


import tensorflow as tf

train_ds = tf.keras.utils.image_dataset_from_directory(
    "train",
    validation_split=0.2,
    subset="training",
    seed=123,
    image_size=(180, 180),
    batch_size=32
)

val_ds = tf.keras.utils.image_dataset_from_directory(
    "valid",
    validation_split=0.2,
    subset="validation",
    seed=123,
    image_size=(180, 180),
    batch_size=32
)

test_ds = tf.keras.utils.image_dataset_from_directory(
    "test",
    validation_split=0.2,
    subset="validation",
    seed=123,
    image_size=(180, 180),
    batch_size=32
)

class_names = train_ds.class_names  # Lista de clases según el dataset
num_clases = len(class_names)
                

3. Arquitectura del Modelo


model = tf.keras.Sequential([
    tf.keras.layers.Rescaling(1./255, input_shape=(180, 180, 3)),
    tf.keras.layers.Conv2D(16, 3, activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    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(num_clases)  # num_clases = número total de deportes
])
                

4. Compilación y Entrenamiento


model.compile(
    optimizer='adam',
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics=['accuracy']
)

history = model.fit(
    train_ds,
    validation_data=val_ds,
    epochs=10
)

model.save("modelo_entrenado.keras")
                

5. Evaluación del Modelo


test_loss, test_acc = model.evaluate(test_ds)
print("Precisión en test:", test_acc)
  

6. Visualización de Resultados


import matplotlib.pyplot as plt

acc = history.history['accuracy']
val_acc = history.history['val_accuracy']

loss = history.history['loss']
val_loss = history.history['val_loss']

plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1)
plt.plot(acc, label='Entrenamiento')
plt.plot(val_acc, label='Validación')
plt.title('Precisión')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(loss, label='Entrenamiento')
plt.plot(val_loss, label='Validación')
plt.title('Pérdida')
plt.legend()
plt.show()
                

7. Demostración con Gradio

Interfaz interactiva para probar el modelo con imágenes nuevas.


import gradio as gr
import tensorflow as tf
import numpy as np

train_ds = tf.keras.utils.image_dataset_from_directory(
    "train",
    validation_split=0.2,
    subset="training",
    seed=123,
    image_size=(180, 180),
    batch_size=32
)

# Cargar el modelo entrenado
model = tf.keras.models.load_model("modelo_entrenado.keras")
class_names = train_ds.class_names  # Lista de clases según el dataset

# Función para predecir
def predict_image(image):
    img = tf.image.resize(image, (180, 180))
    img = tf.expand_dims(img, 0)  # Batch de 1
    prediction = model(img, training=False)
    score = tf.nn.softmax(prediction[0])
    return {class_names[i]: float(score[i]) for i in range(len(class_names))}

# Crear interfaz
interface = gr.Interface(
    fn=predict_image,
    inputs=gr.Image(type="numpy"),
    outputs=gr.Label(num_top_classes=3),
    title="Clasificador de Deportes",
    description="Carga una imagen deportiva y obtén la predicción del modelo"
)

interface.launch()
                

8. Conclusiones

Gracias 🙌

¿Preguntas?