Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
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:

import tensorflow.compat.v1 as tf tf.disable_v2_behavior()

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:

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.

  1. Ejecuta el script automatizado para convertir parte de tu uso de API TF1.x a tf.compat.v1.

  2. Elimina los antiguos símbolos tf.contrib (revisa TF Addons y TF-Slim).

  3. Haz que tus pasadas hacia delante del modelo TF1.x se ejecuten en TF2 con ejecución eager activada.

  4. Actualiza tu código de TF1.x para utilizar bucles de entrenamiento y modelos de guardado/carga a equivalentes de TF2.

  5. (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.

model.fit(dataset, epochs=5)

Pueden iterarse directamente sobre Python estándar:

for example_batch, label_batch in dataset: break

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.