Ayuda a proteger la Gran Barrera de Coral con TensorFlow en Kaggle Únete Challenge

Reescribe automáticamente los símbolos de la API TF 1.xy compat.v1

Ver en TensorFlow.org Ejecutar en Google Colab Ver fuente en GitHub Descargar cuaderno

TensorFlow 2.x incluye muchos cambios en la API de 1.x TF y los tf.compat.v1 API, tales como la reordenación de argumentos, cambiar el nombre de símbolos, y el cambio de valores por defecto para parámetros. Realizar manualmente todas estas modificaciones sería tedioso y propenso a errores. Para simplificar los cambios, y para hacer su transición a la 2.x TF lo más sencillo posible, el equipo TensorFlow ha creado el tf_upgrade_v2 utilidad de código heredado ayuda transición a la nueva API.

El uso típico es así:

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

Acelerará su proceso de actualización al convertir los scripts Python de TensorFlow 1.x existentes a TensorFlow 2.x.

El script de conversión automatiza muchas transformaciones mecánicas de API, aunque muchas API no se pueden migrar automáticamente. Tampoco puede hacer que su código sea totalmente compatible con los comportamientos y las API de TF2. Por lo tanto, es solo una parte de su viaje de migración.

Módulos de compatibilidad

Ciertos símbolos de API no se pueden actualizar simplemente usando un reemplazo de cadena. Los que no se puede actualizar automáticamente va a proyectar en sus ubicaciones en el compat.v1 módulo. Este módulo reemplaza símbolos TF 1.x como tf.foo con el equivalente tf.compat.v1.foo referencia. Si ya está utilizando compat.v1 API mediante la importación a través de TF import tensorflow.compat.v1 as tf , la tf_upgrade_v2 guión intentará convertir estos usos a la API no compat siempre que sea posible. Tenga en cuenta que mientras que algunos compat.v1 API son compatibles con los comportamientos TF2.x, muchos no lo son. Por lo tanto, se recomienda que usted manualmente corregir y reemplazos a migrar a nuevas API en el tf.* Espacio de nombres en lugar de tf.compat.v1 espacio de nombres tan pronto como sea posible.

Debido a TensorFlow deprecations módulo 2.x (por ejemplo, tf.flags y tf.contrib ), algunos cambios no se pueden trabajar en alrededor de cambiar a compat.v1 . Actualización de este código puede requerir el uso de una biblioteca adicional (por ejemplo, absl.flags ) o conmutación a un paquete en tensorflow / complementos .

El resto de esta guía demuestra cómo utilizar el script de reescritura de símbolos. Si bien el script es fácil de usar, se recomienda encarecidamente que lo utilice como parte del siguiente proceso:

  1. Prueba de unidad: Asegúrese de que el código está actualizando tiene un conjunto de pruebas de unidad con una cobertura razonable. Este es el código Python, por lo que el lenguaje no lo protegerá de muchas clases de errores. También asegúrese de que cualquier dependencia que tenga ya se haya actualizado para que sea compatible con TensorFlow 2.x.

  2. Instalar TensorFlow 1.15: Mejora tus TensorFlow a la última versión 1.x TensorFlow, al menos 1,15. Esto incluye la final API TensorFlow 2,0 en tf.compat.v2 .

  3. Con prueba de 1,15: Asegúrese de pruebas unitarias pasan en este punto. Los ejecutará repetidamente a medida que actualice, por lo que comenzar desde verde es importante.

  4. Ejecutar el script de actualización: Ejecutar tf_upgrade_v2 en todo su árbol de fuentes, incluidas las pruebas. Esto actualizará su código a un formato en el que solo use símbolos disponibles en TensorFlow 2.0. Se tendrá acceso a los símbolos en desuso con tf.compat.v1 . Estos eventualmente requerirán atención manual, pero no de inmediato.

  5. Ejecutar las pruebas convertidos con TensorFlow 1.15: Su código todavía debe funcionar correctamente en TensorFlow 1.15. Ejecute sus pruebas unitarias nuevamente. Cualquier error en sus pruebas aquí significa que hay un error en el script de actualización. Por favor, háganoslo saber .

  6. Compruebe el informe de actualización para los avisos y errores: La secuencia de comandos escribe un archivo de informe que explica las conversiones que debe vuelva a verificar, o cualquier acción manual que debe tomar. Por ejemplo: cualquier instancia restante de contrib requerirá una acción manual para eliminarla. Por favor consulte el RFC para más instrucciones .

  7. Instalar TensorFlow 2.x: En este punto debe ser seguro para cambiar a TensorFlow 2.x binarios, incluso si está ejecutando con los comportamientos heredados

  8. Prueba con v1.disable_v2_behavior : Volver a ejecutar sus pruebas con un v1.disable_v2_behavior() en la función principal de las pruebas deberían dar los mismos resultados que se ejecuta en 1,15.

  9. Habilitar Comportamiento V2: Ahora que sus pruebas funcionan utilizando los binarios de TF2, ahora puede empezar a migrar su código para evitar tf.estimator s y sólo utilizando apoyados TF2 comportamientos (con ningún comportamiento TF2 incapacitante). Ver las de migración guías para obtener más detalles.

