Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Bermigrasi penggunaan ringkasan tf.sum ke TF 2.0

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub
 import tensorflow as tf
 

TensorFlow 2.0 mencakup perubahan signifikan pada API tf.summary digunakan untuk menulis data ringkasan untuk visualisasi di TensorBoard.

Apa yang berubah?

Berguna untuk memikirkan API tf.summary sebagai dua sub-API:

Dalam TF 1.x

Kedua bagian harus dihubungkan secara manual bersama - dengan mengambil ringkasan keluaran op melalui Session.run() dan memanggil FileWriter.add_summary(output, step) . v1.summary.merge_all() membuat ini lebih mudah dengan menggunakan koleksi grafik untuk mengagregasi semua output op ringkasan, tetapi pendekatan ini masih bekerja buruk untuk eksekusi yang cepat dan aliran kontrol, membuatnya sangat tidak cocok untuk TF 2.0.

Dalam TF 2.X

Kedua bagian tersebut terintegrasi secara ketat, dan sekarang masing-masing operasi tf.summary menulis data mereka segera ketika dieksekusi. Menggunakan API dari kode model Anda akan tetap terlihat familier, tetapi sekarang sangat bersahabat untuk melakukan eksekusi sambil tetap menggunakan mode grafik. Mengintegrasikan kedua bagian API berarti summary.FileWriter sekarang menjadi bagian dari konteks eksekusi TensorFlow dan dapat diakses langsung oleh operasi tf.summary , sehingga mengonfigurasi penulis adalah bagian utama yang terlihat berbeda.

Contoh penggunaan dengan eksekusi cepat, default di TF 2.0:

 writer = tf.summary.create_file_writer("/tmp/mylogs/eager")

with writer.as_default():
  for step in range(100):
    # other model code would go here
    tf.summary.scalar("my_metric", 0.5, step=step)
    writer.flush()
 
 ls /tmp/mylogs/eager
 
events.out.tfevents.1591960770.kokoro-gcp-ubuntu-prod-57818388.17251.5.v2

Contoh penggunaan dengan eksekusi grafik tf.function:

 writer = tf.summary.create_file_writer("/tmp/mylogs/tf_function")

@tf.function
def my_func(step):
  with writer.as_default():
    # other model code would go here
    tf.summary.scalar("my_metric", 0.5, step=step)

for step in tf.range(100, dtype=tf.int64):
  my_func(step)
  writer.flush()
 
 ls /tmp/mylogs/tf_function
 
events.out.tfevents.1591960771.kokoro-gcp-ubuntu-prod-57818388.17251.1013.v2

Contoh penggunaan dengan eksekusi legacy TF 1.x grafik:

 g = tf.compat.v1.Graph()
with g.as_default():
  step = tf.Variable(0, dtype=tf.int64)
  step_update = step.assign_add(1)
  writer = tf.summary.create_file_writer("/tmp/mylogs/session")
  with writer.as_default():
    tf.summary.scalar("my_metric", 0.5, step=step)
  all_summary_ops = tf.compat.v1.summary.all_v2_summary_ops()
  writer_flush = writer.flush()


with tf.compat.v1.Session(graph=g) as sess:
  sess.run([writer.init(), step.initializer])

  for i in range(100):
    sess.run(all_summary_ops)
    sess.run(step_update)
    sess.run(writer_flush)  
 
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py:1666: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.

 ls /tmp/mylogs/session
 
events.out.tfevents.1591960771.kokoro-gcp-ubuntu-prod-57818388.17251.1446.v2

Konversi kode Anda

