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:
- TF2 tiene nuevas tasas de aprendizaje predeterminadas para los optimizadores de Keras.
- TF2 puede haber cambiado el "nombre" en el que se registran las métricas.
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 .
- Ejecute el script automatizado para convertir parte de su uso de API TF1.x a
tf.compat.v1
. - Elimine los símbolos antiguos
tf.contrib
(verifique TF Addons y TF-Slim ). - Haga que sus pases hacia adelante del modelo TF1.x se ejecuten en TF2 con la ejecución ansiosa habilitada.
- Actualice su código TF1.x para entrenar bucles y guardar/cargar modelos a equivalentes TF2.
- (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.