این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

به طور خودکار کد را به TensorFlow 2 ارتقا دهید

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub بارگیری نوت بوک

TensorFlow 2.0 شامل بسیاری از تغییرات API از قبیل تغییر نام آرگومانها ، تغییر نام نمادها و تغییر مقادیر پیش فرض پارامترها است. انجام دستی همه این تغییرات خسته کننده و مستعد خطا خواهد بود. برای ساده تر کردن تغییرات و ایجاد هرچه tf_upgrade_v2 انتقال شما به TF 2.0 ، تیم tf_upgrade_v2 ابزار tf_upgrade_v2 را برای کمک به انتقال کد میراث به API جدید ایجاد کرده است.

استفاده معمولی مانند این است:

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

این کار با تبدیل اسکریپت های موجود TensorFlow 1.x Python به TensorFlow 2.0 روند ارتقاء شما را تسریع می کند.

اسکریپت تبدیل تا حد امکان خودکار می کند ، اما هنوز هم تغییرات نحوی و سبکی وجود دارد که توسط اسکریپت قابل اجرا نیست.

ماژول های سازگاری

با استفاده از یک جایگزین رشته ، نمادهای خاصی API قابل ارتقا نیستند. برای اطمینان از این که کدهای شما هنوز در TensorFlow 2.0 پشتیبانی نمی شود ، اسکریپت ارتقاء شامل یک ماژول compat.v1 . این ماژول نمادهای TF 1.x مانند tf.foo با مرجع معادل tf.compat.v1.foo . در حالی که ماژول سازگاری خوب است ، ما توصیه می کنیم که به صورت دستی جایگزین های tf.compat.v1 و در اسرع وقت به جای API های جدید در tf.* namespace به API های جدید منتقل کنید.

به دلیل استهلاک ماژول tf.flags 2.x (به عنوان مثال ، tf.flags و tf.contrib ) ، با تغییر دادن به compat.v1 برخی از تغییرات قابل انجام نیست. به روزرسانی این کد ممکن است نیاز به استفاده از یک کتابخانه اضافی (برای مثال ، absl.flags ) یا جابجایی به یک بسته در tensorflow / addons باشد.

بقیه این راهنما نحوه استفاده از اسکریپت ارتقا را نشان می دهد. در حالی که اسکریپت به روزرسانی قابل استفاده است ، به شدت توصیه می شود که از اسکریپت به عنوان بخشی از مراحل زیر استفاده کنید:

  1. Test Unit : اطمینان حاصل کنید که کدی که به روز می کنید دارای یک مجموعه تست واحد با پوشش معقول است. این کد پایتون است ، بنابراین زبان شما را از بسیاری از اشتباهات محافظت نمی کند. همچنین اطمینان حاصل کنید که هرگونه وابستگی شما قبلاً به روز شده است تا با TensorFlow 2.0 سازگار باشد.

  2. نصب TensorFlow 1.14 : TensorFlow خود را به آخرین نسخه TensorFlow 1.x ، حداقل 1.14 ارتقا دهید. این شامل API نهایی TensorFlow 2.0 در tf.compat.v2 .

  3. تست با 1.14 : اطمینان حاصل کنید که آزمون واحد شما در این مرحله می گذرد. شما به عنوان مرتباً مرتب سازی آنها را اجرا می کنید ، بنابراین شروع از سبز مهم است.

  4. اسکریپت به روزرسانی را اجرا کنید: tf_upgrade_v2 روی تمام درخت منبع خود اجرا کنید ، تست های موجود. با این کار کد شما به فرمی ارتقا می یابد که در آن از سمبل های موجود در TensorFlow 2.0 استفاده می شود. نمادهای حذف شده با tf.compat.v1 قابل دسترسی tf.compat.v1 . اینها در نهایت به توجه دستی نیاز دارند ، اما بلافاصله.

  5. تست های تبدیل شده را با TensorFlow 1.14 انجام دهید : کد شما هنوز هم باید در TensorFlow 1.14 خوب باشد. تست های واحد خود را دوباره انجام دهید. هر گونه خطایی در تست های شما در اینجا به معنای اشکالی در اسکریپت ارتقاء وجود دارد. لطفا به ما اطلاع دهید

  6. گزارش بروزرسانی را برای هشدارها و خطاها بررسی کنید : این اسکریپت یک پرونده گزارش را ارسال می کند که هرگونه تبدیل را که باید بررسی کنید یا هر اقدام دستی را که باید انجام دهید ، توضیح می دهد. به عنوان مثال: هر گونه موارد باقیمانده از مشارکت برای حذف دستی نیاز به اقدام دستی دارد. لطفا برای دستورالعمل های بیشتر با RFC مشورت کنید.

  7. نصب TensorFlow 2.0 : در این مرحله می بایست ایمن باشد و به TensorFlow 2.0 تغییر دهید

  8. تست با v1.disable_v2_behavior : اجرای مجدد آزمونهای خود با al v1.disable_v2_behavior() در عملکرد اصلی آزمونها باید همان نتایج اجرا در زیر 1.14 را بدست آورد.

  9. فعال کردن رفتار V2 : اکنون که تست های شما با استفاده از API v2 کار می کند ، می توانید به دنبال تغییر رفتار v2 باشید. بسته به نحوه نگارش کد شما ممکن است نیاز به تغییراتی داشته باشد. برای جزئیات بیشتر به راهنمای مهاجرت مراجعه کنید.

