Cette page a été traduite par l'API Cloud Translation.
Switch to English

Mettre automatiquement à niveau du code pour tensorflow 2

Voir sur TensorFlow.org Exécuter dans Google Colab Voir la source sur GitHub Bloc - notes Télécharger

Tensorflow 2.0 inclut de nombreuses modifications de l'API, tels que les arguments réordonnancement, renommer des symboles, et l'évolution des valeurs par défaut des paramètres. Réglage manuel toutes ces modifications serait fastidieux et sujet à l'erreur. Pour simplifier les changements, et de faire la transition vers TF 2.0 aussi transparente que possible, l'équipe de tensorflow a créé le tf_upgrade_v2 utilitaire pour le code existant aide de transition vers la nouvelle API.

L'usage typique est comme ceci:

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

Il permettra d'accélérer votre processus de mise à niveau en convertissant les scripts existants tensorflow 1.x Python 2.0 tensorflow.

Les automates de script de conversion autant que possible, mais il y a encore des changements syntaxiques et stylistiques qui ne peuvent pas être effectuées par le script.

modules de compatibilité

Certains symboles de l'API ne peuvent pas être mis à niveau en utilisant simplement un remplacement de chaîne. Pour vous assurer que votre code est toujours pris en charge tensorflow 2.0, le script de mise à niveau comprend un compat.v1 module. Ce module remplace les symboles 1.x TF comme tf.foo avec l'équivalent tf.compat.v1.foo référence. Bien que le module de compatibilité est agréable, nous vous recommandons de remplacer Relisez manuellement et les migrer vers les nouvelles API dans le tf.* Espace de noms au lieu de tf.compat.v1 espace de noms aussi rapidement que possible.

En raison de tensorflow deprecations module 2.x (par exemple, tf.flags et tf.contrib ), certains changements ne peuvent pas être contournées par le passage à compat.v1 . Mise à niveau de ce code peut nécessiter l' utilisation d' une bibliothèque supplémentaire (par exemple, absl.flags ) ou le passage à un paquet dans tensorflow / extension .

Le reste de ce guide montre comment utiliser le script de mise à niveau. Alors que le script de mise à niveau est facile à utiliser, il est fortement recommandé que vous utilisez le script dans le cadre du processus suivant:

  1. Unité de test: Assurez -vous que le code que vous mettez à jour a une suite de test unitaire avec une couverture raisonnable. Ceci est du code Python, le langage ne vous protégera pas de nombreuses classes d'erreurs. Assurez-vous également que toute dépendance vous a déjà été mis à jour pour être compatible avec tensorflow 2.0.

  2. Installer tensorflow 1.14: Améliorez votre tensorflow à la dernière version 1.x tensorflow, au moins 1,14. Cela inclut la dernière API tensorflow 2.0 tf.compat.v2 .

  3. Test 1,14: Assurez -vous de vos tests unitaires passent à ce moment. Vous les utiliserez à plusieurs reprises que vous mettez à niveau si à partir de vert est important.

  4. Exécutez le script de mise à niveau: Exécutez tf_upgrade_v2 sur votre arbre des sources, des tests inclus. Cela va améliorer votre code dans un format où il utilise uniquement des symboles disponibles dans tensorflow 2.0. Symboles dépréciées seront accessibles avec tf.compat.v1 . Ceux-ci auront éventuellement besoin d'attention manuelle, mais pas immédiatement.

  5. Exécutez les tests convertis avec tensorflow 1.14: Votre code devrait encore fonctionner bien dans tensorflow 1.14. Exécutez vos tests unitaires à nouveau. Toute erreur dans vos tests signifie ici il y a un bogue dans le script de mise à niveau. S'il vous plaît laissez - nous savoir .

  6. Vérifiez le rapport de mise à niveau pour les avertissements et les erreurs: Le script écrit un fichier de rapport qui explique les conversions que vous devez double contrôle, ou toute action manuelle , vous devez prendre. Par exemple: Tous les autres cas de contrib nécessiteront une action manuelle à supprimer. S'il vous plaît consulter le RFC pour plus d' instructions .

  7. Installer tensorflow 2.0: A ce stade , il doit être sûr de passer à tensorflow 2.0

  8. Test avec v1.disable_v2_behavior : Re-exécution de vos tests avec al v1.disable_v2_behavior() dans les essais la fonction principale doit donner les mêmes résultats que l' exécution sous 1,14.

  9. Activer V2 Comportement: Maintenant que vos tests fonctionnent en utilisant l'API v2, vous pouvez commencer à regarder en tournant sur le comportement v2. Selon la façon dont votre code est écrit ceci peut nécessiter quelques changements. Voir le guide de migration vers pour plus de détails.

