Path: blob/master/site/es-419/guide/migrate/migrate_tf2.md
25118 views
Visión general de migración TF1.x -> TF2
TensorFlow 2 es fundamentalmente diferente de TF1.x en varios aspectos. Puedes seguir ejecutando código TF1.x sin modificar (excepto en el caso de contrib) en instalaciones binarias de TF2 de esta forma:
Sin embargo, así no ejecutarás comportamientos y API de TF2, y puede que no funcione como se espera con código escrito para TF2. Si de por sí no utilizas los comportamientos de TF2, en la práctica estás utilizando TF1.x sobre una instalación de TF2. Lee la guía Comportamientos TF1 vs TF2 para más detalles sobre las diferencias entre TF2 y TF1.x.
Esta guía te ofrece una visión general del proceso para que migres tu código TF1.x a TF2. Esto te permite aprovechar las nuevas y futuras mejoras de las funciones y también hacer que tu código sea más sencillo, eficaz y fácil de mantener.
Si usas las API de alto nivel de tf.keras
y entrenas exclusivamente con model.fit
, tu código debería ser más o menos totalmente compatible con TF2, salvo por las siguientes advertencias:
TF2 tiene nuevas tasas de aprendizaje predeterminadas para los optimizadores Keras.
TF2 puede haber cambiado el "nombre" con el que se registran las métricas.
Proceso de migración a TF2
Antes de migrar, lee la guía para conocer el comportamiento y las diferencias de la API entre TF1.x y TF2.
Ejecuta el script automatizado para convertir parte de tu uso de API TF1.x a
tf.compat.v1
.Elimina los antiguos símbolos
tf.contrib
(revisa TF Addons y TF-Slim).Haz que tus pasadas hacia delante del modelo TF1.x se ejecuten en TF2 con ejecución eager activada.
Actualiza tu código de TF1.x para utilizar bucles de entrenamiento y modelos de guardado/carga a equivalentes de TF2.
(Opcional) Migra tus API compatibles con TF2
tf.compat.v1
a las API idiomáticas de TF2.
Las secciones siguientes amplían los pasos descritos anteriormente.
Ejecutar el script de conversión de símbolos
Esto ejecuta una primera pasada en la reescritura de los símbolos de tu código para que funcione con los binarios de TF 2.x, pero no hará que tu código sea idiomático para TF 2.x ni hará que tu código sea automáticamente compatible con los comportamientos de TF2.
Lo más probable es que tu código siga usando los puntos finales tf.compat.v1
para acceder a marcadores de posición, sesiones, colecciones y otras funciones del estilo TF1.x.
Lee la guía para saber más sobre las mejores prácticas para usar el script de conversión de símbolos.
Eliminar el uso de tf.contrib
El módulo tf.contrib
ha desaparecido y varios de sus submódulos se han integrado en el núcleo de la API de TF2. Los demás submódulos se han separado en otros proyectos como TF IO y TF Addons.
Una gran cantidad de código antiguo de TF1.x usa la librería Slim, que se empaquetó con TF1.x como tf.contrib.layers
. Cuando migres tu código Slim a TF2, cambia tus usos de la API Slim para que apunten al paquete tf-slim pip. Después, lee la guía de mapeo de modelos para aprender a convertir el código Slim.
Otra posibilidad, si usas modelos preentrenados de Slim, es probar los modelos preentrenados de Keras desde tf.keras.applications
o los modelos TF2 SavedModel
de TF Hub exportados desde el código original de Slim.
Hacer que las pasadas hacia delante del modelo TF1.x se ejecuten con los comportamientos TF2 activados
Da seguimiento de variables y pérdidas
TF2 no admite recolecciones globales.
La ejecución eager en TF2 no admite APIs basadas en recolección tf.Graph
. Y esto afecta al modo en que construyes y rastreas las variables.
Para el nuevo código TF2, usarías tf.Variable
en lugar de v1.get_variable
y usarías objetos Python para recopilar y dar seguimiento a las variables en lugar de tf.compat.v1.variable_scope
. Normalmente sería uno de los siguientes:
tf.keras.layers.Layer
tf.keras.Model
tf.Module
Agrega listas de variables (como tf.Graph.get_collection(tf.GraphKeys.VARIABLES)
) con los atributos .variables
y .trainable_variables
de los objetos Layer
, Module
o Model
.
Las clases Layer
y Model
implementan algunas otras propiedades que eliminan la necesidad de recolecciones globales. Su propiedad .losses
puede ser un repuesto para usar la recolección tf.GraphKeys.LOSSES
.
Lee la guía de mapeo de modelos para encontrar más información sobre cómo usar las plantillas de modelado de código TF2 para incrustar tu código existente basado en get_variable
y variable_scope
dentro de Layers
, Models
y Modules
. Esto te permitirá ejecutar pasadas hacia delante con ejecución eager activada sin tener que reescribir mucho.
Adaptar a otros cambios de comportamiento
Si la guía de mapeo de modelos por sí sola no es suficiente para que tu modelo haga pasadas hacia adelante ejecutando otros cambios de comportamiento que pueden ser más detallados, consulta la guía sobre Comportamientos de TF1.x vs TF2 para conocer los otros cambios de comportamiento y cómo puedes adaptarte a ellos. Consulta también la guía Cómo crear nuevas Capas y Modelos mediante subclases para obtener más detalles.
Validar tus resultados
Consulta la guía de validación de modelos para conocer herramientas y orientación sencillas sobre cómo puedes validar (numéricamente) que tu modelo se comporta correctamente cuando está activada la ejecución eager. Puedes encontrarla especialmente útil si la combinas con la guía de mapeo de modelos.
Actualizar el entrenamiento, la evaluación y el código de importación/exportación
Los bucles de entrenamiento de TF1.x creados con tf.estimator.Estimator
en estilo v1.Session
y otros enfoques basados en colecciones no son compatibles con los nuevos comportamientos de TF2. Es importante que migres todo tu código de entrenamiento de TF1.x, ya que combinarlo con código de TF2 puede causar comportamientos inesperados.
Para ello, puedes elegir entre varias estrategias.
El enfoque de más alto nivel es usar tf.keras
. Las funciones de alto nivel de Keras administran muchos de los detalles de bajo nivel que es fácil pasar por alto si escribes tu propio bucle de entrenamiento. Por ejemplo, recopilan automáticamente las pérdidas de regularización y configuran el argumento training=True
al llamar al modelo.
Consulta la Guía de migración de Estimator para saber cómo puedes migrar el código de tf.estimator.Estimator
para usar los bucles de entrenamiento tf.keras
predeterminado y personalizado.
Los bucles de entrenamiento personalizados te proporcionan un control más preciso sobre tu modelo, como el seguimiento de las ponderaciones de capas individuales. Lee la guía sobre construcción de bucles de entrenamiento desde cero para aprender a usar tf.GradientTape
para recuperar las ponderaciones del modelo y usarlas para actualizarlo.
Convertir optimizadores TF1.x en optimizadores Keras
Los optimizadores de tf.compat.v1.train
, como el optimizador Adam y el optimizador de descenso gradiente, tienen equivalentes en tf.keras.optimizers
.
La tabla siguiente resume cómo puedes convertir estos optimizadores heredados en sus equivalentes de Keras. Puedes reemplazar directamente la versión TF1.x por la versión TF2, a menos que se requieran pasos adicionales (como actualizar la tasa de aprendizaje predeterminada).
Ten en cuenta que convertir tus optimizadores puede hacer incompatibles los puntos de verificación previos.
TF1.x | TF2 | Pasos adicionales |
---|---|---|
`tf.v1.train.GradientDescentOptimizer` | `tf.keras.optimizers.SGD` | Ninguno |
`tf.v1.train.MomentumOptimizer` | `tf.keras.optimizers.SGD` | Incluye el argumento "momentum" |
`tf.v1.train.AdamOptimizer` | `tf.keras.optimizers.Adam` | Cambia el nombre de los argumentos "beta1" y "beta2" a "beta_1" y "beta_2" |
`tf.v1.train.RMSPropOptimizer` | `tf.keras.optimizers.RMSprop` | Cambia el nombre del argumento "decay" por "rho" |
`tf.v1.train.AdadeltaOptimizer` | `tf.keras.optimizers.Adadelta` | Ninguno |
`tf.v1.train.AdagradOptimizer` | `tf.keras.optimizers.Adagrad` | Ninguno |
`tf.v1.train.FtrlOptimizer` | `tf.keras.optimizers.Ftrl` | Elimina los argumentos "accum_name" y "linear_name" |
`tf.contrib.AdamaxOptimizer` | `tf.keras.optimizers.Adamax` | Cambia el nombre de los argumentos "beta1" y "beta2" a "beta_1" y "beta_2" |
`tf.contrib.Nadam` | `tf.keras.optimizers.Nadam` | Cambia el nombre de los argumentos "beta1" y "beta2" a "beta_1" y "beta_2" |
Nota: En TF2, todos los épsilones (constantes numéricas de estabilidad) ahora están predeterminados a 1e-7
en lugar de 1e-8
. Esta diferencia es insignificante en la mayoría de los casos que se usan.
Actualizar las canalizaciones de entrada de datos
Hay muchas formas de introducir datos en un modelo tf.keras
. Aceptan generadores Python y arreglos Numpy como entrada.
La forma recomendada de introducir datos en un modelo es usar el paquete tf.data
, que contiene una recolección de clases de alto rendimiento para manipular datos. Los dataset
pertenecientes a tf.data
son eficaces, expresivas y se integran bien con TF2.
Pueden pasarse directamente al método tf.keras.Model.fit
.
Pueden iterarse directamente sobre Python estándar:
Si sigues usando tf.queue
, ahora sólo se admiten como estructuras de datos, no como canalizaciones de entrada.
También debes migrar todo el código de preprocesamiento de características que use tf.feature_columns
. Lee la guía de migración para más detalles.
Modelos de guardado y carga
TF2 usa puntos de verificación basados en objetos. Lee la guía de migración de puntos de verificación para saber más sobre la migración de puntos de verificación de TF1.x basados en nombres. Lee también la guía de puntos de verificación de la documentación básica de TensorFlow.
No hay problemas significativos de compatibilidad para los modelos guardados. Lee la guía SavedModel
para saber más sobre la migración de los SavedModel
de TF1.x a TF2. En general,
saved_models de TF1.x funcionan en TF2.
Los saved_models de TF2 funcionan en TF1.x si todas las ops son compatibles.
Consulta también la sección GraphDef
de la guía de migración SavedModel
para saber más sobre cómo trabajar con los objetos Graph.pb
y Graph.pbtxt
.
(Opcional) Migrar para descartar símbolos tf.compat.v1
.
El módulo tf.compat.v1
contiene la API TF1.x completa, con su semántica original.
Incluso después de seguir los pasos anteriores y acabar con un código totalmente compatible con todos los comportamientos de TF2, es probable que haya muchas menciones a APIs compat.v1
que resulten ser compatibles con TF2. Debes evitar usar estas APIs compat.v1
heredadas para cualquier código nuevo que escribas, aunque seguirán funcionando para tu código ya escrito.
Sin embargo, puedes elegir migrar los usos existentes a API de TF2 no heredadas. Las docstrings de cada uno de los símbolos compat.v1
suelen explicar cómo migrarlos a API de TF2 no heredadas. Además, la sección de la guía para mapear modelos sobre la migración gradual a las API idiomáticas de TF2 también puede ser de ayuda.
Recursos y lecturas complementarias
Como se ha mencionado anteriormente, es una buena práctica migrar todo tu código TF1.x a TF2. Lee las guías de la sección Migrar a TF2 de la guía de TensorFlow para obtener más información.