TF1.x -> Descripción general de la migración TF2

TensorFlow 2 es fundamentalmente diferente de TF1.x en varios aspectos. Todavía puede ejecutar el código TF1.x sin modificar ( excepto contrib ) contra las instalaciones binarias de TF2 de la siguiente manera:

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

Sin embargo, esto no ejecuta los comportamientos ni las API de TF2, y es posible que no funcione como se esperaba con el código escrito para TF2. Si no está ejecutando con los comportamientos de TF2 activos, está ejecutando efectivamente TF1.x sobre una instalación de TF2. Lea la guía de comportamientos de TF1 frente a TF2 para obtener más detalles sobre las diferencias entre TF2 y TF1.x.

Esta guía proporciona una descripción general del proceso para migrar su código TF1.x a TF2. Esto le permite aprovechar las mejoras de características nuevas y futuras y también hacer que su código sea más simple, más eficaz y más fácil de mantener.

Si está utilizando las API de alto nivel de tf.keras y entrenando exclusivamente con model.fit , su código debería ser más o menos totalmente compatible con TF2, excepto por las siguientes advertencias:

Proceso de migración de TF2

Antes de migrar, obtenga información sobre el comportamiento y las diferencias de API entre TF1.x y TF2 leyendo la guía .

  1. Ejecute el script automatizado para convertir parte de su uso de API TF1.x a tf.compat.v1 .
  2. Elimine los símbolos antiguos tf.contrib (verifique TF Addons y TF-Slim ).
  3. Haga que sus pases hacia adelante del modelo TF1.x se ejecuten en TF2 con la ejecución ansiosa habilitada.
  4. Actualice su código TF1.x para entrenar bucles y guardar/cargar modelos a equivalentes TF2.
  5. (Opcional) Migre sus API tf.compat.v1 compatibles con TF2 a API idiomáticas de TF2.

Las siguientes secciones amplían los pasos descritos anteriormente.

Ejecute el script de conversión de símbolos

Esto ejecuta un paso inicial para reescribir los símbolos de su código para que se ejecuten en los binarios de TF 2.x, pero no hará que su código sea idiomático para TF 2.x ni hará que su código sea automáticamente compatible con los comportamientos de TF2.

Lo más probable es que su código siga utilizando los extremos de tf.compat.v1 para acceder a marcadores de posición, sesiones, colecciones y otras funciones de estilo TF1.x.

Lea la guía para obtener más información 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 se ha eliminado y varios de sus submódulos se han integrado en la API central de TF2. Los otros submódulos ahora se dividen en otros proyectos como TF IO y TF Addons .

Una gran cantidad de código TF1.x antiguo utiliza la biblioteca Slim , que se empaquetó con TF1.x como tf.contrib.layers . Al migrar su código Slim a TF2, cambie los usos de la API Slim para que apunten al paquete pip tf-slim . Luego, lea la guía de mapeo de modelos para aprender cómo convertir código Slim.

Alternativamente, si usa modelos preentrenados de Slim, puede considerar probar los modelos preentrenados de Keras de tf.keras.applications o TF Hub 's TF2 SavedModel exportados del código Slim original.

Hacer que los pases hacia adelante del modelo TF1.x se ejecuten con los comportamientos de TF2 habilitados

Seguimiento de variables y pérdidas

TF2 no admite colecciones globales.

La ejecución ansiosa en TF2 no es compatible con las API basadas en la colección tf.Graph . Esto afecta la forma en que construye y realiza un seguimiento de las variables.

Para el nuevo código TF2, usaría tf.Variable en lugar de v1.get_variable y usaría objetos de Python para recopilar y rastrear variables en lugar de tf.compat.v1.variable_scope . Por lo general, este sería uno de:

Agregue 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 varias otras propiedades que eliminan la necesidad de colecciones globales. Su propiedad .losses puede reemplazar el uso de la colección tf.GraphKeys.LOSSES .

Lea la guía de mapeo de modelos para obtener más información sobre el uso de las correcciones de modelado de código TF2 para incrustar su código existente basado en get_variable y variable_scope dentro de Layers , Models y Modules . Esto le permitirá ejecutar pases hacia adelante con la ejecución ansiosa habilitada sin reescrituras importantes.

Adaptarse a otros cambios de comportamiento

Si la guía de mapeo de modelos por sí sola no es suficiente para que su modelo avance y ejecute otros cambios de comportamiento que pueden ser más detalles, consulte la guía sobre comportamientos de TF1.x frente a TF2 para obtener información sobre los otros cambios de comportamiento y cómo puede adaptarse a ellos. . Consulte también la creación de nuevas capas y modelos a través de la guía de subclases para obtener más información.

Validando tus resultados

Consulte la guía de validación del modelo para obtener herramientas sencillas y orientación sobre cómo puede validar (numéricamente) que su modelo se comporta correctamente cuando la ejecución rápida está habilitada. Puede encontrar esto especialmente útil cuando se combina con la guía de mapeo de modelos .

Capacitación de actualización, evaluación e importación/exportación de código

Los bucles de entrenamiento de TF1.x creados con v1.Session tf.estimator.Estimator s y otros enfoques basados ​​en colecciones no son compatibles con los nuevos comportamientos de TF2. Es importante que migre todo el código de entrenamiento de TF1.x, ya que combinarlo con el código de TF2 puede provocar comportamientos inesperados.

Puede elegir entre varias estrategias para hacer esto.