با استفاده از اسکریپت به روزرسانی

برپایی

قبل از شروع اطمینان حاصل کنید که TensorlFlow 2.0 نصب شده است.

 import tensorflow as tf

print(tf.__version__)
 
2.2.0

مخزن git tensorflow / model ها را کلون کنید ، بنابراین شما باید کد دیگری برای آزمایش در آن داشته باشید:

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.

راهنما را بخوانید

فیلمنامه باید با TensorFlow نصب شود. در اینجا کمک داخلی وجود دارد:

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

کد TF1 نمونه

در اینجا یک اسکریپت ساده 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)

با نصب TensorFlow 2.0 اجرا نمی شود:

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

پرونده منفرد

اسکریپت به روزرسانی را می توان در یک پرونده پایتون اجرا کرد:

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


اگر نتواند تصحیح کد را پیدا کند ، خط را چاپ می کند.

درخت فهرست

پروژه های معمولی ، از جمله این مثال ساده ، بسیار بیشتر از یک پرونده استفاده می کنند. به طور معمول می خواهید یک بسته کامل را به روز کنید ، بنابراین اسکریپت نیز می تواند در یک درخت فهرست اجرا شود:

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


یک اخطار درباره عملکرد داده. dataset.make_one_shot_iterator کنید.

اکنون فیلمنامه با TensorFlow 2.0 کار می کند:

توجه داشته باشید که به دلیل ماژول tf.compat.v1 ، اسکریپت تبدیل شده نیز در 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


گزارش مفصل

اسکریپت همچنین لیستی از تغییرات دقیق را گزارش می کند. در این مثال ، یک انتقال احتمالاً ناامن یافت و یک هشدار در بالای پرونده را شامل شد:

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'

یکبار دیگر درباره Dataset.make_one_shot_iterator function هشدار Dataset.make_one_shot_iterator function .

در موارد دیگر خروجی استدلال برای تغییرات غیر مهم را توضیح می دهد:

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


در اینجا محتوای پرونده تغییر یافته است ، توجه داشته باشید که چگونه اسکریپت اسامی آرگومان را برای مقابله با آرگومان های منتقل شده و تغییر نام می دهد:

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)

یک پروژه بزرگتر ممکن است دارای چند خطا باشد. به عنوان مثال مدل deeplab را تبدیل کنید:

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

فایلهای خروجی را تولید می کند:

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

اما خطایی رخ داد. این گزارش به شما کمک می کند تا قبل از اجرای این کار ، آنچه را که باید برطرف کنید ، مشخص کنید. در اینجا سه ​​خطای اول آورده شده است:

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.

حالت "ایمنی"

اسکریپت تبدیل همچنین دارای حالت SAFETY کم تهاجمی است که به سادگی واردات را برای استفاده از ماژول 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)

همانطور که می بینید این کد شما را به روز نمی کند ، اما اجازه می دهد تا کد TensorFlow 1 در TensorFlow 2 اجرا شود.

هشدارها

  • قبل از اجرای این اسکریپت ، قسمت هایی از کد خود را به صورت دستی بروز نکنید. به طور خاص ، عملکردهایی که آرگومانهایی مانند tf.argmax یا tf.batch_to_space مرتب کرده اند ، باعث می شوند اسکریپت به طور نادرست آرگومان های کلمه کلیدی را اضافه کند که از کد موجود شما ناسازگار است.

  • اسکریپت فرض می کند که tensorflow با استفاده از import tensorflow as tf .

  • این اسکریپت استدلالها را تغییر نمی دهد. در عوض ، اسکریپت آرگومان های کلمه کلیدی را به کارکردهایی اضافه می کند که آرگومان های آنها دوباره ترتیب یافته است.

  • tf2up.ml را برای یک ابزار مناسب برای به روزرسانی نوت بوک های Jupyter و پرونده های Python در یک مخزن GitHub بررسی کنید.

برای گزارش اشکالات اسکریپت به روزرسانی یا درخواست درخواست از ویژگی ها ، لطفاً یک مسئله را در GitHub ثبت کنید . و اگر شما TensorFlow 2.0 را آزمایش می کنید ، می خواهیم در مورد آن بشنویم! به انجمن تست TF 2.0 بپیوندید و سؤال و بحث را به test@tensorflow.org ارسال کنید .