Análisis de imágenes
Este código utiliza el dataset mnist para entrenar una red neuronal que reconoce dígitos escritos:
import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Flatten from tensorflow.keras.utils import to_categorical import matplotlib.pyplot as plt # 1. Cargar el conjunto de datos MNIST (X_train, y_train), (X_test, y_test) = tf.keras.datasets.mnist.load_data() # 2. Preprocesar los datos # Escalar los valores de los píxeles al rango [0, 1] X_train, X_test = X_train / 255.0, X_test / 255.0 # Convertir las etiquetas a formato one-hot y_train = to_categorical(y_train) y_test = to_categorical(y_test) # 3. Definir la arquitectura de la red neuronal model = Sequential([ Flatten(input_shape=(28, 28)), # Aplanar la imagen de 28x28 píxeles Dense(128, activation='relu'), # Capa oculta con 128 neuronas y activación ReLU Dense(64, activation='relu'), # Capa oculta adicional con 64 neuronas Dense(10, activation='softmax') # Capa de salida con 10 neuronas (una para cada dígito) y activación softmax ]) # 4. Compilar el modelo model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 5. Entrenar el modelo history = model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_test, y_test)) # 6. Evaluar el modelo loss, accuracy = model.evaluate(X_test, y_test, verbose=0) print(f"Pérdida del modelo: {loss:.2f}, Precisión: {accuracy:.2f}") # 7. Visualizar los resultados # Graficar la precisión y la pérdida durante el entrenamiento plt.figure(figsize=(12, 4)) # Gráfico de la precisión plt.subplot(1, 2, 1) plt.plot(history.history['accuracy'], label='Precisión en entrenamiento') plt.plot(history.history['val_accuracy'], label='Precisión en validación') plt.title('Precisión del modelo') plt.xlabel('Épocas') plt.ylabel('Precisión') plt.legend() # Gráfico de la pérdida plt.subplot(1, 2, 2) plt.plot(history.history['loss'], label='Pérdida en entrenamiento') plt.plot(history.history['val_loss'], label='Pérdida en validación') plt.title('Pérdida del modelo') plt.xlabel('Épocas') plt.ylabel('Pérdida') plt.legend() plt.tight_layout() plt.show() import numpy as np import matplotlib.pyplot as plt # Función para mostrar las predicciones en un subconjunto de imágenes de prueba def show_predictions(model, X_test, y_test, num_images=10): # Seleccionar un subconjunto de imágenes al azar indices = np.random.choice(X_test.shape[0], num_images, replace=False) X_sample = X_test[indices] y_true = np.argmax(y_test[indices], axis=1) # Obtener las etiquetas verdaderas y_pred = np.argmax(model.predict(X_sample), axis=1) # Predecir etiquetas plt.figure(figsize=(15, 3)) for i in range(num_images): plt.subplot(1, num_images, i + 1) plt.imshow(X_sample[i], cmap='gray') plt.axis('off') plt.title(f"True: {y_true[i]}\nPred: {y_pred[i]}") plt.show() # Llamar a la función de predicción para mostrar los resultados show_predictions(model, X_test, y_test, num_images=10) import numpy as np import matplotlib.pyplot as plt # Crear una imagen de 28x28 con valores aleatorios entre 0 y 1 random_image = np.random.rand(28, 28) # Mostrar la imagen generada plt.imshow(random_image, cmap='gray') plt.title("Imagen generada aleatoriamente") plt.axis('off') plt.show() # Redimensionar la imagen para que tenga el formato adecuado (1, 28, 28) para el modelo random_image = random_image.reshape(1, 28, 28) # Hacer la predicción prediction = model.predict(random_image) predicted_class = np.argmax(prediction, axis=1)[0] print(f"El modelo predice que la imagen es el dígito: {predicted_class}") imagen=1-np.array([[1.,1.,1.,1.,1.,1.,0.2,0.4,0.7,0.6,0.1,0.3,0.3,0.2,0.1,0.3,0.4,0.5 ,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,0.1,0.5,0.4,0.1,0.3,0.4,0.6,0.7,0.6,0.1,0.3,0.6 ,0.3,0.3,1.,1.,1.,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,0.1,0.4,0.1,0.4,0.1,0.2,0.1,0.6,0.4,0.3,0.5,0.1 ,0.1,0.2,0.,1.,1.,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,0.6,0.6,0.1,0.6,0.7,0.1,0.6,0.,0.3,0.1,0.6,0.5 ,0.6,0.5,0.1,1.,1.,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,0.2,0.7,0.5,0.,0.3,0.6,0.1,0.5,0.2,0.6,0.2,0.6 ,0.4,0.4,0.4,1.,1.,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.1,0.1 ,0.3,0.,0.1,1.,1.,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.6,0.1 ,0.4,0.4,0.6,1.,1.,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.4,0.1 ,0.6,0.6,0.5,1.,1.,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,0.6,0.6,0.4,0.2,0.2,1.,1.,1.,0.3,0.2 ,0.6,0.3,0.2,1.,1.,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,0.4,0.6,0.1,0.6,0.4,0.5,0.4,0.3,0.3,0.2 ,0.5,0.3,0.1,1.,1.,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,0.,0.1,0.4,0.5,0.1,0.7,0.3,0.2,0.6,0.4 ,0.2,0.2,0.7,1.,1.,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,0.6,0.5,0.6,0.3,0.,0.1,0.1,0.7,0.2,0.4 ,0.1,0.2,0.5,0.2,0.2,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,0.3,0.3,0.,0.6,0.2,0.5,0.1,0.3,0.,0.5 ,0.3,0.5,0.6,0.7,0.5,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,0.4,0.3,0.5,0.5,0.5,0.2,0.4,0.4,0.4,0.4 ,0.5,0.4,0.6,0.,0.5,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.6,0.3 ,0.3,0.5,0.1,0.7,0.2,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. ,0.5,0.,0.5,0.4,0.3,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. ,0.1,0.5,0.1,0.5,0.5,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. ,0.2,0.6,0.3,0.3,0.4,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. ,0.2,0.4,0.2,0.5,0.4,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. ,0.1,0.2,0.6,0.3,0.7,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,0.2 ,0.6,0.1,0.4,0.1,0.7,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,0.7,0.7,0.6,0.1,0.1,0.1,0.4,0.2,0.1,0.1,0.7,0.4 ,0.1,0.5,0.,0.,0.1,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,0.2,0.2,0.2,0.3,0.4,0.2,0.1,0.3,0.6,0.2,0.5,0.6 ,0.4,0.4,0.1,0.3,0.5,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,0.3,0.6,0.2,0.2,0.4,0.5,0.1,0.3,0.2,0.3,0.5,0.6 ,0.,0.5,0.5,0.4,1.,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,0.2,0.2,0.4,0.3,0.5,0.1,0.2,0.7,0.1,0.1,0.1,0.4 ,0.,0.3,0.1,1.,1.,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,0.4,0.5,0.2,0.2,0.1,0.3,0.2,0.3,0.4,0.6,0.6,0.5 ,0.1,1.,1.,1.,1.,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. ,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,] ,[1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. ,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,]]) # Mostrar la imagen generada plt.imshow(imagen, cmap='gray') plt.title("Imagen generada por una matriz") plt.axis('off') plt.show() imagen = imagen.reshape(1, 28, 28) # Hacer la predicción prediction = model.predict(imagen) predicted_class = np.argmax(prediction, axis=1)[0] print(f"El modelo predice que la imagen de matriz es el dígito: {predicted_class}") from PIL import Image # Cargar la imagen imagen = Image.open('numero.png').convert('L') imagen = imagen.resize((28, 28)) # Convertir la imagen en una matriz NumPy matriz = 1-np.array(imagen)/255 # Mostrar la imagen generada plt.imshow(imagen, cmap='gray') plt.title("Imagen cargada") plt.axis('off') plt.show() # Redimensionar la imagen para que tenga el formato adecuado (1, 28, 28) para el modelo imagen = matriz.reshape(1, 28, 28) # Hacer la predicción prediction = model.predict(imagen) predicted_class = np.argmax(prediction, axis=1)[0] print(f"El modelo predice que la imagen es el dígito: {predicted_class}")