Utilizando el símbolo de la reescritura tf_upgrade_v2 guión

Configuración

Antes de comenzar, asegúrese de que TensorFlow 2.x esté instalado.

import tensorflow as tf

print(tf.__version__)
2.6.0

Clonar los tensorflow / modelos repositorio git para que tenga algo de código a prueba en:

git clone --branch r1.13.0 --depth 1 https://github.com/tensorflow/models
Cloning into 'models'...
remote: Enumerating objects: 2927, done.[K
remote: Counting objects: 100% (2927/2927), done.[K
remote: Compressing objects: 100% (2428/2428), done.[K
remote: Total 2927 (delta 504), reused 2113 (delta 424), pack-reused 0[K
Receiving objects: 100% (2927/2927), 369.04 MiB | 27.58 MiB/s, done.
Resolving deltas: 100% (504/504), done.
Checking out files: 100% (2768/2768), done.

Leer la ayuda

La secuencia de comandos debe instalarse con TensorFlow. Aquí está la ayuda incorporada:

tf_upgrade_v2 -h
usage: tf_upgrade_v2 [-h] [--infile INPUT_FILE] [--outfile OUTPUT_FILE]
                     [--intree INPUT_TREE] [--outtree OUTPUT_TREE]
                     [--copyotherfiles COPY_OTHER_FILES] [--inplace]
                     [--no_import_rename] [--no_upgrade_compat_v1_import]
                     [--reportfile REPORT_FILENAME] [--mode {DEFAULT,SAFETY}]
                     [--print_all]

Convert a TensorFlow Python file from 1.x to 2.0

Simple usage:
  tf_upgrade_v2.py --infile foo.py --outfile bar.py
  tf_upgrade_v2.py --infile foo.ipynb --outfile bar.ipynb
  tf_upgrade_v2.py --intree ~/code/old --outtree ~/code/new

optional arguments:
  -h, --help            show this help message and exit
  --infile INPUT_FILE   If converting a single file, the name of the file to
                        convert
  --outfile OUTPUT_FILE
                        If converting a single file, the output filename.
  --intree INPUT_TREE   If converting a whole tree of files, the directory to
                        read from (relative or absolute).
  --outtree OUTPUT_TREE
                        If converting a whole tree of files, the output
                        directory (relative or absolute).
  --copyotherfiles COPY_OTHER_FILES
                        If converting a whole tree of files, whether to copy
                        the other files.
  --inplace             If converting a set of files, whether to allow the
                        conversion to be performed on the input files.
  --no_import_rename    Not to rename import to compat.v2 explicitly.
  --no_upgrade_compat_v1_import
                        If specified, don't upgrade explicit imports of
                        `tensorflow.compat.v1 as tf` to the v2 APIs.
                        Otherwise, explicit imports of the form
                        `tensorflow.compat.v1 as tf` will be upgraded.
  --reportfile REPORT_FILENAME
                        The name of the file where the report log is
                        stored.(default: report.txt)
  --mode {DEFAULT,SAFETY}
                        Upgrade script mode. Supported modes: DEFAULT: Perform
                        only straightforward conversions to upgrade to 2.0. In
                        more difficult cases, switch to use compat.v1. SAFETY:
                        Keep 1.* code intact and import compat.v1 module.
  --print_all           Print full log to stdout instead of just printing
                        errors

Ejemplo de código TF1

Aquí hay una secuencia de comandos simple de TensorFlow 1.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)

Con TensorFlow 2.x instalado, no se ejecuta:

(cd models/samples/cookbook/regression && python custom_regression.py)
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'

Fila india

El script se puede ejecutar en un solo archivo de Python:

!tf_upgrade_v2 \
  --infile models/samples/cookbook/regression/custom_regression.py \
  --outfile /tmp/custom_regression_v2.py
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'

El script imprimirá errores si no puede encontrar una solución para el código.

Árbol de directorio

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

# update the .py files and copy all the other files to the outtree
!tf_upgrade_v2 \
    --intree models/samples/cookbook/regression/ \
    --outtree regression_v2/ \
    --reportfile tree_report.txt
INFO line 82:10: tf.estimator.LinearRegressor: Default value of loss_reduction has been changed to SUM_OVER_BATCH_SIZE; inserting old default value tf.keras.losses.Reduction.SUM.

INFO line 105:2: Renamed 'tf.logging.set_verbosity' to 'tf.compat.v1.logging.set_verbosity'
INFO line 105:27: Renamed 'tf.logging.INFO' to 'tf.compat.v1.logging.INFO'
INFO line 106:2: Renamed 'tf.app.run' to 'tf.compat.v1.app.run'
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'
INFO line 58:10: tf.estimator.LinearRegressor: Default value of loss_reduction has been changed to SUM_OVER_BATCH_SIZE; inserting old default value tf.keras.losses.Reduction.SUM.

INFO line 101:2: Renamed 'tf.logging.set_verbosity' to 'tf.compat.v1.logging.set_verbosity'
INFO line 101:27: Renamed 'tf.logging.INFO' to 'tf.compat.v1.logging.INFO'
INFO line 102:2: Renamed 'tf.app.run' to 'tf.compat.v1.app.run'
INFO line 72:10: tf.estimator.DNNRegressor: Default value of loss_reduction has been changed to SUM_OVER_BATCH_SIZE; inserting old default value tf.keras.losses.Reduction.SUM.

INFO line 96:2: Renamed 'tf.logging.set_verbosity' to 'tf.compat.v1.logging.set_verbosity'
INFO line 96:27: Renamed 'tf.logging.INFO' to 'tf.compat.v1.logging.INFO'
INFO line 97:2: Renamed 'tf.app.run' to 'tf.compat.v1.app.run'
WARNING line 125:15: Changing dataset.make_one_shot_iterator() to tf.compat.v1.data.make_one_shot_iterator(dataset). Please check this transformation.

INFO line 40:7: Renamed 'tf.test.mock' to 'tf.compat.v1.test.mock'
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.



Make sure to read the detailed log 'tree_report.txt'

Tenga en cuenta la advertencia sobre el dataset.make_one_shot_iterator función.

Ahora el script funciona con TensorFlow 2.x:

Tenga en cuenta que debido a que el tf.compat.v1 módulo está incluido en TF 1.15, el guión convertida también se ejecutará en TensorFlow 1.15.

(cd regression_v2 && python custom_regression.py 2>&1) | tail
I0922 22:16:42.778216 140254758430528 estimator.py:2074] Saving dict for global step 1000: global_step = 1000, loss = 651.5428, rmse = 3.684265
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 1000: /tmp/tmpk2_4r192/model.ckpt-1000
I0922 22:16:42.817190 140254758430528 estimator.py:2135] Saving 'checkpoint_path' summary for global step 1000: /tmp/tmpk2_4r192/model.ckpt-1000
Tensor("IteratorGetNext:25", shape=(None,), dtype=float64, device=/device:CPU:0)
Tensor("Squeeze:0", shape=(None,), dtype=float32)

********************************************************************************

RMS error for the test set: $3684

Reporte detallado

El script también informa una lista de cambios detallados. En este ejemplo, encontró una transformación posiblemente insegura e incluyó 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/__init__.py'
 outputting to 'regression_v2/__init__.py'

Nota de nuevo la advertencia sobre la Dataset.make_one_shot_iterator function .

En otros casos, la salida explicará el razonamiento de los cambios no triviales:

%%writefile dropout.py
import tensorflow as tf

d = tf.nn.dropout(tf.range(10), 0.2)
z = tf.zeros_like(d, optimize=False)
Writing dropout.py
!tf_upgrade_v2 \
  --infile dropout.py \
  --outfile dropout_v2.py \
  --reportfile dropout_report.txt > /dev/null
cat dropout_report.txt
TensorFlow 2.0 Upgrade Script
-----------------------------
Converted 1 files
Detected 0 issues that require attention
--------------------------------------------------------------------------------
================================================================================
Detailed log follows:

================================================================================
--------------------------------------------------------------------------------
Processing file 'dropout.py'
 outputting to 'dropout_v2.py'
--------------------------------------------------------------------------------

3:4: INFO: Changing keep_prob arg of tf.nn.dropout to rate, and recomputing value.

4:4: INFO: Renaming tf.zeros_like to tf.compat.v1.zeros_like because argument optimize is present. tf.zeros_like no longer takes an optimize argument, and behaves as if optimize=True. This call site specifies something other than optimize=True, so it was converted to compat.v1.
--------------------------------------------------------------------------------

Aquí está el contenido del archivo modificado, observe cómo el script agrega nombres de argumentos para tratar los argumentos movidos y renombrados:

cat dropout_v2.py
import tensorflow as tf

d = tf.nn.dropout(tf.range(10), rate=1 - (0.2))
z = tf.compat.v1.zeros_like(d, optimize=False)

Un proyecto más grande puede contener algunos errores. Por ejemplo, convierta el modelo deeplab:

!tf_upgrade_v2 \
    --intree models/research/deeplab \
    --outtree deeplab_v2 \
    --reportfile deeplab_report.txt > /dev/null

Produjo los archivos de salida:

ls deeplab_v2
README.md   datasets        input_preprocess.py        train.py
__init__.py deeplab_demo.ipynb  local_test.sh          utils
common.py   eval.py         local_test_mobilenetv2.sh  vis.py
common_test.py  export_model.py     model.py
core        g3doc           model_test.py

Pero hubo errores. El informe le ayudará a identificar lo que necesita corregir antes de que se ejecute. Aquí están los primeros tres errores:

cat deeplab_report.txt | grep -i models/research/deeplab | grep -i error | head -n 3
models/research/deeplab/eval.py:28:7: ERROR: Using member tf.contrib.slim in deprecated module tf.contrib. tf.contrib.slim cannot be converted automatically. tf.contrib will not be distributed with TensorFlow 2.0, please consider an alternative in non-contrib TensorFlow, a community-maintained repository such as tensorflow/addons, or fork the required code.
models/research/deeplab/eval.py:146:8: ERROR: Using member tf.contrib.metrics.aggregate_metric_map in deprecated module tf.contrib. tf.contrib.metrics.aggregate_metric_map cannot be converted automatically. tf.contrib will not be distributed with TensorFlow 2.0, please consider an alternative in non-contrib TensorFlow, a community-maintained repository such as tensorflow/addons, or fork the required code.
models/research/deeplab/export_model.py:25:7: ERROR: Using member tf.contrib.slim in deprecated module tf.contrib. tf.contrib.slim cannot be converted automatically. tf.contrib will not be distributed with TensorFlow 2.0, please consider an alternative in non-contrib TensorFlow, a community-maintained repository such as tensorflow/addons, or fork the required code.

"Modo seguro

La secuencia de comandos de conversión también tiene una menos invasiva SAFETY modo que simplemente cambia las importaciones utilizar el tensorflow.compat.v1 módulo:

cat dropout.py
import tensorflow as tf

d = tf.nn.dropout(tf.range(10), 0.2)
z = tf.zeros_like(d, optimize=False)
tf_upgrade_v2 --mode SAFETY --infile dropout.py --outfile dropout_v2_safe.py > /dev/null
cat dropout_v2_safe.py
import tensorflow.compat.v1 as tf

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

Como puede ver, esto no actualiza su código, pero permite que el código de TensorFlow 1 se ejecute en los binarios de TensorFlow 2. Tenga en cuenta que esto no significa que su código esté ejecutando comportamientos TF 2.x compatibles.

Advertencias

  • No actualice partes de su código manualmente antes de ejecutar este script. En particular, las funciones que han tenido argumentos reordenados como tf.argmax o tf.batch_to_space causa la secuencia de comandos para añadir de forma incorrecta argumentos de palabras clave que mismap su código existente.

  • La secuencia de comandos supone que tensorflow ha sido importada usando import tensorflow as tf , o import tensorflow.compat.v1 as tf .

  • Este script no reordena los argumentos. En cambio, la secuencia de comandos agrega argumentos de palabras clave a las funciones cuyos argumentos se han reordenado.

  • Salida tf2up.ml para una herramienta conveniente para actualizar los cuadernos Jupyter y archivos de Python en un repositorio GitHub.

Para informar de los errores de secuencia de comandos de actualización o peticiones maquillaje, por favor presentar un problema en GitHub .