Trang này được dịch bởi Cloud Translation API.
Switch to English

Tự động nâng cấp mã lên TensorFlow 2

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải vở

TensorFlow 2.0 bao gồm nhiều thay đổi API, chẳng hạn như sắp xếp lại các đối số, đổi tên các ký hiệu và thay đổi các giá trị mặc định cho các tham số. Thực hiện thủ công tất cả các sửa đổi này sẽ rất tẻ nhạt và dễ bị lỗi. Để hợp lý hóa các thay đổi và để giúp quá trình chuyển đổi của bạn thành TF 2.0 trở nên liền mạch nhất có thể, nhóm TensorFlow đã tạo ra tiện ích tf_upgrade_v2 để giúp chuyển mã kế thừa sang API mới.

Cách sử dụng thông thường là như thế này:

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

Nó sẽ tăng tốc quá trình nâng cấp của bạn bằng cách chuyển đổi các tập lệnh Python hiện có của TensorFlow 1.x sang TensorFlow 2.0.

Kịch bản chuyển đổi tự động hóa càng nhiều càng tốt, nhưng vẫn có những thay đổi về cú pháp và kiểu dáng mà kịch bản không thể thực hiện được.

Các mô-đun tương thích

Một số ký hiệu API nhất định không thể được nâng cấp đơn giản bằng cách sử dụng thay thế chuỗi. Để đảm bảo mã của bạn vẫn được hỗ trợ trong TensorFlow 2.0, tập lệnh nâng cấp bao gồm mô-đun compat.v1 . Mô-đun này thay thế các ký hiệu TF 1.x như tf.foo bằng tham chiếu tf.compat.v1.foo tương đương. Mặc dù mô-đun tương thích là tốt, chúng tôi khuyên bạn nên kiểm tra thay thế thủ công và di chuyển chúng sang API mới trong không gian tên tf.* Thay vì không gian tên tf.compat.v1 càng nhanh càng tốt.

Do sự phản đối của mô-đun TensorFlow 2.x (ví dụ: tf.flagstf.contrib ), một số thay đổi không thể được khắc phục bằng cách chuyển sang compat.v1 . Nâng cấp mã này có thể yêu cầu sử dụng một thư viện bổ sung (ví dụ: absl.flags ) hoặc chuyển sang gói trong tenorflow / addons .

Phần còn lại của hướng dẫn này trình bày cách sử dụng tập lệnh nâng cấp. Mặc dù tập lệnh nâng cấp rất dễ sử dụng, nhưng chúng tôi khuyên bạn nên sử dụng tập lệnh như một phần của quy trình sau:

  1. Kiểm tra đơn vị : Đảm bảo rằng mã bạn đang nâng cấp có bộ kiểm tra đơn vị với độ bao phủ hợp lý. Đây là mã Python, vì vậy ngôn ngữ sẽ không bảo vệ bạn khỏi nhiều lỗi sai. Cũng đảm bảo rằng bất kỳ sự phụ thuộc nào bạn đã được nâng cấp để tương thích với TensorFlow 2.0.

  2. Cài đặt TensorFlow 1.14 : Nâng cấp TensorFlow của bạn lên phiên bản TensorFlow 1.x mới nhất, ít nhất là 1.14. Điều này bao gồm API TensorFlow 2.0 cuối cùng trong tf.compat.v2 .

  3. Kiểm tra với 1.14 : Đảm bảo bài kiểm tra đơn vị của bạn vượt qua tại thời điểm này. Bạn sẽ chạy chúng liên tục khi bạn nâng cấp vì vậy bắt đầu từ màu xanh lá cây là rất quan trọng.

  4. Chạy tập lệnh nâng cấp : Chạy tf_upgrade_v2 trên toàn bộ cây nguồn của bạn, bao gồm các bài kiểm tra. Điều này sẽ nâng cấp mã của bạn lên một định dạng trong đó nó chỉ sử dụng các ký hiệu có sẵn trong TensorFlow 2.0. Các biểu tượng không dùng nữa sẽ được truy cập bằng tf.compat.v1 . Những điều này cuối cùng sẽ đòi hỏi sự chú ý bằng tay, nhưng không phải ngay lập tức.

  5. Chạy các thử nghiệm đã chuyển đổi với TensorFlow 1.14 : Mã của bạn vẫn sẽ chạy tốt trong TensorFlow 1.14. Chạy thử nghiệm đơn vị của bạn một lần nữa. Bất kỳ lỗi nào trong các thử nghiệm của bạn ở đây có nghĩa là có lỗi trong tập lệnh nâng cấp. Xin vui lòng cho chúng tôi biết .

  6. Kiểm tra báo cáo nâng cấp để biết các cảnh báo và lỗi : Tập lệnh viết tệp báo cáo giải thích mọi chuyển đổi bạn nên kiểm tra lại hoặc bất kỳ hành động thủ công nào bạn cần thực hiện. Ví dụ: Bất kỳ trường hợp đóng góp nào còn lại sẽ yêu cầu hành động thủ công để xóa. Vui lòng tham khảo RFC để được hướng dẫn thêm .

  7. Cài đặt TensorFlow 2.0 : Tại thời điểm này, an toàn khi chuyển sang TensorFlow 2.0

  8. Kiểm tra với v1.disable_v2_behavior : Chạy lại các thử nghiệm của bạn với al v1.disable_v2_behavior() trong các thử nghiệm chức năng chính sẽ cho kết quả tương tự như chạy dưới 1.14.

  9. Kích hoạt hành vi V2 : Bây giờ các thử nghiệm của bạn hoạt động bằng API v2, bạn có thể bắt đầu tìm cách bật hành vi v2. Tùy thuộc vào cách mã của bạn được viết, điều này có thể yêu cầu một số thay đổi. Xem hướng dẫn di chuyển để biết chi tiết.

