Pemutakhiran kode otomatis ke TensorFlow 2



Materi menyediakan terjemahan manual untuk memperbarui kode secara otomatis dari TensorFlow 1.x ke Tensorflow 2 menggunakan skrip pembaruan tf_upgrade_v2 .

TensorFlow 2.0 mencakup banyak perubahan API, seperti mengubah urutan argumen, mengganti nama karakter, dan mengubah nilai default untuk parameter. Koreksi manual dari semua modifikasi ini membosankan dan rentan kesalahan. Untuk menyederhanakan perubahan dan membuat transisi Anda ke TF 2.0 semulus mungkin, tim TensorFlow membuat utilitas tf_upgrade_v2 untuk membantu berpindah dari kode lama ke API baru.
Catatan: tf_upgrade_v2 diinstal secara otomatis untuk TensorFlow 1.13 dan yang lebih baru (termasuk semua build TF 2.0).
Penggunaan skrip yang khas terlihat seperti ini:

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

Kode ini mempercepat proses peningkatan dengan mengonversi skrip TensorFlow 1.x Python ke TensorFlow 2.0 yang ada.

Skrip konversi mengotomatiskan proses sebanyak mungkin, tetapi masih ada perubahan sintaksis dan gaya yang tidak dapat diperbaiki oleh skrip.

Modul Kompatibilitas


Beberapa karakter API tidak dapat diperbarui hanya dengan menggunakan penggantian string. Untuk memastikan bahwa kode Anda berfungsi di TensorFlow 2.0, skrip pembaruan menyertakan modul compat.v1 . Modul ini menggantikan karakter TF 1.x, seperti tf.foo , dengan tautan setara tf.compat.v1.foo . Meskipun modul kompatibilitas bagus, kami sarankan Anda mengurangi penggantian secara manual dan mengirimkannya ke API baru di ruang nama tf. * tf. * alih- tf.compat.v1 namespace tf.compat.v1 secepat mungkin.

Karena penyusutan modul TensorFlow 2.x (mis. tf.flags dan tf.contrib ), beberapa perubahan tidak dapat dilewati dengan beralih ke compat.v1 . Memperbarui kode tersebut mungkin memerlukan penggunaan pustaka tambahan (misalnya, absl.flags atau beralih ke paket dengan tenorflow/addons .

Proses Pembaruan yang Disarankan


Bagian manual ini menunjukkan penggunaan skrip pembaruan. Meskipun skrip pembaruan mudah digunakan, kami sangat menyarankan Anda menggunakan skrip sebagai bagian dari proses berikut:

  1. Tes unit : pastikan bahwa kode yang diperbarui memiliki serangkaian tes unit dengan cakupan yang wajar. Ini adalah kode Python, jadi bahasa tidak akan melindungi Anda dari banyak kelas kesalahan. Pastikan juga semua dependensi Anda telah diperbarui agar kompatibel dengan TensorFlow 2.0.
  2. Instal TensorFlow 1.14 : Tingkatkan TensorFlow Anda ke versi terbaru dari TensorFlow 1.x, setidaknya 1.14. Ini termasuk TensorFlow 2.0 API terakhir di tf.compat.v2 .
  3. Kode uji dengan 1.14 : Pastikan unit test Anda lulus pada saat ini. Anda akan me-restart mereka selama proses upgrade, jadi penting untuk memulai dengan warna hijau.
  4. Jalankan skrip pembaruan : Jalankan tf_upgrade_v2 pada seluruh pohon sumber termasuk pengujian. Ini akan memperbarui kode Anda ke format yang hanya menggunakan karakter yang tersedia di TensorFlow 2.0. Karakter yang sudah usang akan tersedia dari tf.compat.v1 . Mereka kemudian akan membutuhkan pemrosesan manual. \ N ",
  5. Jalankan tes yang dikonversi dengan TensorFlow 1.14 : Kode Anda masih harus berjalan dengan benar di TensorFlow 1.14. Jalankan tes unit lagi. Kesalahan apa pun dalam pengujian Anda pada tahap ini berarti ada kesalahan dalam skrip pembaruan.
  6. Periksa laporan pembaruan untuk peringatan dan kesalahan : Skrip menulis file laporan yang menjelaskan semua konversi yang perlu Anda periksa, atau semua tindakan yang perlu dilakukan secara manual. Misalnya: Setiap instance kontribus yang tersisa memerlukan penghapusan manual.
  7. Instal TensorFlow 2.0 : Pada titik ini, beralih ke TensorFlow 2.0 harus aman.
  8. Uji kode dengan v1.disable_v2_behavior : Mulai ulang tes Anda dengan v1.disable_v2_behavior() di fungsi tes utama, hasilnya harus sama seperti ketika berjalan di bawah 1,14.
  9. Aktifkan Perilaku V2 : Sekarang setelah tes Anda berjalan menggunakan API v2, Anda dapat mulai menonton penyertaan v2 behavior . Bergantung pada bagaimana kode Anda ditulis, ini mungkin memerlukan beberapa perubahan.

Menggunakan skrip pembaruan


Instalasi


 from __future__ import absolute_import, division, print_function, unicode_literals 

 try: import tensorflow.compat.v2 as tf except Exception: pass tf.enable_v2_behavior() print(tf.__version__) 

Klon repositori tensorflow / models sehingga Anda memiliki beberapa kode untuk eksperimen:

 !git clone --branch r1.13.0 --depth 1 https://github.com/tensorflow/models 

Baca bantuan


Script harus diinstal dengan TensorFlow. Bantuan bawaan disebut seperti ini:

 !tf_upgrade_v2 -h 

Contoh Kode TF1


Berikut ini adalah skrip TensorFlow 1.0 sederhana yang tidak berjalan di TensorFlow 2.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) 

