Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Aktualisieren Sie den Code automatisch auf TensorFlow 2

Ansicht auf TensorFlow.org In Google Colab ausführen Quelle auf GitHub anzeigen Notizbuch herunterladen

TensorFlow 2.0 enthält viele API-Änderungen, z. B. das Neuordnen von Argumenten, das Umbenennen von Symbolen und das Ändern von Standardwerten für Parameter. Das manuelle Durchführen all dieser Änderungen wäre mühsam und fehleranfällig. Um die Änderungen zu optimieren und den Übergang zu TF 2.0 so nahtlos wie möglich zu gestalten, hat das TensorFlow-Team das Dienstprogramm tf_upgrade_v2 , um den Übergang von Legacy-Code zur neuen API zu tf_upgrade_v2 .

Typische Verwendung ist wie folgt:

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

Es beschleunigt Ihren Upgrade-Prozess, indem vorhandene TensorFlow 1.x Python-Skripte in TensorFlow 2.0 konvertiert werden.

Das Konvertierungsskript automatisiert so weit wie möglich, es gibt jedoch noch syntaktische und stilistische Änderungen, die vom Skript nicht ausgeführt werden können.

Kompatibilitätsmodule

Bestimmte API-Symbole können nicht einfach durch Ersetzen einer Zeichenfolge aktualisiert werden. Um sicherzustellen, dass Ihr Code in TensorFlow 2.0 weiterhin unterstützt wird, enthält das Upgrade-Skript ein compat.v1 Modul. Dieses Modul ersetzt TF 1.x-Symbole wie tf.foo durch die entsprechende tf.compat.v1.foo Referenz. Obwohl das Kompatibilitätsmodul gut ist, empfehlen wir, dass Sie Ersetzungen manuell Korrektur tf.compat.v1 so schnell wie möglich auf neue APIs im Namespace tf.* Anstelle des Namespace tf.compat.v1 .

Aufgrund von TensorFlow 2.x-Modulverzerrungen (z. B. tf.flags und tf.contrib ) können einige Änderungen nicht tf.contrib , indem Sie zu compat.v1 . Für die Aktualisierung dieses Codes muss möglicherweise eine zusätzliche Bibliothek (z. B. absl.flags ) verwendet oder in Tensorflow / Addons zu einem Paket gewechselt werden .

Der Rest dieses Handbuchs zeigt, wie das Upgrade-Skript verwendet wird. Obwohl das Upgrade-Skript einfach zu verwenden ist, wird dringend empfohlen, das Skript als Teil des folgenden Prozesses zu verwenden:

  1. Komponententest : Stellen Sie sicher, dass der Code, den Sie aktualisieren, über eine Komponententestsuite mit angemessener Abdeckung verfügt. Dies ist Python-Code, daher schützt Sie die Sprache nicht vor vielen Fehlerklassen. Stellen Sie außerdem sicher, dass alle Abhängigkeiten, die Sie bereits aktualisiert haben, mit TensorFlow 2.0 kompatibel sind.

  2. TensorFlow 1.14 installieren : Aktualisieren Sie Ihren TensorFlow auf die neueste Version von TensorFlow 1.x, mindestens 1.14. Dies beinhaltet die endgültige TensorFlow 2.0-API in tf.compat.v2 .

  3. Test mit 1.14 : Stellen Sie sicher, dass Ihre Komponententests an diesem Punkt bestanden sind. Sie werden sie beim Upgrade wiederholt ausführen, daher ist es wichtig, von grün zu beginnen.

  4. Führen Sie das Upgrade-Skript aus : Führen Sie tf_upgrade_v2 in Ihrem gesamten tf_upgrade_v2 aus, einschließlich Tests. Dadurch wird Ihr Code auf ein Format aktualisiert, in dem nur in TensorFlow 2.0 verfügbare Symbole verwendet werden. Auf veraltete Symbole wird mit tf.compat.v1 . Diese erfordern möglicherweise manuelle Aufmerksamkeit, jedoch nicht sofort.

  5. Führen Sie die konvertierten Tests mit TensorFlow 1.14 aus : Ihr Code sollte in TensorFlow 1.14 weiterhin einwandfrei funktionieren. Führen Sie Ihre Unit-Tests erneut aus. Jeder Fehler in Ihren Tests hier bedeutet, dass das Upgrade-Skript einen Fehler enthält. Bitte lassen Sie es uns wissen .

  6. Überprüfen Sie den Upgrade-Bericht auf Warnungen und Fehler : Das Skript schreibt eine Berichtsdatei, in der alle Konvertierungen erläutert werden, die Sie überprüfen sollten, oder alle manuellen Maßnahmen, die Sie ergreifen müssen. Beispiel: Alle verbleibenden Instanzen von Contrib müssen zum Entfernen manuell ausgeführt werden. Bitte konsultieren Sie den RFC für weitere Anweisungen .

  7. TensorFlow 2.0 installieren : Zu diesem Zeitpunkt sollte es sicher sein, auf TensorFlow 2.0 zu wechseln

  8. Test mit v1.disable_v2_behavior : v1.disable_v2_behavior Ihre Tests mit al v1.disable_v2_behavior() in der Hauptfunktion des Tests erneut v1.disable_v2_behavior() sollten Sie dieselben Ergebnisse v1.disable_v2_behavior() wie unter 1.14.

  9. V2-Verhalten aktivieren : Nachdem Ihre Tests mit der v2-API ausgeführt wurden, können Sie sich mit dem Aktivieren des v2-Verhaltens befassen. Abhängig davon, wie Ihr Code geschrieben ist, sind möglicherweise einige Änderungen erforderlich. Weitere Informationen finden Sie im Migrationshandbuch .