Sử dụng tập lệnh nâng cấp

Thiết lập

Trước khi bắt đầu, hãy đảm bảo rằng TensorlFlow 2.0 được cài đặt.

 import tensorflow as tf

print(tf.__version__)
 
2.2.0

Sao chép kho lưu trữ git tenorflow / model để bạn có một số mã để kiểm tra:

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.

Đọc trợ giúp

Kịch bản nên được cài đặt với TensorFlow. Đây là phần trợ giúp tích hợp:

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

Mã TF1 ví dụ

Dưới đây là tập lệnh TensorFlow 1.0 đơn giản:

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)

Với TensorFlow 2.0 được cài đặt, nó không chạy:

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

Tập tin duy nhất

Tập lệnh nâng cấp có thể chạy trên một tệp 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'


Tập lệnh sẽ in lỗi nếu không thể tìm thấy bản sửa lỗi cho mã.

Cây thư mục

Các dự án điển hình, bao gồm ví dụ đơn giản này, sẽ sử dụng nhiều hơn một tệp. Thông thường muốn nâng cấp toàn bộ gói, vì vậy tập lệnh cũng có thể được chạy trên cây thư mục:

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


Lưu ý một cảnh báo về hàm tập dữ dataset.make_one_shot_iterator .

Bây giờ tập lệnh hoạt động với TensorFlow 2.0:

Lưu ý rằng vì mô-đun tf.compat.v1 , tập lệnh được chuyển đổi cũng sẽ chạy trong 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


Báo cáo chi tiết

Kịch bản cũng báo cáo một danh sách các thay đổi chi tiết. Trong ví dụ này, nó tìm thấy một chuyển đổi có thể không an toàn và bao gồm một cảnh báo ở đầu tệp:

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'

Lưu ý một lần nữa cảnh báo về Dataset.make_one_shot_iterator function .

Trong các trường hợp khác, đầu ra sẽ giải thích lý do cho những thay đổi không tầm thường:

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


Dưới đây là nội dung tệp được sửa đổi, lưu ý cách tập lệnh thêm tên đối số để xử lý đối số được di chuyển và đổi tên:

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)

Một dự án lớn hơn có thể chứa một vài lỗi. Ví dụ: chuyển đổi mô hình deeplab:

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

Nó tạo ra các tập tin đầu ra:

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

Nhưng đã có lỗi. Báo cáo sẽ giúp bạn xác định chính xác những gì bạn cần sửa trước khi nó chạy. Dưới đây là ba lỗi đầu tiên:

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.

"Chế độ an toàn

Tập lệnh chuyển đổi cũng có chế độ SAFETY ít xâm lấn hơn, chỉ đơn giản là thay đổi nhập khẩu để sử dụng mô-đun tensorflow.compat.v1 :

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)

Như bạn có thể thấy điều này không nâng cấp mã của bạn, nhưng nó cho phép mã TensorFlow 1 chạy trong TensorFlow 2

Hãy cẩn thận

  • Không cập nhật các phần của mã theo cách thủ công trước khi chạy tập lệnh này. Cụ thể, các hàm đã được sắp xếp lại các đối số như tf.argmax hoặc tf.batch_to_space khiến tập lệnh thêm không chính xác các đối số từ khóa không khớp với mã hiện tại của bạn.

  • Kịch bản giả định rằng tensorflow được nhập bằng cách sử dụng import tensorflow as tf .

  • Kịch bản này không sắp xếp lại các đối số. Thay vào đó, tập lệnh thêm các đối số từ khóa vào các hàm có các đối số được sắp xếp lại.

  • Kiểm tra tf2up.ml để biết công cụ thuận tiện để nâng cấp sổ ghi chép Jupyter và tệp Python trong kho lưu trữ GitHub.

Để báo cáo lỗi nâng cấp tập lệnh hoặc thực hiện các yêu cầu tính năng, vui lòng gửi vấn đề trên GitHub . Và nếu bạn đang thử nghiệm TensorFlow 2.0, chúng tôi muốn nghe về nó! Tham gia cộng đồng Thử nghiệm TF 2.0 và gửi câu hỏi và thảo luận đến tests@tensorflow.org .