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}")