Verwenden des Upgrade-Skripts

Konfiguration

Stellen Sie vor dem Start sicher, dass TensorlFlow 2.0 installiert ist.

 import tensorflow as tf

print(tf.__version__)
 
2.2.0

Klonen Sie das Git-Repository von tensorflow / models, damit Sie Code zum Testen haben:

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.

Lesen Sie die Hilfe

Das Skript sollte mit TensorFlow installiert werden. Hier ist die eingebaute Hilfe:

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

Beispiel TF1-Code

Hier ist ein einfaches TensorFlow 1.0-Skript:

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)

Mit installiertem TensorFlow 2.0 läuft es nicht:

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

Einzelne Datei

Das Upgrade-Skript kann für eine einzelne Python-Datei ausgeführt werden:

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


Das Skript gibt Fehler aus, wenn keine Lösung für den Code gefunden werden kann.

Verzeichnisbaum

Typische Projekte, einschließlich dieses einfachen Beispiels, verwenden viel mehr als eine Datei. In der Regel möchten Sie ein gesamtes Paket aktualisieren, damit das Skript auch in einem Verzeichnisbaum ausgeführt werden kann:

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


Beachten Sie die einzige Warnung zur Funktion dataset.make_one_shot_iterator .

Jetzt funktioniert das Skript mit TensorFlow 2.0:

Beachten Sie, dass das konvertierte Skript aufgrund des Moduls tf.compat.v1 auch in TensorFlow 1.14 ausgeführt wird.

(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


Ausführlicher Bericht

Das Skript meldet auch eine Liste detaillierter Änderungen. In diesem Beispiel wurde eine möglicherweise unsichere Umwandlung gefunden und oben in der Datei eine Warnung eingefügt:

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'

Beachten Sie erneut die einzige Warnung zur Dataset.make_one_shot_iterator function .

In anderen Fällen erklärt die Ausgabe die Gründe für nicht triviale Änderungen:

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


Beachten Sie hier, wie das Skript Argumentnamen hinzufügt, um mit verschobenen und umbenannten Argumenten umzugehen:

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)

Ein größeres Projekt kann einige Fehler enthalten. Konvertieren Sie beispielsweise das Deeplab-Modell:

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

Es wurden die Ausgabedateien erstellt:

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

Aber es gab Fehler. Der Bericht hilft Ihnen dabei, genau zu bestimmen, was Sie reparieren müssen, bevor dies ausgeführt wird. Hier sind die ersten drei Fehler:

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.

"Sicherheitsmodus

Das Konvertierungsskript verfügt außerdem über einen weniger invasiven SAFETY , in dem die Importe einfach geändert werden, um das Modul tensorflow.compat.v1 zu verwenden:

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)

Wie Sie sehen, wird Ihr Code dadurch nicht aktualisiert, aber TensorFlow 1-Code kann in TensorFlow 2 ausgeführt werden

Vorsichtsmaßnahmen

  • Aktualisieren Sie Teile Ihres Codes nicht manuell, bevor Sie dieses Skript ausführen. Insbesondere Funktionen, bei denen Argumente wie tf.argmax oder tf.batch_to_space neu tf.argmax tf.batch_to_space dass das Skript fälschlicherweise Schlüsselwortargumente hinzufügt, die Ihren vorhandenen Code nicht übereinstimmen.

  • Das Skript geht davon aus, dass tensorflow mithilfe von import tensorflow as tf importiert wird.

  • Dieses Skript ordnet Argumente nicht neu an. Stattdessen fügt das Skript Funktionen, deren Argumente neu angeordnet wurden, Schlüsselwortargumente hinzu.

  • In tf2up.ml finden Sie ein praktisches Tool zum Aktualisieren von Jupyter-Notebooks und Python-Dateien in einem GitHub-Repository.

Um Upgrade-Skriptfehler zu melden oder Funktionsanforderungen zu stellen, melden Sie bitte ein Problem auf GitHub . Und wenn Sie TensorFlow 2.0 testen, möchten wir davon hören! Treten Sie der TF 2.0-Test-Community bei und senden Sie Fragen und Diskussionen an testing@tensorflow.org .