tf.summary kullanımını TF 2.x'e taşıma

import tensorflow as tf

TensorFlow 2.x önemli değişiklikler içeren tf.summary TensorBoard içinde görselleştirme için yazma özeti verilerine kullanılan API.

ne değişti

Bu düşünmek yararlıdır tf.summary iki alt API'ler olarak API:

TF 1.x'te

Olan iki yarım elle birlikte kablolu göre - ile özet op çıkışları getirecek şekilde Session.run() ve arama FileWriter.add_summary(output, step) . v1.summary.merge_all() op tüm özeti op çıkışları toplamak için bir grafiktir toplama kullanarak bu daha kolay, ancak bu yaklaşım hala, özellikle TF 2.x ters düşen hale istekli uygulama ve kontrol akışı için kötü çalıştı

TF 2.X'te

İki yarısı sıkıca entegre edilmiştir ve şimdi bireysel tf.summary çalıştırıldığında ops hemen veri yazma. Model kodunuzdaki API'yi kullanmak hala tanıdık görünmelidir, ancak grafik modu uyumlu kalırken artık istekli yürütme için kolay. 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.x'te 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.1633086727.kokoro-gcp-ubuntu-prod-1386032077.31590.0.v2

tf.function grafik yürütmesi 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.1633086728.kokoro-gcp-ubuntu-prod-1386032077.31590.1.v2

Eski TF 1.x grafik yürütmesi 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.1633086728.kokoro-gcp-ubuntu-prod-1386032077.31590.2.v2

Kodunuzu dönüştürme

Varolan dönüştürme tf.summary böylece TF 2.x API kullanımını güvenilir otomatik olamaz tf_upgrade_v2 komut sadece bunu tüm yeniden yazar tf.compat.v1.summary . TF 2.x'e geçiş yapmak için kodunuzu aşağıdaki gibi uyarlamanız gerekir:

  1. Aracılığıyla varsayılan yazar seti .as_default() kullanımı özeti op mevcut olması gerekir

    • 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 arasında (henüz) yaymak yoktur @tf.function onlar sadece işlev takip edildiğinde algılanır - - yürütme sınırında böylece iyi uygulama çağırmaktır writer.as_default() fonksiyonu bünyesinde ve emin olmak için yazar nesne sürece var olmaya devam @tf.function kullanılıyor
  2. "Adım" değeri ile her bir op geçirilmesi gereken step argüman

    • TensorBoard, verileri bir zaman serisi olarak işlemek için bir adım değeri gerektirir
    • TF 1.x'ten global adım kaldırıldığı için açık geçiş gereklidir, bu nedenle her op okumak için istenen adım değişkenini bilmelidir
    • Klişe azaltmak için, varsayılan bir adım değerinin kaydedilmesi için deneysel destek olarak kullanılabilir tf.summary.experimental.set_step() , ancak bu haber verilmeksizin değiştirilebilir geçici işlevselliği
  3. Bireysel özet operasyonlarının işlev imzaları değişti

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

    • Öncelikle ile yazar başlatmak v1.Session.run(writer.init())

    • Kullanım v1.summary.all_v2_summary_ops() aracılığıyla onları yürütmek için örneğin, şimdiki grafik için tüm TF 2.x özeti op almak için Session.run()

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

Senin TF 1.x kod kullanmak yerine ise tf.contrib.summary API böylece, o TF 2.x API çok daha benzer tf_upgrade_v2 komut herhangi kullanım için göç adımların çoğu (ve yayarlar uyarı ve hataları otomatik olacağı olamaz tamamen taşınmalıdır). Çoğunlukla sadece API çağrıları yeniden yazar tf.compat.v2.summary ; Yalnızca TF 2.x ile uyumluluk gerekiyorsa bırakın compat.v2 ve tıpkı başvurmak tf.summary .

Ek ipuçları

Yukarıdaki kritik alanlara ek olarak, bazı yardımcı yönler de değişti:

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

    • Kontrol ops ve ilişkili kod, (istekli modunda ve çalışan bir düzenli eğer açıklamada onları sarmak için @tf.function imza aracılığıyla ) ya da bir tf.cond
    • Sadece özetleri kontrol etmek için, yeni kullanmak tf.summary.record_if() bağlam yöneticisi, ve bu seçtiğiniz boole durumunu geçmesi
    • Bunlar TF 1.x modelinin yerini alır:

      if condition:
        writer
      .add_summary()
  • Hayır doğrudan yazma tf.compat.v1.Graph - yerine kullanılması iz işlevleri

  • İle LogDir başına Artık küresel yazar önbelleğe alma tf.summary.FileWriterCache

    • (İkincisi ise için TensorBoard desteği Kullanıcılar ya yazar nesnelerin paylaşımı / kendi önbelleğe uygulamak, ya da sadece ayrı yazarlar kullanmalıdır sürüyor )
  • Olay dosyası ikili gösterimi değişti

    • TensorBoard 1.x zaten yeni formatı desteklemektedir; bu fark yalnızca olay dosyalarından özet verileri manuel olarak ayrıştıran kullanıcıları etkiler
    • Özet veriler artık tensör baytları olarak saklanmaktadır; Kullanabileceğiniz tf.make_ndarray(event.summary.value[0].tensor) Numpy dönüştürmek