Path: blob/master/site/es-419/guide/basic_training_loops.ipynb
25115 views
Copyright 2020 The TensorFlow Authors.
Bucles de entrenamiento básico
En los guías anteriores, ha aprendido sobre tensores, variables, cinta de gradiente, y módulos. En esta guía, los combinará todos para entrenar modelos.
TensorFlow también incluye la API tf.Keras, una API de redes neuronales de alto nivel que ofrece abstracciones útiles para reducir el lenguaje repetitivo. Sin embargo, en esta guía, usted usará clases básicas.
Preparación
Cómo resolver problemas de aprendizaje automático
Para resolver un problema de aprendizaje automático se suelen seguir los siguientes pasos:
Obtener datos de entrenamiento.
Definir el modelo.
Definir una función de pérdida.
Recorrer los datos del entrenamiento, calculando la pérdida con respecto al valor ideal
Calcular gradientes para esa pérdida y usar un optimizador para ajustar las variables a los datos.
Evaluar sus resultados.
A modo de ilustración, en esta guía desarrollará un modelo lineal sencillo, , que tiene dos variables: (ponderaciones) y (sesgo).
Este es el más básico de los problemas de aprendizaje automático: Dados e , intente encontrar la pendiente y el desplazamiento de una línea mediante regresión lineal simple.
Datos
El aprendizaje supervisado usa entradas (normalmente denotadas como x) y salidas (denotadas como y, a menudo llamadas etiquetas). La meta es aprender a partir de entradas y salidas asociadas para poder predecir el valor de una salida a partir de una entrada.
Cada entrada de sus datos, en TensorFlow, está casi siempre representada por un tensor, y a menudo es un vector. En el entrenamiento supervisado, la salida (o valor que le gustaría predecir) es también un tensor.
He aquí algunos datos sintetizados añadiendo ruido gaussiano (normal) a los puntos a lo largo de una línea.
Los tensores suelen reunirse en lotes, o grupos de entradas y salidas apiladas. El agrupamiento por lotes puede suponer beneficios para el entrenamiento y funciona bien con aceleradores y computación vectorizada. Dado lo pequeño que es este conjunto de datos, puede tratarlo en su totalidad como un único lote.
Definir el modelo
Use tf.Variable
para representar todas las ponderaciones de un modelo. Una tf.Variable
almacena un valor y lo muestra en forma de tensor según sea necesario. Consulte la guía de variables para saber más.
Use tf.Module
para encapsular las variables y el cálculo. Usted podría usar cualquier objeto de Python, pero de esta manera se puede guardar fácilmente.
Aquí se definen w y b como variables.
Las variables iniciales se configuran aquí de forma fija, pero Keras viene con cualquiera de un número de inicializadores que usted puede usar, con o sin el resto de Keras.
Definir una función de pérdida
Una función de pérdida mide en qué medida la salida de un modelo para una entrada dada coincide con la salida objetivo. La meta es minimizar esta diferencia durante el entrenamiento. Defina la pérdida estándar L2, también conocida como error "cuadrático medio":
Antes de entrenar el modelo, puede visualizar el valor de la pérdida trazando las predicciones del modelo en rojo y los datos de entrenamiento en azul:
Definir un bucle de entrenamiento
El bucle de entrenamiento consiste en realizar repetidamente tres tareas en orden:
Envío de un lote de entradas a través del modelo para generar salidas
Calcular la pérdida comparando las salidas con la salida (o etiqueta)
Usar cinta de gradiente para encontrar los gradientes
Optimizar las variables con esos gradientes
Para este ejemplo, puede entrenar el modelo usando descenso de gradiente.
Hay muchas variantes del esquema de descenso de gradiente que se capturan en tf.keras.optimizers
. Pero con el ánimo de construir desde los fundamentos, aquí implementará usted mismo las matemáticas básicas con la ayuda de tf.GradientTape
para la diferenciación automática y tf.assign_sub
para decrementar un valor (que combina tf.assign
y tf.sub
):
Para echar un vistazo al entrenamiento, puede enviar el mismo lote de x y y a través del bucle de entrenamiento, y ver cómo evolucionan W
y b
.
Realizar el entrenamiento
Grafique la evolución de las ponderaciones a lo largo del tiempo:
Visualice el rendimiento del modelo entrenado
La misma solución, pero con Keras
Es útil contrastar el código anterior con el equivalente en Keras.
La definición del modelo es exactamente la misma si hace una subclase a tf.keras.Model
. Recuerde que los modelos Keras heredan del módulo de forma definitiva.
En lugar de escribir nuevos bucles de entrenamiento cada vez que cree un modelo, puede usar las funciones integradas de Keras como atajo. Puede ser útil cuando no desee escribir o depurar bucles de entrenamiento en Python.
Si lo hace, tendrá que usar model.compile()
para configurar los parámetros, y model.fit()
para el entrenamiento. Puede ser menos código usar las implementaciones Keras de la pérdida L2 y el descenso de gradiente, también como atajo. Las pérdidas y los optimizadores de Keras también pueden usarse fuera de estas funciones de conveniencia, y el ejemplo anterior podría haberlos usado.
fit
de Keras espera datos por lotes o un conjunto de datos completo como un arreglo NumPy. Los arreglos NumPy se trocean en lotes y por defecto tienen un tamaño de lote de 32.
En este caso, para que coincida con el comportamiento del bucle escrito a mano, debe pasar x
como un único lote de tamaño 1000.
Tenga en cuenta que Keras imprime la pérdida después del entrenamiento, no antes, por lo que la primera pérdida parece menor, pero en lo demás esto muestra esencialmente el mismo rendimiento en el entrenamiento.
Siguientes pasos
En esta guía, ha visto cómo usar las clases básicas de tensores, variables, módulos y cinta de gradiente para construir y entrenar un modelo, y además cómo esas ideas se mapean a Keras.
Sin embargo, se trata de un problema extremadamente sencillo. Para una introducción más práctica, véase Recorrido de entrenamiento personalizado.
Para más información sobre cómo usar los bucles de entrenamiento incorporados de Keras, consulte esta guía. Para más información sobre los bucles de entrenamiento y Keras, consulte esta guía. Para escribir bucles de entrenamiento distribuidos personalizados, consulte esta guía.