Proyecto utilizando TensorFlow y un dataset de Kaggle
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)
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
])
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")
test_loss, test_acc = model.evaluate(test_ds)
print("Precisión en test:", test_acc)
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()
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()
¿Preguntas?