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()