Actualización automática de código a TensorFlow 2



El material proporciona una traducción del manual para actualizar automáticamente el código de TensorFlow 1.x a Tensorflow 2 utilizando el script de actualización tf_upgrade_v2 .

TensorFlow 2.0 incluye muchos cambios de API, como cambiar el orden de los argumentos, cambiar el nombre de los caracteres y cambiar los valores predeterminados de los parámetros. La corrección manual de todas estas modificaciones es tediosa y propensa a errores. Para simplificar los cambios y hacer que su transición a TF 2.0 sea lo más fluida posible, el equipo de TensorFlow creó la utilidad tf_upgrade_v2 para ayudar a pasar del código heredado a la nueva API.
Nota: tf_upgrade_v2 instala automáticamente para TensorFlow 1.13 y posterior (incluidas todas las compilaciones de TF 2.0).
Un uso típico del script se ve así:

 tf_upgrade_v2 \ --intree my_project/ \ --outtree my_project_v2/ \ --reportfile report.txt 

Este código acelera el proceso de actualización al convertir los scripts existentes de Python TensorFlow 1.x a TensorFlow 2.0.

El script de conversión automatiza el proceso tanto como sea posible, pero todavía hay cambios sintácticos y estilísticos que el script no puede corregir.

Módulos de compatibilidad


Algunos caracteres de la API no pueden actualizarse simplemente usando el reemplazo de cadena. Para garantizar que su código funcione en TensorFlow 2.0, el script de actualización incluye el módulo compat.v1 . Este módulo reemplaza los caracteres TF 1.x, como tf.foo , con el enlace equivalente tf.compat.v1.foo . Aunque el módulo de compatibilidad es bueno, le recomendamos que reste manualmente los reemplazos y los migre a las nuevas API en el espacio de nombres tf. * tf. * lugar del espacio de nombres tf.compat.v1 más rápido posible.

