Keras: primera red neuronal
Keras es una API de redes neuronales de alto nivel, escrita en Python, que puede ejecutarse sobre TensorFlow, CNTK o Theano. Su desarrollo se centra en apoyar la experimentación rápida, permitiendo pasar de una idea a un resultado rápidamente con un mínimo de código.
Características principales de Keras
- Amigable para el usuario: Keras tiene una interfaz simple y consistente
- Modular: Los distintos componentes de una red neuronal (capas, optimizadores, esquemas de inicialización, etc.) son módulos combinables.
- Fácil extensibilidad: Se pueden agregar fácilmente nuevos módulos para expresar nuevas ideas de investigación.
- Soporte de múltiples backends: Se puede cambiar sin problemas entre TensorFlow, Theano y CNTK como backend de cálculo.
Instalación de Keras
Antes de comenzar, necesitamos instalar Keras y su motor backend (aquí usamos TensorFlow):
pip install tensorflow keras
Nota: Keras 2.4.0 y versiones posteriores ya están integradas en TensorFlow, se puede usar directamente a través de
tensorflow.kerasusar
Construyendo la primera red neuronal
Comencemos con una simple red neuronal totalmente conectada para resolver el clásico problema de reconocimiento de dígitos manuscritos MNIST.
1. Importar las bibliotecas necesarias
Ejemplo
from tensorflow import keras
from tensorflow.keras import layers
2. Preparar los datos
El conjunto de datos MNIST contiene 60,000 imágenes de entrenamiento y 10,000 imágenes de prueba, cada una es una imagen en escala de grises de un dígito manuscrito de 28x28 píxeles.
Ejemplo
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# Preprocesar los datos
x_train = x_train.reshape(60000, 784).astype("float32") / 255
x_test = x_test.reshape(10000, 784).astype("float32") / 255
# Convertir las etiquetas a codificación one-hot
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
3. Construir el modelo
Construiremos una red totalmente conectada simple, que contiene una capa de entrada, una capa oculta y una capa de salida.
Ejemplo
layers.Dense(512, activation="relu", input_shape=(784,)),
layers.Dense(10, activation="softmax")
])
Análisis de la estructura del modelo
Ejemplo
A[Capa de entrada 784 neuronas] --> B[Capa oculta 512 neuronas, activación ReLU]
B --> C[Capa de salida 10 neuronas, activación Softmax]
4. Compilar el modelo
Antes de entrenar el modelo, necesitamos configurar el proceso de aprendizaje:
Ejemplo
optimizer="rmsprop",
loss="categorical_crossentropy",
metrics=["accuracy"]
)
Explicación de los parámetros de compilación
| Parámetro | Descripción | Valores comunes |
|---|---|---|
| optimizer | Optimizador, se usa para actualizar los pesos | "rmsprop", "adam", "sgd" |
| loss | Función de pérdida, mide la diferencia entre las predicciones del modelo y los valores reales | "categorical_crossentropy" (clasificación), "mse" (regresión) |
| metrics | Métrica de evaluación, se usa para monitorear el entrenamiento | ["accuracy"] |
5. Entrenar el modelo
Ahora podemos comenzar a entrenar el modelo:
Ejemplo
x_train, y_train,
batch_size=128,
epochs=10,
validation_split=0.2
)
Explicación de los parámetros de entrenamiento
| Parámetro | Descripción | Valor sugerido |
|---|---|---|
| batch_size | Número de muestras utilizadas en cada actualización de gradiente | 32-256 |
| epochs | Número de épocas de entrenamiento | Ajustar según la complejidad de los datos |
| validation_split | Proporción de datos de entrenamiento utilizada como conjunto de validación | 0.1-0.3 |
6. Evaluar el modelo
Después del entrenamiento, podemos evaluar el rendimiento del modelo en el conjunto de prueba:
Ejemplo
print(f"Precisión de prueba: {test_acc:.4f}")
Ejemplo de código completo
Ejemplo
from tensorflow import keras
from tensorflow.keras import layers
# 1. Cargar los datos
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# 2. Preprocesamiento
x_train = x_train.reshape(60000, 784).astype("float32") / 255
x_test = x_test.reshape(10000, 784).astype("float32") / 255
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
# 3. Construir el modelo
model = keras.Sequential([
layers.Dense(512, activation="relu", input_shape=(784,)),
layers.Dense(10, activation="softmax")
])
# 4. Compilar el modelo
model.compile(
optimizer="rmsprop",
loss="categorical_crossentropy",
metrics=["accuracy"]
)
# 5. Entrenar el modelo
history = model.fit(
x_train, y_train,
batch_size=128,
epochs=10,
validation_split=0.2
)
# 6. Evaluar el modelo
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"Precisión de prueba: {test_acc:.4f}")
Sugerencias para mejorar el modelo
1. Agregar capa Dropout: Para evitar el sobreajuste
Ejemplo
2. Usar un optimizador más avanzado: Por ejemplo, Adam
Ejemplo
3. Agregar capas ocultas: Construir una red más profunda
Ejemplo
4. Usar capas convolucionales: Más eficaz para datos de imágenes
Ejemplo
Preguntas frecuentes
Q1: ¿Por qué la precisión de mi modelo es tan baja?
- Comprobar si el preprocesamiento de datos es correcto
- Intentar ajustar la tasa de aprendizaje
- Aumentar la capacidad de la red (más capas o más neuronas)
Q2: ¿Qué hago si la pérdida (loss) no disminuye durante el entrenamiento?
- Verificar si hay problemas con los datos
- Probar diferentes optimizadores
- Ajustar la tasa de aprendizaje (generalmente reducirla)
Q3: ¿Cómo guardar y cargar un modelo entrenado?
Ejemplo
model.save("mnist_model.h5")
# Cargar el modelo
loaded_model = keras.models.load_model("mnist_model.h5")