Entrenamiento gatos y perros
Para entrenar una red neuronal que me clasifique perros y gatos he bajado este dataset:
https://www.microsoft.com/en-us/download/details.aspx?id=54765
Tiene 15000 imagenes de gatos y perros.
He utilizado el siguiente código para entrenar una red convolucional:
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.optimizers import Adam
import matplotlib.pyplot as plt
# Definir rutas
train_dir = 'dataset/' # Asegúrate de que tus imágenes están organizadas en carpetas "gatos" y "perros"
# Preprocesamiento de las imágenes
train_datagen = ImageDataGenerator(
rescale=1. / 255, # Normaliza las imágenes
shear_range=0.2, # Aumenta las imágenes con transformaciones aleatorias
zoom_range=0.2,
horizontal_flip=True
)
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(64, 64), # Redimensiona las imágenes a 64x64
batch_size=32,
class_mode='binary' # Como es un problema de clasificación binaria (gato o perro)
)
# Definir el modelo CNN
model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)),
MaxPooling2D((2, 2)),
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D((2, 2)),
Conv2D(64, (3, 3), activation='relu'),
Flatten(),
Dense(64, activation='relu'),
Dropout(0.5),
Dense(1, activation='sigmoid') # Salida binaria (0 o 1)
])
# Compilar el modelo
model.compile(
optimizer=Adam(),
loss='binary_crossentropy',
metrics=['accuracy']
)
# Entrenar el modelo
history = model.fit(
train_generator,
steps_per_epoch=train_generator.samples // train_generator.batch_size,
epochs=10
)
# Evaluar el modelo
plt.plot(history.history['accuracy'])
plt.title('Precisión del modelo')
plt.xlabel('Épocas')
plt.ylabel('Precisión')
plt.show()
# Guardar el modelo entrenado
model.save('modelo_gato_perro.h5')
He guardado el modelo para no tener que entrenar, ya que tarda mucho. El resultado es el siguiente:
https://trifulcas.com/wp-content/uploads/2024/11/modelo_gato_perro.h5
Con ese modelo podemos hacer predicciones.
from tensorflow.keras.preprocessing import image
import numpy as np
from tensorflow.keras.models import load_model
for i in range(100):
# Cargar la imagen
img_path = f'dataset/Dog/{i*10}.jpg' # Cambia la ruta de la imagen
img = image.load_img(img_path, target_size=(64, 64)) # Redimensionar a 64x64
img_array = image.img_to_array(img)
img_array = np.expand_dims(img_array, axis=0) # Hacer batch
# Normalizar la imagen
img_array /= 255.
model = load_model('modelo_gato_perro.h5')
# Realizar la predicción
prediction = model.predict(img_array)
# Mostrar el resultado
if prediction[0] > 0.5:
print("Es un perro.")
else:
print(f"Es un gato {i}.")
Podríamos mirar la precisión, o incluso descargar imágenes de perros y gatos para probar