Utilisation du script de mise à niveau

Installer

Avant de commencer assurer que TensorlFlow 2.0 est installé.

 import tensorflow as tf

print(tf.__version__)
 
2.2.0

Clone les tensorflow / modèles dépôt git de sorte que vous avez un code à tester sur:

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% (2449/2449), done.[K
remote: Total 2927 (delta 509), reused 2036 (delta 403), pack-reused 0[K
Receiving objects: 100% (2927/2927), 369.04 MiB | 21.01 MiB/s, done.
Resolving deltas: 100% (509/509), done.
Checking out files: 100% (2768/2768), done.

Lire l'aide

Le script doit être installé avec tensorflow. Voici l'aide de builtin:

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] [--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 compact.v2 explicitly.
  --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

Exemple de code TF1

Voici un simple script 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)

Avec tensorflow 2.0 installé, il ne fonctionne pas:

(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'

Un seul fichier

Le script de mise à niveau peut être exécuté sur un seul fichier 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'


Le script imprime des erreurs si elle ne peut pas trouver une solution pour le code.

arborescence

Les projets typiques, y compris cet exemple simple, utiliseront beaucoup plus d'un fichier. En règle générale voulez mettre à jour un paquet entier, de sorte que le script peut également être exécuté sur une arborescence:

 # upgrade 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
 
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 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 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'
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 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 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'


Notez l'un avertissement au sujet de la dataset.make_one_shot_iterator fonction.

Maintenant, le script fonctionne avec tensorflow 2.0:

Notez que parce que le tf.compat.v1 module, le script converti sera également exécuter dans tensorflow 1.14.

(cd regression_v2 && python custom_regression.py 2>&1) | tail
I0723 01:38:37.875919 139960395478848 estimator.py:2066] Saving dict for global step 1000: global_step = 1000, loss = 309.0033, rmse = 2.5372365
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 1000: /tmp/tmppypy65xc/model.ckpt-1000
I0723 01:38:37.917639 139960395478848 estimator.py:2127] Saving 'checkpoint_path' summary for global step 1000: /tmp/tmppypy65xc/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: $2537


Rapport détaillé

Le script indique également une liste des modifications détaillées. Dans cet exemple, il a trouvé une transformation potentiellement dangereuse et comprenait un avertissement en haut du fichier:

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/automobile_data.py'
 outputting to 'regression_v2/automobile_data.py'

Notez encore une mise en garde au sujet de la Dataset.make_one_shot_iterator function .

Dans d'autres cas, la sortie expliquera le raisonnement des changements non négligeables:

 %%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.
--------------------------------------------------------------------------------


Voici le contenu du fichier modifié, notez le script ajoute des noms d'argument pour faire face à des arguments déplacés et rebaptisées:

cat dropout_v2.py
import tensorflow as tf

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

Un projet plus vaste pourrait contenir quelques erreurs. Par exemple convertir le modèle deeplab:

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

Il a produit les fichiers de sortie:

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

Mais il y avait des erreurs. Le rapport vous aidera à broche point ce que vous devez résoudre avant de cela fonctionner. Voici les trois premières erreurs:

cat deeplab_report.txt | grep -i models/research/deeplab | grep -i error | head -n 3
models/research/deeplab/vis.py:31: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/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.
models/research/deeplab/train.py:29: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.

mode « sécurité »

Le script de conversion a aussi une moins invasive SAFETY mode qui change simplement les importations pour utiliser le tensorflow.compat.v1 Module:

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)

Comme vous pouvez le voir cela ne met pas à jour votre code, mais ne permet tensorflow 1 code à exécuter dans tensorflow 2

avertissements

  • Ne pas mettre à jour les parties de votre code manuellement avant d'exécuter ce script. En particulier, les fonctions qui ont eu des arguments réorganisées comme tf.argmax ou tf.batch_to_space la cause du script pour ajouter de manière incorrecte des arguments clés qui mismap votre code existant.

  • Le script suppose que tensorflow est importé à l' aide import tensorflow as tf .

  • Ce script ne pas les arguments Réorganiser. Au lieu de cela, le script ajoute des arguments de mots clés aux fonctions qui ont leurs arguments réorganisés.

  • Consultez tf2up.ml un outil pratique pour mettre à niveau les ordinateurs portables et les fichiers Jupyter Python dans un dépôt GitHub.

Pour signaler des bogues de script de mise à niveau ou faire des demandes de fonctionnalités, s'il vous plaît déposer une question sur GitHub . Et si vous testez tensorflow 2.0, nous voulons entendre parler! Joignez - vous à la TF 2.0 communauté Test et envoyer vos questions et discussion testing@tensorflow.org .