Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Tf.summary kullanımını TF 2.0'a taşıma

TensorFlow.org'da görüntüleyin Google Colab'de çalıştırın Kaynağı GitHub'da görüntüleyin
import tensorflow as tf

TensorFlow 2.0, tf.summary görselleştirme için özet verileri yazmak için kullanılan tf.summary API'sinde önemli değişiklikler içerir.

Ne değişti

tf.summary API'sini iki alt API olarak düşünmek faydalıdır:

TF 1.x'te

Session.run() aracılığıyla özet işlem çıktılarını getirerek ve FileWriter.add_summary(output, step) çağırarak iki yarının manuel olarak birbirine bağlanması FileWriter.add_summary(output, step) . v1.summary.merge_all() op, tüm özet işlem çıktılarını bir araya getirmek için bir grafik koleksiyonu kullanarak bunu kolaylaştırdı, ancak bu yaklaşım, istekli yürütme ve kontrol akışı için yine de yetersiz çalıştı ve özellikle TF 2.0 için uygun değildi.

TF 2.X'te

İki yarım sıkı bir şekilde entegre edilmiştir ve artık bireysel tf.summary işlemleri yürütüldüğünde verilerini hemen yazmaktadır. API'yi model kodunuzdan kullanmak yine de tanıdık gelecektir, ancak artık grafik modu uyumlu kalırken istekli yürütme için dostça. API aracının iki yarısı entegre summary.FileWriter hemen TensorFlow yürütme içeriği bir parçasıdır ve doğrudan erişilebilir olur tf.summary çok yazarlar yapılandırma ops ana parça bakır farklı olmasıdır.

İstekli yürütme ile örnek kullanım, TF 2.0'da varsayılan:

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.1599908770.kokoro-gcp-ubuntu-prod-1849198075.22428.5.v2

Tf.fonksiyon grafiği yürütme ile örnek kullanım:

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.1599908771.kokoro-gcp-ubuntu-prod-1849198075.22428.1013.v2

Eski TF 1.x grafik yürütme ile örnek kullanım:

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)
ls /tmp/mylogs/session
events.out.tfevents.1599908771.kokoro-gcp-ubuntu-prod-1849198075.22428.1446.v2

Kodunuzu dönüştürme

Mevcut tf.summary kullanımının TF 2.0 API'ye dönüştürülmesi güvenilir bir şekilde otomatikleştirilemez, bu nedenle tf_upgrade_v2 komut dosyası hepsini tf.compat.v1.summary yeniden tf.compat.v1.summary . TF 2.0'a geçmek için, kodunuzu aşağıdaki gibi uyarlamanız gerekir:

  1. Özet işlemlerini kullanmak için .as_default() aracılığıyla ayarlanan varsayılan bir yazıcı mevcut olmalıdır

    • Bu, operasyonları hevesle yürütmek veya grafik yapımında operasyonları kullanmak anlamına gelir
    • Varsayılan bir yazar olmadan, özet operasyonlar sessiz operasyonsuz hale gelir
    • Varsayılan yazarlar (henüz) @tf.function yürütme sınırı boyunca @tf.function - yalnızca işlev izlendiğinde algılanırlar - bu nedenle en iyi uygulama, işlev gövdesi içinde writer.as_default() çağırmak ve writer nesnesini sağlamaktır. @tf.function kullanıldığı sürece var olmaya devam eder
  2. "Adım" değeri, step bağımsız değişkeni aracılığıyla her operasyona aktarılmalıdır.

    • TensorBoard, verileri bir zaman serisi olarak işlemek için bir adım değeri gerektirir
    • Açık geçiş gereklidir çünkü TF 1.x'ten gelen genel adım kaldırılmıştır, bu nedenle her op okumak için istenen adım değişkenini bilmelidir
    • Standart bir adım değerini kaydetmek için deneysel destek tf.summary.experimental.set_step() olarak mevcuttur, ancak bu, önceden haber verilmeksizin değiştirilebilen geçici işlevselliktir.
  3. Bireysel özet işlemlerinin işlev imzaları değişti

    • Dönüş değeri artık bir boole'dir (bir özetin gerçekten yazılıp yazılmadığını gösterir)
    • İkinci parametre adı (kullanılıyorsa) tensor data değişti
    • collections parametresi kaldırıldı; koleksiyonlar yalnızca TF 1.x'tir
    • family parametresi kaldırıldı; sadece tf.name_scope() kullanın
  4. [Yalnızca eski grafik modu / oturum yürütme kullanıcıları için]

    • İlk önce yazarı v1.Session.run(writer.init()) ile v1.Session.run(writer.init())

    • Geçerli grafik için tüm TF 2.0 özet işlemlerini almak için v1.summary.all_v2_summary_ops() kullanın, örneğin bunları Session.run() aracılığıyla yürütmek için

    • Yazarı v1.Session.run(writer.flush()) ve aynı şekilde close() için yıkayın

TF 1.x kodunuz bunun yerine tf.contrib.summary API'sini kullanıyorsa, bu TF 2.0 API'ye çok daha benzerdir, bu nedenle tf_upgrade_v2 betiği geçiş adımlarının çoğunu otomatikleştirir (ve tam olarak yapılamayan herhangi bir kullanım için uyarılar veya taşınmış). Çoğunlukla, API çağrılarını tf.compat.v2.summary yeniden tf.compat.v2.summary ; Yalnızca TF 2.0+ ile uyumluluğa ihtiyacınız varsa, compat.v2 ve sadece tf.summary olarak tf.summary .

Ek ipuçları

Yukarıdaki kritik alanlara ek olarak, bazı yardımcı hususlar da değişti:

  • Koşullu kayıt ("her 100 adımda bir günlüğe kaydet" gibi) yeni bir görünüme sahip

  • tf.compat.v1.Graph doğrudan yazılması tf.compat.v1.Graph - bunun yerine izleme işlevlerini kullanın

  • Tf.summary.FileWriterCache ile tf.summary.FileWriterCache başına artık genel yazıcı önbelleği yok

    • Kullanıcılar ya kendi yazar nesnelerini önbelleğe alma / paylaşma işlemlerini gerçekleştirmeli ya da sadece ayrı yazarlar kullanmalıdır (ikincisi için TensorBoard desteği devam etmektedir )
  • Olay dosyası ikili gösterimi değişti

    • TensorBoard 1.x zaten yeni biçimi destekliyor; bu fark yalnızca olay dosyalarındaki özet verilerini manuel olarak ayrıştıran kullanıcıları etkiler
    • Özet veriler artık tensör baytları olarak saklanmaktadır; bunu tf.make_ndarray(event.summary.value[0].tensor) dönüştürmek için tf.make_ndarray(event.summary.value[0].tensor) kullanabilirsiniz