Path: blob/master/site/es-419/guide/effective_tf2.ipynb
25115 views
Copyright 2020 The TensorFlow Authors.
Tensorflow 2 efectivo
Descripción general
En esta guía se brinda una lista de las mejores prácticas para escribir código con TensorFlow 2 (TF2). Está escrita para usuarios que han cambiado recientemente desde TensorFlow 1 (TF1) a TF2. Para más información sobre cómo migrar código TF1 a TF2, consulte la sección de la guía en que se trata el tema de la migración.
Preparación
Importe TensorFlow y otras dependencias para usar los ejemplos de esta guía.
Recomendaciones para TensorFlow 2 idiomático
Refactorización del código en módulos más pequeños
Una buena práctica es la de refactorizar el código en funciones más pequeñas a las que llamamos cuando es necesario. Para un mejor desempeño, debería tratar de decorar los bloques de cálculo más grandes posibles en una tf.function
(tenga en cuenta que las funciones Python anidadas llamadas por una tf.function
no necesitan sus propias decoraciones separadas, a menos que desee usar jit_compile
diferentes para la tf.function
). Dependiendo de su caso de uso, podría tratarse de múltiples pasos de entrenamiento o incluso de un ciclo de entrenamiento completo. Para casos de interferencia, podría ser un solo pase hacia adelante del modelo.
Ajuste de la tasa de aprendizaje predeterminada para algunos tf.keras.optimizer
Algunos optimizadores Keras tienen tasas de aprendizaje diferentes en TF2. Si nota un cambio en el comportamiento de convergencia en sus modelos, controle las tasas de aprendizaje predeterminadas.
No hay cambios para optimizers.SGD
, optimizers.Adam
ni optimizers.RMSprop
.
Las siguientes tasas de aprendizaje han cambiado:
optimizers.Adagrad
de0.01
a0.001
optimizers.Adadelta
de1.0
a0.001
optimizers.Adamax
de0.002
a0.001
optimizers.Nadam
de0.002
a0.001
Use tf.Module
y capas Keras para gestionar las variables
Los tf.Module
y las tf.keras.layers.Layer
ofrecen propiedades convenientes en variables
y trainable_variables
que pueden reunir recursivamente todas las variables dependientes. Todo esto facilita la gestión de variables a nivel local a donde se están usando.
Las capas o modelos Keras heredan de tf.train.Checkpointable
y se integran con @tf.function
, lo que hace posible directamente aplicar puntos de control (checkpoint) o exportar SavedModels de objetos Keras. No necesariamente hay que usar la API Model.fit
de Keras para aprovechar estas integraciones.
Lea la sección sobre transferencia de aprendizaje y ajuste fino en la guía de Keras para entender cómo recopilar un subconjunto de variables relevantes con Keras.
Combinación de los tf.data.Dataset
y la tf.function
El paquete (tfds
) de conjuntos de datos de TensorFlow contiene utilidades para cargar conjuntos de datos predeterminados como los objetos tf.data.Dataset
. Para este ejemplo, puede cargar el conjunto de datos MNIST con tfds
:
Después, prepare el conjunto de datos para entrenamiento:
Redimensione cada imagen.
Aleatorice el orden de los ejemplos.
Recolecte lotes de imágenes y etiquetas.
Para no hacer muy extenso el ejemplo, ajuste el conjunto de datos para que solamente devuelva 5 lotes:
Use iteraciones Python regulares para iterar sobre datos de entrenamiento que entren en la memoria. De lo contrario, tf.data.Dataset
será la mejor opción para transmitir los datos de entrenamiento desde el disco. Los conjuntos de datos son iterables (no iteradores) y funcionan igual que los iterables de Python en ejecución eager. Puede utilizar por completo las funciones de preextracción o streaming asincrónicas de conjuntos de datos encapsulando el código en tf.function
, que reemplaza la iteración Python con las operaciones de grafos equivalentes mediante AutoGraph.
Si usa la API Model.fit
de Keras, no tendrá que preocuparse por la iteración del conjunto de datos.
Uso de ciclos de entrenamiento Keras
Cuando no es necesario realizar un control de bajo nivel del proceso de entrenamiento, se recomienda usar los métodos integrados fit
, evaluate
y predict
de Keras. Estos métodos ofrecen una interfaz uniforme para entrenar el modelo, que es independiente del tipo de implementación (secuencial, funcional o de subclase).
Las ventajas que ofrecen estos métodos incluyen lo siguiente:
Aceptan arreglos Numpy, generadores de Python y
tf.data.Datasets
.Aplican automáticamente regularización y pérdidas por activación.
Son compatibles con
tf.distribute
, donde el código de entrenamiento sigue siendo el mismo independientemente de la configuración que tenga el hardware.Son compatibles con invocables arbitrarios como las pérdidas o las métricas.
Son compatibles con invocables como
tf.keras.callbacks.TensorBoard
y otros invocables personalizados.Son ejecutantes, que usan automáticamente grafos de TensorFlow.
A continuación, un ejemplo del entrenamiento de un modelo con Dataset
. Para más detalles sobre cómo funciona, consulte los tutoriales.
Personalización de entrenamiento y escritura del ciclo propio
Si los modelos Keras le resultan útiles, pero necesita más flexibilidad y control del paso o los ciclos de entrenamiento externos, puede implementar sus propios pasos o incluso los ciclos enteros. Para más información sobre personalización de fit
consulte la guía de Keras.
También puede implementar muchas cosas como un tf.keras.callbacks.Callback
.
Este método tiene muchas de las ventajas que mencionamos previamente, pero además le permite controlar el paso de entrenamiento e incluso el ciclo externo.
En un ciclo de entrenamiento estándar hay tres pasos:
Iterar sobre un generaror Python o un
tf.data.Dataset
para obtener lotes de muestras.Usar
tf.GradientTape
para recopilar los gradientes.Usar uno de los
tf.keras.optimizers
para aplicar las actualizaciones de pesos a las variables del modelo.
Recuerde:
Incluya siempre un argumento de
training
en el métodocall
de los modelos y las capas en subclases.Asegúrese de invocar al modelo con el argumento de
training
establecido correctamente.Dependiendo del uso, las variables del modelo pueden no existir hasta que el modelo esté funcionando en un lote de datos.
Debe manejar manualmente algunas cosas como las pérdidas de regularización del modelo.
No hay necesidad de ejecutar inicializadores variables ni de agregar dependencias de control manual. La tf.function
se ocupa de las dependencias de control automático y de la inicialización variable en la creación.
Aproveche tf.function
con el flujo de control de Python
tf.function
ofrece una forma de convertir el flujo de control dependiente de datos en equivalentes de modo grafo como tf.cond
y tf.while_loop
.
Un lugar común donde aparece el flujo de control dependiente de datos es en los modelos secuenciales.tf.keras.layers.RNN
encapsula una celda RNN, con lo que permite desplegar la recurrencia, ya sea de forma dinámica o estática.
Para más información, lea la guía tf.function
.
Métricas y pérdidas de estilo nuevo
Tanto las métricas como las pérdidas son objetos que funcionan con ejecución eager y en tf.function
.
Los objetos de pérdida son invocables y esperan (y_true
y y_pred
) como argumentos:
Uso de métricas para recopilar y mostrar datos
Puede usar tf.metrics
para agregar datos y tf.summary
para registrar resúmenes y realizar la redirección a un escritor con un gestor de contexto. Los resúmenes se emiten directamente al escritor, lo que significa que debe proporcionarle el valor step
en el sitio invocado (callsite).
Use tf.metrics
para agregar datos antes de registrarlos como resúmenes. Las métricas consideran los datos con estado (stateful); acumulan valores y devuelven un resultado acumulado cuando se llama al método result
(como Mean.result
). Borre los valores acumulados con Model.reset_states
.
Visualice los resúmenes apuntando TensorBoard al directorio de registros de resumen:
Use la API tf.summary
para escribir los datos de resumen para la visualización en TensorBoard. Para más información, lea la guía de tf.summary
.
Nombres de métricas de Keras
Los modelos Keras conservan consistencia con respecto a la administración de los nombres de las métricas. Cuando se pasa una cadena de caracteres (string) en la lista de métricas, esa cadena exacta se usa como el name
de la métrica. Estos nombres se ven en el objeto de historia que devuelve model.fit
y en los registros pasados a keras.callbacks
. Se establece a la cadena que se pasó en la lista de métricas.
Depuración
Use la ejecución eager para correr el código paso a paso para inspeccionar formas, tipos de datos y valores. Ciertas API, como tf.function
, tf.keras
, etc. están diseñadas para usar ejecución de Graph (grafos) por motivos de mejor desempeño y portabilidad. Cuando realice la depuración, use tf.config.run_functions_eagerly(True)
para aplicar la ejecución eager dentro de este código.
Por ejemplo:
Esto también funciona dentro de los modelos Keras y de otras API compatibles con la ejecución eager:
Notas:
Los métodos
tf.keras.Model
comofit
,evaluate
ypredict
ejecutan graphs contf.function
en su funcionamiento interno.Cuando use
tf.keras.Model.compile
, establezcarun_eagerly = True
para deshabilitar que la lógicaModel
se encapsule entf.function
.Use
tf.data.experimental.enable_debug_mode
para habilitar el modo de depuración paratf.data
. Para más detalles, lea los documentos de la API.
No mantenga tf.Tensors
en los objetos
Estos objetos de tensores pueden crearse en un tf.function
o en el contexto eager, entonces, estos tensores se comportan de un modo diferente. Siempre use los tf.Tensor
solamente para valores intermedios.
Para dar seguimiento al estado, use las tf.Variable
, ya que siempre se pueden usar desde cualquiera de los dos contextos. Para más información, lea la guía de tf.Variable
.
Recursos y lecturas complementarias
Para más información sobre cómo usar TF2, lea las guías y los tutoriales.
Si antes usó TF1.x, se le recomienda migrar el código a TF2. Para más detalles, lea las guías sobre migración.