Solución clasificación
import numpy as np
from sklearn.datasets import fetch_olivetti_faces
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.utils import to_categorical
# Cargar el dataset Olivetti Faces
data = fetch_olivetti_faces()
X = data.images # Imágenes (número de instancias, 64, 64)
y = data.target # Etiquetas de personas (0 a 39)
# Preprocesamiento
X = X.reshape(X.shape[0], 64, 64, 1) # Redimensionar para añadir el canal de color
X = X / 255.0 # Normalización
# Codificación one-hot de las etiquetas
y = to_categorical(y, num_classes=40)
# Dividir el dataset en entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Construcción del modelo
model = Sequential([
Flatten(input_shape=(64, 64, 1)),
Dense(128, activation='relu'),
Dense(128, activation='relu'),
Dense(128, activation='relu'),
Dense(40, activation='softmax') # 40 clases para las personas en el dataset
])
# Compilar el modelo
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# Entrenar el modelo
model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_test, y_test))
# Evaluar el modelo
loss, accuracy = model.evaluate(X_test, y_test)
print(f'Accuracy en el conjunto de prueba: {accuracy * 100:.2f}%')
import matplotlib.pyplot as plt
import random
# Seleccionar algunas muestras aleatorias de X_test para probar las predicciones
num_samples = 10 # Número de muestras para mostrar
indices = random.sample(range(X_test.shape[0]), num_samples)
sample_images = X_test[indices]
sample_labels = y_test[indices]
# Generar predicciones en las muestras seleccionadas
predictions = model.predict(sample_images)
predicted_classes = np.argmax(predictions, axis=1)
true_classes = np.argmax(sample_labels, axis=1)
# Visualizar las muestras junto con la etiqueta real y la predicción
plt.figure(figsize=(15, 8))
for i in range(num_samples):
plt.subplot(2, 5, i + 1)
plt.imshow(sample_images[i].reshape(64, 64), cmap='gray')
plt.title(f'Predicción: {predicted_classes[i]}\nReal: {true_classes[i]}')
plt.axis('off')
plt.tight_layout()
plt.show()