memberikan kesalahan berikut:

 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' 

File tunggal


Skrip pembaruan dapat dijalankan pada file Python yang terpisah:

 !tf_upgrade_v2 \ --infile models/samples/cookbook/regression/custom_regression.py \ --outfile /tmp/custom_regression_v2.py 

Skrip akan menampilkan kesalahan jika tidak dapat menemukan koreksi untuk kode.

 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' 

Pohon direktori


Proyek tipikal, termasuk contoh sederhana ini, menggunakan lebih dari satu file. Biasanya Anda ingin memperbarui seluruh paket, sehingga skrip juga dapat dijalankan di pohon direktori:

 #   .py      outtree !tf_upgrade_v2 \ --intree models/samples/cookbook/regression/ \ --outtree regression_v2/ \ --reportfile tree_report.txt 

Perhatikan satu komentar tentang fungsi tersebut
 dataset.make_one_shot_iterator 
.

Sekarang skrip sudah bekerja dengan TensorFlow 2.0.

Perhatikan bahwa karena modul `tf.compat.v1`, skrip yang dikonversi juga akan berjalan di TensorFlow 1.14.

Laporan terperinci


Script juga menerbitkan daftar perubahan yang terperinci. Dalam contoh ini, ia menemukan satu transformasi yang mungkin tidak aman dan menambahkan peringatan ke bagian atas file:

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

Perhatikan lagi satu komentar tentang Dataset.make_one_shot_iterator function .

Mode Aman


Skrip konversi juga memiliki mode "AMAN" yang kurang invasif yang hanya mengubah impor untuk menggunakan modul tensorflow.compat.v1 .

 !tf_upgrade_v2 --mode SAFETY --infile dropout.py --outfile dropout_v2_safe.py > /dev/null 

Misalnya kode:

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


dalam mode ini dikonversi menjadi sebagai berikut:

 import tensorflow.compat.v1 as tf tf.disable_v2_behavior() d = tf.nn.dropout(tf.range(10), 0.2) z = tf.zeros_like(d, optimize=False) 

Seperti yang Anda lihat, kode Anda belum diperbarui, tetapi sekarang kode TensorFlow 1 berjalan di TensorFlow 2.

Peringatan


  • Jangan perbarui bagian kode Anda secara manual sebelum menjalankan skrip. Secara khusus, fungsi dengan argumen yang disusun ulang, seperti tf.argmax atau tf.batch_to_space , akan memaksa skrip untuk menambahkan argumen kata kunci yang salah, yang akan membingungkan kode Anda yang ada.
  • Script mengasumsikan tensorflow diimpor menggunakan import tensorflow as tf
  • Script tidak menyusun ulang argumen. Sebagai gantinya, skrip menambahkan kata kunci argumen ke fungsi di mana argumen dibalik.

Setelah verifikasi, terjemahan juga akan muncul di Tensorflow.org. Jika Anda ingin berpartisipasi dalam terjemahan dokumentasi situs web Tensorflow.org ke dalam bahasa Rusia, silakan hubungi secara pribadi atau komentar. Setiap koreksi atau komentar sangat dihargai.

Source: https://habr.com/ru/post/id483184/


All Articles