El enfoque de más alto nivel es usar tf.keras . Las funciones de alto nivel en Keras administran muchos de los detalles de bajo nivel que podrían pasarse por alto fácilmente si escribe su propio ciclo de entrenamiento. Por ejemplo, recopilan automáticamente las pérdidas de regularización y establecen el argumento training=True al llamar al modelo.

Consulte la guía de migración de Estimator para obtener información sobre cómo puede migrar el código de tf.estimator.Estimator para usar los bucles de entrenamiento Vanilla y tf.keras personalizados .

Los bucles de entrenamiento personalizados le brindan un control más preciso sobre su modelo, como el seguimiento de los pesos de las capas individuales. Lea la guía sobre la creación de bucles de entrenamiento desde cero para aprender a usar tf.GradientTape para recuperar los pesos del modelo y usarlos para actualizar el modelo.

Convierta los optimizadores TF1.x en optimizadores Keras

Los optimizadores en tf.compat.v1.train , como el optimizador Adam y el optimizador de descenso de gradiente , tienen equivalentes en tf.keras.optimizers .

La siguiente tabla resume cómo puede convertir estos optimizadores heredados en sus equivalentes de Keras. Puede reemplazar directamente la versión TF1.x con la versión TF2 a menos que se requieran pasos adicionales (como actualizar la tasa de aprendizaje predeterminada ).

Tenga en cuenta que la conversión de sus optimizadores puede hacer que los puntos de control antiguos sean incompatibles .

TF1.x TF2 Pasos adicionales
`tf.v1.train.GradientDescentOptimizer` tf.keras.optimizers.SGD Ninguna
`tf.v1.train.MomentumOptimizer` tf.keras.optimizers.SGD Incluir el argumento `impulso`
`tf.v1.train.AdamOptimizer` tf.keras.optimizers.Adam Cambie el nombre de los argumentos `beta1` y `beta2` a `beta_1` y `beta_2`
`tf.v1.train.RMSPropOptimizer` tf.keras.optimizers.RMSprop Cambie el nombre del argumento `decay` a `rho`
`tf.v1.train.AdadeltaOptimizer` tf.keras.optimizers.Adadelta Ninguna
`tf.v1.train.AdagradOptimizer` tf.keras.optimizers.Adagrad Ninguna
`tf.v1.train.FtrlOptimizer` tf.keras.optimizers.Ftrl Elimina los argumentos `accum_name` y `linear_name`
`tf.contrib.AdamaxOptimizer` tf.keras.optimizers.Adamax Cambie el nombre de los argumentos `beta1` y `beta2` a `beta_1` y `beta_2`
`tf.contrib.Nadam` tf.keras.optimizers.Nadam Cambie el nombre de los argumentos `beta1` y `beta2` a `beta_1` y `beta_2`

Actualizar canalizaciones de entrada de datos

Hay muchas formas de alimentar datos a un modelo tf.keras . Aceptarán generadores de Python y matrices Numpy como entrada.

La forma recomendada de alimentar datos a un modelo es usar el paquete tf.data , que contiene una colección de clases de alto rendimiento para manipular datos. Los conjuntos de dataset que pertenecen a tf.data son eficientes, expresivos y se integran bien con TF2.

Se pueden pasar directamente al método tf.keras.Model.fit .

model.fit(dataset, epochs=5)

Se pueden iterar directamente sobre Python estándar:

for example_batch, label_batch in dataset:
    break

Si aún usa tf.queue , ahora solo se admiten como estructuras de datos, no como canalizaciones de entrada.

También debe migrar todo el código de preprocesamiento de características que usa tf.feature_columns . Lea la guía de migración para obtener más detalles.

Guardar y cargar modelos

TF2 utiliza puntos de control basados ​​en objetos. Lea la guía de migración de puntos de control para obtener más información sobre cómo migrar puntos de control TF1.x basados ​​en nombres. Lea también la guía de puntos de control en los documentos principales de TensorFlow.

No hay problemas de compatibilidad significativos para los modelos guardados. Lea la SavedModel de modelos guardados para obtener más información sobre cómo migrar modelos guardados en SavedModel a TF2. En general,

  • Los modelos guardados de TF1.x funcionan en TF2.
  • Los modelos guardados de TF2 funcionan en TF1.x si se admiten todas las operaciones.

Consulte también la sección GraphDef SavedModel la guía de migración de modelo guardado para obtener más información sobre cómo trabajar con objetos Graph.pb y Graph.pbtxt .

(Opcional) Migrar los 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 terminar con un código que es totalmente compatible con todos los comportamientos de TF2, es probable que haya muchas menciones de apis compat.v1 que resultan ser compatibles con TF2. Debe evitar usar estas API heredadas de compat.v1 para cualquier código nuevo que escriba, aunque seguirán funcionando para su código ya escrito.

Sin embargo, puede optar por migrar los usos existentes a las API de TF2 no heredadas. Las cadenas de documentación de los símbolos compat.v1 individuales a menudo explicarán cómo migrarlos a API TF2 no heredadas. Además, la sección de la guía de mapeo de modelos sobre la migración incremental a las API idiomáticas de TF2 también puede ayudar con esto.

Recursos y lecturas adicionales

Como se mencionó anteriormente, es una buena práctica migrar todo su código TF1.x a TF2. Lea las guías en la sección Migrar a TF2 de la guía de TensorFlow para obtener más información.