Debido a la depreciación de los módulos TensorFlow 2.x (por ejemplo, tf.flags y tf.contrib ), algunos cambios no se pueden compat.v1 cambiando a compat.v1 . La actualización de dicho código puede requerir el uso de una biblioteca adicional (por ejemplo, absl.flags o cambiar a un paquete en tenorflow/addons .

Proceso de actualización recomendado


Esta parte del manual demuestra el uso del script de actualización. Aunque el script de actualización es fácil de usar, le recomendamos que lo use como parte del siguiente proceso:

  1. Pruebas unitarias : asegúrese de que el código actualizado tenga un conjunto de pruebas unitarias con una cobertura razonable. Este es el código de Python, por lo que el lenguaje no lo protegerá de muchas clases de error. También asegúrese de que todas sus dependencias se hayan actualizado para que sean compatibles con TensorFlow 2.0.
  2. Instale TensorFlow 1.14 : Actualice su TensorFlow a la última versión de TensorFlow 1.x, al menos 1.14. Incluye la API final de TensorFlow 2.0 en tf.compat.v2 .
  3. Código de prueba con 1.14 : asegúrese de que las pruebas de su unidad pasen en este punto. Los reiniciará durante el proceso de actualización, por lo que es importante comenzar con un color verde.
  4. Ejecute el script de actualización : ejecute tf_upgrade_v2 en todo el árbol de origen, incluidas las pruebas. Esto actualizará su código a un formato en el que use solo los caracteres disponibles en TensorFlow 2.0. Los caracteres obsoletos estarán disponibles en tf.compat.v1 . Posteriormente requerirán procesamiento manual. \ N ",
  5. Ejecute pruebas convertidas con TensorFlow 1.14 : su código aún debe ejecutarse correctamente en TensorFlow 1.14. Ejecute las pruebas unitarias nuevamente. Cualquier error en sus pruebas en esta etapa significa que hay un error en el script de actualización.
  6. Verifique el informe de actualización en busca de advertencias y errores : el script escribe un archivo de informe que explica todas las conversiones que necesita verificar dos veces, o todas las acciones que deben realizarse manualmente. Por ejemplo: cualquier instancia restante de contrib requiere eliminación manual.
  7. Instale TensorFlow 2.0 : en este punto, cambiar a TensorFlow 2.0 debería ser seguro.
  8. Pruebe el código con v1.disable_v2_behavior : v1.disable_v2_behavior sus pruebas con v1.disable_v2_behavior() en la función de prueba principal, los resultados deben ser los mismos que cuando se ejecuta bajo 1.14.
  9. Habilite el comportamiento V2 : ahora que sus pruebas se están ejecutando con la API v2, puede comenzar a ver la inclusión del v2 behavior . Dependiendo de cómo esté escrito su código, esto puede requerir algunos cambios.

Usando el script de actualización


Instalación


 from __future__ import absolute_import, division, print_function, unicode_literals 

 try: import tensorflow.compat.v2 as tf except Exception: pass tf.enable_v2_behavior() print(tf.__version__) 

Clone el repositorio de tensorflow / modelos para que tenga un código para experimentar:

 !git clone --branch r1.13.0 --depth 1 https://github.com/tensorflow/models 

Leer ayuda


El script debe instalarse con TensorFlow. La ayuda integrada se llama así:

 !tf_upgrade_v2 -h 

Ejemplo de código TF1


Aquí hay un script simple de TensorFlow 1.0 que no se ejecuta en TensorFlow 2.0

 !head -n 65 models/samples/cookbook/regression/custom_regression.py | tail -n 10 

  # Calculate loss using mean squared error average_loss = tf.losses.mean_squared_error(labels, predictions) # Pre-made estimators use the total_loss instead of the average, # so report total_loss for compatibility. batch_size = tf.shape(labels)[0] total_loss = tf.to_float(batch_size) * average_loss if mode == tf.estimator.ModeKeys.TRAIN: optimizer = params.get("optimizer", tf.train.AdamOptimizer) 

dando el siguiente error:

 Traceback (most recent call last): File "custom_regression.py", line 162, in <module> tf.logging.set_verbosity(tf.logging.INFO) AttributeError: module 'tensorflow' has no attribute 'logging' 

Archivo único


El script de actualización se puede ejecutar en un archivo Python separado:

 !tf_upgrade_v2 \ --infile models/samples/cookbook/regression/custom_regression.py \ --outfile /tmp/custom_regression_v2.py 

El script mostrará errores si no puede encontrar correcciones para el código.

 INFO line 38:8: Renamed 'tf.feature_column.input_layer' to 'tf.compat.v1.feature_column.input_layer' INFO line 43:10: Renamed 'tf.layers.dense' to 'tf.compat.v1.layers.dense' INFO line 46:17: Renamed 'tf.layers.dense' to 'tf.compat.v1.layers.dense' INFO line 57:17: tf.losses.mean_squared_error requires manual check. tf.losses have been replaced with object oriented versions in TF 2.0 and after. The loss function calls have been converted to compat.v1 for backward compatibility. Please update these calls to the TF 2.0 versions. INFO line 57:17: Renamed 'tf.losses.mean_squared_error' to 'tf.compat.v1.losses.mean_squared_error' INFO line 61:15: Added keywords to args of function 'tf.shape' INFO line 62:15: Changed tf.to_float call to tf.cast(..., dtype=tf.float32). INFO line 65:40: Renamed 'tf.train.AdamOptimizer' to 'tf.compat.v1.train.AdamOptimizer' INFO line 68:39: Renamed 'tf.train.get_global_step' to 'tf.compat.v1.train.get_global_step' INFO line 83:9: tf.metrics.root_mean_squared_error requires manual check. tf.metrics have been replaced with object oriented versions in TF 2.0 and after. The metric function calls have been converted to compat.v1 for backward compatibility. Please update these calls to the TF 2.0 versions. INFO line 83:9: Renamed 'tf.metrics.root_mean_squared_error' to 'tf.compat.v1.metrics.root_mean_squared_error' INFO line 142:23: Renamed 'tf.train.AdamOptimizer' to 'tf.compat.v1.train.AdamOptimizer' INFO line 162:2: Renamed 'tf.logging.set_verbosity' to 'tf.compat.v1.logging.set_verbosity' INFO line 162:27: Renamed 'tf.logging.INFO' to 'tf.compat.v1.logging.INFO' INFO line 163:2: Renamed 'tf.app.run' to 'tf.compat.v1.app.run' TensorFlow 2.0 Upgrade Script ----------------------------- Converted 1 files Detected 0 issues that require attention -------------------------------------------------------------------------------- Make sure to read the detailed log 'report.txt' 

Árbol de directorios


Los proyectos típicos, incluido este sencillo ejemplo, usan más de un archivo. Por lo general, desea actualizar todo el paquete, por lo que el script también se puede ejecutar en el árbol de directorios:

 #   .py      outtree !tf_upgrade_v2 \ --intree models/samples/cookbook/regression/ \ --outtree regression_v2/ \ --reportfile tree_report.txt 

Presta atención a un comentario sobre la función
 dataset.make_one_shot_iterator 
.

Ahora el script ya está funcionando con TensorFlow 2.0.

Tenga en cuenta que debido al módulo `tf.compat.v1`, el script convertido también se ejecutará en TensorFlow 1.14.

Informe detallado


El script también publica una lista detallada de cambios. En este ejemplo, encontró una transformación posiblemente insegura y agregó una advertencia en la parte superior del archivo:

 !head -n 20 tree_report.txt 

 TensorFlow 2.0 Upgrade Script ----------------------------- Converted 7 files Detected 1 issues that require attention -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- File: models/samples/cookbook/regression/automobile_data.py -------------------------------------------------------------------------------- models/samples/cookbook/regression/automobile_data.py:125:15: WARNING: Changing dataset.make_one_shot_iterator() to tf.compat.v1.data.make_one_shot_iterator(dataset). Please check this transformation. ================================================================================ Detailed log follows: ================================================================================ ================================================================================ Input tree: 'models/samples/cookbook/regression/' ================================================================================ -------------------------------------------------------------------------------- Processing file 'models/samples/cookbook/regression/custom_regression.py' outputting to 'regression_v2/custom_regression.py' 

Vuelva a prestar atención a un comentario sobre la Dataset.make_one_shot_iterator function .

Modo seguro


El script de conversión también tiene un modo "SEGURO" menos invasivo que simplemente cambia las importaciones para usar el módulo tensorflow.compat.v1 .

 !tf_upgrade_v2 --mode SAFETY --infile dropout.py --outfile dropout_v2_safe.py > /dev/null 

Por ejemplo código:

 import tensorflow as tf d = tf.nn.dropout(tf.range(10), 0.2) z = tf.zeros_like(d, optimize=False) 


en este modo se convierte a lo siguiente:

 import tensorflow.compat.v1 as tf tf.disable_v2_behavior() d = tf.nn.dropout(tf.range(10), 0.2) z = tf.zeros_like(d, optimize=False) 

Como puede ver, su código no se ha actualizado, pero ahora el código TensorFlow 1 se ejecuta en TensorFlow 2.

Advertencias


  • No actualice partes de su código manualmente antes de ejecutar el script. En particular, las funciones con argumentos reordenados, como tf.argmax o tf.batch_to_space , obligarán al script a agregar incorrectamente argumentos de palabras clave, lo que confundirá su código existente.
  • El script asume que tensorflow importa usando import tensorflow as tf
  • El script no reordena los argumentos. En cambio, el script agrega las palabras clave de los argumentos a las funciones en las que se invierten los argumentos.

Después de la verificación, la traducción también aparecerá en Tensorflow.org. Si desea participar en la traducción de la documentación del sitio web de Tensorflow.org al ruso, comuníquese personalmente o envíe sus comentarios. Cualquier corrección o comentario son apreciados.

Source: https://habr.com/ru/post/483184/


All Articles