Mengonversi penggunaan tf.summary ada ke TF 2.0 API tidak dapat diandalkan secara otomatis, sehingga skrip tf_upgrade_v2 hanya menulis ulang semuanya menjadi tf.compat.v1.summary . Untuk bermigrasi ke TF 2.0, Anda harus menyesuaikan kode Anda sebagai berikut:

  1. Penulis default yang diatur melalui .as_default() harus ada untuk menggunakan ringkasan operasi

    • Ini berarti menjalankan ops dengan penuh semangat atau menggunakan ops dalam konstruksi grafik
    • Tanpa penulis default, ringkasan ops menjadi diam no-ops
    • Penulis default belum (belum) menyebar melintasi batas eksekusi @tf.function - mereka hanya terdeteksi ketika fungsi dilacak - jadi praktik terbaik adalah memanggil writer.as_default() di dalam fungsi tubuh, dan untuk memastikan bahwa objek penulis terus ada selama fungsi @tf.function sedang digunakan
  2. Nilai "langkah" harus diteruskan ke setiap op melalui argumen step

    • TensorBoard membutuhkan nilai langkah untuk membuat data sebagai rangkaian waktu
    • Diperlukan secara eksplisit karena langkah global dari TF 1.x telah dihapus, sehingga setiap op harus tahu variabel langkah yang diinginkan untuk dibaca
    • Untuk mengurangi boilerplate, dukungan eksperimental untuk mendaftarkan nilai langkah default tersedia sebagai tf.summary.experimental.set_step() , tetapi ini adalah fungsi sementara yang dapat diubah tanpa pemberitahuan
  3. Tanda tangan fungsi ops ringkasan individu telah berubah

    • Nilai kembali sekarang menjadi boolean (menunjukkan jika ringkasan sebenarnya ditulis)
    • Nama parameter kedua (jika digunakan) telah berubah dari tensor ke data
    • Parameter collections telah dihapus; koleksi hanya TF 1.x
    • Parameter family telah dihapus; cukup gunakan tf.name_scope()
  4. [Hanya untuk pengguna mode lama / eksekusi grafik]

    • Pertama-tama inisialisasi penulis dengan v1.Session.run(writer.init())

    • Gunakan v1.summary.all_v2_summary_ops() untuk mendapatkan semua operasi ringkasan TF 2.0 untuk grafik saat ini, misalnya untuk menjalankannya melalui Session.run()

    • Siram penulis dengan v1.Session.run(writer.flush()) dan juga untuk close()

Jika kode TF 1.x Anda menggunakan API tf.contrib.summary , ini jauh lebih mirip dengan API TF 2.0, jadi skrip tf_upgrade_v2 akan mengotomatiskan sebagian besar langkah migrasi (dan memancarkan peringatan atau kesalahan untuk setiap penggunaan yang tidak dapat sepenuhnya sepenuhnya. bermigrasi). Sebagian besar hanya menulis ulang panggilan API ke tf.compat.v2.summary ; jika Anda hanya perlu kompatibilitas dengan TF 2.0+, Anda dapat menghapus compat.v2 dan hanya tf.summary sebagai tf.summary .

Kiat tambahan

Selain bidang-bidang penting di atas, beberapa aspek tambahan juga telah berubah:

  • Rekaman bersyarat (seperti "log setiap 100 langkah") memiliki tampilan baru

    • Untuk mengontrol ops dan kode terkait, bungkus dalam pernyataan if biasa (yang bekerja dalam mode eager dan di @tf.function melalui tanda tangan ) atau tf.cond
    • Untuk mengontrol ringkasan saja, gunakan manajer konteks tf.summary.record_if() baru, dan berikan kondisi boolean yang Anda pilih
    • Ini menggantikan pola TF 1.x:
 if condition:
  writer.add_summary()
 
  • Tidak ada penulisan langsung tf.compat.v1.Graph - alih-alih gunakan fungsi penelusuran

  • Tidak ada lagi caching penulis global per logdir dengan tf.summary.FileWriterCache

    • Pengguna harus mengimplementasikan caching / berbagi objek penulis mereka sendiri, atau cukup menggunakan penulis terpisah (dukungan TensorBoard untuk yang terakhir sedang berlangsung )
  • Representasi file biner acara telah berubah

    • TensorBoard 1.x sudah mendukung format baru; perbedaan ini hanya memengaruhi pengguna yang secara manual mem-parsing data ringkasan dari file acara
    • Data ringkasan sekarang disimpan sebagai tensor byte; Anda dapat menggunakan tf.make_ndarray(event.summary.value[0].tensor) untuk mengubahnya menjadi numpy